介绍
Ansible Vault 可以加密敏感变量,从而将它们与 Playbook 一起存储,而不会泄露明文机密。只有当你提供有效的 Vault 密码时,Playbook 才能使用这些变量的值。
在本实验中,你将创建一个加密变量,观察在缺少密码时出现的错误,并使用 Vault 密码文件成功运行 Playbook。
创建 Vault 练习项目
在此步骤中,你将创建一个包含清单(inventory)、组变量目录、Playbook 目录和报告目录的项目。
cd /home/labex/project
mkdir -p rhce-ansible/{inventory/group_vars/managed,playbooks,managed,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[managed]
host ansible_connection=local
EOF
加密变量将存放在 inventory/group_vars/managed 下,因此它会像其他任何变量文件一样为 managed 组加载。不同之处在于,Ansible 必须在使用前对其进行解密。
创建 Vault 密码文件
在此步骤中,你将为实验自动化创建一个密码文件。在实际工作中,请妥善保护此文件或使用基于提示(prompt-based)的工作流。 在运行此步骤中的命令之前,请返回 Ansible 项目目录。即使 LabEx 分步运行,这也能确保命令的稳定性。
cd /home/labex/project/rhce-ansible
cat > vault_pass.txt <<'EOF'
labex-vault-pass
EOF
chmod 600 vault_pass.txt
此密码文件仅用于实验工作流。chmod 600 模式意味着只有所有者可以读取和写入它,这是在处理可解锁机密的文件时应养成的最低限度的习惯。
ls -l vault_pass.txt
检查权限是否类似于 -rw-------。如果该文件可被组或其他用户读取,请重新运行 chmod 600 命令。
创建加密变量
在此步骤中,你将使用 ansible-vault encrypt_string 创建一个名为 app_secret 的加密变量。加密后的文件可以像其他任何组变量文件一样加载。
在运行此步骤中的命令之前,请返回 Ansible 项目目录。
cd /home/labex/project/rhce-ansible
ansible-vault encrypt_string --vault-password-file vault_pass.txt 'redhat' --name app_secret > inventory/group_vars/managed/vault.yml
该命令会写入一个名为 app_secret 的加密 YAML 变量。变量名保持可读,但值 redhat 存储在 Vault 块中。
sed -n "1,8p" inventory/group_vars/managed/vault.yml
文件应显示 app_secret: !vault 和 $ANSIBLE_VAULT; 头部。你不应该在此文件中看到明文机密。
编写使用机密的 Playbook
在此步骤中,你将编写一个引用 app_secret 的 Playbook。如果没有 Vault 密码,Ansible 将无法解密此变量。
在运行此步骤中的命令之前,请返回 Ansible 项目目录。
cd /home/labex/project/rhce-ansible
cat > playbooks/use-vault.yml <<'EOF'
---
- name: Use an encrypted variable
hosts: managed
gather_facts: false
tasks:
- name: Write secret-derived file
ansible.builtin.copy:
dest: /home/labex/project/rhce-ansible/managed/secret.txt
content: |
secret={{ app_secret }}
mode: '0600'
EOF
该 Playbook 像使用普通变量一样使用 app_secret。这就是 Vault 的意义所在:Playbook 逻辑可以保持简洁,而敏感值在静态存储时保持加密状态。
ansible-playbook playbooks/use-vault.yml > reports/vault-missing.txt 2>&1 || true
由于未提供 Vault 密码,此运行预计会失败。输出被重定向到报告中,以便你可以在不中断实验的情况下检查失败原因。
grep -Ei "vault|decrypt|password|secret" reports/vault-missing.txt
过滤后的错误信息应提及 Vault、解密(decryption)、密码或机密。还要注意,验证过程预期此时还没有 managed/secret.txt 文件。
使用 Vault 密码运行 Playbook
在此步骤中,你将提供 Vault 密码文件,以便 Ansible 可以解密变量并写入受保护的输出文件。 在运行此步骤中的命令之前,请返回 Ansible 项目目录。
cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/use-vault.yml --vault-password-file vault_pass.txt | tee reports/vault-run.txt
现在 Ansible 可以在运行时解密 app_secret 并将明文值传递给 copy 任务。磁盘上的加密文件保持加密状态。
sudo ls -l managed/secret.txt && cat managed/secret.txt
该文件应具有 600 权限,并包含 secret=redhat。这证明了 Playbook 在使用解密值的同时,仍然保护了生成的机密文件。
总结
你创建了一个 Vault 加密变量,观察到 Playbook 在没有密码的情况下无法使用它,然后通过 Vault 密码文件运行 Playbook,成功解密并应用了机密信息。


