繁体   English   中英

使用 Ansible 中的 jinja2 模板未正确评估嵌套字典变量

[英]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.

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