赞
踩
目录
jinja2基于python模板引擎,主要用于重复的多次的工作而仅需要用变量去替换少部分可变因素的场景,自定义要在受管节点上配置的文件,模板文件一般以".j2"为后缀,以“{{ xxx }}”为样存放表达式或变量,以“{% xxx %}”来存放控制语句,以“{# xxx #}”来存放注释语句
注意:在"{{}}"中要对变量进行操作时,变量名不加引号
(1)可以实现简易的函数运算,部署代码简洁高效灵活,适用性很广泛
(2)支持数据类型多,字符串("string")、整数、浮点数、列表("[]")、元组("()")、字典("{}")、布尔值等,基本上通python内这些数据类型的用法一致
(3)表达式支持多种数据运算,加(+)、减(-)、乘(*)、除(/)、整除(//)、取余(%)、幂运算(**),比较运算中的相等(==)、不等(!=)、大于等于(>=)、小于等于(<=),逻辑运算中的与(and)、或(or)、非(not),成员运算等
在创建好合适的jinja2模板后,通过template模块来部署到受管节点,同时也可以将管理节点的文件传递到受管节点
- [root@main ~]# cat myhosts.j2
- {{ inventory_hostname }} {{ ansible_default_ipv4.address }} #利用内置变量作为模板内容来生成主机名和对应IP地址
- [root@main ~]# cat myhostsj2.yaml
- ---
- - hosts: servera
- tasks:
- - name: template servera
- template:
- dest: /root
- src: /root/myhosts.j2
-
- [root@main ~]# ansible servera -m shell -a 'cat /root/myhosts.j2'
- servera | CHANGED | rc=0 >>
- servera 192.168.2.131
dest:受管节点的绝对路径,用于存放template传输的文件
src:管理节点的jinja2模板位置
backup:建立超时时间内的备份文件
group:指定受管节点上的template文件属组
owner:指定受管节点上的template文件属主
mode:指定受管节点上的template文件权限
(1)格式
- {% for ... %}
- 代码段
- {% endfor %}
(2)示例
生成192.168.2.10-192.168.2.14几个IP
- [root@main ~]# cat myhosts.j2
- {% for i in range(10,15) %}
- #range(10,15)此处称为可递归(迭代)对象,可以是range范围、列表、字典等类型,可python的range一样也可以指定起始和步长
- 192.168.2.{{ i }}
- {% endfor %}
- #若不想要结果换行,可以如下书写
- #{% for i in range(10,15) -%}
- #...
- #{%- endfor %}
- [root@main ~]# cat myhostsj2.yaml
- ---
- - hosts: servera
- tasks:
- - name: template servera
- template:
- dest: /root
- src: /root/myhosts.j2
-
- [root@main ~]# ansible servera -m shell -a 'cat /root/myhosts.j2'
- servera | CHANGED | rc=0 >>
- 192.168.2.10
- 192.168.2.11
- 192.168.2.12
- 192.168.2.13
- 192.168.2.14
(3)特殊格式
在每一次输出后添加一些内容“~string”
- [root@main ~]# ansible servera -m shell -a 'cat /root/myhosts.j2'
- servera | CHANGED | rc=0 >>
- 192.168.2.10hello
- 192.168.2.11hello
- 192.168.2.12hello
- 192.168.2.13hello
- 192.168.2.14hello
- [root@main ~]# cat myhosts.j2
- {% for i in range(10,15) %}
- 192.168.2.{{ i ~'hello' }}
- {% endfor %}
(4)关于loop的部分内置变量
loop.index输出是第几次循环,从1开始,若指定loop.index0则是从0开始
- [root@main ~]# cat myhosts.j2
- {% for i in range(10,15) %}
- 192.168.2.{{ i ~ '***' ~ loop.index }}
- {% endfor %}
- [root@main ~]# ansible servera -m shell -a 'cat /root/myhosts.j2'
- servera | CHANGED | rc=0 >>
- 192.168.2.10***1
- 192.168.2.11***2
- 192.168.2.12***3
- 192.168.2.13***4
- 192.168.2.14***5
loop.revindex输出这次循环距整个循环结束还有多少,从1开始,若是loop.revindex0则从0开始
- [root@main ~]# cat myhosts.j2
- {% for i in range(10,15) %}
- 192.168.2.{{ i ~ '***' ~ loop.revindex }}
- {% endfor %}
- [root@main ~]# ansible servera -m shell -a 'cat /root/myhosts.j2'
- servera | CHANGED | rc=0 >>
- 192.168.2.10***5
- 192.168.2.11***4
- 192.168.2.12***3
- 192.168.2.13***2
- 192.168.2.14***1
-
- [root@main ~]# cat myhosts.j2
- {% for i in range(10,15) %}
- 192.168.2.{{ i ~ '***' ~ loop.revindex0 }}
- {% endfor %}
- [root@main ~]# ansible servera -m shell -a 'cat /root/myhosts.j2'
- servera | CHANGED | rc=0 >>
- 192.168.2.10***4
- 192.168.2.11***3
- 192.168.2.12***2
- 192.168.2.13***1
- 192.168.2.14***0
loop.length输出可迭代对象的长度
- [root@main ~]# cat myhosts.j2
- {% for i in range(10,15) %}
- 192.168.2.{{ i ~ '***' ~ loop.length }}
- {% endfor %}
- [root@main ~]# ansible servera -m shell -a 'cat /root/myhosts.j2'
- servera | CHANGED | rc=0 >>
- 192.168.2.10***5
- 192.168.2.11***5
- 192.168.2.12***5
- 192.168.2.13***5
- 192.168.2.14***5
(1)if单分支格式
- {% if... %}
- 代码段
- {% endif ... %}
(2)if双分支格式
- {% if ... %}
- ...
- {% else %}
- ...
- {% endif ... %}
(3)if多分支格式
- {% if ... %}
- ...
- {% elif ... %}
- ...
- {% elif ... %}
- ...
- {% else %}
- ...
- {% endif ... %}
(4)if语句的三元运算
- [root@main ~]# cat sanyuanif.j2
- {{ 'true' if 2 < 4 else 'false' }}
- [root@main ~]# ansible servera -m shell -a 'cat /root/sanyuanif.j2'
- servera | CHANGED | rc=0 >>
- true
- [root@main ~]# ansible servera -m shell -a 'cat /root/bianliang.j2'
- servera | CHANGED | rc=0 >>
- nihaohello
- [root@main ~]# cat bianliang.j2
- {% set a='hello' %}
- nihao{{ a }}
(1)大于/小于
- [root@main ~]# cat luoji.j2
- {{ 'a' > 'b' }}
- {{ 1 < 0 }}
- [root@main ~]# ansible servera -m shell -a 'cat /root/luoji.j2'
- servera | CHANGED | rc=0 >>
- False
- False
(2)大于等于/小于等于
- [root@main ~]# cat luoji.j2
- {{ 'a' >= 'b' }}
- {{ 1 <= 0 }}
- [root@main ~]# ansible servera -m shell -a 'cat /root/luoji.j2'
- servera | CHANGED | rc=0 >>
- False
- False
(3)等于/不等于
- [root@main ~]# cat luoji.j2
- {{ 'a'!= 'b' }}
- {{ 1 == 1 }}
- [root@main ~]# ansible servera -m shell -a 'cat /root/luoji.j2'
- servera | CHANGED | rc=0 >>
- True
- True
(1)与
- [root@main ~]# cat luoji.j2
- {{ true and false }}
- [root@main ~]# ansible servera -m shell -a 'cat /root/luoji.j2'
- servera | CHANGED | rc=0 >>
- False
(2)或
- [root@main ~]# cat luoji.j2
- {{ true or true }}
- [root@main ~]# ansible servera -m shell -a 'cat /root/luoji.j2'
- servera | CHANGED | rc=0 >>
- True
(3)非
- [root@main ~]# cat luoji.j2
- {{ not true }}
- [root@main ~]# ansible servera -m shell -a 'cat /root/luoji.j2'
- servera | CHANGED | rc=0 >>
- False
包括加、减、乘、除、整除、取余,幂运算
- [root@main ~]# cat suanshu.j2
- {{ 2 + 2 }}
- {{ 2 - 1 }}
- {{ 2 * 8 }}
- {{ 8 / 3 }}
- {{ 8 // 2 }}
- {{ 4 % 6 }}
- {{ 4 ** 2 }}
- [root@main ~]# ansible servera -m shell -a 'cat /root/suanshu.j2'
- servera | CHANGED | rc=0 >>
- 4
- 1
- 16
- 2.66666666667
- 4
- 4
- 16
主要是属于和不属于
- [root@main ~]# ansible servera -m shell -a 'cat /root/chengyuan.j2'
- servera | CHANGED | rc=0 >>
- True
- True
- [root@main ~]# cat chengyuan.j2
- {{ 'a' in 'aniad' }}
- {{ 'b' not in 'aniad' }}
主要是判断文件或目录是否存在、目标的类型、变量是否已经被定义过
- [root@main ~]# cat shuxing.j2
- {{ '/root' is exists }}
- {{ '/root' is directory }}
- {{ '/root' is file }}
- {{ inventory_hostname is defined }}
- {{ inventory_hostname is undefined }}
- [root@main ~]# ansible servera -m shell -a 'cat /root/shuxing.j2'
- servera | CHANGED | rc=0 >>
- True
- True
- False
- True
- False
一般用在"{{ 表达式/变量名 }}"中
包括有所有字符转换大小写、首字母大写其后字符小写、字符串反转、返回首/尾字符串、去除开头和结尾空格、字符串居中显示、返回字符串长度、转换字符串为列表并打乱顺序
- ['e', 's', '5', 'v', 'h', 'c']
- [root@main ~]# cat uplo.j2
- {{ 'a' | upper }}
- {{ 'A' | lower }} #所有字符串转换为大/小写
-
- {{ 'dwDDEVEf' | capitalize }} #首字母大写其后字符小写
-
- {{ 'cefev' | reverse }} #字符串反转
-
- {{ 'vde' | first }} #返回首/尾字符串
- {{ 'vde' | last }}
-
- {{ ' ecdw' | trim }} #去除开头和结尾空格
-
- {{ 'cwwdceve' | center }} #字符串居中显示
-
- {{ 'cvervahh' | count }}
- {{ 'cvervahh' | length }} #返回字符串长度
-
- {{ 'vdvsb' | list }} #转换字符串为列表
-
- {{ 'evsh5c' | shuffle }} #转换字符串为列表,打乱顺序
- [root@main ~]# ansible servera -m shell -a 'cat /root/uplo.j2'
- servera | CHANGED | rc=0 >>
- A
- a
-
- Dwddevef
-
- vefec
-
- v
- e
-
- ecdw
-
- cwwdceve
-
- 8
- 8
-
- ['v', 'd', 'v', 's', 'b']
-
- ['e', 's', '5', 'v', 'h', 'c']
包括有转换为int、float、取绝对值、四舍五入、取随机数
- [root@main ~]# cat number.j2
- {{ 4.65 | int }} #转换为int
-
- {{ 6 | float }} #转换为float
-
- {{ -5 | abs }} #取绝对值
-
- {{ 43.6563 | round }} #四舍五入
-
- {{ 20 | random(step=5) }} #在0-20之间,取一个随机数,step=5表示这个数须是5的倍数
- #{{ 20 | random(start=5) }} 在0-20之间,取一个随机数,start进一步限制了范围,在5-20之间
- #{{ 20 | random }} 若不加限制条件就表示随机从0-20之间生成一个
- [root@main ~]# ansible servera -m shell -a 'cat /root/number.j2'
- servera | CHANGED | rc=0 >>
- 4
-
- 6.0
-
- 5
-
- 44.0
-
- 5
upper/lower、length/count、first/last的用法和字符串过滤器的用法一样,这里主要介绍列表取最大/最小值、排序、求和、平铺、拼接、随机返回一个值、去重、求并/交等
- [root@main ~]# cat liebiao.j2
- {{ [1,4,0,2] | max }}
- {{ [1,4,0,2] | min }} #最大值/最小值
-
- {{ [1,4,0,2] | sort }} #排序
-
- {{ [1,4,0,2] | sum }} #求和
-
- {{ [1,4,0,2] | join }} #将列表内的内容都拼到一起,可以使用join()指定以什么分隔开
-
- {{ [1,4,0,2] | random }} #从列表总随机返回一个值
-
- {{ [0,1,4,0,2] | unique }} #去重
-
- {{ [1,4,0,2] | union([1,4,8,3]) }} #求并
- {{ [1,4,0,2] | intersect([1,4,8,3]) }} #求交
-
- {{ [1,4,0,2] | difference([1,4,8,3]) }} #求存在与[1,4,0,2]中但是不在[1,4,8,3]中的元素
-
- {{ [1,4,0,2] | symmetric_difference([1,4,8,3]) }} #求除了交集之外的元素
-
- [root@main ~]# ansible servera -m shell -a 'cat /root/liebiao.j2'
- servera | CHANGED | rc=0 >>
- 4
- 0
-
- [0, 1, 2, 4]
-
- 7
-
- 1402
-
- 0
-
- [0, 1, 4, 2]
-
- [1, 4, 0, 2, 8, 3]
- [1, 4]
-
- [0, 2]
-
- [0, 2, 8, 3]
(1)如果变量没有被定义,返回指定内容(临时)
- {{ myvar | default("no") }}
- [root@main ~]# ansible servera -m shell -a 'cat /root/default.j2'
- servera | CHANGED | rc=0 >>
- no
(2)如果变量没有被定义或者被定义为空,返回指定内容(临时)
- {{ myvar | default("hello",boolean=true) }}
- [root@main ~]# ansible servera -m shell -a 'cat /root/default.j2'
- servera | CHANGED | rc=0 >>
- hello
我理解为获取变量指向的内容
- {% set a='qwe' %}
- {{ a | basename }}
- [root@main ~]# ansible servera -m shell -a 'cat /root/default.j2'
- servera | CHANGED | rc=0 >>
- qwe
- 6.hash
- {{ 'redhat' | hash }}
- [root@main ~]# ansible servera -m shell -a 'cat /root/default.j2'
- servera | CHANGED | rc=0 >>
- 3c767c41afb12ada140190ed82db3fd930e2efa3
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。