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

news/2025/2/23 5:38:43

目录

jinja2%E4%BB%8B%E7%BB%8D-toc" style="margin-left:0px;">一.jinja2介绍

jinja2%E6%A8%A1%E7%89%88%E7%AE%80%E4%BB%8B-toc" style="margin-left:40px;">1.Ansible上jinja2模版简介

jinja2%E6%A8%A1%E7%89%88%E4%BC%98%E7%82%B9-toc" style="margin-left:40px;">2.jinja2模版优点

template%E9%83%A8%E7%BD%B2jinja2%E6%A8%A1%E6%9D%BF-toc" style="margin-left:0px;">二.template部署jinja2模板

1.示例

template%E6%A8%A1%E5%9D%97%E5%8F%82%E6%95%B0-toc" style="margin-left:40px;">2.template模块参数

jinja2%E7%9A%84%E6%8E%A7%E5%88%B6%E8%AF%AD%E5%8F%A5-toc" style="margin-left:0px;">三.jinja2的控制语句

1.for循环

2.if判断语句

3.set设置变量

jinja2%E8%A1%A8%E8%BE%BE%E5%BC%8F%E8%BF%90%E7%AE%97%E5%92%8C%E5%B1%9E%E6%80%A7%E5%88%A4%E6%96%AD-toc" style="margin-left:0px;">四.jinja2表达式运算和属性判断

1.比较运算

2.逻辑运算

3.算数运算

4.成员运算

5.属性判断

五.部分过滤器的使用

1.字符串过滤器

2.数字过滤器

3.列表过滤器

4.default

5.basename

6.对字符串进行hash加密


jinja2%E4%BB%8B%E7%BB%8D">一.jinja2介绍

jinja2%E6%A8%A1%E7%89%88%E7%AE%80%E4%BB%8B">1.Ansible上jinja2模版简介

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

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

jinja2%E6%A8%A1%E7%89%88%E4%BC%98%E7%82%B9">2.jinja2模版优点

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

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

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

template%E9%83%A8%E7%BD%B2jinja2%E6%A8%A1%E6%9D%BF">二.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

template%E6%A8%A1%E5%9D%97%E5%8F%82%E6%95%B0">2.template模块参数

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

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

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

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

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

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

jinja2%E7%9A%84%E6%8E%A7%E5%88%B6%E8%AF%AD%E5%8F%A5">三.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%E8%A1%A8%E8%BE%BE%E5%BC%8F%E8%BF%90%E7%AE%97%E5%92%8C%E5%B1%9E%E6%80%A7%E5%88%A4%E6%96%AD">四.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

http://www.niftyadmin.cn/n/5118587.html

相关文章

【Python语言速回顾】——异常文件操作

目录 一、异常 1、检测异常try语句 2、抛出异常 3、异常处理流程 二、文件操作 1、打开文件 ①文件模式acess_mode ②文件缓冲区 2、基本的文件方法 ①读和写、关闭文件 ②读取行 ③文件重命名 ④删除文件&#xff08;系统中已存在的文件&#xff09; 3、基本的目…

网工内推 | 网络工程师,大专以上、HCIA认证即可,最高14薪

01 湖南口味王集团 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、负责园区内电脑日常维护&#xff1b; 2、负责园区内办公周边设备的日常维护&#xff0c;如打印机、投影仪等&#xff1b; 3、负责园区内电话日常维护&#xff1b; 4、负责园区内信息资产管理&#…

Java架构师内功数据库

目录 1 导学2 数据库基本概念2.1 数据库系统2.2 三级模式-两级映像2.3 数据库设计2.4 数据模型2.4.1 E-R模型2.4.2 关系模型2.5 关系代数3 规范化和并发控制3.1 函数依赖3.2 键与约束3.3 范式3.3.1 第一范式1NF3.3.2 第二范式3.3.3 第三范式3.4 模式分解3.5 并发控制3.6 封锁协…

KekeBlog项目实战后台模块(二)(已完结)

十一、后台模块-菜单列表 菜单指的是权限菜单&#xff0c;也就是一堆权限字符串 1. 查询菜单 1.1 接口分析 需要展示菜单列表&#xff0c;不需要分页。可以针对菜单名进行模糊查询。也可以针对菜单的状态进行查询。菜单要按照父菜单id和orderNum进行排序 请求方式 请求路径…

线性表操作的实现--顺序表

本文参考朱战力老师的数据结构与算法--使用C语言一书 文章目录 前言 一、线性表是什么&#xff1f; 二、具体实现 1.顺序表的定义 2.初始化ListInitiate&#xff08;L&#xff09; 3.求当前元素个数ListLength&#xff08;L&#xff09; 4.插入元素ListInsert&#xff08;L&…

idea 设置serlvet 类模板(快捷生成servlet类)

我的版本是idea2020.3.4&#xff0c;博客中有相应安装教程&#xff0c;其他版本设置类似&#xff1a; 1.选择文件-->设置 2.选择编辑器-->文件和代码模板-->其他 3.选择Web-->Servlet Annotated Class.java-->复制相应模板&#xff0c;下面顺便设置了注释模板 …

解决 hash 冲突的办法有哪些?HashMap 用的哪种?

解决 hash 冲突的办法有哪些&#xff1f;HashMap 用的哪种&#xff1f; 解决Hash冲突方法有&#xff1a;开放定址法、再哈希法、链地址法&#xff08;拉链法&#xff09;、建立公共溢出区。HashMap中采用的是拉链法 。 开放定址法&#xff1a; ● 开放定址法也称为再散列法&am…

F28335-可移植新建工程模板-基于bitfield

文章目录 前言步骤新建工程工程管理拷贝底层文件 添加测试函数编写main.c测试函数 前言 实验要求利用28335芯片&#xff0c;重新学习一下DSP28335&#xff0c;并做个记录。 值得一提的是&#xff0c;28335只能用寄存器开发&#xff0c;而不能用库函数开发&#xff0c;相应的也…