Vagrantfile详细说明
Vagrant文件说明
-
[x] Vagrantfile里定义的路径,都是以Vagrantfile文件所在目录,为工作区。
-
[x]
do … end
为配置的开始结束符,所有配置信息都写在这两段代码之间。 -
[x]
|…|
是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、虚拟机属性
不同的虚拟化平台,有着各自不同的设置
-
[x] VirtualBox
-
[x] VMware
-
[x] Docker
-
[x] Hyper-V
以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、启动任务
不同的执行器,有着各自不同的设置
- [x] File
- [x] Shell
- [x] Ansible
- [x] Ansible Local
- [x] CFEngine
- [x] Chef Common Configuration
- [x] Chef Solo
- [x] Chef Zero
- [x] Chef Client
- [x] Chef Apply
- [x] Docker
- [x] Puppet Apply
- [x] Puppet Agent
- [x] Salt
以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文件里建立多个虚拟机 https://www.vagrantup.com/docs/multi-machine
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