Ansible中的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

我在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:
        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
的值。我们可以使用另一个变量,在该变量下可以找到子目录。