Ansible 自动化运维实战系列(五):Roles详解
📚 系列导航
👉 第一篇:概述、部署与命令
👉 第二篇:主机清单详解
👉 第三篇:常用模块详解
👉 第四篇:Playbook详解
👉 第五篇:Roles详解
👉 第六篇:Valut详解
👉 第七篇:Galaxy详解
一:概述
roles
是一种用来模块化组织 Playbook 的机制,就像是把一堆散落的任务(tasks)、变量(vars)、模板(templates)等文件,按照固定的目录结构打包成一个“功能模块”。
如果 Playbook 里的内容越来越多,所有任务、模板、变量都写在一个文件里,会变得杂乱且难以维护。
roles
帮你:
- 按功能拆分(比如 webserver、database、common)
- 提高复用性(同一个 role 可在不同项目直接使用)
- 方便团队协作(不同人负责不同 role)
二:初始化
1)创建目录
[root@m01 ansible]# mkdir -p playbook/roles
2)初始化
自动创建
ansible-galaxy init <role>:官方提供的脚手架
[root@m01 ansible]# cd playbook/roles/ [root@m01 roles]# ansible-galaxy init nfs-server - Role nfs-server was created successfully
手动创建
[root@m01 module]# cd playbook/roles/ [root@m01 roles]# mkdir -p rsync-server/{tasks,files,templates,handlers}
三:目录结构
roles/
└─ myrole/
├── defaults # 默认变量目录(优先级最低,可被外部覆盖)
│ └── main.yml # - 定义默认值,比如端口、路径等
├── files # 存放要直接复制到目标主机的静态文件
├── handlers # 存放处理器(handlers),用于 notify 触发的任务
│ └── main.yml # - 例如“重启 nginx”这种操作
├── meta # 存放角色的元信息
│ └── main.yml # - 依赖的其他 roles、作者信息等
├── README.md # 角色说明文档(变量说明、使用方法等)
├── tasks # 主要任务目录(核心执行逻辑)
│ └── main.yml # - 必须存在,定义具体的任务步骤
├── templates # 存放 Jinja2 模板(可渲染变量的配置文件)
├── tests # 角色测试目录
│ ├── inventory # - 测试用的主机清单
│ └── test.yml # - 测试用的 playbook
└── vars # 固定变量目录(优先级高,不易被覆盖)
└── main.yml # - 定义不希望被轻易改动的变量
四:案例
通过
roles
实现nfs-server
在指定组的机器部署
1)初始化 nfs-server role
[root@m01 roles]# ansible-galaxy init nfs-server
2)编写 role
编写
/roles/nfs-server/tasks/install.yml
剧本[root@m01 roles]# vim nfs-server/tasks/install.yml - name: "01 install nfs-utils rpcbind" yum: name: "nfs-utils,rpcbind" state: "present" tags: - "01 install"
编写
/roles/nfs-server/tasks/config.yml
剧本[root@m01 roles]# vim nfs-server/tasks/config.yml - name: "02 vim file" lineinfile: path: "/etc/exports" line: "/backup-nfs/ 172.16.1.0/24(rw,all_squash)" create: true tags: - "02 vim file" - name: "03 create dir" file: path: "/backup-nfs" owner: "nfsnobody" group: "nfsnobody" state: "directory" tags: - "03 create dir"
编写
/roles/nfs-server/tasks/start.yml
剧本[root@m01 roles]# vim nfs-server/tasks/start.yml - name: "04 start rpc nfs" systemd: name: "{{ item }}" enabled: "yes" state: "started" loop: - "rpcbind" - "nfs" tags: - "04 start rpc nfs"
编写
/roles/nfs-server/tasks/main.yml
剧本可以直接在剧本中使用
inclued
,不使用role
--- - hosts: backup tasks: - include_tasks: install.yml - include_tasks: config.yml - include_tasks: start.yml
[root@m01 roles]# vim nfs-server/tasks/main.yml --- - include_tasks: install.yml - include_tasks: config.yml - include_tasks: start.yml
3)编写 nfs-server.yml
剧本文件
[root@m01 roles]# vim nfs-server.yml
- hosts: backup
roles:
- role: nfs-server
4)执行 nfs-server.yml
剧本文件
[root@m01 roles]# ansible-playbook nfs-server.yml
总结
1 概述
用途:模块化组织 Ansible 剧本,便于复用与维护
结构:tasks + vars + handlers + templates + files + meta
2 核心案例
🆕 初始化 Role:ansible-galaxy init <role_name>
📂 编辑 Role:在 tasks/main.yml 中编写任务
🖋 编写主剧本:nfs-server.yml 调用 role
▶ 执行剧本:ansible-playbook nfs-server.yml
3 目录结构
📂 tasks:主要任务列表
📂 handlers:事件触发任务
📂 vars:变量定义
📂 templates:模板文件(Jinja2)
📂 files:静态文件
📂 meta:依赖声明
4 流程
1️⃣ 创建 Role 目录
2️⃣ 初始化 Role
3️⃣ 编写任务文件
4️⃣ 编写主剧本
5️⃣ 执行验证
5 提示与技巧
🛠 使用 --syntax-check 检查语法
🚀 使用 --step 单步执行
🎯 使用 --tags 只运行部分任务
⚠ 忽略错误:ignore_errors
🔄 循环与条件:loop、when