当前位置:   article > 正文

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

ansible j2

目录

一.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.示例

  1. [root@main ~]# cat myhosts.j2
  2. {{ inventory_hostname }} {{ ansible_default_ipv4.address }}   #利用内置变量作为模板内容来生成主机名和对应IP地址
  3. [root@main ~]# cat myhostsj2.yaml
  4. ---
  5. - hosts: servera
  6. tasks:
  7.   - name: template servera
  8.     template:
  9.       dest: /root
  10.       src: /root/myhosts.j2
  11. [root@main ~]# ansible servera -m shell -a 'cat /root/myhosts.j2'
  12. servera | CHANGED | rc=0 >>
  13. servera 192.168.2.131

2.template模块参数

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

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

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

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

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

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

三.jinja2的控制语句

1.for循环

(1)格式

  1. {% for ... %}
  2. 代码段
  3. {% endfor %}

(2)示例

生成192.168.2.10-192.168.2.14几个IP

  1. [root@main ~]# cat myhosts.j2
  2. {% for i in range(10,15) %}                  
  3. #range(10,15)此处称为可递归(迭代)对象,可以是range范围、列表、字典等类型,可python的range一样也可以指定起始和步长
  4. 192.168.2.{{ i }}
  5. {% endfor %}
  6. #若不想要结果换行,可以如下书写
  7. #{% for i in range(10,15) -%}
  8. #...
  9. #{%- endfor %}
  10. [root@main ~]# cat myhostsj2.yaml
  11. ---
  12. - hosts: servera
  13. tasks:
  14.   - name: template servera
  15.     template:
  16.       dest: /root
  17.       src: /root/myhosts.j2
  18. [root@main ~]# ansible servera -m shell -a 'cat /root/myhosts.j2'
  19. servera | CHANGED | rc=0 >>
  20. 192.168.2.10
  21. 192.168.2.11
  22. 192.168.2.12
  23. 192.168.2.13
  24. 192.168.2.14

(3)特殊格式

在每一次输出后添加一些内容“~string”

  1. [root@main ~]# ansible servera -m shell -a 'cat /root/myhosts.j2'
  2. servera | CHANGED | rc=0 >>
  3. 192.168.2.10hello
  4. 192.168.2.11hello
  5. 192.168.2.12hello
  6. 192.168.2.13hello
  7. 192.168.2.14hello
  8. [root@main ~]# cat myhosts.j2
  9. {% for i in range(10,15) %}
  10. 192.168.2.{{ i ~'hello' }}
  11. {% endfor %}

(4)关于loop的部分内置变量

loop.index输出是第几次循环,从1开始,若指定loop.index0则是从0开始

  1. [root@main ~]# cat myhosts.j2
  2. {% for i in range(10,15) %}
  3. 192.168.2.{{ i ~ '***' ~ loop.index }}
  4. {% endfor %}
  5. [root@main ~]# ansible servera -m shell -a 'cat /root/myhosts.j2'
  6. servera | CHANGED | rc=0 >>
  7. 192.168.2.10***1
  8. 192.168.2.11***2
  9. 192.168.2.12***3
  10. 192.168.2.13***4
  11. 192.168.2.14***5

loop.revindex输出这次循环距整个循环结束还有多少,从1开始,若是loop.revindex0则从0开始

  1. [root@main ~]# cat myhosts.j2
  2. {% for i in range(10,15) %}
  3. 192.168.2.{{ i ~ '***' ~ loop.revindex }}
  4. {% endfor %}
  5. [root@main ~]# ansible servera -m shell -a 'cat /root/myhosts.j2'
  6. servera | CHANGED | rc=0 >>
  7. 192.168.2.10***5
  8. 192.168.2.11***4
  9. 192.168.2.12***3
  10. 192.168.2.13***2
  11. 192.168.2.14***1
  12. [root@main ~]# cat myhosts.j2
  13. {% for i in range(10,15) %}
  14. 192.168.2.{{ i ~ '***' ~ loop.revindex0 }}
  15. {% endfor %}
  16. [root@main ~]# ansible servera -m shell -a 'cat /root/myhosts.j2'
  17. servera | CHANGED | rc=0 >>
  18. 192.168.2.10***4
  19. 192.168.2.11***3
  20. 192.168.2.12***2
  21. 192.168.2.13***1
  22. 192.168.2.14***0

loop.length输出可迭代对象的长度

  1. [root@main ~]# cat myhosts.j2
  2. {% for i in range(10,15) %}
  3. 192.168.2.{{ i ~ '***' ~ loop.length }}
  4. {% endfor %}
  5. [root@main ~]# ansible servera -m shell -a 'cat /root/myhosts.j2'
  6. servera | CHANGED | rc=0 >>
  7. 192.168.2.10***5
  8. 192.168.2.11***5
  9. 192.168.2.12***5
  10. 192.168.2.13***5
  11. 192.168.2.14***5

2.if判断语句

(1)if单分支格式

  1. {% if... %}
  2. 代码段
  3. {% endif ... %}

(2)if双分支格式

  1. {% if ... %}
  2. ...
  3. {% else %}
  4. ...
  5. {% endif ... %}

(3)if多分支格式

  1. {% if ... %}
  2. ...
  3. {% elif ... %}
  4. ...
  5. {% elif ... %}
  6. ...
  7. {% else %}
  8. ...
  9. {% endif ... %}

(4)if语句的三元运算

  1. [root@main ~]# cat sanyuanif.j2
  2. {{ 'true' if 2 < 4 else 'false' }}
  3. [root@main ~]# ansible servera -m shell -a 'cat /root/sanyuanif.j2'
  4. servera | CHANGED | rc=0 >>
  5. true

3.set设置变量

  1. [root@main ~]# ansible servera -m shell -a 'cat /root/bianliang.j2'
  2. servera | CHANGED | rc=0 >>
  3. nihaohello
  4. [root@main ~]# cat bianliang.j2
  5. {% set a='hello' %}
  6. nihao{{ a }}

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

1.比较运算

(1)大于/小于

  1. [root@main ~]# cat luoji.j2
  2. {{ 'a' > 'b' }}
  3. {{ 1 < 0 }}
  4. [root@main ~]# ansible servera -m shell -a 'cat /root/luoji.j2'
  5. servera | CHANGED | rc=0 >>
  6. False
  7. False

(2)大于等于/小于等于

  1. [root@main ~]# cat luoji.j2
  2. {{ 'a' >= 'b' }}
  3. {{ 1 <= 0 }}
  4. [root@main ~]# ansible servera -m shell -a 'cat /root/luoji.j2'
  5. servera | CHANGED | rc=0 >>
  6. False
  7. False

(3)等于/不等于

  1. [root@main ~]# cat luoji.j2
  2. {{ 'a'!= 'b' }}
  3. {{ 1 == 1 }}
  4. [root@main ~]# ansible servera -m shell -a 'cat /root/luoji.j2'
  5. servera | CHANGED | rc=0 >>
  6. True
  7. True

2.逻辑运算

(1)与

  1. [root@main ~]# cat luoji.j2
  2. {{ true and false }}
  3. [root@main ~]# ansible servera -m shell -a 'cat /root/luoji.j2'
  4. servera | CHANGED | rc=0 >>
  5. False

(2)或

  1. [root@main ~]# cat luoji.j2
  2. {{ true or true }}
  3. [root@main ~]# ansible servera -m shell -a 'cat /root/luoji.j2'
  4. servera | CHANGED | rc=0 >>
  5. True

(3)非

  1. [root@main ~]# cat luoji.j2
  2. {{ not true }}
  3. [root@main ~]# ansible servera -m shell -a 'cat /root/luoji.j2'
  4. servera | CHANGED | rc=0 >>
  5. False

3.算数运算

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

  1. [root@main ~]# cat suanshu.j2
  2. {{ 2 + 2 }}
  3. {{ 2 - 1 }}
  4. {{ 2 * 8 }}
  5. {{ 8 / 3 }}
  6. {{ 8 // 2 }}
  7. {{ 4 % 6 }}
  8. {{ 4 ** 2 }}
  9. [root@main ~]# ansible servera -m shell -a 'cat /root/suanshu.j2'
  10. servera | CHANGED | rc=0 >>
  11. 4
  12. 1
  13. 16
  14. 2.66666666667
  15. 4
  16. 4
  17. 16

4.成员运算

主要是属于和不属于

  1. [root@main ~]# ansible servera -m shell -a 'cat /root/chengyuan.j2'
  2. servera | CHANGED | rc=0 >>
  3. True
  4. True
  5. [root@main ~]# cat chengyuan.j2
  6. {{ 'a' in 'aniad' }}
  7. {{ 'b' not in 'aniad' }}

5.属性判断

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

  1. [root@main ~]# cat shuxing.j2
  2. {{ '/root' is exists }}
  3. {{ '/root' is directory }}
  4. {{ '/root' is file }}
  5. {{ inventory_hostname is defined }}
  6. {{ inventory_hostname is undefined }}
  7. [root@main ~]# ansible servera -m shell -a 'cat /root/shuxing.j2'
  8. servera | CHANGED | rc=0 >>
  9. True
  10. True
  11. False
  12. True
  13. False

五.部分过滤器的使用

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

1.字符串过滤器

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

  1. ['e', 's', '5', 'v', 'h', 'c']
  2. [root@main ~]# cat uplo.j2
  3. {{ 'a' | upper }}
  4. {{ 'A' | lower }}     #所有字符串转换为大/小写
  5. {{ 'dwDDEVEf' | capitalize }} #首字母大写其后字符小写
  6. {{ 'cefev' | reverse }}   #字符串反转
  7. {{ 'vde' | first }}   #返回首/尾字符串
  8. {{ 'vde' | last }}
  9. {{ ' ecdw' | trim }}   #去除开头和结尾空格
  10. {{ 'cwwdceve' | center }}   #字符串居中显示
  11. {{ 'cvervahh' | count }}  
  12. {{ 'cvervahh' | length }} #返回字符串长度
  13. {{ 'vdvsb' | list }} #转换字符串为列表
  14. {{ 'evsh5c' | shuffle }}   #转换字符串为列表,打乱顺序
  15. [root@main ~]# ansible servera -m shell -a 'cat /root/uplo.j2'
  16. servera | CHANGED | rc=0 >>
  17. A
  18. a
  19. Dwddevef
  20. vefec
  21. v
  22. e
  23. ecdw
  24.                                   cwwdceve                                    
  25. 8
  26. 8
  27. ['v', 'd', 'v', 's', 'b']
  28. ['e', 's', '5', 'v', 'h', 'c']

2.数字过滤器

包括有转换为int、float、取绝对值、四舍五入、取随机数

  1. [root@main ~]# cat number.j2
  2. {{ 4.65 | int }} #转换为int
  3. {{ 6 | float }} #转换为float
  4. {{ -5 | abs }}   #取绝对值
  5. {{ 43.6563 | round }} #四舍五入
  6. {{ 20 | random(step=5) }}   #在0-20之间,取一个随机数,step=5表示这个数须是5的倍数
  7. #{{ 20 | random(start=5) }}   在0-20之间,取一个随机数,start进一步限制了范围,在5-20之间
  8. #{{ 20 | random }}   若不加限制条件就表示随机从0-20之间生成一个
  9. [root@main ~]# ansible servera -m shell -a 'cat /root/number.j2'
  10. servera | CHANGED | rc=0 >>
  11. 4
  12. 6.0
  13. 5
  14. 44.0
  15. 5

3.列表过滤器

upper/lower、length/count、first/last的用法和字符串过滤器的用法一样,这里主要介绍列表取最大/最小值、排序、求和、平铺、拼接、随机返回一个值、去重、求并/交等

  1. [root@main ~]# cat liebiao.j2
  2. {{ [1,4,0,2] | max }}
  3. {{ [1,4,0,2] | min }}   #最大值/最小值
  4. {{ [1,4,0,2] | sort }}   #排序
  5. {{ [1,4,0,2] | sum }}   #求和
  6. {{ [1,4,0,2] | join }}   #将列表内的内容都拼到一起,可以使用join()指定以什么分隔开
  7. {{ [1,4,0,2] | random }} #从列表总随机返回一个值
  8. {{ [0,1,4,0,2] | unique }}   #去重
  9. {{ [1,4,0,2] | union([1,4,8,3]) }}   #求并
  10. {{ [1,4,0,2] | intersect([1,4,8,3]) }}   #求交
  11. {{ [1,4,0,2] | difference([1,4,8,3]) }}   #求存在与[1,4,0,2]中但是不在[1,4,8,3]中的元素
  12. {{ [1,4,0,2] | symmetric_difference([1,4,8,3]) }}   #求除了交集之外的元素
  13. [root@main ~]# ansible servera -m shell -a 'cat /root/liebiao.j2'
  14. servera | CHANGED | rc=0 >>
  15. 4
  16. 0
  17. [0, 1, 2, 4]
  18. 7
  19. 1402
  20. 0
  21. [0, 1, 4, 2]
  22. [1, 4, 0, 2, 8, 3]
  23. [1, 4]
  24. [0, 2]
  25. [0, 2, 8, 3]

4.default

(1)如果变量没有被定义,返回指定内容(临时)

  1. {{ myvar | default("no") }}
  2. [root@main ~]# ansible servera -m shell -a 'cat /root/default.j2'
  3. servera | CHANGED | rc=0 >>
  4. no

(2)如果变量没有被定义或者被定义为空,返回指定内容(临时)

  1. {{ myvar | default("hello",boolean=true) }}
  2. [root@main ~]# ansible servera -m shell -a 'cat /root/default.j2'
  3. servera | CHANGED | rc=0 >>
  4. hello

5.basename

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

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

6.对字符串进行hash加密

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/459345
推荐阅读
相关标签
  

闽ICP备14008679号