Vagrantfile详细说明

301 阅读4分钟

Vagrant文件说明

  • Vagrantfile里定义的路径,都是以Vagrantfile文件所在目录,为工作区。

  • do … end 为配置的开始结束符,所有配置信息都写在这两段代码之间。

  • |…| 是do之前的对象的名称,相当于函数的入参

    对象 do | 对象名 |
      ...
    end
    

Vagrant单机部署

1、版本声明

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

配置Vagrant 2.0.x 版本(Vagrant::Config.run do |config| 此为Vagrant 1.0.x 的配置)

2、box名称设置

Vagrant.configure("2") do |config|
  config.vm.box = "centos-7.2"
end

该名称为box系统镜像名

3、主机名称

Vagrant.configure("2") do |config|
  config.vm.hostname = "node1" #默认localhost.localdomain
end

4、虚拟机属性

不同的虚拟化平台,有着各自不同的设置

以VirtualBox为列:

4.1、基本通用设置

Vagrant.configure("2") do |config|
  config.vm.provider "virtualbox" do |vb|
    vb.name = "centos7-vm" #虚拟机名称(默认随机生成一段字符串)
    vb.memory = "1024"     #虚拟机内存(单位M)
    vb.cpus = 2            #虚拟机cpu核数
    vb.gui = true          #启动虚拟机桌面(默认false)
  end
end

4.2、调用VirtualBox命令

VirtualBox提供了VBoxManage命令行工具可以针对某个 VM 做很多事,modifyvm 就是一条可以修订 VM 配置参数的子命令。而Vagrant也可以在配置文件 Vagrantfile中操作 virtualbox 以达到类似的目的。

Vagrant.configure("2") do |config|
  config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm",:id,"--name","centos7-vm","--memory","1024","--cpus","2"]
  end
end
4.2.1、其他命令
4.2.1.1、修改显存

默认为8M,如果启动桌面,至少需要10M,如下修改为16M:

vb.customize ["modifyvm", :id, "--vram", "16"]
4.2.1.2、增加光驱
vb.customize ["storageattach",:id,"--storagectl", "IDE Controller","--port","0","--device","0","--type","dvddrive","--medium","/Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso"]

注: 参数meduim不可以为空

"--meduim", "emptydrive" ###只挂载驱动器不挂ISO , "--medium", "none" ###卸载光驱

5、网络配置

Vagrant的网络类型有三种:

  • NAT(网络地址转换模式): 默认创建,只能虚拟机单向向外访问,其他虚拟机和主机无法访问它。
  • Host-only(主机模式) : 虚拟机只能与宿主计算机互访,其他主机无法访问它,但同网段虚拟机可以。
  • Bridge(桥接模式) : 此模式下VM就像同处一个局域网中的其他的计算机一样,可以被其他主机访问。

5.1、Private network(私有网络)

Vagrant.configure("2") do |config|
  # 主机模式(Host-only)
  config.vm.network "private_network", ip: "192.168.10.11"
end

5.2、Public network(公有网络)

Vagrant.configure("2") do |config|
  # 桥接模式(Bridge)
  config.vm.network "public_network", ip: "192.168.10.11"
end

5.3、 Forwarded port(端口映射)

Vagrant.configure("2") do |config|
  config.vm.network :forwarded_port, guest: 80, host: 8080
end

把宿主机上的8080端口映射到虚拟机的80端口,不支持在宿主机器上使用小于1024的端口来转发

guest和host是必须的,还有几个可选属性:

  • guest_ip:字符串,VM指定绑定的IP,默认值为: 0.0.0.0

  • host_ip :字符串,HOST指定绑定的IP,默认值为:0.0.0.0

  • protocol:字符串,可选TCP或UDP,默认值为:TCP

6、共享目录

6.1、Basic usage(基本用法)

Vagrant.configure("2") do |config|
  config.vm.synced_folder "../data", "/vagrant_data"
end

将宿主机的Vagrantfile所在(工作)目录../data映射为 VM中的 /vagrant_data

6.2、修改所有者/组

Vagrant.configure("2") do |config|
  config.vm.synced_folder "../data", "/vagrant_data", owner: "root", group: "root"
end

设置共享目录的所有者。默认情况下,是SSH用户。

7、启动任务

不同的执行器,有着各自不同的设置

以Shell为列:

7.1、单行脚本

Vagrant.configure("2") do |config|
 # 执行一条shell命令,打印Hello World!
 config.vm.provision "shell", inline: "echo Hello World!"
end

7.2、外部脚本

Vagrant.configure("2") do |config|
  config.vm.provision "shell", path => "script.sh"
end

path可以是(~、../、./)相对路径,也可以是绝对路径,或者是远程URL

7.3、内联脚本

$script = <<-SCRIPT
  echo 'Hello World!'
SCRIPT

Vagrant.configure("2") do |config|
  config.vm.provision "shell", inline => $script
end

7.4、参数传递

Vagrant.configure("2") do |config|
  config.vm.provision "shell" do |s|
    s.inline = "echo $1"
    s.args   = ["hello, world!"]
  end
end

7.5、多个任务

Vagrant.configure("2") do |config|
    
  config.vm.provision "shell", inline: "echo foo"

  config.vm.define "websit" do |web|
    web.vm.provision "shell", inline: "echo websit"
  end

  config.vm.provision "shell", path => "script.sh"
    
end

Vagrant分布式部署

在一个Vagrantfile文件里建立多个虚拟机 www.vagrantup.com/docs/multi-…

1、配置语法

VAGRANTFILE_API_VERSION = "2"                                #定义版本

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|       #使用内部2版本
  
  config.vm.define :debian1 do |centos1|                     #定义虚拟机
     centos1.vm.box = "centos-7.2"                           #使用centos-7.2系统镜像
     centos1.vm.host_name = "node1"                          #设置hostname
     centos1.vm.network :public_network, ip: "192.168.1.1"  #设置网络
  end
  config.vm.define :debian2 do |centos2|
     centos2.vm.box = "centos-7.2"
     centos2.vm.host_name = "node2"
     centos2.vm.network :public_network, ip: "192.168.1.2"
  end
  config.vm.define :node3 do |centos3|
     centos3.vm.box = "centos-7.2"
     centos3.vm.host_name = "node3"
     centos3.vm.network :public_network, ip: "192.168.1.3"
  end

end

2、循环创建

(1..3).each do |i|
  config.vm.define "node-#{i}" do |node|
    node.vm.box = "centos-7.2"
    node.vm.host_name = "node#{i}"
    node.vm.network :public_network, ip: "192.168.1.#{i}"
  end
end

注意事项

1、程序缓存

使用 Apache/Nginx 时会出现诸如图片修改后但页面刷新仍然是旧文件的情况,是由于静态文件缓存造成的。需要对虚拟机里的 Apache/Nginx 配置文件进行修改:

  • Apache 配置添加:
EnableSendfile off
  • Nginx 配置添加:
sendfile off;

2、重载配置

修改Vagrantfile属性, 需重新加载配置才能生效。

vagrant reload

定制box: github.com/jayknoxqu/p…