Linux

Role 与 Vault

RHEL 9 用 Ansible Role 把任务打包复用,并用 Vault 加密敏感文件;含 httpd 角色与系统角色实战。

剧本写多了会乱:任务、变量、模板散落各处。Role(角色) 把「做完一件事所需的一切」收进标准目录;Vault 则给密码等敏感文件上锁。这是 EX294 收尾两大件。

系列:从 RHCSA 到 RHCE · 第 17 / 17 篇 上一篇:变量与流程控制 总目录:系列索引

环境说明

  • 系统: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/*.j2Jinja2 模板(可含 {{ }})高
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 换成你的用户。

小结

  1. Role = 标准目录打包:tasks 必有,变量进 defaults/vars,动态内容用 templates。
  2. playbook 用 roles: 调用;系统角色要 拷到 roles_path。
  3. Vault 用口令加密敏感文件:encrypt / decrypt / rekey。
  4. 系列到此覆盖 RHCSA 地基 + EX294 主干;考前请把 14–17 的实验在自己环境再跑一遍。

恭喜读完本系列。 建议按 总目录 回顾,或从标签 RHEL9 复盘单篇。

系列导航:总目录 · 上一篇:变量与流程控制

相关阅读

全部文章 →
← 返回列表更多「Linux」