Ansible 条件判断
一、使用 when
进行条件判断
- 功能:
when
关键字用于在 Ansible 任务中进行条件判断,决定任务是否执行。when
语句后面跟随一个条件表达式,只有当条件为真时,任务才会被执行。 - 用法:
when
后面可以是一个简单的布尔值、变量、或者更复杂的表达式。条件表达式可以根据变量的值、主机的事实(facts)、命令的结果等来定义。
示例:
tasks:
- name: Install Nginx on RedHat systems
yum:
name: nginx
state: present
when: ansible_facts['os_family'] == 'RedHat'
- 解释:该任务使用
when
条件判断语句,只有在操作系统家族(os_family)为RedHat
时,才会执行安装 Nginx 的任务。
二、多条件判断(and、or、not)
- 功能:Ansible 支持使用
and
、or
、not
等逻辑操作符进行多条件判断,使条件判断更加灵活和复杂。 - 用法:使用
and
连接多个条件,表示所有条件都必须为真;使用or
连接多个条件,表示只需任意一个条件为真;使用not
表示条件为假时执行任务。
示例:
2.1 使用 and
和 or
tasks:
- name: Install Apache on Ubuntu systems with 4GB RAM or more
apt:
name: apache2
state: present
when: ansible_facts['ansible_distribution'] == 'Ubuntu' and ansible_facts['ansible_memtotal_mb'] >= 4096
- 解释:该任务只有在操作系统为 Ubuntu 且内存大于等于 4GB 时,才会执行安装 Apache 的操作。
tasks:
- name: Install software on RedHat or Ubuntu systems
package:
name: httpd
state: present
when: ansible_facts['os_family'] == 'RedHat' or ansible_facts['ansible_distribution'] == 'Ubuntu'
- 解释:该任务只有在操作系统家族为 RedHat 或者发行版为 Ubuntu 时,才会执行安装
httpd
软件包的操作。
2.2 使用 not
tasks:
- name: Ensure Nginx is not installed on non-RedHat systems
yum:
name: nginx
state: absent
when: not ansible_facts['os_family'] == 'RedHat'
- 解释:该任务只有在操作系统家族不是 RedHat 时,才会执行卸载 Nginx 的操作。
三、基于变量、事实和命令结果的条件
- 基于变量的条件:条件可以直接使用变量的值,变量的值通常是在 Playbook 中定义的,也可以是通过
set_fact
动态设置的。
示例:
tasks:
- name: Install Nginx if needed
yum:
name: nginx
state: present
when: nginx_needed
-
解释:该任务会检查变量
nginx_needed
的值,如果为true
,则执行安装 Nginx。 -
基于事实(facts)的条件:Ansible 在执行 Playbook 时会收集目标主机的事实信息(如操作系统类型、内存大小等),可以使用这些事实信息进行条件判断。
示例:
tasks:
- name: Ensure high availability setup on Debian systems
service:
name: corosync
state: started
when: ansible_facts['ansible_distribution'] == 'Debian'
-
解释:该任务只有在操作系统为 Debian 时,才会启动
corosync
服务。 -
基于命令结果的条件:可以使用
register
保存命令执行的结果,并基于结果进行条件判断。
示例:
tasks:
- name: Check if Apache is running
shell: systemctl status apache2
register: apache_status
ignore_errors: yes
- name: Restart Apache if it's not running
service:
name: apache2
state: restarted
when: apache_status.rc != 0
- 解释:
- 第一个任务执行
systemctl status apache2
命令,检查 Apache 服务的状态,并将结果保存到变量apache_status
中。 - 第二个任务使用
when
语句,只有当apache_status
的返回码(rc)不为 0 时,才会执行重启 Apache 服务的操作。
- 第一个任务执行
通过使用 when
关键字和逻辑操作符,Ansible 可以根据不同的条件来执行任务,使 Playbook 更加灵活和智能化。