Ansible 角色(Roles)

发布于:2025-09-10 ⋅ 阅读:(21) ⋅ 点赞:(0)

Ansible 角色(Roles)

一、角色(Roles)核心概念

Ansible 角色是一种模块化组织任务、变量、模板等资源的机制,通过固定目录结构将自动化逻辑拆分,实现代码复用、结构清晰、便于协作维护的目标。

无论是自定义角色、第三方下载角色,还是系统自带角色,均遵循统一的目录规范,核心解决 “复杂 Playbook 臃肿、重复代码多” 的问题。

二、角色的固定目录结构

通过 ansible-galaxy init [角色名] 创建的角色,默认生成以下目录(每个目录功能明确):

目录 / 文件

核心功能

defaults/

角色的默认变量(优先级最低,可被外部变量覆盖),通常存放 main.yml

vars/

角色的私有变量(优先级较高,仅角色内部使用,不建议外部修改)

files/

存放静态文件(如配置文件、脚本),角色中引用时无需写路径,直接用文件名

templates/

存放模板文件(.j2 格式,支持变量替换),引用时直接用模板名

handlers/

角色的处理器(如服务重启),需通过 notify 触发,默认文件 main.yml

meta/

角色的元数据(如作者、版本、依赖关系),默认文件 main.yml

tasks/

角色的核心任务(自动化逻辑),默认文件 main.yml(必须存在)

tests/

角色的测试文件(如测试 Playbook、inventory),用于验证角色功能

README.md

角色的帮助文档(使用说明、参数列表、示例)

三、角色的使用优先级

在 Playbook 中,角色与任务的执行顺序遵循固定优先级(从先到后):

pre_tasks(Play 前置任务) → roles(角色) → tasks(Play 普通任务) → post_tasks(Play 后置任务) → handlers(所有触发的处理器)

关键说明:

  1. pre_tasks:在角色执行前运行,若任务触发 handlers,则 handlers 会在角色执行前先执行;
  2. post_tasks:在角色和 tasks 执行后运行,触发的 handlers 同样会后置执行;
  3. handlers:无论被哪个阶段的任务触发,最终统一在所有任务(pre_tasks/roles/tasks/post_tasks)执行完毕后运行。

四、角色的三种类型与实战操作

根据角色来源,分为 “自定义角色”“第三方下载角色”“系统自带角色”,以下分别介绍创建、安装与使用方法。

4.1 类型 1:自定义角色(以 httpd 角色为例)

需求

在 /home/student/ansible/roles 下创建 httpd 角色,实现:

  1. 安装 httpd 和 firewalld,并设置开机自启;
  2. 配置防火墙允许 http 服务;
  3. 通过模板生成网页(显示主机 FQDN 和 IP)。
步骤 1:创建角色目录
# 进入角色存放目录

cd /home/student/ansible/roles

# 创建 httpd 角色(自动生成固定目录)

ansible-galaxy init httpd
步骤 2:编写模板文件(templates/index.html.j2)

模板中使用 Ansible 内置变量,动态生成网页内容:

# /home/student/ansible/roles/httpd/templates/index.html.j2

Welcome to {{ ansible_fqdn }} on {{ ansible_default_ipv4.address }}
步骤 3:编写核心任务(tasks/main.yml)

角色的所有自动化逻辑在此定义,包括安装软件、部署模板、启动服务、配置防火墙:

# /home/student/ansible/roles/httpd/tasks/main.yml

---

# 1. 安装 httpd 和 firewalld

- name: 安装 httpd 与 firewalld 软件

  yum:

    name:

      - httpd

      - firewalld

    state: present # 确保软件已安装

# 2. 部署模板文件到目标主机(生成网页)

- name: 部署网页模板

  template:

    src: index.html.j2 # 直接引用 templates 目录下的模板名

    dest: /var/www/html/index.html # 目标路径

    mode: '0644' # 文件权限

# 3. 启动并设置 httpd、firewalld 开机自启(循环执行)

- name: 启动服务并设置开机自启

  service:

    name: "{{ item }}" # 循环变量,对应 loop 中的服务名

    state: restarted # 确保服务重启(首次安装后启动)

    enabled: yes # 开机自启

  loop:

    - httpd

    - firewalld

# 4. 配置防火墙允许 http 服务(永久+临时生效)

- name: 防火墙允许 http 服务

  firewalld:

    service: http

    state: enabled

    permanent: yes # 永久生效(重启防火墙后保留)

    immediate: yes # 临时生效(无需重启防火墙)
步骤 4:创建 Playbook 引用角色(myrole.yml)

在 /home/student/ansible 下创建 Playbook,为 webtest 主机组启用 httpd 角色:

# /home/student/ansible/myrole.yml

---

- name: 应用 httpd 角色到 webtest 主机组

  hosts: webtest # 目标主机组(需在 inventory 中定义)

  roles:

    - httpd # 引用自定义角色(角色名即目录名)
步骤 5:执行与验证

4.2 类型 2:第三方下载角色(从 URL 安装)

需求

从指定 URL 下载 haproxy 和 myphp 角色,安装到 /home/student/ansible/roles 目录。

步骤 1:创建角色安装配置文件(down.yml)

通过 YAML 文件指定角色名和下载地址:

# /home/student/ansible/down.yml

---

- name: haproxy # 角色名(安装后目录名)

  src: http://ansible.example.com/roles/haproxy.tar # 下载 URL

- name: myphp # 角色名

  src: http://ansible.example.com/roles/myphp.tar # 下载 URL
步骤 2:安装角色到指定目录

使用 ansible-galaxy install 命令,通过 -p 指定安装路径:

ansible-galaxy install 
-r /home/student/ansible/down.yml 
-p /home/student/ansible/roles
  • -r:指定角色配置文件(down.yml);
  • -p:指定安装目录(避免默认安装到 ~/.ansible/roles)。
步骤 3:查看与使用
# 列出本地已安装的角色

ansible-galaxy list

# 使用方式与自定义角色一致,在 Playbook 中引用:

# roles:

# - haproxy

# - myphp

4.3 类型 3:系统自带角色(以 rhel-system-roles.timesync 为例)

RHEL/CentOS 提供官方系统角色(如时间同步、防火墙、SELinux 配置),存放在 /usr/share/ansible/roles。

需求

安装 timesync 角色(时间同步),为 test01 主机组配置时间服务器 ansible.example.com,并启用 iburst 参数(加速时间同步)。

步骤 1:安装系统角色包
# 安装 RHEL 系统角色(包含 timesync、firewall 等)

sudo yum -y install rhel-system-roles
步骤 2:复制角色到自定义目录(可选)

系统角色默认路径为 /usr/share/ansible/roles,可复制到自己的角色目录方便管理:

cp -r /usr/share/ansible/roles/rhel-system-roles.timesync 
/home/student/ansible/roles/timesync
步骤 3:创建 Playbook 配置角色(timesync.yml)

通过变量 timesync_ntp_servers 配置时间服务器:

# /home/student/ansible/timesync.yml

---

- name: 应用 timesync 角色配置时间同步

  hosts: test01 # 目标主机组

  vars:

# 配置 NTP 服务器(启用 iburst 参数)

    timesync_ntp_servers:

      - hostname: ansible.example.com # 时间服务器地址

        iburst: yes # 加速首次同步

  roles:

    - timesync # 引用 timesync 角色(若复制到自定义目录,直接用角色名)
步骤 4:执行与验证
# 执行 Playbook

ansible-playbook /home/student/ansible/timesync.yml

# 验证时间同步状态(在受控主机执行)

timedatectl status # 查看 NTP 同步是否开启,服务器是否为 ansible.example.com

五、角色的其他使用方式

除了在 roles 字段中引用角色,还可通过模块动态 / 静态导入角色:

模块

加载方式

特点

import_role

静态导入

解析 Playbook 时加载角色,不支持动态条件(如 when),适合固定角色引用

include_role

动态导入

执行阶段加载角色,支持 when/loop 动态控制,适合按需加载角色

示例:用 include_role 动态引用角色

---

- name: 动态加载 httpd 角色

  hosts: all

  tasks:

# 仅在主机属于 web 组时,加载 httpd 角色

    - name: 按需加载 httpd 角色

      include_role:

        name: httpd

        when: "'web' in group_names" # 条件判断

六、总结

  1. 角色优势:模块化拆分代码,提升复用性与可维护性,适合复杂自动化场景;
  2. 核心结构:固定目录规范,tasks/main.yml 是必须存在的核心文件;
  3. 使用场景
  • 自定义角色:满足业务个性化需求;
  • 第三方角色:复用社区 / 企业现成角色(如监控、数据库部署);
  • 系统角色:官方维护,适配 RHEL 系列系统,稳定性高;

执行顺序:牢记 pre_tasks → roles → tasks → post_tasks → handlers,避免任务顺序错误。


网站公告

今日签到

点亮在社区的每一天
去签到