我在执行 Ansible playbook 以在 RHEL7 上使用
yum
和在 RHEL8 上使用 dnf
安装软件包时遇到问题。
我正在使用下面我的剧本中所示的条件,但不断出现错误。
错误
{"msg": "The conditional check 'ansible_os_family == \"RedHat\" and ansible_lsb.major_release|int == \"7\"' failed. The error was: error while evaluating conditional (ansible_os_family == \"RedHat\" and ansible_lsb.major_release|int == \"7\"): 'dict object' has no attribute 'major_release'\n\nThe error appears to be in '/ansible/master/intall.pkg.yml': line 9, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n # (Task-1) Checks if ansible_os_family == \"RHEL7\" and then Installs telnet on Remote Node\n - name: Install telnet on RHEL7 Server\n ^ here\n"}
剧本
---
- hosts: all
gather_facts: true
become: yes
#become_user: ansible
become_method: sudo
tasks:
# (Task-1) Checks if ansible_os_family == "RHEL7" and then Installs telnet on Remote Node
- name: Install telnet on RHEL7 Server
yum: name=telnet state=present
when: ansible_os_family == "RedHat" and ansible_lsb.major_release|int == "7"
# (Task-2) Checks if ansible_os_family == "RHEL8" and then Installs telnet on Remote Node
- name: Install telnet on RHEL8 Server
package: name=telnet state=present
when: ansible_os_family == "RedHat" and ansible_lsb.major_release|int == "8"
如何使用我的剧本跳过 RHEL7 并使用
dnf
在 RHEL8 上安装软件包?
谢谢你。
正如 @Zeitounator 的评论中已经提到的,您可以查看基于 ansible_facts
- name: "Install telnet on RHEL-{{ ansible_distribution_major_version }} Remote Node"
yum:
name: telnet
state: present
when: ansible_distribution == 'RedHat' and ansible_distribution_major_version == '7'
- name: "Install telnet on RHEL-{{ ansible_distribution_major_version }} Remote Node"
yum:
name: telnet
state: present
when: ansible_distribution == 'RedHat' and ansible_distribution_major_version == '8'
这之所以成为可能,是因为
这意味着在您的具体情况下使用 或虽然 RHEL 8 中使用的 YUM v4 基于 DNF,但它与 RHEL 7 中使用的 YUM v3 兼容。对于软件安装,
yum
命令及其大多数选项的工作方式与RHEL 8 就像在 RHEL 7 中一样。
package
模块
除非软件包的可用性和/或命名存在差异,否则不需要条件检查。此模块管理目标上的包,无需指定包管理器模块(如 ansible.builtin.yum、ansible.builtin.apt,...)。在机器的异构环境中使用很方便,无需为每个包管理器创建特定的任务。
package
在模块后面调用模块发现的操作系统使用的包管理器ansible.builtin.setup。
单个任务,例如
- name: "Install telnet on RHEL-{{ ansible_distribution_major_version }} Remote Node"
package: # or even yum
name: telnet
state: present
应该可以工作。根据您的基础设施并为未来版本做好准备,您可以切换到适用于 RHEL-8 和 RHEL-9 实例的 模块。
- name: "Install telnet on RHEL-{{ ansible_distribution_major_version }} Remote Node"
dnf:
name: telnet
state: present
when: ansible_distribution == 'RedHat' and ansible_distribution_major_version == '8'