在使用Vagrant1.8.1及更早版本与Ansible2进行组合时,可以使用ansible_local provisioner
截至2016年7月,已经发布了Vagrant1.8.5版本,因此此页面的内容已经变得无关紧要。除非有特殊原因,建议使用Vagrant1.8.4或更高版本。
以下是截至2016/05的描述,当时Vagrant和Ansible的最新版本如下:
-
- Vagrant:1.8.1
- Ansible:2.0.2
两个Ansible配置工具
如果在Vagrant中使用Ansible,有以下两种配置管理器。
-
- ansible プロビジョナ
- ansible_local プロビジョナ
虽然使用配置管理工具不是必需的,但如果在 Vagrant 文件中记录下来,可以通过 vagrant up 或 vagrant provision 命令进行执行,非常方便。
Ansible部署器在运行Vagrant的主机上执行Ansible。
ansible_local部署器在通过Vagrant构建的客户机上执行Ansible。如果客户机操作系统中未安装ansible,则会自动安装并执行。
如果使用Vagrant和Ansible,就不需要在主机上安装Ansible,使用ansible_local provisioner会更方便。
使用 Vagrant 1.8.1 版本时,使用 ansible_local provisioner 会导致错误发生。
然而,到目前为止(2016/05)看起来ansible_local配置管理工具无法兼容Ansible2,会出现以下错误导致无法执行。
The Ansible software could not be found! Please verify
that Ansible is correctly installed on your guest system.
If you haven't installed Ansible yet, please install Ansible
on your Vagrant basebox, or enable the automated setup with the
`install` option of this provisioner. Please check
https://docs.vagrantup.com/v2/provisioning/ansible_local.html
for more information.
然而,当进入客户操作系统并执行ansible –version命令时,安装的版本是2.0.2。
为什么无法运行?
如果在运行ansible-galaxy –help时,provisioner ansible_local的状态码为0,则判断ansible已被安装。然而,从Ansible2开始,返回的状态码不是0,导致错误报告为“未安装Ansible!”。
解决方法是使用权宜之计
怎么办?为了避免这个错误,下面的代码可以这样操作。
begin
Vagrant.require_version(">= 1.8.2")
rescue
config.vm.provision "shell", inline: <<-SHELL
echo '#!/bin/bash' > /usr/local/bin/ansible-galaxy
echo '/usr/bin/ansible-galaxy "$@" || exit 0' >> /usr/local/bin/ansible-galaxy
chmod 755 /usr/local/bin/ansible-galaxy
SHELL
end
config.vm.provision :ansible_local do |ansible|
ansible.playbook = "provisioning/site.yml"
end
在ansible_local提供程序之前执行shell提供程序,创建以下文件,并强制将/usr/bin/ansible-galaxy的状态代码设置为0,以欺骗提供程序对Ansible安装的检查。
#!/bin/bash
/usr/bin/ansible-galaxy "$@" || exit 0
使用begin和rescue来包围是为了只在低于Vagrant 1.8.2版本上运行。这个ansible_local provisioner的bug似乎在Vagrant 1.8.2中得到修复。