什么是vagrant provision?
pollyduan 2019-11-04 13:43:47
从字面上来看,provision是准备,实现的功能是在原生镜像的基础上,进行一些附加的操作,以改变虚拟机的环境,比如安装应用,发布程序等。
1 helloword
在vagrant的 Vagrant.configure(2) do |config| 节点内,加入如下代码:
config.vm.provision "shell", inline: "echo hello provisio."
还有一种格式:
config.vm.provision "shell" do |s|
s.inline = "echo hello provision."
end
测试一下:
如果vm已经启动,直接运行
就可以看到控制台显示的信息了。或者:
vagrant reload --provision
重启vm,并自动执行provision操作。
Tips: 运行后可能会提示:default: stdin: is not a tty 错误,不影响执行效果,想要去除,在配置文件增加一行即可。
config.ssh.shell = "bash -c 'BASH_ENV=/etc/profile exec bash'"
什么是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 foo"
config.vm.define "web" do |web|
web.vm.provision "shell", inline: "echo bar"
end
config.vm.provision "shell", inline: "echo baz"
end
输出结果:
==> default: "foo"
==> default: "baz"
==> default: "bar"
2 如何执行provision任务
尝试了helloword,我们来了解一下provision任务是怎么运行的。
- 启动时自动执行,缺省地,任务只执行一次,第二次启动就不会自动运行了。如果需要每次都自动运行,需要为provision指定
run:"always"
属性 - 启动时运行,在启动命令加
--provision
参数,适用于 vagrant up
和 vagrant reload
- vm启动状态时,执行
vagrant provision
命令。
在编写provision任务时,可能同时存在几种类型的任务,但执行时可能只执行一种,如,我只执行shell类型的任务。可以如下操作:
vagrant provision --provision-with shell