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

