![](/img/trans.png)
[英]Loop over Ansible variable array in Jinja2 template to create nested dictionary
[英]nested dictionary variable is not evaluated correctly with jinja2 template in Ansible
我在 yaml 文件和 jinja2 模板中有变量,如下所示。
#consul_common.yml
preprod:
config_token: "SomeTestToken"
#config.env.j2
service_config_token={{ config_token }}
剧本如下:
---
- hosts: all
gather_facts: yes
tasks:
- include_vars: consul_common.yml
- set_fact:
config_token: "{{ (deploy_environment | lower) }}['config_token']"
- debug:
var: "{{ config_token }}"
- template:
src: config.env.j2
dest: /apps/account-service/config.env
当我运行传递额外环境变量deploy_environment=PREPROD
的剧本时,调试给出了正确的变量值,即“SomeTestToken”但是当它在 jinja2 模板中模板化时,这就是我在/apps/account-service/config.env
中得到的
service_config_token=preprod['consul_config_token']
我期待的内容是: service_config_token=SomeTestToken
尝试使用此"{{ (deploy_environment | lower)['config_token'] }}"
,也没有用。
实际上,由set_fact
config_token
字典引用"config_token": "preprod['consul_config_token']"
,而不是值。
示例(注意缺少 Jinja 分隔符{{.. }}
):
- debug:
var: config_token
此外,在您的 vars 文件consul_common.yml
中,您正在设置preprod['config_token']
。 而在你的set_fact
中,你试图引用preprod['consul_config_token']
,理想情况下它不应该给你SomeTestToken
的值。
因此,对上述问题进行了更正后,下面的剧本应该可以完成这项工作:
tasks:
# include vars with a variable name, so that we can access the sub-dict "preprod"
- include_vars:
file: consul_common.yml
name: consul_vars
# I have used the shorter "deploy_env" variable
- set_fact:
config_token: "{{ consul_vars[deploy_env|lower]['config_token'] }}"
- template:
src: config.env.j2
dest: /apps/account-service/config.env
以上 playbook 使用-e "deploy_env=PREPROD"
运行,将模板呈现为:
service_config_token=SomeTestToken
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.