我有一个剧本,可以生成两个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
答案 0 :(得分:1)
使用vars
lookup plugin引用变量(而不是像现在一样迭代名称中的字符)。
你的内部循环应该是:
{% for index in lookup('vars', prefix) %}
还要检查control whitespace in Jinja2的方法,因为你当前代码得到的输出会奇怪地缩进。
答案 1 :(得分:0)
我对Ansible的经验不多,但我想你应该尝试在defaults.yml
(这是您的模板所期望的)
prefix_list:
-
- kola
- wlcom
- linkstory
-
- kola
(模板中需要prefix1
和prefix2
时
prefix_list:
prefix1:
- kola
- wlcom
- linkstory
prefix2:
- kola
在这种情况下,Jinja循环应该以这种方式修复
{% for prefix in prefix_list %}
{% for index in prefix_list[prefix] %}
{{ index }}
{% endfor %}
{% endfor %}