1

是否可以根据前一个供应商的成功或失败来运行一个 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.
4

3 回答 3

1

我不认为有办法让故障转移供应商...... Vagrant 似乎只是停止出错而没有办法继续。

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

使用此答案中的 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
于 2013-10-15T20:32:54.690 回答
0

与其检查单个命令,不如检查平台:

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
于 2014-10-05T22:17:06.840 回答
0

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

故障转移.sh

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

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

主机本地

[default]
127.0.0.1
于 2015-03-12T01:27:14.243 回答