有条件地在Vagrantfile中调用不同的配置

时间:2015-03-09 11:59:46

标签: vagrant 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需要始终运行,但我需要有条件地运行剩余的条款。对于Eg。如果dev模式,请运行provision/dev-setup.sh

是否有一些内置的Vagrant配置设置来实现这一目标? (比如将命令行参数传递给vagrant provision)?

如果可能,我不想依赖this之类的ENV变量。

2 个答案:

答案 0 :(得分:7)

我认为环境变量是处理此问题的最常用方法,并且无法通过vagrant upvagrant provision命令传递任何内容。以下是您可以探索的几个替代想法:

  1. 在Dev与Prod环境中有其他不同之处。 Vagrantfile只是一个Ruby脚本,因此任何可以检测到的东西都可以用来控制配置脚本序列。例如,文件,本地网络,主机名等的存在/不存在

  2. 定义单独的Vagrant节点,这些节点实际上是相同的,但根据配置而有所不同。例如,使用如下文件,您可以执行vagrant up prodvagrant 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

更多信息: