Ansible 角色全方位实操指南:基础概念、创建使用、系统角色与 Galaxy 管理 - 指南
Ansible 角色全方位实操指南:基础概念、创建使用、系统角色与 Galaxy 管理
Ansible 角色是实现代码复用、标准化配置和简化大型项目管理的核心机制。本文将从角色基础概念、目录结构、创建与使用、系统角色及 Galaxy 管理五个维度,结合实操示例,全面讲解 Ansible 角色的应用。
一、Ansible 角色基础
1. 角色的核心价值
当 Playbook 数量增多时,重复编写相同配置(如数据库、Web 服务部署)会导致冗余。角色通过标准化目录结构打包任务、变量、文件等资源,实现:
- 代码复用:一个角色可在多个项目中调用,只需传递不同变量即可适配场景。
- 易于共享:角色可独立导出,供团队或社区使用(如 Ansible Galaxy)。
- 项目拆分:大型项目可按功能拆分为多个角色(如 httpd、mysql、firewalld),支持并行开发。
- 标准化配置:统一目录结构降低维护成本,新成员可快速理解角色功能。
2. 角色的标准化目录结构
角色的功能由固定子目录划分,顶级目录为角色名(如 http、timesync),各子目录功能如下:
| 目录/文件 | 作用说明 | 
|---|---|
| defaults/main.yml | 角色默认变量(优先级最低),可在 Playbook 中覆盖。 | 
| files/ | 存放静态文件(如配置文件、脚本),角色任务引用时无需写路径。 | 
| handlers/main.yml | 角色的处理程序(如服务重启),由任务触发。 | 
| meta/main.yml | 角色元信息(作者、许可证、依赖角色、支持的操作系统)。 | 
| tasks/main.yml | 角色核心任务列表(必须存在),是角色执行的入口。 | 
| templates/ | 存放 Jinja2 模板文件(后缀 .j2),支持变量渲染。 | 
| tests/ | 角色测试文件(如测试 Playbook、清单文件),可选。 | 
| vars/main.yml | 角色内部变量(优先级较高),通常不建议在 Playbook 中修改。 | 
二、角色的创建与使用(实操示例)
以创建 http 角色为例,实现部署 YUM 仓库、安装 Apache、生成动态首页、配置防火墙的完整流程,并通过 Playbook 调用角色。
步骤 1:创建角色目录(ansible-galaxy 初始化)
ansible-galaxy init 命令可自动生成标准化角色目录,默认路径为 /etc/ansible/roles(Ansible 默认角色路径)。
# 进入默认角色目录
[student@master ansible]$ cd roles/
# 初始化名为 http 的角色
[student@master roles]$ ansible-galaxy init http
- Role http was created successfully
# 查看生成的目录结构
[student@master roles]$ tree http
http
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml步骤 2:编写角色核心配置
(1)创建 Jinja2 模板(动态首页)
在 templates/ 目录下创建 index.html.j2,使用 Ansible Facts(系统内置变量)渲染主机名和 IP:
# /etc/ansible/roles/http/templates/index.html.j2
Welcome to {{ ansible_fqdn }} on {{ ansible_ens160.ipv4.address }}- ansible_fqdn:受控节点的完全合格域名(如- node1.example.com)。
- ansible_ens160.ipv4.address:网卡- ens160的 IPv4 地址(需根据实际网卡名调整)。
(2)编写任务列表(tasks/main.yml)
定义角色的执行步骤:挂载 ISO 镜像、配置 YUM 仓库、安装 Apache、部署模板、配置防火墙。
# /etc/ansible/roles/http/tasks/main.yml
---
# tasks file for http
---
# tasks file for http
#
- name: repo1
yum_repository:
file: server
name: aaa
description: aa1
baseurl: http://ansible.example.com/rhel9/AppStream
enabled: 1
gpgcheck: 0
- name: repo2
yum_repository:
file: sever
name: bbb
description: bb1
baseurl: http://ansible.example.com/rhel9/BaseOS
enabled: 1
gpgcheck: 0
- name: install httpd
yum:
name:
- httpd
- firewalld
state: present
- name: cp html
template:
src: index.html.j2
dest: /var/www/html/index.html
notify: #当cp html执行完后发生变化时执行handlers/main.yml中的restarted httpd
- restarted httpd
- name: firewallhttp
firewalld:
service: http
permanent: yes
state: enabled
immediate: yes(3)编写处理程序(handlers/main.yml)
定义任务触发的操作(如 httpd 重启):
# /etc/ansible/roles/http/handlers/main.yml
---
# 重启 httpd firewalld服务
- name: restarted httpd
service:
name: "{{ item }}"
state: restarted
enabled: yes
loop:
- httpd
- firewalld步骤 3:编写 Playbook 调用角色
在 /etc/ansible/ 目录下创建 newrole.yml,指定在所有受控节点上运行 http 角色:
# /etc/ansible/newrole.yml
---
- name: use http
hosts: all # 目标主机(可改为具体主机组,如 node1)
roles:
- http # 调用 http 角色步骤 4:执行 Playbook 并验证
# 执行 Playbook
ansible-playbook newrole.yml
# 验证结果(在控制节点访问受控节点的首页)
[student@master ansible]$curl http://node1.example.com # 输出:Welcome to node1.example.com on 192.168.122.10
[student@master ansible]$curl http://node2.example.com # 输出:Welcome to node2.example.com is 192.168.122.20关键知识点:变量优先级与执行顺序
1. 变量优先级(从高到低)
- Playbook 中角色内定义的变量(如 roles: - { role: cy, a1: 333 })
- 角色 vars/main.yml中的变量
- Playbook 中设置的共用变量
- 角色 defaults/main.yml中的变量
2. 任务执行顺序
pre_tasks(Play 前置任务)→ 角色任务(roles)→ tasks(Play 普通任务)→ post_tasks(Play 后置任务)- 若 pre_tasks触发处理程序,会在角色执行前运行;
- 角色任务触发的处理程序,会在所有角色/普通任务执行后运行。
示例(含执行顺序):
---
- name: abcd
hosts: node1
post_tasks:
- name: post_tasks
debug:
var: 5555
roles:
- abcd
pre_tasks:
- name: pre_tasks
debug:
var: 1111
- name: echo
shell:
cmd: echo aaaa
notify: handlers
tasks:
- name: tasks
debug:
var: 4444
handlers:
- name: handlers
debug:
var: 2222运行结果
TASK [pre_tasks] ***************************************************************************
ok: [node1] => {
"1111": "VARIABLE IS NOT DEFINED!"
}
TASK [echo] ********************************************************************************
changed: [node1]
RUNNING HANDLER [handlers] *****************************************************************
ok: [node1] => {
"2222": "VARIABLE IS NOT DEFINED!"
}
TASK [abcd : relos] ************************************************************************
ok: [node1] => {
"msg": "3333"
}
TASK [tasks] *******************************************************************************
ok: [node1] => {
"4444": "VARIABLE IS NOT DEFINED!"
}
TASK [post_tasks] **************************************************************************
ok: [node1] => {
"5555": "VARIABLE IS NOT DEFINED!"
}可以看出
- 第一阶段:执行pre_tasks(先跑pre_tasks的 debug,再跑echoshell 任务);
- 第二阶段:执行pre_tasks触发的handlers(echo任务 notify 后,立即执行 Handler);
- 第三阶段:执行roles(abcd角色的任务,输出msg: "3333");
- 第四阶段:执行tasks(普通任务的 debug);
- 第五阶段:执行post_tasks(后置任务的 debug)。
三、RHEL 系统角色(官方预定义角色)
RHEL 提供 rhel-system-roles 软件包,包含多个预定义角色,可快速实现标准化配置(如时钟同步、网络、SELinux)。
1. 安装系统角色
# RHEL/CentOS 8+ 系统
[student@master ansible]$ yum -y install rhel-system-roles
# 查看系统角色路径(默认存放位置)
[student@master ansible]$ ls /usr/share/ansible/roles/
linux-system-roles.certificate rhel-system-roles.certificate
linux-system-roles.cockpit rhel-system-roles.cockpit
linux-system-roles.crypto_policies rhel-system-roles.crypto_policies
linux-system-roles.firewall rhel-system-roles.firewall
linux-system-roles.ha_cluster rhel-system-roles.ha_cluster
linux-system-roles.kdump rhel-system-roles.kdump
linux-system-roles.kernel_settings rhel-system-roles.kernel_settings
linux-system-roles.logging rhel-system-roles.logging
linux-system-roles.metrics rhel-system-roles.metrics
linux-system-roles.nbde_client rhel-system-roles.nbde_client
linux-system-roles.nbde_server rhel-system-roles.nbde_server
linux-system-roles.network rhel-system-roles.network
linux-system-roles.postfix rhel-system-roles.postfix
linux-system-roles.selinux rhel-system-roles.selinux
linux-system-roles.ssh rhel-system-roles.ssh
linux-system-roles.sshd rhel-system-roles.sshd
linux-system-roles.storage rhel-system-roles.storage
linux-system-roles.timesync rhel-system-roles.timesync
linux-system-roles.tlog rhel-system-roles.tlog
linux-system-roles.vpn rhel-system-roles.vpn2. 常用 RHEL 系统角色
| 角色名称 | 功能说明 | 
|---|---|
| rhel-system-roles.kdump | 配置 kdump 崩溃恢复服务(系统崩溃时收集内存转储)。 | 
| rhel-system-roles.network | 配置网络接口(IP、网关、DNS 等)。 | 
| rhel-system-roles.selinux | 管理 SELinux(模式切换、文件/端口上下文、布尔值)。 | 
| rhel-system-roles.timesync | 配置 NTP/chrony 时钟同步(核心角色)。 | 
| rhel-system-roles.firewall | 配置防火墙规则(比 firewalld模块更简化)。 | 
| Rhel-system-roles.tuned | 配置tuned服务,以调优系统性能 | 
| Rhel-system-roles.postfix | 使用postfix服务将每个主机配置为邮件传输代理 | 
3. 系统角色实操示例:配置时钟同步
需求:在所有受控节点上使用 timesync 角色,同步到 classroom.example.com 时间服务器,并启用 iburst 参数(快速同步)。
步骤 1:复制系统角色到默认路径(可选)
系统角色默认路径已在 Ansible 配置中,若需自定义路径,可复制到 /etc/ansible/roles/:
[student@master ansible]$ cp -r /usr/share/ansible/roles/rhel-system-roles.timesync -p /etc/ansible/roles/timesync步骤 2:编写 Playbook(timesync.yml)
# /home/student/ansible/timesync.yml
---
- name: Configure Time Synchronization
hosts: all
vars:
timesync_ntp_servers:
- hostname: ansible.example.com
iburst: yes
roles:
- timesync # 直接调用系统角色(无需复制也可使用)
#或
- timesync步骤 3:执行并验证
# 执行 Playbook
ansible-playbook timesync.yml
# 验证同步状态(在受控节点执行)
[student@master ansible]$ ansible all -m shell -a ' chronyc sources 's # 查看 NTP 源状态,应显示 classroom.example.com四、从 Ansible Galaxy 管理角色
Ansible Galaxy(galaxy.ansible.com)是社区角色仓库,可通过 ansible-galaxy 命令下载、管理角色。
1. 核心命令说明
| 命令 | 功能 | 
|---|---|
| ansible-galaxy init <角色名> | 本地初始化角色目录(如 ansible-galaxy init http)。 | 
| ansible-galaxy install | 从 Galaxy 或本地文件下载角色。 | 
| ansible-galaxy list | 列出本地已安装的角色。 | 
| ansible-galaxy remove <角色名> | 删除本地角色。 | 
2. 安装角色(从本地/远程源)
(1)从本地压缩包安装
假设本地有 haproxy.tar.gz 和 phpinfo.tar.gz 角色压缩包,通过配置文件批量安装:
- 创建角色安装清单( - roles_requirements.yml):- # /etc/ansible/roles/roles_requirements.yml - name: haproxy # 角色名 src: file:///root/haproxy.tar.gz # 本地压缩包路径 - name: phpinfo src: file:///root/phpinfo.tar.gz
- 执行安装(指定安装路径为 - /etc/ansible/roles):- ansible-galaxy install -r /etc/ansible/roles/roles_requirements.yml -p /etc/ansible/roles/
(2)从 Ansible Galaxy 安装(社区角色)
安装社区热门角色(如 geerlingguy.apache,Apache 部署角色):
# 安装到默认路径(~/.ansible/roles)
ansible-galaxy install geerlingguy.apache
# 安装到指定路径
ansible-galaxy install geerlingguy.apache -p /etc/ansible/roles/3. 列出与删除角色
# 列出本地所有角色(按路径分组)
ansible-galaxy list
# 删除指定角色
ansible-galaxy remove haproxy # 删除 haproxy 角色 
                    
                 
                
            
         
 浙公网安备 33010602011771号
浙公网安备 33010602011771号