它的作用与php解释器一样,把带有php代码的源文件,解析成html
jinja2是把带有jinja2语法的文件解析成对应的目标内容
使用jinja2模块渲染文件
from jinja2 import Environment as Env ,FileSystemLoader as FS
#指定本地模板目录
env = Env(loader=FS('/jinja2'))
#加载模板文件
template = env.get_template('ceshi.html')
#渲染模板,可以传递变量
print(template.render(names=['lala','haha']).replace('\t','').lstrip('\n'))
{{ EXPR }} | 用于装载表达式,比如变量,运算表达式,比较表达式。 |
---|---|
{% EXPR %} | 用于装载控制语句,比如if,for等。 |
{# #} | 用于装载注释,模板文件中的注释不会包含在最终生成文件中。 |
{%for … %}用于声明循环,{% endfor %} 表示结束。
{% for host in groups['all'] %}
{{ hostvars[host]['ansible_default_ipv4']['address'] }} {{ hostvars[host]['ansible_fqdn'] }} {{ hostvars[host]['ansible_hostname'] }}
{% endfor %}
{% for myuser in users if not myuser == "Mario" %}
{{loop.index}} - {{ myuser }}
{% endfor %}
myuser会遍历users变量中所有值,除了Mario。
loop.index代表当前循环的索引号,从1开始到最后循环体的数量。例如循环体有12个,那么loop.index代表1,2,3..12。
假如users变量为:Tom,Eric,Mario,Alice
输出结果为:
1 - Tom
2 - Eric
4 - Alice
loop.index | 当前循环操作为整个循环的第几次循环,序号从1开始 |
---|---|
loop.index0 | 当前循环操作为整个循环的第几次循环,序号从0开始 |
loop.revindex | 当前循环操作距离整个循环结束还有几次,序号到1结束 |
loop.revindex0 | 当前循环操作距离整个循环结束还有几次,序号到0结束 |
loop.first | 当操作迭代对象中的第一个元素时,此变量的值为true |
loop.last | 当操作迭代对象中的最后一个元素时,此变量的值为true |
loop.length | 迭代对象的长度 |
loop.depth | 当使用递归的循环时,当前迭代所在的递归中的层级,层级序号从1开始 |
loop.depth0 | 当使用递归的循环时,当前迭代所在的递归中的层级,层级序号从0开始 |
loop.cycle() | 这是一个辅助函数,通过这个函数我们可以在指定的一些值中进行轮询取值。 |
参考:http://jinja.pocoo.org/
{% for i in [3,1,7,8,2] %}
{{ i }}
{% endfor %}
{% for i in [7,1,5,3,9] if i > 3 %}
{{ i }}
{% endfor %}
{% for i in [7,1,5,3,9] if i > 3 %}
{% for n in [1,2,5,3,9] if n < 3 %}
{{ i }} - {{ n }}
{% endfor %}
{% endfor %}
range(3)代表 1 2 3,循环三次。
{% for i in range(3) %}
172.16.{{ i }}.110
{% endfor %}
range(1,4,2),从1开始,到4结束,步长2.
{% for i in range(1,4,2) %}
{{ i }}
{% endfor %}
如果Success变量是true,那么输出变量ok。
{% if success %}
{{ ok }}
{% endif %}
配置mysql端口,如果PORT定义了端口,那么使用该值,否则使用默认3306.
{% if PORT %}
bind-address=0.0.0.0:{{ PORT }}
{% else %}
bind-address=0.0.0.0:3306
{% endif %}
{% if 条件一 %}
...
{% elif 条件二 %}
...
{% elif 条件N %}
...
{% endif %}
{% if 条件一 %}
...
{% elif 条件N %}
...
{% else %}
...
{% endif %}
{% for i in range(1,100) %}
{% if i % 2 == 0 %}
{{ i }}
{%endif%}
{% endfor %}
参考:https://www.programcreek.com/python/example/1632/jinja2.Environment
对内容进行特定的处理
{{ output | to_json }} | 使用JSON格式输出。 |
---|---|
{{ output | to_yaml}} | 使用YAML格式输出。 |
{{ output | to_nice_json}} | 使用人们更加可读的JSON格式输出。 |
{{ output | to_nice_yaml}} | 使用人们更加可读的YAML格式输出。 |
{{ output | from_json}} | 把output当做JSON格式解析。 |
{{ output | from_yaml}} | 把output当做YAML格式解析。 |
when语句中使用的表达式就是Jinja2表达式,用于测试返回值。
测试的返回值包括:failed
,changed
,succeeded
,skipped
。
示例:
tasks:
- debug: msg=”the execution was aborted”
when: returnvalue | failed -> 相当于 when: returnvalue is failed
将字符串转换成纯大写 | "{{ testvar | upper }}" |
---|---|
将字符串转换成纯小写 | "{{ testvar | lower }}" |
将字符串变成首字母大写,之后所有字母纯小写 | "{{ testvar | capitalize }}" |
将字符串反转 | "{{ testvar | reverse }}" |
返回字符串的第一个字符 | "{{ testvar | first }}" |
返回字符串的最后一个字符 | "{{ testvar | last }}" |
将字符串开头和结尾的空格去除 | "{{ testvar1 | trim }}" |
将字符串放在中间,并且设置字符串的长度为30,字符串两边用空格补齐30位长 | "{{ testvar1 | center(width=30) }}" |
返回字符串长度,length与count等效,可以写为count | "{{ testvar2 | length }}" |
将字符串转换成列表,每个字符作为一个元素 | "{{ testvar3 | list }}" |
将字符串转换成列表,每个字符作为一个元素,并且随机打乱顺序 | "{{ testvar3 | shuffle }}" |
在随机打乱顺序时,将ansible_date_time.epoch的值设置为随机种子 | "{{ testvar3 | shuffle(seed=(ansible_date_time.epoch)) }}" |
ansible中,字符串和整形不能直接计算,比如{{ 8+'8' }}会报错,所以,我们可以把一个值为数字的字符串转换成整形后再做计算
将对应的值转换成int类型 | "{{ 8+('8' | int) }}" |
---|---|
使用int(default=6)或者int(6)时,如果无法转换则返回指定值6 | "{{ 'a' | int(default=6) }}" |
将对应的值转换成浮点型,如果无法转换,默认返回'0.0' | "{{ '8' | float }}" |
当对应的值无法被转换成浮点型时,则返回指定值'8.8' | "{{ 'a' | float(8.88) }}" |
获取对应数值的绝对值 | "{{ testvar4 | abs }}" |
四舍五入 | "{{ 12.5 | round }}" |
取小数点后五位 | "{{ 3.1415926 | round(5) }}" |
从0到100中随机返回一个随机数 | "{{ 100 | random }}" |
从5到10中随机返回一个随机数 | "{{ 10 | random(start=5) }}" |
从5到15中随机返回一个随机数,步长为3 | "{{ 15 | random(start=5,step=3) }}" |
从0到15中随机返回一个随机数,这个随机数是5的倍数 | "{{ 15 | random(step=5) }}" |
0~15间返回一个随机数,随机数种子是facts->ansible_date_time.epoch | "{{ 15 | random(seed=(ansible_date_time.epoch)) }}" |
返回列表长度,length与count等效,可以写为count | "{{ testvar7 | length }}" |
---|---|
返回列表中的第一个值 | "{{ testvar7 | first }}" |
返回列表中的最后一个值 | "{{ testvar7 | last }}" |
返回列表中最小的值 | "{{ testvar7 | min }}" |
返回列表中最大的值 | "{{ testvar7 | max }}" |
将列表升序排序输出 | "{{ testvar7 | sort }}" |
将列表降序排序输出 | "{{ testvar7 | sort(reverse=true) }}" |
返回纯数字非嵌套列表中所有数字的和 | "{{ testvar7 | sum }}" |
如果列表中包含列表,那么使用flatten可以'拉平'嵌套的列表 | "{{ testvar8 | flatten }}" |
如果列表中嵌套了列表,那么将第1层的嵌套列表‘拉平’ | "{{ testvar8 | flatten(levels=1) }}" |
过滤器都是可以自由结合使用的,就好像linux命令中的管道符一样 | "{{ testvar8 | flatten | max }}" |
将列表中的元素合并成一个字符串 | "{{ testvar9 | join }}" |
将列表中的元素合并成一个字符串,每个元素之间用指定的字符隔开 | "{{ testvar9 | join(',') }}" |
从列表中随机返回一个元素, 不能使用start和step参数 | "{{ testvar9 | random }}" |
从列表中随机返回一个元素 | "{{ testvar9 | random(seed=(ansible_date_time.epoch)) }}" |
随机打乱顺序列表中元素的顺序 | "{{ testvar9 | shuffle }}" |
在随机打乱顺序时,将ansible_date_time.epoch的值设置为随机种子 | "{{ testvar9 | shuffle(seed=(ansible_date_time.epoch)) }}" |
将列表中的每个元素变成纯大写 | "{{ testvar10 | upper }}" |
将列表中的每个元素变成纯小写 | "{{ testvar10 | lower }}" |
去掉列表中重复的元素,重复的元素只留下一个 | "{{ testvar11 | unique }}" |
去掉列表中重复的元素,重复的元素只留下一个 | "{{ testvar11 | unique }}" |
将两个列表合并,重复的元素只留下一个, 也就是求两个列表的并集 | "{{ testvar11 | union(testvar12) }}" |
取出两个列表的交集,重复的元素只留下一个 | "{{ testvar11 | intersect(testvar12) }}" |
两个列表的交集在列表1中的补集 | "{{ testvar11 | difference(testvar12) }}" |
去除两个列表的交集,剩余的元素 | "{{ testvar11 | symmetric_difference(testvar12) }}" |
比较运算 | 逻辑运算 | 算数运算 | 成员运算 |
---|---|---|---|
{{ 1 == 1 }} | {{ (2 > 1) or (1 > 2) }} | {{ 3 + 2 }} | {{ 1 in 1,2,3,4 }} |
{{ 2 != 2 }} | {{ (2 > 1) and (1 > 2) }} | {{ 3 - 4 }} | {{ 1 not in 1,2,3,4 }} |
{{ 2 > 1 }} | {{ not true }} | {{ 3 * 5 }} | |
{{ 2 >= 1 }} | {{ not True }} | {{ 2 ** 3 }} | |
{{ 2 < 1 }} | {{ not false }} | {{ 7 / 5 }} | |
{{ 2 <= 1 }} | {{ not False }} | {{ 7 // 5 }} |
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。