确认!在Vagrant的ansible_local中,如果找不到ansible会导致失败的原因和解决办法

你好,我是OakFun的@dz_,也就是大平和美。

开场白 – 一开始

我最近开始使用 Vagrant 来创建本地环境,并逐渐进行个性化定制。

因为在Shell上进行配置变得麻烦,所以我想要使用Ansible,但是如果主机操作系统是Windows的话就需要依赖Cygwin,这同样很麻烦。因此,我决定使用ansible_local作为Provisioner。

然而,然而!!

经过几天的纠结和困扰,终于解决了以下所述的错误,现在我来分享一下(*ノД`)ノ

请注意,虽然此次的宿主操作系统是Windows,但宿主操作系统的种类并不重要。在Mac OS上,已经确认存在相同的错误。

结论:原因是因为 Ansible 的版本不匹配。

总结起来,ansible_local Provisioner在当前版本2.0.1的Ansible中无法正常运行。(截至2016年3月)

因此,可以通过先安装Ansible的1.x版本,使得我们能够在配置管理中执行Ansible Playbook。

那么,接下来我将详细说明以下内容。

详细介绍

Ansible本地配置管理是什么

在 Vagrant 中,可以使用 Ansible 进行配置。有两种预设的 Provisioner,即 ansible 和 ansible_local。

Provisionerプロビジョニングの仕組みansibleホストOS上の Ansible を使ってプロビジョニングansible_localゲストOS上の Ansible を使ってプロビジョニング

如果使用ansible_local,不需要在主机操作系统中安装Ansible,可以避免污染本地环境。

    Ansible Local – Provisioning – Vagrant by HashiCorp

找不到Ansible错误

但是当实际使用 ansible_local 时,我遇到了以下错误。

# Vagrant を起動したところ...
vagrant up

...<略>...

==> default: Running provisioner: ansible_local...
    default: Installing Ansible...
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 软件。

正如错误信息所示,ansible_local可以通过指定ansible.install = true来自动安装Ansible到宿主操作系统中(请参考以下脚本)。

然而,即使指定了自动安装,仍然会因为这个错误而崩溃。

Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "playbook.yml"
    ansible.install = true    # Ansible を自動でインストールさせる指定
  end
end

提示

尽管发生了上述错误,但实际上 Ansible 已经正确安装了。

vagrant@vagrant-ubuntu-trusty-64:~$ ansible --version
ansible 2.0.1.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides

我因为束手无策,所以咨询了一位经验丰富的前辈,并且他提出了对Ansible版本表示怀疑的建议,你觉得呢?

处理 (duì chǔ)

所以,当我明确地安装了 Ansible 的 1.x 系列版本后,它成功地运行了!

另外,嘉宾操作系统预设为 Ubuntu。如使用其他操作系统,请确认 Ansible 的安装方法。

Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/trusty64"

  # 先に Ansible 1.x をインストールさせる
  config.vm.provision :shell, path: "install-ansible.sh"

  # Ansible_local で任意の Playbook を実行する
  config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "playbook.yml"
  end
end
#!/usr/bin/env bash

# PPA から Ansible 1.x 系バージョンのリポジトリを登録する
apt-get install -y software-properties-common
apt-add-repository -y ppa:ansible/ansible-1.9
apt-get update

# Ansible 1.x 系バージョンをインストールする
apt-get install -y ansible=1.9.4-1ppa~trusty

完成了!(*´・ω・)ノシ

结语-结束

这次我经过了长时间的烦恼后,找到了大神级别的前辈 @kazumihirose,在他的帮助下,得知问题可能不是Ansible版本导致的,最后问题得以解决!感谢您一如既往的可靠帮助,非常感谢!

附注:如果主机操作系统是Windows,则Ansible Local的配置将失败。

如果在上述处理中,使用 Ansible Local 进行引导时可以正常进行配置,但在引导后尝试进行配置时出现以下错误,则可能是其他原因。

ansible本地提供程序:
* 客户端上不存在playbook: C:/vagrant/ansible/playbook.yml

似乎有人提供了以下的补丁。请根据您自己的判断进行使用。(我自己没有尝试过。)