在Ansible中如何根据操作系统类型执行任务

233次阅读
没有评论

问题描述

在使用 Ansible 的 playbook 过程中,有时需要根据操作系统的类型(如 CentOS、RHEL 等)来决定是否执行某个任务,或者根据操作系统家族(os_family)来进行条件判断。比较常见的例子是在不同的 Linux 发行版上,软件包的命名可能会有所不同。很多 Ansible playbook 都会使用类似下面的方式添加一个 “when:” 条件来判断操作系统类型:

when: ansible_distribution == 'CentOS' or ansible_distribution == 'RedHat'

但也有一些人使用以下方式进行操作系统家族的判断:

when: ansible_os_family == 'RedHat'

这种方式更加直接和简洁,并且支持各种 EL(Enterprise Linux)的衍生版本,比如 Scientific Linux 和 Rocky Linux,而不需要不断添加到一个可能的 EL 衍生版本列表中。那么,为什么前一种判断方式更加常见呢?我是否遗漏了什么内容?

解决方案

在 Ansible 中,根据操作系统类型或家族执行任务是一个常见的需求。两种判断方式都是有效的,但使用 ansible_distributionansible_distribution_major_version 判断操作系统类型是因为这些信息直接指明了特定的发行版,而使用 ansible_os_family 则更为通用。

使用 ansible_distribution 和 ansible_distribution_major_version

通过判断 ansible_distribution 及其版本来确定操作系统类型是很常见的做法,因为这些变量提供了具体的发行版信息。例如,ansible_distribution 的值可以是 “CentOS”、”RedHat”、”Debian” 等。

以下是一个使用 ansible_distributionansible_distribution_major_version 的示例条件判断:

- name: Install package on CentOS
  yum:
    name: your_package
    state: present
  when: ansible_distribution == 'CentOS' and ansible_distribution_major_version|int >= 7

- name: Install package on Ubuntu
  apt:
    name: your_package
    state: present
  when: ansible_distribution == 'Ubuntu'

使用 ansible_os_family

另一种方法是使用 ansible_os_family 这个更为通用的变量来判断操作系统家族。这样的话,无论是 CentOS、RHEL、Scientific Linux 还是 Rocky Linux,都会被归类到 “RedHat” 家族中。

以下是一个使用 ansible_os_family 的示例条件判断:

- name: Install package on RedHat family
  yum:
    name: your_package
    state: present
  when: ansible_os_family == 'RedHat'

- name: Install package on Debian family
  apt:
    name: your_package
    state: present
  when: ansible_os_family == 'Debian'

总结

使用 ansible_distributionansible_distribution_major_version 可以更精确地根据发行版执行任务,而使用 ansible_os_family 则更加通用,适用于不同 EL 衍生版本。选择哪种判断方式取决于你的需求和偏好,以及是否需要特定版本的区分。无论选择哪种方式,Ansible 都能满足你的条件判断需求。

正文完