Role 与 Vault
RHEL 9 用 Ansible Role 把任务打包复用,并用 Vault 加密敏感文件;含 httpd 角色与系统角色实战。
本页目录
剧本写多了会乱:任务、变量、模板散落各处。Role(角色) 把「做完一件事所需的一切」收进标准目录;Vault 则给密码等敏感文件上锁。这是 EX294 收尾两大件。
环境说明
- 系统:RHEL 9
- 前置:14–16(cfg、inventory、Playbook、变量)
- 工作目录:
/home/alice/ansible - cfg 中已设:
roles_path = /home/alice/ansible/roles
1. 为什么需要 Role
没有 Role 时,一个「装 httpd 并发布页面」的剧本可能越来越长,还不好复用。
Role 的思路:
roles/
httpd/
tasks/ 做什么
vars/ 变量(优先级高)
defaults/ 默认变量(优先级低,易被覆盖)
templates/ 含变量的模板文件
files/ 静态文件
README.md 说明
好处:
- 一个目录 = 一项能力
- 别人(或系统包)写好的角色可直接
roles:调用 - 考试题常要求:所有角色放在
~/ansible/roles/
2. 目录结构速查
| 目录 | 放什么 | 考试频率 |
|---|---|---|
| tasks/main.yml | 必有:任务列表 | 极高 |
| defaults/main.yml | 默认变量 | 高 |
| vars/main.yml | 变量(会覆盖 defaults) | 高 |
| templates/*.j2 | Jinja2 模板(可含 {{ }}) | 高 |
| files/ | 原样拷贝的静态文件 | 中 |
| meta/ | 角色依赖等 | 低 |
| README.md | 说明(非强制,建议写) | 中 |
记忆:先有 tasks,再配 vars/defaults,动态内容放 templates。
3. 用 galaxy 初始化角色骨架
cd /home/alice/ansible
ansible-galaxy init roles/httpd
ls roles/httpd
会生成标准目录。考试可自己 mkdir -p,用 init 更快、结构不容易错。
4. 实战:httpd 角色
4.1 变量
vim roles/httpd/vars/main.yml
---
con: "Ansible Automation tooooools."
vim roles/httpd/defaults/main.yml
---
web: "init..."
| 文件 | 优先级 |
|---|---|
| defaults/main.yml | 低(像默认值) |
| vars/main.yml | 高(更「硬」的默认) |
调用角色时还可在 playbook 的 vars: 里再覆盖。
4.2 模板 templates
vim roles/httpd/templates/index.j2
hello {{ansible_fqdn}}.
hello {{con}}.
This is {{web}} index page.
.j2 表示 Jinja2:部署时 {{ }} 会被换成真实值。
4.3 任务 tasks
vim roles/httpd/tasks/main.yml
---
- yum:
name: httpd
- service:
name: httpd
state: started
enabled: yes
- template:
src: index.j2
dest: /var/www/html/index.html
| 模块 | 作用 |
|---|---|
| yum | 装 httpd |
| service | 启动并自启 |
| template | 把 templates/index.j2 渲染后拷到节点 |
copy vs template:copy 原样拷贝;template 会替换里面的 {{变量}}。
4.4 说明文件 README(可选但推荐)
vim roles/httpd/README.md
# 角色名称: httpd
- 变量 con 默认: "Ansible Automation tooooools."
- 变量 web 默认: "init..."
- 模板: index.j2
- 使用:
- hosts: 目标组
roles:
- httpd
4.5 用剧本调用角色
vim http.yml
---
- hosts: web
roles:
- httpd
ansible-playbook http.yml
curl http://node3/
curl http://node4/
期望类似:
hello node3.lab0.example.com.
hello Ansible Automation tooooools..
This is a web index page.
说明:第二行结尾的 .. 不是笔误——变量 con 本身以 . 结尾,模板里又写了一次 .,渲染后会连在一起。自己做实验时可把变量或模板里的句号去掉一个。
若要覆盖变量:
---
- hosts: web
vars:
web: "exam page"
roles:
- httpd
考点:
roles:列表调用;template+.j2;角色必须在roles_path下。
5. 系统角色:rhel-system-roles
红帽把常用角色打成 RPM,装完角色目录自动出现:
sudo yum install -y rhel-system-roles
ls /usr/share/ansible/roles/
考试题常写:任何角色都放到 /home/alice/ansible/roles。系统角色在 /usr/share/...,需要 拷贝 过去:
cp -r /usr/share/ansible/roles/rhel-system-roles.timesync/ \
/home/alice/ansible/roles/timesync
ls /home/alice/ansible/roles/
调用示例(时间同步):
vim timesync.yml
---
- hosts: all
vars:
timesync_ntp_servers:
- hostname: server1.lab0.example.com
iburst: yes
roles:
- timesync
ansible-playbook timesync.yml
先 cat roles/timesync/README.md 看变量名——不同版本参数可能略有差异,以 README 为准。
6. 批量下载角色:galaxy install -r
网上或内网会提供角色压缩包 URL。写一个需求文件:
vim roles/down.yml
- src: http://server1.lab0.example.com/roles/haproxy.tar
name: haproxy
- src: http://server1.lab0.example.com/roles/myphp.tar
name: myphp
ansible-galaxy install -r roles/down.yml
ls /home/alice/ansible/roles/
习惯上需求文件也常叫
requirements.yml;本课用down.yml只是文件名,内容格式相同。
下载并解压到 roles_path 后即可:
vim php.yml
---
- hosts: web
roles:
- myphp
ansible-playbook php.yml
7. Vault:给敏感文件加密
仓库里不想明文放密码、私钥。ansible-vault 用口令加密文件。
7.1 准备明文(实验)
vim mimi.txt
这里是秘密的内容
vim pass.txt
123456
7.2 加密
ansible-vault encrypt --vault-id pass.txt mimi.txt
cat mimi.txt
会变成类似:
$ANSIBLE_VAULT;1.1;AES256
363662356461323762...
7.3 解密查看(看完记得再锁上)
ansible-vault decrypt --vault-id pass.txt mimi.txt
cat mimi.txt
# 确认完后立刻再加密,避免明文留在仓库
ansible-vault encrypt --vault-id pass.txt mimi.txt
7.4 改口令 rekey
文件必须处于加密状态才能 rekey;若刚 decrypt 成明文,请先 encrypt 再改口令。
ansible-vault rekey mimi.txt
# 先输旧口令,再输两次新口令(交互式;或配合 vault-id 文件)
| 子命令 | 作用 |
|---|---|
| encrypt | 加密 |
| decrypt | 解密 |
| rekey | 改加密口令 |
| --vault-id pass.txt | 用文件里的口令,避免手输(脚本友好) |
Playbook 里使用加密变量文件:
ansible-playbook site.yml --ask-vault-pass
# 或
ansible-playbook site.yml --vault-password-file pass.txt
考点:
encrypt/decrypt/rekey;--vault-id或--vault-password-file。 易错:加密后还当明文cat看,看不懂属正常;要decrypt。 安全:pass.txt本身不要提交到公开仓库;实验可chmod 600。
8. 推荐练习(约 50 分钟)
cd /home/alice/ansible
# --- Role ---
ansible-galaxy init roles/httpd
vim roles/httpd/vars/main.yml
vim roles/httpd/defaults/main.yml
vim roles/httpd/templates/index.j2
vim roles/httpd/tasks/main.yml
vim http.yml
ansible-playbook http.yml
curl http://node3/ || curl http://node1/
# --- 系统角色(若有 rhel-system-roles 包)---
sudo yum install -y rhel-system-roles
cp -r /usr/share/ansible/roles/rhel-system-roles.timesync/ roles/timesync
# 按 README 写 timesync.yml 并执行(NTP 地址换成你的)
# --- Vault ---
echo 'top secret' > /home/alice/ansible/secret.txt
echo 'vaultpass' > /home/alice/ansible/vault.pw
chmod 600 vault.pw
ansible-vault encrypt --vault-id vault.pw secret.txt
cat secret.txt
ansible-vault decrypt --vault-id vault.pw secret.txt
cat secret.txt
期望
roles/httpd下有 tasks、vars、defaults、templates- playbook 执行后,页面显示渲染后的主机名与
con - vault 加密后文件以
$ANSIBLE_VAULT开头
9. 速查表
| 目标 | 命令/路径 |
|---|---|
| 建角色骨架 | ansible-galaxy init roles/名称 |
| 任务 | roles/名称/tasks/main.yml |
| 默认变量 | roles/名称/defaults/main.yml |
| 覆盖用变量 | roles/名称/vars/main.yml 或 play vars: |
| 模板 | roles/名称/templates/xx.j2 + template 模块 |
| 调用角色 | play 里 roles: - 名称 |
| 系统角色 | rhel-system-roles → 拷到 roles/ |
| 装角色包 | ansible-galaxy install -r 文件 |
| 加密 | ansible-vault encrypt --vault-id 口令文件 目标文件 |
| 解密 | ansible-vault decrypt ... |
| 改口令 | ansible-vault rekey ... |
| 执行带 vault | --vault-password-file 或 --ask-vault-pass |
考点与易错
考点:按题面创建 role(tasks/vars/templates);
roles:调用;template渲染;vault 三命令。 易错:角色不在~/ansible/roles,或名字与roles:不一致。 易错:用copy代替template,节点上仍是字面{{ con }}。 易错:defaults与vars优先级弄反,覆盖不生效。 易错:vault 文件解密后忘记再加密就提交。 练习环境:NTP/角色包 URL 以题面为准;alice换成你的用户。
小结
- Role = 标准目录打包:
tasks必有,变量进defaults/vars,动态内容用templates。 - playbook 用
roles:调用;系统角色要 拷到roles_path。 - Vault 用口令加密敏感文件:
encrypt/decrypt/rekey。 - 系列到此覆盖 RHCSA 地基 + EX294 主干;考前请把 14–17 的实验在自己环境再跑一遍。