有条件地调用 Vagrantfile 中的不同规定
Conditionally call different provision in Vagrantfile
我的 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
需要始终 运行,但是我需要有条件地 运行 其余条款。对于例如。如果 dev
模式,运行 provision/dev-setup.sh
是否有一些内置的 Vagrant 配置设置可以实现此目的? (比如将命令行参数传递给 vagrant provision
)?
如果可能的话,我不想依赖像 this 这样的 ENV 变量。
我认为环境变量是处理此问题的最常用方法,没有办法通过 vagrant up
或 vagrant provision
命令传递任何内容。以下是您可以探索的几个备选想法:
在 Dev 和 Prod 环境中还有其他不同之处。 Vagrantfile 只是一个 Ruby 脚本,所以任何可以检测到的东西都可以用来控制配置脚本序列。例如,presence/absence 文件、本地网络、主机名等
定义单独的 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
您还可以在您的清单中创建一个新变量来保存环境,例如 env: dev
在开发清单中和 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
更多信息:
我的 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
需要始终 运行,但是我需要有条件地 运行 其余条款。对于例如。如果 dev
模式,运行 provision/dev-setup.sh
是否有一些内置的 Vagrant 配置设置可以实现此目的? (比如将命令行参数传递给 vagrant provision
)?
如果可能的话,我不想依赖像 this 这样的 ENV 变量。
我认为环境变量是处理此问题的最常用方法,没有办法通过 vagrant up
或 vagrant provision
命令传递任何内容。以下是您可以探索的几个备选想法:
在 Dev 和 Prod 环境中还有其他不同之处。 Vagrantfile 只是一个 Ruby 脚本,所以任何可以检测到的东西都可以用来控制配置脚本序列。例如,presence/absence 文件、本地网络、主机名等
定义单独的 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
您还可以在您的清单中创建一个新变量来保存环境,例如 env: dev
在开发清单中和 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
更多信息: