《Ansible语法篇:jinja2的for和if的使用》

更多的测试器可以查看Jinja2的官方文档

一、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版本,生成相应版本的配置文件。
在这里插入图片描述


总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:《Linux运维篇:Linux系统运维指南》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东城绝神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值