【问题标题】:Failover provisioners in Vagrant?Vagrant 中的故障转移供应商?
【发布时间】:2015-03-12 09:27:14
【问题描述】:

是否可以根据前一个配置器的成功或失败运行一个 Vagrant 配置器?

我有一个配置了 Ansible 的 Vagrant VM,我想分发给其他人。问题是,其中一些人正在运行 Windows,而 Ansible 不支持 Windows。我可以解决这个问题,但我想抓住失败的供应商并做其他事情。

确切地说,我只想在 Ansible 配置程序失败时运行 shell 配置程序。 Vagrantfile 只是 Ruby,所以看起来这应该是可能的,不管怎样。

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  # This fails on Windows
  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "vagrant/ansible/main.yml"
  end

  # Run this provisioner IF AND ONLY IF the Ansible provisioner has failed:
  config.vm.provision "shell", path: "failover.sh"

尝试在 Windows 上运行 Ansible 配置器时,Vagrant 返回此错误:

[default] Running provisioner: ansible...
The executable 'ansible-playbook' Vagrant is trying to run was not found
in the %PATH% variable. This is an error. Please verify this software is
installed and on the path.

【问题讨论】:

    标签: vagrant ansible


    【解决方案1】:

    我认为没有办法让故障转移配置程序... Vagrant 似乎只是在错误时停止而没有继续的方法。

    正如您所说,Vagrantfile 只是 Ruby,因此更好的选择可能是在尝试运行配置程序之前先检测机器上是否安装了 ansible。

    使用 this answer 中的 which 函数结合以下内容应该可以让你做你想做的事:

    if which('ansible-playbook')
        # This fails on Windows
        config.vm.provision "ansible" do |ansible|
            ansible.playbook = "vagrant/ansible/main.yml"
        end
    else
        # Run this provisioner IF AND ONLY IF the Ansible provisioner has failed:
        config.vm.provision "shell", path: "failover.sh"
    end
    

    【讨论】:

    • 好点,但在这种情况下,尝试将 ansible-playbook 运行到变量中可能更容易,如下所示:do_ansible = `ansible-playbook --version` rescue nil ?
    • 是的,这有点简单!
    【解决方案2】:

    检查平台而不是检查单个命令:

    if Vagrant::Util::Platform.windows?
      config.vm.provision "shell", path: "failover.sh"
    else
      config.vm.provision "ansible" do |ansible|
      ansible.playbook = "vagrant/ansible/main.yml"
    end
    

    【讨论】:

      【解决方案3】:

      对于 Windows 主机,在来宾操作系统中运行 ansible-playbook。

      failover.sh

      sudo apt-get install ansible -y
      ansible-playbook ansible/playbooks/vagrant-playbook.yml -i ansible/conf/hosts_local -c local
      

      (将你的 ansible 目录挂载到 vagrantbox 并提供一个)

      host_local

      [default]
      127.0.0.1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-06
        • 2012-07-13
        • 2014-06-14
        • 2019-05-01
        相关资源
        最近更新 更多