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