【问题标题】:nested dictionary variable is not evaluated correctly with jinja2 template in AnsibleAnsible 中的 jinja2 模板未正确评估嵌套字典变量
【发布时间】:2021-02-28 05:18:38
【问题描述】:

我在 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'] }}" 试过了,也没用。

【问题讨论】:

    标签: ansible ansible-template


    【解决方案1】:

    实际上由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
    

    【讨论】:

    • preprod['consul_config_token'] 是我的错字。我现在已经编辑过了。那么我必须为包含的变量命名才能使其工作吗?
    • 所以当我们include_vars 时,默认情况下变量被包含在顶层。可以直接引用preprod['config_token'],但是由于preprod本身就是deploy_env的值。我们可以使用一个额外的变量来找到这个子字典。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多