Ansible 角色(Roles)
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(所有触发的处理器)
关键说明:
- pre_tasks:在角色执行前运行,若任务触发 handlers,则 handlers 会在角色执行前先执行;
- post_tasks:在角色和 tasks 执行后运行,触发的 handlers 同样会后置执行;
- handlers:无论被哪个阶段的任务触发,最终统一在所有任务(pre_tasks/roles/tasks/post_tasks)执行完毕后运行。
四、角色的三种类型与实战操作
根据角色来源,分为 “自定义角色”“第三方下载角色”“系统自带角色”,以下分别介绍创建、安装与使用方法。
4.1 类型 1:自定义角色(以 httpd 角色为例)
需求
在 /home/student/ansible/roles 下创建 httpd 角色,实现:
- 安装 httpd 和 firewalld,并设置开机自启;
- 配置防火墙允许 http 服务;
- 通过模板生成网页(显示主机 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.j2Welcome 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- firewalldstate: 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: httpstate: enabledpermanent: 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:执行与验证
# 执行 Playbookansible-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: alltasks:# 仅在主机属于 web 组时,加载 httpd 角色- name: 按需加载 httpd 角色include_role:name: httpdwhen: "'web' in group_names" # 条件判断
六、总结
- 角色优势:模块化拆分代码,提升复用性与可维护性,适合复杂自动化场景;
- 核心结构:固定目录规范,tasks/main.yml 是必须存在的核心文件;
- 使用场景:
- 自定义角色:满足业务个性化需求;
- 第三方角色:复用社区 / 企业现成角色(如监控、数据库部署);
- 系统角色:官方维护,适配 RHEL 系列系统,稳定性高;
执行顺序:牢记 pre_tasks → roles → tasks → post_tasks → handlers,避免任务顺序错误。