Ansible学习笔记——JINJA2模板的语法及使⽤(template模块)JINJA2模板的语法及使⽤
JINJA2模板的语法
个⼈理解⾮常像shell脚本或者开发语⾔,例如⼀些逻辑运算等。
如果有开发基础,更易懂吧。⽐如我哈哈哈哈哈
1、变量
可以在j2模板中引⼊facts变量,直接使⽤。
This is the system {{ ansible_facts['fqdn']}}.
This is a {{ ansible_facts['distribution']}} version {{ ansible_facts['distribution_version']}} system.
Only use this system with permission.
也可以直接引⽤playbook中的变量
也可以在j2模板中定义变量——此时的优先级⾼于playbook中的优先级。
例如,在j2模板中定义了username变量:
{% set username = 'zhang' %}
The username id {{ username }}
在yml⽂件中也定义了变量
vars:
-username: wangxc
执⾏后,⽂件中的结果为:
The username id zhang
此时可以证明,j2模板中的变量优先级是更⾼的。
当移除掉j2模板中的变量定义时,将会引⽤yml⽂件中的变量。
The username id wangxc
2、逻辑控制——ifelse
{% if 条件表达式 %}
……
{% endif %}
{% if 条件表达式 %}
……
{% elif 条件表达式 %}
……
{% else %}
……
{% endif %}
jinja2的⽀持使⽤for循环、ifelse判断控制。逻辑控制语句,需要写在{% ………………%} 中
{# {% if filter01 is defined %} #}
{% if myhosts is defined %}
variable is defined
{% else %}variable怎么记
variable is undefined
{% endif %}
在yml⽂件中定义变量矩阵
vars:
myhosts:
- servera
-
serverb
输出的结果:
variable is defined
3、逻辑控制——for循环
jinja2的⽀持使⽤for循环、ifelse判断控制
{% for myhost in groups['myhosts'] %}
my host is {{ myhost }}
{% endfor %}
在yml⽂件中定义变量矩阵
vars:
myhosts:
-
servera
- serverb
运⾏结果:
my host is servera
my host is serverb
4、算术运算符
⽤的很少
+:把两个对象加到⼀起。如:{{ 1 + 1 }} 等于 2。但是如果两者是字符串或列表,你可以⽤这种⽅式来衔接它们【连接字符串推荐使⽤ ~ 运算符】。-:⽤第⼀个数减去第⼆个数。如:{{ 3 - 2 }} 等于 1 。
/:对两个数做除法。返回值会是⼀个浮点数。如:{{ 1 / 2 }} 等于 {{ 0.5 }} 。
//:对两个数做除法,返回整数商。如:{{ 20 // 7 }} 等于 2 。
%:计算整数除法的余数。如:{{ 11 % 7 }} 等于 4 。
*:⽤右边的数乘左边的操作数。如:{{ 2 * 2 }} 会返回 4。也可以⽤于重复⼀个字符串多次。如:{{ '=' * 80 }} 会打印 80 个等号的横条。
**:取左操作数的右操作数次幂。如:{{ 2 ** 3 }} 会返回 8。
5、逻辑运算
==:⽐较两个对象是否相等。
!=:⽐较两个对象是否不等。
>:如果左边⼤于右边,返回 true。
>=:如果左边⼤于等于右边,返回 true。
<:如果左边⼩于右边,返回 true。
<=:如果左边⼩于等于右边,返回 true。
对于逻辑判断,在 for 过滤或 if 表达式中,它可以⽤于联合多个表达式:
and:如果左操作数和右操作数同为真,返回 true。
or:如果左操作数或右操作数有⼀个为真,返回 true。
not:对⼀个表达式取反(见下)。
(expr):表达式组。
提⽰:is 和 in 运算符同样⽀持使⽤中缀记法:foo is not bar 和 foo not in bar。所有的其它表达式需要前缀记法:not (foo and bar) 。in:运⾏序列/映射包含检查。如果左操作数包含于右操作数,返回 true 。⽐如 {{ 1 in [1,2,3] }} 会返回 true。
is:运⾏⼀个测验。参见上述
|:应⽤⼀个过滤器。参见上述
~:把所有的操作数转换为字符串,并且连接它们。 {{ "Hello " ~ name ~ "!" }} 会返回(假设 name 值为 'John' ) Hello John!。6、过滤器
官⽅的解释是这样的:
我觉得这⼀部分有点抽象,但看起来似乎⼜像是提供了⼀些⽐较⽅便的⼯具类(它叫做过滤器),可以帮助我们快速实现⼀些功能。就⽐如Java中的String类的⾃带⽅法,trim、toUpperCase、length等
以下是从⽹络上到的⼀个例⼦,可以参考看看:
{# 变量定义 #}
{% set filter01 = -24.5 %}
{% set filter02 = 'abcDEGg' %}
{% set filter03 = " abCDef G hkIL " %}
{% set filter04 = ['physics','chemistry',1997,2000] %}
# 过滤器使⽤
## 取绝对值
{{ filter01|abs() }}或者{{ filter01|abs }}
## ⾸字符⼤写,其他⼩写
{{ filter02|capitalize() }}或者{{ filter02|capitalize }}
## 去掉两端空格
|{{ filter03|trim() }}|或者|{{ filter03|trim }}|
## 返回序列的第⼀个
{{ filter04|first() }}或者{{ filter04|first }}
## 将序列变为字符串,可以指定每个元素间加⼊什么字符,默认空
默认情况:{{ filter04|join() }}或者{{ filter04|join }}
加⼊字符:{{ filter04|join('|') }}
# Tests 测验使⽤
## 变量是否定义
未定义:{{ filter00 is defined }}
已定义:{{ filter01 is defined }}
## 变量是否是数字
{{ filter01 is number }} === {{ filter02 is number }}
## 变量是否是⼩写
{{ filter02 is lower }}
## 变量是否是字符串
{{ filter02 is string }}
## 变量在 if 中的判断是否已定义
{# ***** 变量已经被定义,直接判断表达式是 True或False ***** #}
{# {% if filter01 %} #}{# 如果变量没有定义,那么执⾏会报错 #}
{# 由于 filter00 之前未定义,因此这⾥定义为 false,不然执⾏会报错【⽣产中会在 playbook中定义】{% set filter00 = false %}
{% if filter00 %}
#}
{# ***** 通过判断变量是否被定义,得到到True或False ***** #}
{# {% if filter01 is defined %} #}
{% if filter00 is defined %}
variable is defined
{% else %}
variable is undefined
{% endif %}
# range 使⽤
{% for i in range(1,20) %}
server 172.16.1.{{ i }}:80
{% endfor %}
运⾏的结果
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论