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"

运行方式

  1. 将上述代码保存为 install_by_os.yml。
  2. 确保控制节点已安装 Ansible,且目标主机在 inventory 中可访问。
  3. 执行命令:ansible-playbook -i inventory install_by_os.yml

验证方法

  1. 语法检查:运行 ansible-playbook --syntax-check install_by_os.yml,无报错即通过。
  2. 实际执行:运行上述 Playbook,观察输出中每个任务的状态。若主机为 Ubuntu,应看到 apt 任务状态为 changed 或 ok,而 yum 任务被跳过(skipped);CentOS 主机则相反。
  3. 结果确认:在目标主机上执行 which curl 或 curl --version,能正常输出版本信息即表示安装成功。

关键说明

  • ansible_os_family 是 Ansible 自动收集的系统事实,Ubuntu/Debian 返回 Debian,CentOS/RHEL 返回 RedHat,无需手动定义。
  • 若需安装其他软件,只需修改变量 target_package 的值,无需改动任务逻辑。
  • 对于 Fedora 等使用 dnf 的系统,yum 模块同样兼容,Ansible 会自动调用 dnf 作为后端。