Ansible-将动态变量传递到Jinja2模板中

时间:2019-10-14 12:12:47

标签: ansible jinja2

我在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' %}

1 个答案:

答案 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 }}"