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

【网络运维】Ansible roles:角色管理

Ansible roles:角色管理

实验环境准备

准备实验环境:

[furongwang@controller ~]$ mkdir web && cd web[furongwang@controller web]$ cat > ansible.cfg <<'EOF'
[defaults]
remote_user = furongwang
inventory = ./inventory[privilege_escalation]
become = True
become_user = root
become_method = sudo
become_ask_pass = False
EOF[furongwang@controller web]$ cat > inventory <<'EOF'
controller
node1
node2
node3
node4
EOF

Ansible 角色介绍

在生产环境中,Playbook 往往会变得冗长复杂,包含多个文件、任务和处理程序。随着开发的 Playbook 越来越多,代码重复利用变得尤为重要。

Ansible 角色提供了一种标准化方式,将任务、变量、文件、模板等资源打包在统一目录结构中,只需简单调用即可在不同项目中复用自动化代码。

Ansible 角色结构

通过以下命令初始化一个角色:

[furongwang@controller web]$ ansible-galaxy init furongwang
- furongwang was created successfully
[furongwang@controller web]$ tree furongwang
furongwang
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars└── main.yml8 directories, 8 files

角色目录结构说明

  • defaults:包含角色变量的默认值,优先级较低,易于被覆盖
  • files:存放由角色任务引用的静态文件
  • handlers:包含角色的处理程序定义
  • meta:包含角色元信息,如作者、许可证、平台和依赖项
  • tasks:包含角色的主要任务定义
  • templates:存放由角色任务引用的 Jinja2 模板
  • tests:包含测试用的清单和 Playbook
  • vars:定义角色变量值,优先级较高
  • README.md:提供角色描述、使用文档和示例

Ansible 角色目录位置

Ansible 默认在以下位置查找角色:

  • ~/.ansible/roles
  • /usr/share/ansible/roles
  • /etc/ansible/roles

优先级从上到下依次降低。可以通过 ansible.cfg 中的 roles_path 变量自定义角色路径:

[defaults]
roles_path = ./roles

多个路径使用冒号分隔:

roles_path = /etc/ansible/roles:/home/student/web/roles

创建和使用角色

创建角色

[furongwang@controller web]$ mkdir roles
[furongwang@controller web]$ ansible-galaxy init apache --init-path=./roles

角色任务示例

# tasks/main.yml
---
# tasks file for apache
- name: install webyum:name: "{{ web_package }}"state: latest- name: "start {{ web_service }}"service:name: "{{ web_service }}"state: startedenabled: yes- name: prepare motdtemplate:src: motd.j2dest: /etc/motd- name: prepare furongwang sitetemplate:src: furongwang.conf.j2dest: /etc/httpd/conf.d/furongwang.confnotify:- restart_web- name: prepare DocumentRoot file:path: "/var/www/html/{{ ansible_hostname }}" state: directory- name: prepare index.htmltemplate:src: index.html.j2dest: "/var/www/html/{{ ansible_hostname }}/index.html"

调用角色

---
- name: deploy apachehosts: node1roles:- apache

角色依赖管理

角色可以依赖其他角色,这在构建复杂自动化流程时非常有用:

# roles/apache/meta/main.yml
dependencies:
- role: firewallservice: http

任务执行顺序

Ansible 按照特定顺序执行任务:

  1. pre_tasks 任务
  2. roles 任务
  3. tasks 任务
  4. post_tasks 任务

处理程序执行顺序更为复杂,涉及不同阶段通知的处理程序。

示例:

# 准备环境
[furongwang@controller web]$ ansible-galaxy init test_task_exec_order --init-path=roles
[furongwang@controller web]$ vim roles/test_task_exec_order/tasks/main.yml
---
# tasks file for test_task_exec_order
- name: task in roleshell: echo 'task in role'

测试剧本内容如下:

---
- name: test task execute orderhosts: node1gather_facts: falsepre_tasks:- name: task in pre_tasksshell: echo 'task in pre_tasks'roles:- test_task_exec_ordertasks:- name: task in tasksshell: echo 'task in tasks'post_tasks:- name: task in post_tasksshell: echo 'task in post_tasks'

模拟执行结果:(使用了新目录)
在这里插入图片描述

Handlers 执行顺序

play中存在handlers任务,则按以下顺序执行:

  1. pre_tasks任务
  2. pre_tasks通知的handlers任务
  3. roles任务
  4. tasks 任务
  5. roles通知的handlers任务
  6. tasks通知的handlers任务
  7. post_tasks任务
  8. post_tasks通知的handlers任务

示例:

# 准备环境
[furongwang@controller web]$ vim roles/test_task_exec_order/tasks/main.yml
---
# tasks file for test_task_exec_order
- name: task in roleshell: echo 'task in role'notify:- role_handler[furongwang@controller web]$ vim roles/test_task_exec_order/handlers/main.yml
---
# handlers file for test_task_exec_order
- name: role_handlershell: echo handle in role

测试剧本内容如下:

---
- name: test task execute orderhosts: node1gather_facts: falsepre_tasks:- name: task in pre_tasksshell: echo 'task in pre_tasks'notify:- iamhandlerroles:- test_task_exec_ordertasks:- name: task in tasksshell: echo 'task in tasks'notify:- iamhandlerpost_tasks:- name: task in post_tasksshell: echo 'task in post_tasks'notify:- iamhandler handlers:- name: iamhandlershell: echo iamhandler

执行结果如下:(使用了新目录)
在这里插入图片描述

include_role 和 import_role 模块

这两个模块允许在任务级别调用角色:

---
- hosts: node1tasks:    - shell: echo 'first task'- name: use role in tasksimport_role:name: hello

主要区别:

  • import_role 在 Playbook 执行前解析角色
  • include_role 在任务执行时解析角色

Ansible 角色优势

  • 标准化系统配置的基本要素
  • 支持并行开发,提高团队协作效率
  • 提高代码重用率,易于共享
  • 使大型项目更易于管理

开发角色最佳实践

  1. 不要在角色中存储敏感信息
  2. 使用 ansible-galaxy init 初始化角色
  3. 维护完整的 README.md 和 meta/main.yml 文件
  4. 保持角色功能专注单一
  5. 经常重用和重构角色
  6. 使用版本控制系统管理角色

使用系统角色

RHEL 系统提供了预置的系统角色:

[furongwang@controller ~]$ sudo yum install -y rhel-system-roles

时间同步角色示例

---
- name: Time Synchronizationhosts: node1vars:timesync_ntp_servers:- hostname: classroom.example.com   iburst: yestimezone: "Asia/Shanghai"roles:- rhel-system-roles.timesynctasks:- name: Set timezonetimezone:name: "{{ timezone }}"

使用 Ansible Galaxy 部署角色

Ansible Galaxy 是一个由社区管理的角色仓库,包含大量可重用的角色。

常用命令

# 搜索角色
[furongwang@controller ~]$ ansible-galaxy search --platforms=EL haproxy# 查看角色信息
[furongwang@controller ~]$ ansible-galaxy info geerlingguy.docker# 安装角色
[furongwang@controller ~]$ ansible-galaxy install geerlingguy.haproxy# 批量安装角色
[furongwang@controller ~]$ ansible-galaxy install -r requires.yml# 查看本地角色清单
[furongwang@controller web]$ ansible-galaxy list
# /home/student/web/roles
- apache, (unknown version)
- firewall, (unknown version)
- test_task_exec_order, (unknown version)# 角色管理其他命令
# 登入Ansible galaxy
[furongwang@controller ~]$ ansible-galaxy login# 删除Ansible galaxy中角色
[furongwang@controller ~]$ ansible-galaxy delete# 删除本地角色
[furongwang@controller ~]$ ansible-galaxy remove
# 或者rm删除相应目录# 登出Ansible galaxy
[furongwang@controller ~]$ ansible-galaxy logout

总结

​ Ansible 角色是提升自动化代码复用性和维护性的重要工具。通过标准化目录结构、清晰的变量管理和依赖关系,角色使得复杂自动化任务的开发和维护变得更加高效。结合 Ansible Galaxy 社区资源,可以快速获取经过验证的高质量角色,大幅提升自动化项目开发效率。

​ 掌握 Ansible 角色管理,不仅能够提高个人工作效率,还能促进团队协作和知识共享,是每个 Ansible 用户必备的重要技能。

http://www.dtcms.com/a/338618.html

相关文章:

  • 前端多环境变量配置全攻略:开发 / 测试 / 生产自动切换实战
  • 时间差值工具Date.now()和performance.now()
  • 【实时Linux实战系列】实时大数据处理与分析
  • 【STM32】HAL库中的实现(五):ADC (模数转换)
  • 服务器经常宕机的原因及解决办法
  • Xftp8传输文件与 Linux 系统 Anaconda 安装
  • 腾讯混元3D系列开源模型:从工业级到移动端的本地部署
  • 游戏相机震动与武器后坐力实现指南
  • 禾赛激光雷达AT128P/海康相机(2):基于欧几里德聚类的激光雷达障碍物检测
  • VScode ROS文件相关配置
  • 知识篇 | 中间件会话保持和会话共享有啥区别?
  • 在Windows高效使用OpenCode的方案
  • Rust 入门 返回值和错误处理 (二十)
  • Docker 快速下载Neo4j 方法记录
  • 管道魔法再现:卡巴斯基发现与CVE-2025-29824漏洞利用相关的进化版后门程序
  • Rust学习笔记(七)|错误处理
  • 人工智能驱动的开发变革
  • 安全多方计算(MPC)技术解析及NssMPClib开源项目实践
  • 驱动开发系列65 - NVIDIA 开源GPU驱动open-gpu-kernel-modules 目录结构
  • ubuntu24 编译安装php-7.4.33
  • Python入门第11课:Python网络请求入门,使用requests库轻松获取网页数据
  • 什么是大数据平台?大数据平台和数据中台有什么关系?
  • RNN如何将文本压缩为256维向量
  • ubuntu下编译c程序报错“ubuntu error: unknown type name ‘uint16_t’”
  • 【保姆级教程~】如何在Ubuntu中装miniconda,并创建conda虚拟环境
  • ubuntu20.04 上 flathub summary exceeded maximum size of 10485760 bytes 的处理
  • 边缘智能体:Go编译在医疗IoT设备端运行轻量AI模型(上)
  • 分布式机器学习之流水线并行GPipe:借助数据并行来实现模型并行计算
  • JVM之Java内存区域与内存溢出异常
  • 微服务-06.微服务拆分-拆分原则