Bootstrap

Ansible上jinja2模板的部署和控制语句、运算方式、部分过滤器的演示

目录

一.jinja2介绍

1.Ansible上jinja2模版简介

2.jinja2模版优点

二.template部署jinja2模板

1.示例

2.template模块参数

三.jinja2的控制语句

1.for循环

2.if判断语句

3.set设置变量

四.jinja2表达式运算和属性判断

1.比较运算

2.逻辑运算

3.算数运算

4.成员运算

5.属性判断

五.部分过滤器的使用

1.字符串过滤器

2.数字过滤器

3.列表过滤器

4.default

5.basename

6.对字符串进行hash加密


 

一.jinja2介绍

1.Ansible上jinja2模版简介

jinja2基于python模板引擎,主要用于重复的多次的工作而仅需要用变量去替换少部分可变因素的场景,自定义要在受管节点上配置的文件,模板文件一般以".j2"为后缀,以“{{ xxx }}”为样存放表达式或变量,以“{% xxx %}”来存放控制语句,以“{# xxx #}”来存放注释语句

注意:在"{{}}"中要对变量进行操作时,变量名不加引号

2.jinja2模版优点

(1)可以实现简易的函数运算,部署代码简洁高效灵活,适用性很广泛

(2)支持数据类型多,字符串("string")、整数、浮点数、列表("[]")、元组("()")、字典("{}")、布尔值等,基本上通python内这些数据类型的用法一致

(3)表达式支持多种数据运算,加(+)、减(-)、乘(*)、除(/)、整除(//)、取余(%)、幂运算(**),比较运算中的相等(==)、不等(!=)、大于等于(>=)、小于等于(<=),逻辑运算中的与(and)、或(or)、非(not),成员运算等

二.template部署jinja2模板

在创建好合适的jinja2模板后,通过template模块来部署到受管节点,同时也可以将管理节点的文件传递到受管节点

1.示例

[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

2.template模块参数

dest:受管节点的绝对路径,用于存放template传输的文件

src:管理节点的jinja2模板位置

backup:建立超时时间内的备份文件

group:指定受管节点上的template文件属组

owner:指定受管节点上的template文件属主

mode:指定受管节点上的template文件权限

三.jinja2的控制语句

1.for循环

(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

2.if判断语句

(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

3.set设置变量

[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 }}

四.jinja2表达式运算和属性判断

1.比较运算

(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

2.逻辑运算

(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

3.算数运算

包括加、减、乘、除、整除、取余,幂运算

[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

4.成员运算

主要是属于和不属于

[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' }}

5.属性判断

主要是判断文件或目录是否存在、目标的类型、变量是否已经被定义过

[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

五.部分过滤器的使用

一般用在"{{ 表达式/变量名 }}"中

1.字符串过滤器

包括有所有字符转换大小写、首字母大写其后字符小写、字符串反转、返回首/尾字符串、去除开头和结尾空格、字符串居中显示、返回字符串长度、转换字符串为列表并打乱顺序

['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']

2.数字过滤器

包括有转换为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 

3.列表过滤器

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]

4.default

(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

5.basename

我理解为获取变量指向的内容

{% set a='qwe' %}
{{ a | basename }}
[root@main ~]# ansible servera -m shell -a 'cat /root/default.j2'
servera | CHANGED | rc=0 >>
qwe
6.hash

6.对字符串进行hash加密

{{ 'redhat' | hash }}
[root@main ~]# ansible servera -m shell -a 'cat /root/default.j2'
servera | CHANGED | rc=0 >>
3c767c41afb12ada140190ed82db3fd930e2efa3

 

;