美文网首页
Vagrant的配置文件Vagrantfile详解-2

Vagrant的配置文件Vagrantfile详解-2

作者: 白红薯粉 | 来源:发表于2019-03-10 15:48 被阅读0次

    1、定义vm的configure配置节点(一个节点就是一个虚拟机)

    config.vm.define :mysql do |mysql_config|

    # ...

    end

    表示在config配置中,定义一个名为mysql的vm配置,该节点下的配置信息命名为mysql_config; 如果该Vagrantfile配置文件只定义了一个vm,这个配置节点层次可忽略。

    还可以在一个Vagrantfile文件里建立多个虚拟机,一般情况下,你可以用多主机功能完成以下任务:

    ▲ 分布式的服务,例如网站服务器和数据库服务器

    ▲ 分发系统

    ▲ 测试接口

    ▲ 灾难测试 

    Vagrant.configure("2") do |config|

      config.vm.define "web" do |web|

        web.vm.box = "apache"

      end

      config.vm.define "db" do |db|

        db.vm.box = "mysql"

      end

    end

    当定义了多主机之后,在使用vagrant命令的时候,就需要加上主机名,例如vagrant ssh web;也有一些命令,如果你不指定特定的主机,那么将会对所有的主机起作用,比如vagrant up;你也可以使用表达式指定特定的主机名,例如vagrant up /follower[0-9]/。

    2、通用数据 设置一些基础数据,供配置信息中调用。

    app_servers = {

        :service1 => '192.168.10.10',

        :service2 => '192.168.10.11'

    }

    这里是定义一个hashmap,以key-value方式来存储vm主机名和ip地址。

    3、配置信息

    ENV["LC_ALL"] = "en_US.UTF-8"

    #指定vm的语言环境,缺省地,会继承host的locale配置

    Vagrant.configure("2") do |config|

        # ...

    end

    参数2,表示的是当前配置文件使用的vagrant configure版本号为Vagrant 1.1+,如果取值为1,表示为Vagrant 1.0.x Vagrantfiles,旧版本暂不考虑,记住就写2即可。

    do … end 为配置的开始结束符,所有配置信息都写在这两段代码之间。 config是为当前配置命名,你可以指定任意名称,如myvmconfig,在后面引用的时候,改为自己的名字即可。

    4、vm提供者配置

    config.vm.provider :virtualbox do |vb|

        # ...

    end

    ▲vm provider通用配置

    虚机容器提供者配置,对于不同的provider,特有的一些配置,此处配置信息是针对virtualbox定义一个提供者,命名为vb,跟前面一样,这个名字随意取,只要节点内部调用一致即可。

    配置信息又分为通用配置和个性化配置,通用配置对于不同provider是通用的,常用的通用配置如下:

    #指定vm-name,也就是virtualbox管理控制台中的虚机名称。如果不指定该选项会生成一个随机的名字,不容易区分。

    vb.name = "centos7"

    # vagrant up启动时,是否自动打开virtual box的窗口,缺省为false

    vb.gui = true

    #指定vm内存,单位为MB

    vb.memory = "1024"

    #设置CPU个数

    vb.cpus = 2

    ▲vm provider个性化配置(virtualbox)

    上面的provider配置是通用的配置,针对不同的虚拟机,还有一些的个性的配置,通过vb.customize配置来定制。

    对virtual box的个性化配置,可以参考:VBoxManage modifyvm 命令的使用方法。详细的功能接口和使用说明,可以参考virtualbox官方文档

    #修改vb.name的值

    v.customize ["modifyvm", :id, "--name", "mfsmaster2"]

    #如修改显存,缺省为8M,如果启动桌面,至少需要10M,如下修改为16M:

    vb.customize ["modifyvm", :id, "--vram", "16"]

    #调整虚拟机的内存

    vb.customize ["modifyvm", :id, "--memory", "1024"]

    #指定虚拟CPU个数

    vb.customize ["modifyvm", :id, "--cpus", "2"]

    #增加光驱:

    vb.customize ["storageattach",:id,"--storagectl", "IDE Controller","--port","0","--device","0","--type","dvddrive","--medium","/Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso"]

    #注:meduim参数不可以为空,如果只挂载驱动器不挂在iso,指定为“emptydrive”。如果要卸载光驱,medium传入none即可。

    #从这个指令可以看出,customize方法传入一个json数组,按照顺序传入参数即可。

    #json数组传入多个参数

    v.customize ["modifyvm", :id, "--name", “mfsserver3", "--memory", “2048"]

    5、一组相同配置的vm

    前面配置了一组vm的hash map,定义一组vm时,使用如下节点遍历。

    #遍历app_servers map,将key和value分别赋值给app_server_name和app_server_ip

    app_servers.each do |app_server_name, app_server_ip|

        #针对每一个app_server_name,来配置config.vm.define配置节点,命名为app_config

        config.vm.define app_server_name do |app_config|

              # 此处配置,参考config.vm.define

        end

    end

    如果不想定义app_servers,下面也是一种方案:

    (1..3).each do |i|

            config.vm.define "app-#{i}" do |node|

            app_config.vm.hostname = "app-#{i}.vagrant.internal"

            app_config.vm.provider "virtualbox" do |vb|

                vb.name = app-#{i}

            end

      end

    end

    6、provision任务

    你可以编写一些命令,让vagrant在启动虚拟机的时候自动执行,这样你就可以省去手动配置环境的时间了。

    ▲ 脚本何时会被执行

    ● 第一次执行vagrant up命令

    ● 执行vagrant provision命令

    ● 执行vagrant reload --provision或者vagrant up --provision命令

    ● 你也可以在启动虚拟机的时候添加--no-provision参数以阻止脚本被执行

    ▲ provision任务是什么?

    provision任务是预先设置的一些操作指令,格式:

    config.vm.provision 命令字 json格式参数

    config.vm.provion 命令字 do |s|

        s.参数名 = 参数值

    end

    每一个 config.vm.provision 命令字 代码段,我们称之为一个provisioner。

    根据任务操作的对象,provisioner可以分为:

    ● Shell

    ● File

    ● Ansible

    ● CFEngine

    ● Chef

    ● Docker

    ● Puppet

    ● Salt

    根据vagrantfile的层次,分为:

    configure级:它定义在 Vagrant.configure("2") 的下一层次,形如: config.vm.provision ...

    vm级:它定义在 config.vm.define "web" do |web| 的下一层次,web.vm.provision ...

    执行的顺序是先执行configure级任务,再执行vm级任务,即便configure级任务在vm定义的下面才定义。例如:

    Vagrant.configure("2") do |config|

      config.vm.provision "shell", inline: "echo 1"

      config.vm.define "web" do |web|

        web.vm.provision "shell", inline: "echo 2"

      end

      config.vm.provision "shell", inline: "echo 3"

    end

    输出结果:

    ==> default: "1"

    ==> default: "2"

    ==> default: "3"

    ▲ 如何使用

    ● 单行脚本

    helloword只是一个开始,对于inline模式,命令只能在写在一行中。

    单行脚本使用的基本格式:

    config.vm.provision "shell", inline: "echo fendo"

    shell命令的参数还可以写入do ... end代码块中,如下:

    config.vm.provision "shell" do |s|

      s.inline = "echo hello provision."

    end

    ● 内联脚本

    如果要执行脚本较多,可以在Vagrantfile中指定内联脚本,在Vagrant.configure节点外面,写入命名内联脚本:

    $script = <<SCRIPT

    echo I am provisioning...

    echo hello provision.

    SCRIPT

    然后,inline调用如下:

    config.vm.provision "shell", inline: $script

    ● 外部脚本

    也可以把代码写入代码文件,并保存在一个shell里,进行调用:

    config.vm.provision "shell", path: "script.sh"

    script.sh的内容:

    echo hello provision.

    修改完Vagrantfile的配置后,记得要重启虚拟机,才能使用虚拟机更新后的配置。

    vagrant reload

    Vagrant的配置文件Vagrantfile详解-1 点击查看

    参考文章:https://blog.csdn.net/u011781521/article/details/80291765

    相关文章

      网友评论

          本文标题:Vagrant的配置文件Vagrantfile详解-2

          本文链接:https://www.haomeiwen.com/subject/xsoupqtx.html