【发布时间】:2020-02-11 01:32:27
【问题描述】:
我在访问 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' %}
【问题讨论】:
-
抱歉这么短的评论,但很简单:
domain: tf_result.outputs.{{ item + '_domain' }}.value=>domain: "{{ tf_result.outputs[item + '_domain'].value }}"。 -
@Zeitounator,谢谢!这正是我想要的。您可以将其发布为答案,以便我将其标记为已回答吗?
-
转化为答案