我在Jinja2模板中访问动态命名的Ansible变量时遇到问题。我有一个这样的租户列表:
tenants:
- liamtest1
- liamtest2
在我的剧本中,我为以下每个租户创建了Terraform配置文件,如下所示:
- name: Generate a .tf file for each tenant in list
template:
src: templates/tenant.tf.j2
dest: "{{ enviro }}/terraform/{{ item }}.tf"
with_items: "{{ hostvars[inventory_hostname][enviro]['tenants'] }}"
稍后在剧本中,我使用terraform模块应用我的配置并将输出注册到变量:
- name: Run terraform
terraform:
project_path: "{{ enviro }}/terraform/"
state: present
register: tf_result
我已在terraform输出中以租户名称作为前缀,这样我就不会重复。这一点一切正常,我可以通过调试任务显示这些输出,例如 tenant _domain:
- debug:
var: tf_result.outputs.{{ item + '_domain' }}.value
with_items: "{{ hostvars[inventory_hostname][enviro]['tenants'] }}"
产生此输出:
ok: [localhost] => (item=liamtest1) => {
"ansible_loop_var": "item",
"item": "liamtest1",
"tf_result.outputs.liamtest1_domain.value": "liamtest1.mydomain.com"
}
ok: [localhost] => (item=liamtest2) => {
"ansible_loop_var": "item",
"item": "liamtest2",
"tf_result.outputs.liamtest2_domain.value": "liamtest2.mydomain.com"
}
我似乎无法做的是从另一个Jinja2模板生成另一组文件(这次是mongodb的javascript文件)。
我已经尝试过了:
- name: Generate a .js file for each tenant in list
vars:
domain: tf_result.outputs.{{ item + '_domain' }}.value
template:
src: templates/tenant.js.j2
dest: "{{ enviro }}/mongodb/{{ item }}.js"
with_items: "{{ hostvars[inventory_hostname][enviro]['tenants'] }}"
如果我在我的Jinja2模板中使用{{ domain }}
引用它,则其结尾只有一个字符串,例如第一个文件中的tf_result.outputs.liamtest1_domain.value
和第二个文件中的tf_result.outputs.liamtest2_domain.value
。
我还尝试在Jinja2模板中使用lookup
,如下所示:
{{ lookup('vars', domain) }}
哪个给我:
"AnsibleUndefinedVariable: No variable found with this name: tf_result.outputs.liamtest1_domain.value"
我还尝试了其他一些变体,例如:
{{ lookup(hostvars[inventory_hostname], domain) }}
我也尝试过其他一些事情,我不确定它们是否都值得一提,因为它们都不起作用,但是例如,我尝试在Jinja模板中而不是像这样的任务级别设置变量例如:
{% set domain = lookup('vars', 'tf_result.outputs.' + item + '_domain' %}
答案 0 :(得分:1)
您的Yaml只是存在语法问题。
# Wrong
vars:
domain: tf_result.outputs.{{ item + '_domain' }}.value
这是声明一个var,其值是(字面意义上的)"tf_result.outputs."
的串联,后跟当前item
和"_domain.value"
的值。您想要的是该完整变量中包含的实际值。这是正确的语法:
# Correct
vars:
domain: "{{ tf_result.outputs[item + '_domain'].value }}"