Ansible 角色管理指南

Ansible 角色管理指南

实验环境设置

以下命令用于准备实验环境,创建一个工作目录并配置基本的Ansible设置:

# 创建web工作目录并进入
[azurewhisky@controller ~]$ mkdir web && cd web# 创建Ansible配置文件
[azurewhisky@controller web]$ cat > ansible.cfg <<'EOF'
[defaults]
remote_user = azurewhisky  # 设置远程登录用户名
inventory = ./inventory    # 指定清单文件位置[privilege_escalation]
become = True              # 启用权限提升
become_user = root         # 提升到root用户
become_method = sudo       # 使用sudo方法
become_ask_pass = False    # 不询问密码
EOF# 创建主机清单文件
[azurewhisky@controller web]$ cat > inventory <<'EOF'
controller
node1
node2
node3
node4
EOF

Ansible 角色详解

什么是Ansible角色?

在实际生产环境中,Playbook往往会变得很长且复杂,包含许多文件、任务和处理程序。随着编写的Playbook越来越多,我们会发现有很多机会可以复用之前编写的代码。

Ansible角色提供了一种标准化方式来打包和复用自动化代码。它将任务、变量、文件、模板等资源组织在一个标准化的目录结构中,只需将角色从一个项目复制到另一个项目,然后在Playbook中调用即可。

Ansible角色结构

通过以下命令可以初始化一个标准的Ansible角色:

[azurewhisky@controller web]$ ansible-galaxy init azurewhisky
- azurewhisky was created successfully# 查看角色目录结构
[azurewhisky@controller web]$ tree azurewhisky
azurewhisky
├── 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/roles
  • /usr/share/ansible/roles
  • /etc/ansible/roles

优先级从上到下递减。可以通过配置文件自定义角色路径:

# 在ansible.cfg中设置角色路径
[defaults]
roles_path = ./roles  # 相对路径示例# 多个路径用冒号分隔
roles_path = /etc/ansible/roles:/home/azurewhisky/web/roles

创建自定义角色

下面创建一个Apache Web服务器角色的完整示例:

# 创建角色目录并初始化Apache角色
[azurewhisky@controller web]$ mkdir roles
[azurewhisky@controller web]$ ansible-galaxy init apache --init-path=./roles
配置任务文件
# roles/apache/tasks/main.yml
---
# Apache角色任务文件
- name: 安装Web服务器yum:name: "{{ web_package }}"  # 使用变量指定软件包名state: latest- name: "启动{{ web_service }}服务"service:name: "{{ web_service }}"  # 使用变量指定服务名state: startedenabled: yes  # 设置开机自启- name: 配置登录提示信息template:src: motd.j2           # 源模板文件dest: /etc/motd        # 目标文件位置- name: 配置AzureWhisky站点template:src: azurewhisky.conf.j2  # 虚拟主机配置模板dest: /etc/httpd/conf.d/azurewhisky.confnotify:- 重启Web服务         # 触发处理程序- name: 创建网站根目录file:path: "/var/www/html/{{ ansible_hostname }}"  # 使用主机名创建目录state: directory- name: 创建首页文件template:src: index.html.j2     # 首页模板dest: "/var/www/html/{{ ansible_hostname }}/index.html"
配置默认变量
# roles/apache/defaults/main.yml  
---
# Apache角色默认变量
web_package: httpd    # Web服务器软件包名
web_service: httpd    # Web服务名称
创建模板文件
{# roles/apache/templates/motd.j2 #}
hello guys!
Welcome to {{ ansible_fqdn }}!  {# 使用事实变量填充完全限定域名 #}
{# roles/apache/templates/azurewhisky.conf.j2 #}
# {{ ansible_managed }}  {# Ansible管理标记 #}
<VirtualHost *:80>ServerAdmin azurewhisky@{{ ansible_fqdn }}ServerName {{ ansible_fqdn }}ErrorLog logs/{{ ansible_hostname }}-error.logCustomLog logs/{{ ansible_hostname }}-common.log commonDocumentRoot /var/www/html/{{ ansible_hostname }}/<Directory /var/www/html/{{ ansible_hostname }}/>Options +Indexes +FollowSymlinks +IncludesOrder allow,denyAllow from all</Directory>
</VirtualHost>
配置处理程序
# roles/apache/handlers/main.yml
---
# Apache角色处理程序
- name: 重启Web服务service:name: "{{ web_service }}"state: restarted
创建首页模板
{# roles/apache/templates/index.html.j2 #}
Welcome to {{ ansible_fqdn }} !
配置角色元数据
---
galaxy_info:author: azurewhiskydescription: azurewhisky的Web服务器角色company: azurewhisky世界license: GPLv2min_ansible_version: 2.4platforms:- name: Fedoraversions:- all- 25galaxy_tags: [apache, web]  # 角色标签
dependencies: []  # 角色依赖项

调用角色

在Playbook中调用角色非常简单:

# 基本调用方式
---
- name: 部署Apachehosts: node1roles:- apache  # 直接引用角色名# 带参数调用方式  
---
- name: 部署Apachehosts: node1roles:- role: apache        # 明确指定角色web_package: httpd  # 传递参数web_service: httpd- { role: apache, web_package: httpd, web_service: httpd }  # 简写格式

执行Playbook并验证结果:

# 验证motd配置
[azurewhisky@controller web]$ ssh root@node1
hello guys!
Welcome to node1.lab.example.com!# 验证网站访问
[root@node1 ~]$ curl http://node1/
Welcome to node1.azurewhisky.top !

角色依赖关系

角色可以声明依赖其他角色,例如Web服务器角色可能依赖防火墙角色:

# roles/apache/meta/main.yml
dependencies:
- role: firewallservice: http  # 传递参数给依赖角色

创建防火墙角色:

[azurewhisky@controller web]$ ansible-galaxy init firewall --init-path=./roles

配置防火墙角色任务:

# roles/firewall/tasks/main.yml
---
# 防火墙角色任务
- name: 安装firewalldyum:name: firewalldstate: latest- name: 启动并启用firewalld服务service:name: firewalldstate: startedenabled: true- name: 配置防火墙服务firewalld:state: enabled        # 启用规则immediate: true       # 立即生效permanent: true       # 永久生效service: "{{ service }}"  # 使用变量指定服务

配置防火墙默认变量:

# roles/firewall/defaults/main.yml
---
# 防火墙默认变量
service: ssh  # 默认允许SSH服务

任务执行顺序

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

  1. pre_tasks - 前置任务
  2. roles - 角色任务
  3. tasks - 普通任务
  4. post_tasks - 后置任务

注意:剧本中的书写顺序不影响实际执行顺序。

示例演示:

---
- name: 测试任务执行顺序hosts: node1gather_facts: false  # 禁用事实收集pre_tasks:- name: 前置任务shell: echo '这是前置任务'roles:- test_task_exec_order  # 调用测试角色tasks:- name: 普通任务shell: echo '这是普通任务'post_tasks:- name: 后置任务shell: echo '这是后置任务'

处理程序执行顺序

处理程序按照以下顺序执行:

  1. pre_tasks通知的处理程序
  2. roles任务
  3. roles通知的处理程序
  4. tasks任务
  5. tasks通知的处理程序
  6. post_tasks任务
  7. post_tasks通知的处理程序

重要:剧本中的处理程序具有全局作用域,可以被任何任务通知。

动态角色调用

使用include_roleimport_role在任务中动态调用角色:

---
- hosts: node1tasks:- shell: echo '第一个任务'- name: 在任务中调用角色import_role:  # 或使用include_rolename: hellowhen: condition_met  # 条件判断

区别说明:

  • import_role:执行前解析角色,语法错误会立即终止
  • include_role:执行时解析角色,条件为false时不解析

Ansible角色的优势

  • 标准化:为系统类型(Web服务器、数据库等)定义标准配置
  • 并行开发:多个管理员可以同时开发不同角色
  • 代码复用:轻松共享和复用自动化代码
  • 易于管理:使大型项目更易于维护和组织

角色开发最佳实践

  1. 避免敏感信息:不要将密码或密钥存储在角色中,使用变量参数化
  2. 精简结构:使用ansible-galaxy init创建角色,删除不需要的目录
  3. 完善文档:维护README.md和meta/main.yml文件说明角色用途
  4. 功能专注:每个角色应专注于特定功能,避免过于复杂
  5. 代码重构:经常重用和重构角色,避免为边缘情况创建新角色
  6. 版本控制:使用版本控制系统管理角色演变

使用系统角色

系统角色介绍

RHEL从7.4开始提供预打包的系统角色,这些角色可以帮助标准化RHEL主机的配置。例如,使用timesync角色可以统一配置RHEL6和7的时间同步,无需关心底层是ntpd还是chronyd服务。

安装系统角色

[azurewhisky@controller ~]$ sudo yum install -y rhel-system-roles# 系统角色安装在标准位置
[azurewhisky@controller ~]$ ls -1 /usr/share/ansible/roles/# 文档位于
[azurewhisky@controller ~]$ ls /usr/share/doc/rhel-system-roles

时间同步角色示例

---
- name: 时间同步配置hosts: node1vars:timesync_ntp_servers:- hostname: classroom.example.comiburst: yes  # 启用快速初始同步timezone: "Asia/Shanghai"  # 设置时区roles:- rhel-system-roles.timesync  # 调用系统角色tasks:- name: 设置时区timezone:name: "{{ timezone }}"

SELinux角色示例

---
- name: SELinux配置hosts: node1vars:selinux_state: enforcing  # 设置强制模式selinux_booleans:- name: 'httpd_enable_homedirs'state: 'on'persistent: 'yes'  # 永久生效selinux_fcontexts:- target: '/srv/www(/.*)?'setype: 'httpd_sys_content_t'state: 'present'roles:- rhel-system-roles.selinux

处理需要重启的SELinux配置

---
- hosts: node1,node2vars:selinux_state: enforcingtasks:- block:  # 块错误处理- name: 应用SELinux角色include_role:name: rhel-system-roles.selinuxrescue:  # 救援块- name: 检查是否需要重启以外的错误fail:when: not selinux_reboot_required- name: 重启受管主机reboot:- name: 重新应用SELinux角色include_role:name: rhel-system-roles.selinux

使用Ansible Galaxy部署角色

Ansible Galaxy介绍

Ansible Galaxy是一个由社区维护的角色仓库,包含大量可重用的角色,帮助用户快速实现自动化任务。

ansible-galaxy命令使用

# 查看已安装角色
[azurewhisky@controller web]$ ansible-galaxy list# 搜索角色(需要网络连接)
[azurewhisky@controller ~]$ ansible-galaxy search --platforms=EL haproxy# 查看角色详细信息
[azurewhisky@controller ~]$ ansible-galaxy info geerlingguy.docker# 查看本地角色信息
[azurewhisky@controller web]$ ansible-galaxy info apache --offline# 安装角色
[azurewhisky@controller ~]$ ansible-galaxy install geerlingguy.haproxy

批量安装角色

创建requirements.yml文件:

# requires.yml
- name: dockersrc: https://github.com/geerlingguy/ansible-role-docker/archive/2.7.0.tar.gz
- name: haproxysrc: https://github.com/geerlingguy/ansible-role-haproxy/archive/1.1.2.tar.gz

批量安装:

[azurewhisky@controller ~]$ ansible-galaxy install -r requires.yml

其他管理命令

# 登录Galaxy
[azurewhisky@controller ~]$ ansible-galaxy login# 删除角色
[azurewhisky@controller ~]$ ansible-galaxy remove role_name# 登出
[azurewhisky@controller ~]$ ansible-galaxy logout

综合案例:部署Web集群

需求说明

  1. node3作为负载均衡器(HAProxy)
  2. node1和node2作为Web服务器

实施步骤

# 创建清单文件
[azurewhisky@controller web]$ cat > inventory <<EOF
[loadbalancers]
loadbalancer ansible_host=node3[webservers]
node1
node2
EOF# 安装所需角色
[azurewhisky@controller web]$ ansible-galaxy install geerlingguy.haproxy
[azurewhisky@controller web]$ ansible-galaxy install geerlingguy.apache# 查看HAProxy角色文档了解配置参数
[azurewhisky@controller web]$ less roles/geerlingguy.haproxy/README.md

编写部署剧本

# deploy_web_cluster.yaml
---
- name: 部署负载均衡器hosts: loadbalancersvars:haproxy_backend_servers:  # 配置后端服务器- name: node1address: 10.1.8.11:80  # node1的IP和端口- name: node2address: 10.1.8.12:80  # node2的IP和端口roles:- geerlingguy.haproxy  # 调用HAProxy角色- name: 部署Web服务器hosts: webserversroles:- geerlingguy.apache  # 调用Apache角色tasks:- name: 创建首页内容copy:content: "Welcome to {{ ansible_fqdn }}.\n"  # 动态生成内容dest: /var/www/html/index.html

执行部署并验证

# 运行部署剧本
[azurewhisky@controller web]$ ansible-playbook deploy_web_cluster.yaml# 测试负载均衡效果
[azurewhisky@controller web]$ curl http://node3/
Welcome to node1.azurewhisky.top.
[azurewhisky@controller web]$ curl http://node3/
Welcome to node2.azurewhisky.top.

通过这个完整的指南,您应该对Ansible角色管理有了深入的理解,能够创建、使用和管理角色,以及利用Ansible Galaxy中的社区资源来加速自动化部署。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/93758.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【补充】数据库中有关系统编码和校验规则的简述

一、字符集和校验规则&#xfeff;1.创建数据库案例数据库创建方法&#xff1a;使用CREATE DATABASE语句创建数据库字符集指定方式&#xff1a;通过CHARACTER SETutf8指定数据库编码格式默认配置说明&#xff1a;未指定字符集时默认使用utf8和utf8_general_ci配置文件位置&…

计算机网络 HTTP1.1、HTTP2、HTTP3 的核心对比及性能分析

以下是 HTTP/1.1、HTTP/2、HTTP/3 的核心对比及性能分析&#xff0c;重点关注 HTTP/3 的性能优势&#xff1a;&#x1f4ca; HTTP 协议演进对比表特性HTTP/1.1 (1997)HTTP/2 (2015)HTTP/3 (2022)传输层协议TCPTCPQUIC (基于 UDP)连接建立TCP 三次握手 TLS 握手 (高延迟)同 HTT…

【计算机视觉与深度学习实战】07基于Hough变换的答题卡识别技术:原理、实现与生物识别拓展(有完整代码)

1. 引言 在人工智能和计算机视觉快速发展的今天,自动化图像识别技术已经渗透到社会生活的各个角落。从工业质检到医学影像分析,从自动驾驶到教育评估,计算机视觉技术正在重塑我们与数字世界的交互方式。在这众多应用中,答题卡识别技术作为教育信息化的重要组成部分,承载着…

《WASM驱动本地PDF与Excel预览组件的深度实践》

WASM为何能成为本地文件解析的核心载体,首先需要跳出“前端只能处理轻量任务”的固有认知,从“性能与兼容性平衡”的角度切入。PDF与Excel这类文件格式的解析,本质是对复杂二进制数据的解码与重构——PDF包含嵌套的对象结构、字体渲染规则和矢量图形描述,Excel则涉及单元格…

Oracle Free 实例重装系统操作指南

之前申请了两台 x86 架构的 Oracle 机器&#xff0c;偶尔用来部署开源项目测试&#xff0c;有一台在测试 SSH 相关功能时 “变砖”&#xff0c;网上看重装系统发现很繁琐就没去打理&#xff0c;近期又想到这个机器&#xff0c;发现去年就有了官方重装方法&#xff0c;简单配置下…

Linux 基础指令与权限管理

一、Linux 操作系统概述1.1 操作系统的核心价值操作系统的本质是 "使计算机更好用"。它作为用户与硬件之间的中间层&#xff0c;负责内存管理、进程调度、文件系统管理和设备驱动管理等核心功能&#xff0c;让用户无需直接操作硬件即可完成复杂任务。在服务器领域&am…

深度学习-167-MCP技术之工具函数的设计及注册到MCP服务器的两种方式

文章目录 1 MCP协议概述 1.1 MCP的原理 1.2 两种主要的通信模式 2 工具函数的设计与实现 2.1 tools.py(工具函数) 2.2 工具函数的设计原则 2.3 工具函数的测试 3 MCP服务器的构建与配置 3.1 安装mcp库 3.2 main.py(MCP服务器) 3.2.1 方式一(add_tool方法) 3.2.2 方式二(@mcp.to…

哈希:两数之和

问题描述&#xff1a;在一个整数数组中&#xff0c;找到两数之和为target的两个值&#xff0c;返回找到的两个值的下标。 nums[3,3] target6 返回&#xff1a;[0,1] 说明&#xff1a;返回结果&#xff0c;索引无顺序要求&#xff1b;有唯一的答案&#xff1b;不能使用两次相…

PHP反序列化的CTF题目环境和做题复现第5集_POP链构造4

1 题目 下载yii2.0.37版本,https://github.com/yiisoft/yii2/releases/tag/2.0.37 放在phpstudy的www目录下或ubuntu的/var/www/html的目录下。 3 EXP <?php namespace PHPUnit\Framework\MockObject{class MockTrait {private $classCode = "system(whoami);php…

广东省省考备考(第八十一天8.19)——资料分析、数量(强化训练)

资料分析 错题解析解析解析解析解析今日题目正确率&#xff1a;67% 数量&#xff1a;数学运算解析解析解析标记题解析今日题目正确率&#xff1a;80%

决策树剪枝及数据处理

一、核心决策树算法&#xff08;3 类主流算法&#xff09;1. ID3 算法&#xff1a;用 “信息增益” 选属性ID3 是决策树的 “开山鼻祖” 之一&#xff0c;它的核心逻辑是 “选能让数据最‘纯’的属性”—— 这里的 “纯” 用 “信息增益” 衡量。简单说&#xff0c;“信息增益”…

Ansible 角色管理

环境准备# 创建一个叫web的文件夹并进入&#xff08;相当于新建一个工作目录&#xff09;[lykcontroller ~]$ mkdir web && cd web​# 创建Ansible的配置文件ansible.cfg[lykcontroller web]$ cat > ansible.cfg <<EOF[defaults]remote_user lykinventory .…

Java面试准备指南!

现在已经是8月中旬了&#xff0c;秋招马上就要开始了&#xff0c;不知道大家准备好了吗&#xff1f;现阶段找工作真的是千军万马过独木桥&#xff0c;没有真本事&#xff0c;真的会被淘汰掉&#xff0c;现实就是如此的残酷&#xff01; 为了能够帮助到大家在秋招Java面试中脱颖…

Encoder-Decoder Model编码器-解码器模型

Encoder-Decoder编码器-解码器是一种深度学习模型&#xff0c;应用于图像处理、语音识别、自然语言处理等领域。主要由编码器和解码器两部分组成&#xff0c;这种结构能够处理序列到序列的任务。编码器-解码器模型具备独特的双阶段处理&#xff0c;先对输入信息进行编码&#x…

Python函数总结

目录 一、普通函数 1.1 函数的定义与调用 1.2 函数的说明文档 1.3 函数的参数 1.4 函数的返回值 二、函数的作用域和关键字 2.1 局部作用域 2.2 全局作用域 2.4 global关键字和nonlocal关键字的使用 三、函数的递归与嵌套 3.1 嵌套函数 3.2递归函数 四、函数名的应…

sqlite-gui:一款开源免费、功能强大的SQLite开发工具

sqlite-gui 是一个轻量级的 SQLite 编辑器&#xff0c;基于 C/mingw64/WinAPI 开发&#xff0c;支持 Windows 平台。 sqlite-gui 是一个免费开源的项目&#xff0c;代码托管在 GitHub&#xff1a; https://github.com/little-brother/sqlite-gui 功能特性 支持 SQL 语法高亮…

Ethan独立开发新品速递 | 2025-08-19

每日精选Product Hunt上最值得关注的独立产品&#xff0c;发现全球创新灵感&#xff0c;助力你的产品成长。 下面挑选出对独立开发者最有参考价值的 10 个项目&#xff0c;侧重开发工具、AI 工具、SaaS 和创业支持类产品&#xff0c;去除娱乐、小众垂直和大公司产品。每条保留原…

从 Hive 数仓出发,全面剖析 StarRocks、MySQL、HBase 的使用场景与区别

以 Hive 数仓为底座,深入理解 StarRocks、MySQL 和 HBase 的区别与使用场景 一、前言 在现代大数据架构中,Hive 通常作为离线数仓的核心底座,负责批量数据的接入、清洗、计算与存储。然而,为了满足 实时计算、低延迟查询、业务交互型操作和高并发存储 等不同需求,我们往…

低延迟、跨平台与可控性:直播SDK的模块化价值解析

引言 音视频直播已经从单纯的娱乐应用&#xff0c;成长为产业级的实时交互基础设施。无论是安防监控的秒级告警联动、工业巡检的远程可视化操作&#xff0c;还是智慧教育中的多终端互动课堂、远程医疗里的超低延迟手术协作&#xff0c;都离不开一条低延迟、高稳定性、跨平台可…

JVM参数优化

JVM 参数优化是提升 Java 应用性能、减少 GC 停顿、避免 OOM&#xff08;内存溢出&#xff09;等问题的核心手段。优化的核心目标是平衡内存使用、GC 效率与应用响应速度&#xff0c;需结合应用类型&#xff08;如 Web 应用、批处理应用&#xff09;、业务场景&#xff08;如高…