3. 使用条件语句根据操作系统执行不同任务
任务目标
编写一个 Ansible Playbook,使其能够根据目标主机的操作系统类型(Ubuntu/Debian 或 CentOS/RHEL)自动选择对应的包管理器(apt 或 yum)并安装指定软件包。本案例以安装 curl 为例,但逻辑可复用于其他软件包。
实现思路
利用 Ansible 的 ansible_os_family 事实(fact)作为判断条件,通过 when 语句分别定义针对 Debian 系和 RedHat 系的任务。每个任务只在其匹配的系统上执行,从而实现跨平台兼容。
Playbook 完整代码
---
- name: Install package based on OS family
hosts: all
become: yes
vars:
target_package: curl
tasks:
- name: Install package on Debian/Ubuntu systems
ansible.builtin.apt:
name: "{{ target_package }}"
state: present
update_cache: yes
when: ansible_os_family == "Debian"
- name: Install package on CentOS/RHEL systems
ansible.builtin.yum:
name: "{{ target_package }}"
state: present
when: ansible_os_family == "RedHat"
运行方式
- 将上述代码保存为
install_by_os.yml。 - 确保控制节点已安装 Ansible,且目标主机在 inventory 中可访问。
- 执行命令:
ansible-playbook -i inventory install_by_os.yml
验证方法
- 语法检查:运行
ansible-playbook --syntax-check install_by_os.yml,无报错即通过。 - 实际执行:运行上述 Playbook,观察输出中每个任务的状态。若主机为 Ubuntu,应看到
apt任务状态为changed或ok,而yum任务被跳过(skipped);CentOS 主机则相反。 - 结果确认:在目标主机上执行
which curl或curl --version,能正常输出版本信息即表示安装成功。
关键说明
ansible_os_family是 Ansible 自动收集的系统事实,Ubuntu/Debian 返回Debian,CentOS/RHEL 返回RedHat,无需手动定义。- 若需安装其他软件,只需修改变量
target_package的值,无需改动任务逻辑。 - 对于 Fedora 等使用
dnf的系统,yum模块同样兼容,Ansible 会自动调用dnf作为后端。