ansible2.8.0 版本更新后,Amazon Linux 的 EC2 实例上的 playbook(包含 yum module)无法正常运行的 bug 的临时解决方案

首先

我更新了Ansible2.8.0后,包含yum模块的playbook无法正常运行。其他模块可以正常进行dry run和应用。

我向ansible用户组问了一个问题,虽然得到了解决,但我想可能还有其他人遇到了同样的困难,所以我写了这篇文章。

※2019/07/01 由于Ansible2.8.1进行了修复,因此只要更新就不会出现错误。

环境。

MacBookAir
操作系统:Mojave 10.14.4
从本地环境的终端运行
对AWS EC2的amazon linux实例执行操作

ansible版本2.8.0

执行ansible-playbook时发生的错误

在common role的main.yml文件中,包含了多个任务。其中一个任务是执行base-packages.yml文件中的yum模块。然而,在执行该模块时出现了下面的错误,无法执行。

fatal: [xxx-xxxx-xxx01]: FAILED! => {"changed": false, "msg": "`python2-dnf` is not installed, but it is requiredfor the Ansible dnf module.", "results": []}
# ansible-playbook -i hosts xxxx-xxx.yml -l xxx-xxxx-xxx01 --check --diff

PLAY [all] *******************************************************************************************

TASK [Gathering Facts] *******************************************************************************
ok: [xxx-xxxx-xxx01]

TASK [common : include tasks/base-packages.yml] ******************************************************
included: /Users/xxxx/git/xxxx_xxxx/xxxx_xxx/ansible/roles/common/tasks/base-packages.yml for xxx-xxxx-xxx01

TASK [common : yum install bacepackage] **************************************************************
fatal: [xxx-xxxx-xxx01]: FAILED! => {"changed": false, "msg": "`python2-dnf` is not installed, but it is requiredfor the Ansible dnf module.", "results": []}

PLAY RECAP *******************************************************************************************
xxx-xxxx-xxx01            : ok=2    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0
# cat xxxx-xxx.yml
- hosts: all
  become: True
  roles:
    - common
# cat roles/common/tasks/main.yml

- name: include tasks/base-packages.yml
  include_tasks: tasks/base-packages.yml

- name: include tasks/timezone.yml
  include_tasks: tasks/timezone.yml

- name: include tasks/hostname.yml
  include_tasks: tasks/hostname.yml
# cat roles/common/tasks/base-packages.yml

- name: yum install bacepackage
  yum:
    name: ['vim', 'zsh', 'git', 'tree', 'htop', 'mlocate', 'telnet', 'yum-plugin-changelog']
    state: present

错误概述

如果在 Amazon Linux 上运行 Ansible,则似乎识别的软件包管理器是 dnf。
基于此,yum 模块将此内容视为 dnf 的软件包管理器。
因此,出现了找不到 dnf 依赖的“python-dnf”错误。

解决方案 (jiě jué cè)

似乎已经在 Ansible 的 GitHub 上提出了此问题。

因为在这里找到能够解决问题的评论,我想和您分享一下。

在这个代码的注释中,我们使用 set_fact 来强制覆盖 Ansible 的事实变量,并将虚拟机可用的软件包管理器从 dnf 替换成了 yum。

在我的代码中具体来说,我已经插入了如下内容。

发生错误时的代码

# cat roles/common/tasks/base-packages.yml

- name: yum install bacepackage
  yum:
    name: ['vim', 'zsh', 'git', 'tree', 'htop', 'mlocate', 'telnet', 'yum-plugin-changelog']
    state: present

修复了错误的代码。

cat roles/common/tasks/base-packages.yml
- set_fact:
    ansible_facts:
      pkg_mgr: yum


- name: yum install bacepackage
  yum:
    name: ['vim', 'zsh', 'git', 'tree', 'htop', 'mlocate', 'telnet', 'yum-plugin-changelog']
    state: present

yum模块已成功通过。

TASK [common : include tasks/base-packages.yml] *****************************************************
included: /Users/xxxx/git/xxxx_xxxx/xxxx_xxx/ansible/roles/common/tasks/base-packages.yml for xxx-xxxx-xxx01

TASK [common : set_fact] ****************************************************************************
ok: [xxx-xxxx-xxx01]

TASK [common : yum install bacepackage] *************************************************************
 [WARNING]: Platform linux on host xxx-xxxx-xxx01 is using the discovered Python interpreter at
/usr/bin/python, but future installation of another Python interpreter could change this. See
https://docs.ansible.com/ansible/2.8/reference_appendices/interpreter_discovery.html for more
information.

ok: [xxx-xxxx-xxx01]

总结

非常感谢回答问题的Ansible用户组的大家。
在问题的最后部分提到了预计在2.8.1版本中解决的内容。
如果没有急需的话,我认为可以等待2.8.1版本的发布。
如果无法等待,还可以通过pip降低Ansible版本来解决。

通过始终更新至最新版本的方式,可能存在着包含错误的可能性,但这样做也有助于理解使用的工具中的错误。

我希望通过更新至最新版本并快速使用新功能,始终保持获取信息的态度。

如果您对 Ansible2.8.0 新增的功能有兴趣,可以阅读此文章:https://tekunabe.hatenablog.jp/entry/2019/05/16/ansible28 。

在这个活动中,我们将介绍Ansible2.8.0的新功能以及举办LT等活动!由于我身在东京,所以我决定远程参加!
https://ansible-users.connpass.com/event/130456/

请参考以下网站

我在Amazon Linux上开始推荐使用dnf而感到困扰的ansible。

检查Ansible的事实变量。

「Ansible 2.8.0在Amazon Linux上安装yum软件包失败」
https://github.com/ansible/ansible/issues/56583

bannerAds