在Ansible的jinja2模板中,嵌套字典变量没有正确求值



我在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

最新更新