Ansible中如何解密Jinja2模板文件中的单个加密变量
问题描述
在Ansible的inventory目录下有一个名为myFile.properties.j2的Jinja2模板文件,被某playbook的角色任务调用。
模板文件内容:
my.super.pwd=nope my.otherSuper.pwd= !vault | $ANSIBLE_VAULT;1.1;AES256 38663664363362333264343934373066623330373736646232663337353062383731346234363937 3131633062366462643261323333303438333330343231370a626639333066303562373964633035 30653433303165333734386131353861366637393430636364386439386666363331656330393830 3961666132396561350a326266633462653335626466623464316461313061373532633136353734 30613030363837333833656239626236323036356265313435636232633031323432626338663838 33663135346364316135386239663063623363656661643635353032633365663464356235396466 663633333832623963393334633666383964 and.antoher= !vault | $ANSIBLE_VAULT;1.1;AES256 38663664363362333264343934373066623330373736646232663337353062383731346234363937 3131633062366462643261323333303438333330343231370a626639333066303562373964633035 30653433303165333734386131353861366637393430636364386439386666363331656330393830 3961666132396561350a326266633462653335626466623464316461313061373532633136353734 30613030363837333833656239626236323036356265313435636232633031323432626338663838 33663135346364316135386239663063623363656661643635353032633365663464356235396466 663633333832623963393334633666383964 another.pwd.net=nope and.another.pwd=nope
调用该模板的任务:
- name: "Template the secrets files" template: src: "{{ item.src }}" dest: "{{ somewhere }}/{{ item.path | basename | regex_replace('.j2$', '') }}" force: true mode: '0440' owner: "{{ somebody }}" group: root with_filetree: "{{ some_dir }}" when: item.state == 'file'
执行playbook后,生成的文件内容与原模板完全一致,其中的加密变量未被解密,但将整个文件加密时可正常解密,需解决此问题。
解决方案
Ansible默认不会自动解密模板中的内联Vault片段(即!vault |开头的行内加密内容),仅会自动解密作为变量存在的Vault内容,或对整个加密文件进行解密。以下两种方法可解决该问题:
方法1:将Vault内容提取为变量
把模板中的加密内容迁移到Ansible变量文件中并加密,再在模板中引用变量:
- 创建加密的变量文件:
ansible-vault create vars/secrets.yml - 在变量文件中定义需加密的密码(保存时Ansible会自动加密整个文件):
my_otherSuper_pwd: "解密后的密码内容" and_antoher_pwd: "解密后的密码内容" - 修改Jinja2模板
myFile.properties.j2:my.super.pwd=nope my.otherSuper.pwd={{ my_otherSuper_pwd }} and.antoher={{ and_antoher_pwd }} another.pwd.net=nope and.another.pwd=nope - 在playbook或角色中加载该变量文件:
执行playbook时,Ansible会自动解密变量并替换到模板中。vars_files: - vars/secrets.yml
方法2:使用vault过滤器手动解密内联内容
若不想修改模板结构,可在模板中用Jinja2的vault过滤器手动解密内联Vault片段:
将模板中的!vault |替换为{{ '<vault内容>' | vault }},注意把多行Vault内容合并为单行(或用引号包裹多行):
my.super.pwd=nope my.otherSuper.pwd={{ '$ANSIBLE_VAULT;1.1;AES256\n38663664363362333264343934373066623330373736646232663337353062383731346234363937\n3131633062366462643261323333303438333330343231370a626639333066303562373964633035\n30653433303165333734386131353861366637393430636364386439386666363331656330393830\n3961666132396561350a326266633462653335626466623464316461313061373532633136353734\n30613030363837333833656239626236323036356265313435636232633031323432626338663838\n33663135346364316135386239663063623363656661643635353032633365663464356235396466\n663633333832623963393334633666383964' | vault }} and.antoher={{ '$ANSIBLE_VAULT;1.1;AES256\n38663664363362333264343934373066623330373736646232663337353062383731346234363937\n3131633062366462643261323333303438333330343231370a626639333066303562373964633035\n30653433303165333734386131353861366637393430636364386439386666363331656330393830\n3961666132396561350a326266633462653335626466623464316461313061373532633136353734\n30613030363837333833656239626236323036356265313435636232633031323432626338663838\n33663135346364316135386239663063623363656661643635353032633365663464356235396466\n663633333832623963393334633666383964' | vault }} another.pwd.net=nope and.another.pwd=nope
模板渲染时,Ansible会通过vault过滤器解密对应内容。
注意:使用方法2时,需确保执行playbook的环境能获取Vault密码(如通过--ask-vault-pass参数、环境变量ANSIBLE_VAULT_PASSWORD_FILE等方式提供)。
内容的提问来源于stack exchange,提问作者Faycal Said
相关产品推荐
相关产品推荐

