1. 概述

Ansible 是一个非常强大的自动化配置和部署工具,但其术语体系对于初学者来说可能会有些混乱。比如 Task、Role、Play、Playbook 这些概念,乍看之下容易混淆。但它们在 Ansible 中各自扮演着关键角色,理解它们的区别是掌握 Ansible 的基础。

本文将从实际用途和结构角度出发,清晰区分这四个核心概念,帮助你更高效地组织和编写 Ansible 脚本。


2. Task(任务)

Task 是 Ansible Playbook 中最小的执行单元,用于描述一个具体的配置操作或命令执行。每个 Task 都调用一个模块(module)来完成特定任务,例如安装软件、修改配置文件、重启服务等。

例如,使用 ansible.builtin.package 模块安装 Apache:

- name: Install Apache
  ansible.builtin.package:
    name: apache2
    state: present

这段代码表示:在目标主机上安装名为 apache2 的软件包(如果尚未安装)。

再比如,卸载 MariaDB:

- name: Remove MariaDB
  ansible.builtin.package:
    name: mariadb-server
    state: absent

关键点

  • 每个 Task 都是一个模块调用
  • Task 以列表形式组织,按顺序执行
  • 可以传入参数控制模块行为

3. Play(剧本)

Play 是一个或多个 Task 的集合,它定义了这些任务将在哪些主机(hosts)上执行。Play 是 Playbook 的基本执行单元。

Play 必须包含 hoststasks 两个字段:

- hosts: all
  tasks:
    - name: Install Apache
      ansible.builtin.package:
        name: apache2
        state: present

    - name: Remove MariaDB
      ansible.builtin.package:
        name: mariadb-server
        state: absent

这段 Play 表示:在所有主机上先安装 Apache,再卸载 MariaDB。

⚠️ 注意

  • hosts 字段指定目标主机或主机组(如 webservers, databases
  • Play 可以包含 handlers, variables, roles 等高级特性

4. Role(角色)

Role 是 Ansible 中用于组织和复用代码的核心机制。它将 Task、变量、文件、模板等资源封装在一个标准目录结构中,便于在多个 Playbook 中重复使用。

4.1. Role 的目录结构

一个标准的 Role 目录结构如下:

role_1/
├── README.md
├── defaults/
│   └── main.yml
├── files/
├── handlers/
│   └── main.yml
├── meta/
│   └── main.yml
├── tasks/
│   └── main.yml
├── templates/
└── vars/
    └── main.yml

每个子目录都有其特定用途,例如:

  • tasks/main.yml:定义主任务列表
  • handlers/main.yml:定义触发器任务
  • defaults/main.yml:定义默认变量
  • vars/main.yml:定义变量(优先级高于 defaults)

4.2. 在 Play 中引入 Role

Role 不能直接写在 Playbook 中,但可以通过 roles 关键字引入:

- hosts: all
  roles:
    - role_1

你也可以指定 Role 的路径:

- hosts: all
  roles:
    - baeldung_roles/role_1

4.3. 在 Task 中动态引入 Role

使用 include_roleimport_role 可以在 Task 中引入 Role:

- name: Include role_1
  include_role:
    name: role_1

区别在于:

  • include_role:动态加载,Ansible 在执行到该 Task 时才解析 Role
  • import_role:静态加载,Ansible 在 Playbook 开始时就解析 Role

4.4. Role 依赖(Role Dependencies)

meta/main.yml 中可以声明 Role 的依赖项:

dependencies:
  - role: role_2

这样,当 Role A 被引入时,Role B 也会自动被加载。


5. Playbook(剧本)

Playbook 是 Ansible 的最高层级配置文件,由一个或多个 Play 构成。它是执行 Ansible 自动化任务的入口文件。

例如,一个包含两个 Play 的 Playbook:

- hosts: databases
  tasks:
    - name: Remove MariaDB
      ansible.builtin.package:
        name: mariadb-server
        state: absent

- hosts: webservers
  tasks:
    - name: Install Apache
      ansible.builtin.package:
        name: apache2
        state: present

这段 Playbook 表示:

  1. databases 主机组上卸载 MariaDB
  2. webservers 主机组上安装 Apache

关键点

  • Playbook 是 YAML 文件
  • Playbook 是 ansible-playbook 命令的输入
  • Playbook 可以组织多个 Play,实现复杂自动化流程

6. 总结

概念 描述
Task 最小执行单元,调用模块完成具体操作
Play 一组 Task 的集合,定义在哪些主机上执行
Role 可复用的代码模块,包含 Task、变量、文件等
Playbook 多个 Play 的集合,是 Ansible 自动化的入口文件

建议

  • 初学时从 Task 和 Play 开始,逐步过渡到 Role 和 Playbook
  • 尽量使用 Role 提高代码复用性和可维护性
  • Playbook 是组织多个 Play 的最佳方式,适合构建复杂自动化流程

掌握这四个核心概念,你就能更清晰地理解 Ansible 的工作流程,写出结构更清晰、可维护性更强的自动化脚本。


原始标题:Difference Between Task, Role, Play, and Playbook in Ansible