问题描述
在使用 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_distribution
和 ansible_distribution_major_version
判断操作系统类型是因为这些信息直接指明了特定的发行版,而使用 ansible_os_family
则更为通用。
使用 ansible_distribution 和 ansible_distribution_major_version
通过判断 ansible_distribution
及其版本来确定操作系统类型是很常见的做法,因为这些变量提供了具体的发行版信息。例如,ansible_distribution
的值可以是 “CentOS”、”RedHat”、”Debian” 等。
以下是一个使用 ansible_distribution
和 ansible_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_distribution
和 ansible_distribution_major_version
可以更精确地根据发行版执行任务,而使用 ansible_os_family
则更加通用,适用于不同 EL 衍生版本。选择哪种判断方式取决于你的需求和偏好,以及是否需要特定版本的区分。无论选择哪种方式,Ansible 都能满足你的条件判断需求。