You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ansible角色中加密整个vault.yml文件无法加载,求可行方案

在Ansible角色中使用加密的整个vault.yml文件的解决方案

问题场景

我之前在Ansible角色里习惯用encrypt_string加密敏感信息,但新老板要求必须加密整个vars/vault.yml文件。尝试后发现角色里无法正常读取这个加密文件的内容,执行playbook时提示password变量未定义。

环境结构

bash-3.2$ tree
.
├── playbooks
│   └── run_foo.yml
└── roles
    └── foo
        ├── tasks
        │   └── main.yml
        └── vars
            ├── main.yml
            └── vault.yml

5 directories, 4 files

相关文件内容

  1. playbook文件(playbooks/run_foo.yml)
---
- name: Run Foo
  hosts: all
  roles:
    - role: ../roles/foo
  1. 角色任务文件(roles/foo/tasks/main.yml)
---
# tasks file for foo
- name: 输出明文变量
  debug:
    var: clear_text
- name: 输出加密的密码变量
  debug:
    var: password
  1. 角色主变量文件(roles/foo/vars/main.yml)
---
# vars file for foo
include_vars: vault.yml
clear_text: 12345
  1. 加密后的vault.yml文件
$ANSIBLE_VAULT;1.1;AES256
64653334323939303461653839353634666162383130326533306234636232656162306661383761
6339376233366638643331373831316638373263663830350a333733653039353939656633376333
31323232666633373633393032396232613830393735396139376333353035633566376465636536
3930633964633861620a633735343066313938633733303538333864353665393062626338356665
63363666636638623964336461346366323565323563316434323439626239633734
  1. 解密后的vault.yml内容
password: hovercraft

执行结果

bash-3.2$ ansible-playbook -i,localhost playbooks/run_foo.yml --connection=local --ask-vault-pass
Vault password:

PLAY [Run Foo] **************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************
[WARNING]: error loading fact - please check content
[WARNING]: Platform darwin on host localhost is using the discovered Python interpreter at /Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6, but future installation of
another Python interpreter could change the meaning of that path. See https://docs.ansible.com/ansible/2.10/reference_appendices/interpreter_discovery.html for more information.
ok: [localhost]

TASK [../roles/foo : 输出明文变量] ******************************************************************************************
ok: [localhost] => {
    "clear_text": 12345
}

TASK [../roles/foo : 输出加密的密码变量] **************************************************************************************
ok: [localhost] => {
    "password": "VARIABLE IS NOT DEFINED!"
}

PLAY RECAP ******************************************************************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

解决方案

完全可以在Ansible角色中使用加密的整个vault.yml文件,问题出在你加载加密变量的方式上。

错误原因

在vars/main.yml中用include_vars直接加载加密的vault.yml时,Ansible不会自动解密这个文件——include_vars在变量加载阶段执行,此时Ansible的vault解密机制还未处理该文件内容,导致无法解析出里面的变量。

正确实现方式

有两种可靠的解决方法:

方法1:在任务阶段加载加密文件

修改角色的tasks/main.yml,在开头添加加载加密变量的任务,确保在任务执行阶段(此时已获取vault密码)加载并解密文件:

---
# tasks file for foo
- name: 加载加密的vault变量
  include_vars: vault.yml

- name: 输出明文变量
  debug:
    var: clear_text
- name: 输出加密的密码变量
  debug:
    var: password

方法2:利用Ansible自动加载vault文件的规则

Ansible默认会自动解密命名为vault.yml或以vault_开头的变量文件,只要执行时提供vault密码。只需调整变量加载逻辑:

  • 移除vars/main.yml中的include_vars: vault.yml配置
  • 保留vault.yml在角色的vars目录下,Ansible会自动加载该目录下的所有.yml文件,并自动解密vault.yml

验证

无论使用哪种方法,重新执行原playbook命令并输入vault密码后,password变量都会被正确输出为hovercraft。


内容的提问来源于stack exchange,提问作者Red Cricket

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 06:04:56