在使用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中得到修复。

在筆者的環境中(使用boxcutter/centos71),使用Vagrant1.8.5進行虛擬主機的SSH登入密鑰設定失敗,導致無法登入。這個問題無法被驗證。而在Vagrant1.8.4中,這個問題並不存在,證實這項小技巧不再需要。
广告
将在 10 秒后关闭
bannerAds