Ansible 自动化运维实战系列(五):Roles详解
- 📚 系列导航
- 一:概述
- 二:初始化
-
- 1)创建目录
- 2)初始化
- 三:目录结构
- 四:案例
-
- 1)初始化 `nfs-server role`
- 2)编写 `role`
- 3)编写 `nfs-server.yml` 剧本文件
- 4)执行 `nfs-server.yml` 剧本文件
- 总结
📚 系列导航
👉 第一篇:概述、部署与命令 👉 第二篇:主机清单详解 👉 第三篇:常用模块详解 👉 第四篇: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
评论前必须登录!
注册