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

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变量文件中并加密,再在模板中引用变量:

  1. 创建加密的变量文件:
    ansible-vault create vars/secrets.yml
    
  2. 在变量文件中定义需加密的密码(保存时Ansible会自动加密整个文件):
    my_otherSuper_pwd: "解密后的密码内容"
    and_antoher_pwd: "解密后的密码内容"
    
  3. 修改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
    
  4. 在playbook或角色中加载该变量文件:
    vars_files:
      - vars/secrets.yml
    
    执行playbook时,Ansible会自动解密变量并替换到模板中。

方法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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:10:30