是否可以根据前一个配置程序的成功或失败运行一个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.
答案 0 :(得分:1)
我认为没有办法让故障转移供应商... Vagrant似乎只是在没有办法继续的情况下停止错误。
正如你所说Vagrantfile
只是Ruby,所以更好的选择可能是在尝试运行配置程序之前检测是否在机器上安装了ansible。
使用this answer中的哪个功能结合以下内容可以让您做您想做的事情:
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
答案 1 :(得分: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
答案 2 :(得分:0)
对于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