Ansible 角色全方位实操指南:基础概念、创建使用、系统角色与 Galaxy 管理 - 指南

Ansible 角色全方位实操指南:基础概念、创建使用、系统角色与 Galaxy 管理

Ansible 角色是实现代码复用、标准化配置和简化大型项目管理的核心机制。本文将从角色基础概念、目录结构、创建与使用、系统角色及 Galaxy 管理五个维度,结合实操示例,全面讲解 Ansible 角色的应用。

一、Ansible 角色基础

1. 角色的核心价值

当 Playbook 数量增多时,重复编写相同配置(如数据库、Web 服务部署)会导致冗余。角色通过标准化目录结构打包任务、变量、文件等资源,实现:

  • 代码复用:一个角色可在多个项目中调用,只需传递不同变量即可适配场景。
  • 易于共享:角色可独立导出,供团队或社区使用(如 Ansible Galaxy)。
  • 项目拆分:大型项目可按功能拆分为多个角色(如 httpdmysqlfirewalld),支持并行开发。
  • 标准化配置:统一目录结构降低维护成本,新成员可快速理解角色功能。

2. 角色的标准化目录结构

角色的功能由固定子目录划分,顶级目录为角色名(如 httptimesync),各子目录功能如下:

目录/文件作用说明
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!"
}

可以看出

  1. 第一阶段:执行pre_tasks(先跑pre_tasks的 debug,再跑echo shell 任务);
  2. 第二阶段:执行pre_tasks触发的handlersecho任务 notify 后,立即执行 Handler);
  3. 第三阶段:执行rolesabcd角色的任务,输出msg: "3333");
  4. 第四阶段:执行tasks(普通任务的 debug);
  5. 第五阶段:执行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.vpn

2. 常用 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.gzphpinfo.tar.gz 角色压缩包,通过配置文件批量安装:

  1. 创建角色安装清单(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
  2. 执行安装(指定安装路径为 /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 角色

posted on 2025-09-24 20:25  slgkaifa  阅读(22)  评论(0)    收藏  举报

导航