如何使用 jinja 评估 yaml 密钥,然后使用 ansible 在 .j2 文件中使用 jinja 评估其值?
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 的结果输出如下所示:-
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 ... while ansible templates secret.j2。有没有办法在同一行中通过修改数据库密码: ... ?"
答:是的。有。试试 lookup 插件 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
我有一个 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 的结果输出如下所示:-
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 ... while ansible templates secret.j2。有没有办法在同一行中通过修改数据库密码: ... ?"
答:是的。有。试试 lookup 插件 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