繁体   English   中英

如何使用 jinja 评估 yaml 密钥,然后使用 ansible 使用 jinja in.j2 文件评估其值?

[英]How to evaluate a yaml key using jinja and then evaluate its value using jinja in .j2 file using ansible?

我有一个 kubernetes 秘密清单,格式为 secret.j2 文件,其中包含密码密钥。 该密码密钥应该从 dev.yml 文件中存在的 ansible-vault 加密字符串中分配一个值。 这个 dev.yml 如下所示:-

dev_db_password: !vault |
    $ANSIBLE_VAULT;1.1;AES256
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

我将“dev”作为运行时参数“namespace=dev”传递给我的剧本。 secret.j2 的 stringData 如下所示:-

stringData:
 consoleadminpassword: "{{'{{'}} {{ namespace + '_console_password' }} {{'}}'}}"
 consolenonadminpassword: "{{'{{'}} {{ namespace + '_console_password' }} {{'}}'}}"
 dbpassword: "{{'{{'}} {{ namespace + '_console_password' }} {{'}}'}}"

当我将 secret.j2 模板化为 secret.yml 时,生成的 stringData 的 output 如下所示:-

stringData:
  consoleadminpassword: "{{ dev_console_password }}"
  consolenonadminpassword: "{{ dev_console_password }}"
  dbpassword: "{{ dev_db_password }}"

现在我希望它进一步评估“dev_db_password”以将“dbpassword”密钥设置为 dev.yml 的解密值,而 ansible 将 secret.j2 模板设置为 secret.yml。 有没有办法通过修改dbpassword: "{{'{{'}} {{ namespace + '_db_password' }} {{'}}'}}"在同一行中实现这一点?

问: 评估 dev_db_password ... 而 ansible 模板 secret.j2。有没有办法通过修改dbpassword 在同一行中实现这一点: ...?

答:是的。 有。 尝试查找插件vars 请参阅ansible-doc -t lookup vars

dbpassword: "{{'{{'}} {{ lookup('vars', namespace + '_db_password') }} {{'}}'}}"

例如,模板

shell> cat secret.j2
stringData:
  consoleadminpassword: "{{'{{'}} {{ lookup('vars', namespace + '_console_password') }} {{'}}'}}"
  consolenonadminpassword: "{{'{{'}} {{ lookup('vars', namespace + '_console_password') }} {{'}}'}}"
  dbpassword: "{{'{{'}} {{ lookup('vars', namespace + '_db_password') }} {{'}}'}}"

和剧本

- hosts: localhost
  tasks:
    - template:
        src: secret.j2
        dest: secret.yml
      vars:
        namespace: dev
        dev_console_password: passwd_console
        dev_db_password: passwd_db

shell> cat secret.yml 
stringData:
  consoleadminpassword: "{{ passwd_console }}"
  consolenonadminpassword: "{{ passwd_console }}"
  dbpassword: "{{ passwd_db }}"

如果您不需要对字典中的变量(密码)进行下一次评估,请使用下面的模板

shell> cat secret.j2
stringData:
  consoleadminpassword: {{ lookup('vars', namespace + '_console_password') }}
  consolenonadminpassword: {{ lookup('vars', namespace + '_console_password') }}
  dbpassword: {{ lookup('vars', namespace + '_db_password') }}

会给

shell> cat secret.yml 
stringData:
  consoleadminpassword: passwd_console
  consolenonadminpassword: passwd_console
  dbpassword: passwd_db

如果您将密码放入加密文件

shell> cat dev.yml 
dev_console_password: passwd_console
dev_db_password: passwd_db
shell> ansible-vault encrypt dev.yml
Encryption successful
shell> cat dev.yml
$ANSIBLE_VAULT;1.1;AES256
30663636653963333864346339303034356463356234383035363561356365376130396465323736
...

剧本将给出相同的结果

- hosts: localhost
  vars:
    namespace: dev
  tasks:
    - include_vars: "{{ namespace }}.yml"
    - template:
        src: secret.j2
        dest: secret.yml

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM