Ansible中的jinja2模板未正确计算嵌套字典变量
我在yaml文件和jinja2模板中有变量,如下所示 #领事馆Ansible中的jinja2模板未正确计算嵌套字典变量,ansible,ansible-template,Ansible,Ansible Template,我在yaml文件和jinja2模板中有变量,如下所示 #领事馆 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
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
当我运行playbook传递额外的环境变量时,debug给出了正确的变量值,即“SomeTestToken”
但是当它在jinja2模板中进行模板化时,这就是我在/apps/account service/config.env
service_config_token=preprod['consul_config_token']
我希望内容是:service\u config\u token=SomeTestToken
尝试使用此
“{(部署环境|较低)['config_token']}}”
,也不起作用。实际上由set_fact
设置的变量config_token
包含字典引用“config_token”:“prepod['consur_config_token']”,而不是值
示例(注意缺少的Jinja分隔符{{..}}
):
-调试:
var:config_令牌
另外,在您的vars文件consul\u common.yml
中,您正在设置prepod['config\u token']
。而在您的set\u fact
中,您试图引用prepod['consur\u config\u token']
,这在理想情况下不应该为您提供SomeTestToken
的值
因此,通过对上述问题的更正,下面的剧本应该可以完成这项工作:
任务:
#包括具有变量名的变量,以便我们可以访问子目录“prepod”
-包括以下变量:
文件:consur_common.yml
姓名:领事瓦尔斯
#我使用了较短的“deploy_env”变量
-设定事实:
配置令牌:{{consu vars[deploy_env|lower]['config_令牌']}
-模板:
src:config.env.j2
dest:/apps/account service/config.env
上面使用-e“deploy_env=prepod”
运行的playbook将模板呈现为:
service_config_token=SomeTestToken
prepod['consur\u config\u token']是我这边的一个打字错误。我现在已经编辑过了。所以我必须给包含的变量起一个名字才能让它工作吗?所以当我们包含变量时,默认情况下,这些变量包含在顶级。您可以直接引用为prepod['config\u token']
,但由于prepod
本身就是deploy\u env
的值。我们可以使用另一个变量,在该变量下可以找到子目录。