Ansible和Jinja2变量组合

时间:2018-05-07 11:04:46

标签: ansible jinja2

我有一个剧本,可以生成两个Ansible列表的bash脚本。

在Jinja2模板文件中,我试图在一个Ansible列表上运行for循环,然后根据第一个的输出在其中运行另一个for循环。

这是我的Ansible defaults.yml

##################################
#        FIRST LOOP              #
##################################

prefix_list:
  - prefix1
  - prefix2

##################################
#         SECOND LOOP            #
##################################
prefix1:
  - kola
  - wlcom
  - linkstory



prefix2:
  - kola

Jinja2模板:

#!/bin/bash
date=$(date +'%Y.%m' -d "month ago")
exdate=$(date +'%Y.%m' -d "{{ exdate }} months ago")
{% for prefix in prefix_list %}
    {% for index in prefix %}
        {{ index }}
    {% endfor %}
{% endfor %}

结果:

#!/bin/bash
date=$(date +'%Y.%m' -d "month ago")
exdate=$(date +'%Y.%m' -d "12 months ago")
            p
            r
            e
            f
            i
            x
            1
                p
            r
            e
            f
            i
            x
            2

2 个答案:

答案 0 :(得分:1)

使用vars lookup plugin引用变量(而不是像现在一样迭代名称中的字符)。

你的内部循环应该是:

{% for index in lookup('vars', prefix) %}

还要检查control whitespace in Jinja2的方法,因为你当前代码得到的输出会奇怪地缩进。

答案 1 :(得分:0)

我对Ansible的经验不多,但我想你应该尝试在defaults.yml

中嵌套你的列表

案例1 - 嵌套列表

(这是您的模板所期望的)

prefix_list:
  -
    - kola
    - wlcom
    - linkstory

  -
    - kola

案例2 - 字典

(模板中需要prefix1prefix2

prefix_list:
  prefix1:
    - kola
    - wlcom
    - linkstory

  prefix2:
    - kola

在这种情况下,Jinja循环应该以这种方式修复

{% for prefix in prefix_list %}
    {% for index in prefix_list[prefix] %}
        {{ index }}
    {% endfor %}
{% endfor %}