Ansible:使用 yum 和 dnf 安装软件包的 Playbook

问题描述 投票:0回答:1

我在执行 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 上安装软件包?

谢谢你。

ansible rhel rhel7 ansible-facts
1个回答
0
投票

正如 @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 中的软件管理工具

虽然 RHEL 8 中使用的 YUM v4 基于 DNF,但它与 RHEL 7 中使用的 YUM v3 兼容。对于软件安装,yum

 命令及其大多数选项的工作方式与RHEL 8 就像在 RHEL 7 中一样。

这意味着在您的具体情况下使用

yum

package
 模块

此模块管理目标上的包,无需指定包管理器模块(如 ansible.builtin.yumansible.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 实例的

dnf

 模块。

- 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'
    
© www.soinside.com 2019 - 2024. All rights reserved.