一、jinja2 for循环

在jinja2中的for循环,跟python中的for循环基本上是一模一样的。也是for…in…的形式。并且也可以遍历所有的序列以及迭代器。但是唯一不同的是,jinja2中的for循环没有break和continue语句。

但是在Jinja2模板中,没有continue和break语句,所以我们不能使用他们来控制我们的循环。但是Jinja2模板给我们提供了for循环中的其他一些变量。

变量

作用

loop.index0

当前迭代对象的索引,从0开始

loop.index

当前迭代对象的索引,从1开始

loop.revindex

当前循环的反向索引,比如序列的长度为5,那么第一次循环这个值就为5,接下来每次减一

lopp.revindex0

当前循环的反向索引,从0开始,所以第一次的值为loop.length-1

loop.first

是否为第一次迭代,反回True或False

loop.last

是否为最后一次迭代,返回True或False

loop.length

序列的长度

loop.previtem

当前循环值得上一个值,如果为序列中的第一个值,那么上一个值就为空

loop.nextitem

当前循环值得下一个值,如果为序列中的最后一个值,那么下一个值就为空

loop.cycle()

辅助循环,看下面的例子

for循环基本语法如下:

{ % for 迭代变量 in 可迭代对象 % }
{{ 迭代变量 }}
{ % endfor % }

案例一:为远程主机生成服务器列表,该列表从192.168.37.201 web01.magedu开始,到192.168.37.211 web11.magedu结束。在该案例中,手工一条条添加10条记录明显不是我们期望的结果,这里需要用For循环通过模板批量生成对应的配置文件。我们具体看下对应的Jinja2文件该如何编写。

{% for id in range(201,211) %}
192.168.37.{{ id }} web{{ "%02d"|format(id-200) }}.magedu
{% endfor %}

最终执行结果,如下所示:

192.168.37.201 web01.magedu
192.168.37.202 web02.magedu
192.168.37.203 web03.magedu
192.168.37.204 web04.magedu
192.168.37.205 web05.magedu
192.168.37.206 web06.magedu
192.168.37.207 web07.magedu
192.168.37.208 web08.magedu
192.168.37.209 web09.magedu
192.168.37.210 web10.magedu

第二行涉及一定的Python基础,这里额外解释下:

1、{{ id }}:提取for循环中对应变量id的值
2、“%02d”:调用的是Python内置的字符串格式化输出,然后将结果通过管道符"|"传递给format函数做二次处理,Jinja支持简单的算法运算符,但不经常用到,这里format(id-200)表示id的值减去200
3、%2d是将数字按宽度为2,采用右对齐方式输出,若数据位数不到2位,则左边补空格。%02d,和%2d差不多,只不过左边补0。%-2d将数字按宽度为2,采用左对齐方式输出,若数据位数不到2位,则右边补空格。%.2d 输出整形时最少输出2位,如不够前面以0占位。如输出2时变成02,200时只输出200。输出浮点型时(%.2f)小数点后强制2位输出

比如:

num = 1
print("%d" % (num))结果为:   (1)
print("%2d" % (num))结果为:  ( 1)
print("%02d" % (num))结果为: (01)
print("%-2d" % (num))结果为: (1 )
print("%.2d" % (num))结果为: (01)
print("%.2d" % (200))结果为: (200)
print('%.2f' % 3.1415926) 结果为: (3.14)
print('%.2f' % 3.1455926) 结果为:3.15
print('%.2f' % 3.1465926) 结果为:3.15

案例二:

1、换行

{% for i in [3,5,2,7] %}
{{ i }}
{% endfor %}

执行结果
3
5
2
7

2、不换行数字之间没有空格

{% for i in [3,5,2,7] -%}
{{ i }}
{%- endfor %}

执行结果
3527

3、不换行且数字之间有空格

{% for i in [3,5,2,7] -%}
{{ i }}{{ ' ' }}
{%- endfor %}

执行结果
3 5 2 7

4、字符间的连接符

{% for key,val in {'name':'zjy','age':18}.iteritems() %}
{{ key~ ':' ~val }}
{% endfor %}

执行结果
age:18
name:zjy

5、使用range

{% for i in range(5) %}
{{i}}
{% endfor %}

执行结果
0
1
2
3
4

6、 使用loop.index获取每次循环的次数

{% for i in [2,3,6,1] %}
{{ i~'----'~loop.index }}
{% endfor %}

执行结果
2----1
3----2
6----3
1----4

二、jinja2 if条件

if条件基本语法如下:

{% if variable is defined %}
    value of variable: {{ variable }}
{% else %}
    variable is not defined
{% endif %}

案例一:根据不同的mysql版本,生成相应版本的配置文件。

ansible循环创建多个用户 ansible for循环_2d