我在Vagrant文件中设置了以下规定。
config.vm.provision :shell, :path => "provision/bootstrap.sh"
config.vm.provision :shell, :path => "provision/step-1.sh"
config.vm.provision :shell, :path => "provision/step-2.sh"
config.vm.provision :shell, :path => "provision/dev-setup.sh"
provision/bootstrap.sh
需要始终运行,但我需要有条件地运行剩余的条款。对于Eg。如果dev
模式,请运行provision/dev-setup.sh
是否有一些内置的Vagrant配置设置来实现这一目标? (比如将命令行参数传递给vagrant provision
)?
如果可能,我不想依赖this之类的ENV变量。
答案 0 :(得分:7)
我认为环境变量是处理此问题的最常用方法,并且无法通过vagrant up
或vagrant provision
命令传递任何内容。以下是您可以探索的几个替代想法:
在Dev与Prod环境中有其他不同之处。 Vagrantfile只是一个Ruby脚本,因此任何可以检测到的东西都可以用来控制配置脚本序列。例如,文件,本地网络,主机名等的存在/不存在
定义单独的Vagrant节点,这些节点实际上是相同的,但根据配置而有所不同。例如,使用如下文件,您可以执行vagrant up prod
或vagrant up dev
,具体取决于您的环境:
Vagrant.configure("2") do |config|
config.vm.provision :shell, :path => "provision/bootstrap.sh"
config.vm.provision :shell, :path => "provision/step-1.sh"
config.vm.provision :shell, :path => "provision/step-2.sh"
config.vm.define "prod" do |prod|
...
end
config.vm.define "dev" do |dev|
...
config.vm.provision :shell, :path => "provision/dev-setup.sh"
end
end
答案 1 :(得分:1)
您还可以在广告资源中创建一个新变量来保存环境,例如展示广告资源中的env: dev
和prod广告资源中的env: production
,然后使用它来有条件地包含您的各个任务文件,像这样:
# provision.yml (your main playbook)
- include: provision/bootstrap.sh
- include: provision/step-1.sh
- include: provision/step-2.sh
- include: provision/dev-setup.sh
when: env == 'dev'
然后在Vagrant中,您可以指定要使用的广告资源,例如:
config.vm.provision "provision", type: "ansible" do |ansible|
ansible.playbook = 'provision.yml'
ansible.inventory_path = 'inventory/dev'
end
更多信息: