ansible循环嵌套列表

时间:2015-11-25 00:06:31

标签: jinja2 ansible

我在group_vars中嵌套了这样的列表:

var_name:
- group1:
    - variable1
    - variable2
- group2:
    - variable1
    - variable2

并希望在jinja2模板中迭代它以形成像:

这样的xml
<group>
    <variable> <host>variable1</host> </variable>
    <variable> <host>variable2</host> </variable>
</group>
<group>
    <variable> <host>variable1</host> </variable>
    <variable> <host>variable2</host> </variable>
</group>

所以我做了一个像

这样的嵌套noop
{% for var in var_name %}
    <group>
    {% for host in var %}
            <variable> <host>{{host}}</host> </variable>
    {% endfor %}
    </group>
{% endfor %}

但它没有用,我得到了

<group>
    <variable> <host>group1</host> </variable>
<group>
<group>
    <variable> <host>group2</host> </variable>
<group>

看起来像包含var变量值的主变量,我应该怎么做?

2 个答案:

答案 0 :(得分:1)

你关闭了。试试这个。

首先,将group1和group2重命名为&#34; group&#34;像这样:

var_name:
- group:
    - variable1
    - variable2
- group:
    - variable1
    - variable2

然后,按如下方式更改循环:

{% for var in var_name %}
<group>
{% for host in var.group %}
    <variable><host>{{ host }}</host></variable>
{% endfor %}
</group>
{% endfor %}

答案 1 :(得分:0)

问题在于您的{% for host in var %}声明。 var只在循环的第一次迭代中解析为字符串group1,在第二次迭代中解析为group2。这就是你得到你提到的输出的原因。

您要做的是使用该名称作为var_name数据结构的参考。你想要的是这些方面:

{% for host in var_name[var] %}

这将引用您在var_name中定义的变量。