有条件地调用 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 upvagrant provision 命令传递任何内容。以下是您可以探索的几个备选想法:

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

  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
    

您还可以在您的清单中创建一个新变量来保存环境,例如 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

更多信息: