在本章中,我将为您介绍 Ansible 中的角色(Role)是什么,以及如何在您的 Ansible Playbook 中日常使用它。

Ansible 角色的作用

  1. 实现代码复用 角色是 Ansible 中实现代码复用的重要机制,类似于传统编程中的函数。通过使用角色,您可以更快速地开发 Playbook,并复用 Ansible 代码。

角色的目录结构

角色通常具有以下目录结构:

user.example/
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml
  • defaults: main.yml 文件包含角色变量的默认值,这些值可以在使用角色时被覆盖。这些变量的优先级较低,通常用于在 Play 中被修改和定制。
  • files: 该目录包含角色任务中引用的静态文件。
  • handlers: main.yml 文件包含角色的处理器定义。
  • meta: main.yml 文件包含角色的相关信息,包括作者、许可证、支持的平台以及可选的角色依赖。
  • tasks: main.yml 文件包含角色的任务定义。
  • templates: 该目录包含角色任务中引用的 Jinja2 模板。
  • tests: 该目录可以包含用于测试角色的清单文件和 test.yml Playbook。
  • vars: main.yml 文件定义角色的变量值。这些变量通常用于角色内部,优先级较高,不建议在 Play 中修改。

并非每个角色都会包含所有这些目录。

在 Playbook 中使用 Ansible 角色

示例 1:简单角色使用

文件名:role_simple.yml

---
- name: role example
  hosts: all
  roles:
    - role1
    - role2
  • 功能:将 role1 和 role2 应用于所有受管主机。

示例 2:带变量的角色使用

文件名:role_vars.yml

---
- name: role example
  hosts: all
  roles:
    - role: role1
    - role: role2
      var1: value
      var2: value
  • 功能:将 role1 和 role2 应用于所有受管主机。role2 带有两个变量参数。

角色的执行顺序

在 Playbook 中,任务的执行顺序如下:

  1. pre_tasks: 在角色执行之前运行的任务。如果这些任务通知了处理器,则这些处理器任务会在角色或正常任务之前执行。
  2. 角色任务: 角色的任务被添加到任务列表的开头。如果有多个角色,第二个角色的任务列表会添加在第一个角色之后。
  3. 正常任务: Playbook 中定义的普通任务。
  4. post_tasks: 在 Playbook 的正常任务之后执行的任务。如果这些任务通知了处理器,则这些处理器任务会在角色任务或正常任务之后运行。
  5. 处理器: 在所有任务执行完成后,通知的处理器任务会被执行。

示例文件:role_order.yml

---
- name: order of execution example
  hosts: all
  pre_tasks:
    - debug:
        msg: 'pre-task'
      notify: my handler
  roles:
    - role1
  tasks:
    - debug:
        msg: 'first task'
      notify: my handler
  post_tasks:
    - debug:
        msg: 'post-task'
      notify: my handler
  handlers:
    - name: my handler
      debug:
        msg: Running my handler

Ansible Galaxy

Ansible Galaxy 是一个社区驱动的平台,用于共享和下载 Ansible 角色。

手动安装角色

$ ansible-galaxy install geerlingguy.redis -p roles/

使用 requirements.yml 安装角色

文件名:requirements.yml

- src: geerlingguy.redis
  version: "1.5.0"

安装命令:

$ ansible-galaxy install -r roles/requirements.yml -p roles

通过 Ansible Galaxy,您可以轻松地安装和管理角色,从而加速开发并复用社区提供的高质量代码。

总结

Ansible 角色是实现代码复用的重要机制,通过合理的目录结构和清晰的执行顺序,您可以更高效地开发 Playbook。Ansible Galaxy 提供了一个丰富的角色库,帮助您快速获取和使用高质量的 Ansible 角色。