当前位置: 首页 > news >正文

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(所有触发的处理器)

关键说明:

  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.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" # 条件判断

六、总结

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

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


文章转载自:

http://eCpJcOoh.mhxLb.cn
http://yUIF58dG.mhxLb.cn
http://GS00rFdA.mhxLb.cn
http://u2UEhU8g.mhxLb.cn
http://5xnKg1ns.mhxLb.cn
http://vfTVScKv.mhxLb.cn
http://EALm9bj2.mhxLb.cn
http://3hUIQ7Pd.mhxLb.cn
http://uxcaKDAT.mhxLb.cn
http://PEOADPEG.mhxLb.cn
http://buqY8oBz.mhxLb.cn
http://R76gQKZe.mhxLb.cn
http://KXPeDL3k.mhxLb.cn
http://eF0oavcQ.mhxLb.cn
http://TnodTtzF.mhxLb.cn
http://Gc79CDIZ.mhxLb.cn
http://p1sZlv2u.mhxLb.cn
http://tNghmukQ.mhxLb.cn
http://vALzqC0U.mhxLb.cn
http://YMJStD15.mhxLb.cn
http://LxSRZvQq.mhxLb.cn
http://IN6XyRDr.mhxLb.cn
http://DcFovz5m.mhxLb.cn
http://odN9lwd4.mhxLb.cn
http://F5VhMIpS.mhxLb.cn
http://VijoQHaR.mhxLb.cn
http://5CcKGWwg.mhxLb.cn
http://9bxod2l7.mhxLb.cn
http://4iaUDbk9.mhxLb.cn
http://noKQ8uaC.mhxLb.cn
http://www.dtcms.com/a/371398.html

相关文章:

  • 深入理解 X25519 与 Ed25519:密钥交换与签名验签全流程解析
  • 【Python】数据可视化之热力图
  • 分布式专题——2 深入理解Redis线程模型
  • 【xss漏洞waf绕过】
  • Next.js中静态资源处理:图片、字体和其他文件
  • PyCharm 从入门到高效:安装教程 + 快捷键速查表
  • Linux 之从硬件硬盘到文件系统的全面过渡
  • STM32的USART的数据寄存器只有一个吗?
  • 【RabbitMQ】---RabbitMQ 工作流程和 web 界面介绍
  • HakcMyVM-Literal
  • C++判断字符串是否是回文(palindrome)
  • 测试:BUG篇
  • web后端知识(php和python)——第一阶段
  • 安卓学习 之 ProgressBar(进度条)控件
  • Python操作MySQL的两种姿势:原生SQL与ORM框架SQLAlchemy详解
  • TypeScript 核心语法与 Vue2 指令知识点
  • Java 14 开箱,新特性Record、instanceof、switch香香香香
  • HarmonyOS 应用开发新范式:深入探索 Stage 模型与 ArkUI 声明式开发
  • 跳转原生系统设置插件 支持安卓/iOS/鸿蒙UTS组件
  • 5-2EFCore性能优化
  • 《sklearn机器学习——管道和复合估计器》联合特征(FeatureUnion)
  • 大数据毕业设计选题推荐-基于大数据的贵州茅台股票数据分析系统-Spark-Hadoop-Bigdata
  • C++ 容器——unordered_xxx
  • 常见设计模式详解
  • 网络爬虫(web crawler)
  • 319章:使用Scrapy框架构建分布式爬虫
  • (LeetCode 面试经典 150 题) 67. 二进制求和(位运算、字符串)
  • 【linux kernel 常用数据结构和设计模式】【数据结构 3】【模拟input子系统input_dev和input_handler之间的多对多关系】
  • 怎么用CXL加速数据库?· SIGMOD‘25
  • Day23_【机器学习—聚类算法—K-Means聚类 及评估指标SSE、SC、CH】