Ansible 是一个用 python 编写的简单 IT 自动化平台,使您的应用程序和系统更易于部署。 在过去的几年里,它变得非常流行,但是在尝试运行 Ansible 时可能会遇到一些麻烦 Fedora 23.
Fedora 23 现在使用 Python 3 作为默认安装的 python 版本,但 Ansible 仍然需要 Python 2。由于 Ansible 仍然默认使用 Python 2,因此在尝试使用 Ansible 时可能会返回类似于以下的错误 Fedora 23:
GATHERING FACTS * failed: [f23] => {"failed": true, "parsed": false} /bin/sh: /usr/bin/python: No such file or directory
幸运的是,您可以在剧本中添加一些步骤,以完全解决此问题。 您可以选择在单个播放或多个播放中应用它们,如下所示。
解决方法 – 单一的多合一游戏
在单次播放的情况下,这是我在将配置应用于 vagrant box 时经常使用的东西,您可以通过以下步骤解决此问题:
- 显式禁用在初始化时收集事实
- 使用 Ansible 的 raw 模块安装 python2
- 显式调用设置模块再次收集事实
在 ansible 执行中默认发生的事实收集将尝试使用 python 2。我们必须禁用它,否则它会在执行之前失败 生的 ssh 命令来安装 python 2。幸运的是,我们仍然可以在单人游戏中使用事实,但是,通过显式调用 设置 安装python2后的模块。
因此,通过应用这些微小的更改,一个简单的多合一游戏可能看起来像:
- hosts: f23 remote_user: fedora gather_facts: false become_user: root become: yes tasks: - name: install python and deps for ansible modules raw: dnf install -y python2 python2-dnf libselinux-python - name: gather facts setup: - name: use facts lineinfile: dest=/etc/some-cfg-file line="myip={{ ansible_eth0.ipv4.address }}" create=true
并且运行 play 的输出应该是成功的:
PLAY [f23] **************************************************************** TASK: [install python and deps for ansible modules] *************************** ok: [f23] TASK: [gather facts] ********************************************************** ok: [f23] TASK: [use facts] ************************************************************* changed: [f23] PLAY RECAP ******************************************************************** f23 : ok=3 changed=1 unreachable=0 failed=0
解决方法 – 多次播放
如果您在剧本中使用多个剧本,那么您可以简单地让其中一个在其中安装 python 2 生的 模式,而其他的可以保持不变; 您不必明确收集事实,因为现在安装了 python 2。 所以对于第一场比赛,你会有类似的东西:
- hosts: f23 remote_user: fedora gather_facts: false become_user: root become: yes tasks: - name: install python and deps for ansible modules raw: dnf install -y python2 python2-dnf libselinux-python
并且,重新使用第二次播放上面示例中的代码如下所示:
- hosts: f23 remote_user: fedora become_user: root become: yes tasks: - name: use facts lineinfile: dest=/etc/some-cfg-file line="myip={{ ansible_eth0.ipv4.address }}" create=true
因此,在 Ansible 添加对 python 3 的一流支持之前,您应该使用这些小的更改进行备份并运行。
灵感主要来自 这 Lars Kellogg-Stedman 发布。