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: serveratasks:- name: template serveratemplate:dest: /rootsrc: /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: serveratasks:- name: template serveratemplate:dest: /rootsrc: /root/myhosts.j2
​
[root@main ~]# ansible servera -m shell -a 'cat /root/myhosts.j2'
servera | CHANGED | rc=0 >>192.168.2.10192.168.2.11192.168.2.12192.168.2.13192.168.2.14

(3)特殊格式

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

[root@main ~]# ansible servera -m shell -a 'cat /root/myhosts.j2'
servera | CHANGED | rc=0 >>192.168.2.10hello192.168.2.11hello192.168.2.12hello192.168.2.13hello192.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***1192.168.2.11***2192.168.2.12***3192.168.2.13***4192.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***5192.168.2.11***4192.168.2.12***3192.168.2.13***2192.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***4192.168.2.11***3192.168.2.12***2192.168.2.13***1192.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***5192.168.2.11***5192.168.2.12***5192.168.2.13***5192.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/123206.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Connectify Hotspot 23.0.1.40175 MAX Crack

您是学生吗&#xff1f;你在宿舍打游戏吗&#xff1f;你是在集体宿舍吗&#xff1f;如果是&#xff1a;你需要功能上网吧 Connectify Hotspot 专业 WiFi 热点共享管理工具 Connectify 是一款强大的无线热点工具&#xff0c;可以让带有无线网卡 / 3G 上网卡的电脑变成无线路由器…

CSS3中的字体和文本样式

CSS3优化了CSS 2.1的字体和文本属性&#xff0c;同时新增了各种文字特效&#xff0c;使网页文字更具表现力和感染力&#xff0c;丰富了网页设计效果&#xff0c;如自定义字体类型、更多的色彩模式、文本阴影、生态生成内容、各种特殊值、函数等。 1、字体样式 字体样式包括类…

MySQL2:MySQL中一条查询SQL是如何执行的?

MySQL2&#xff1a;MySQL中一条查询SQL是如何执行的&#xff1f; MySQL中一条查询SQL是如何执行的&#xff1f;1.连接怎么查看MySQL当前有多少个连接&#xff1f;思考&#xff1a;为什么连接数是查看线程&#xff1f;客户端的连接和服务端的线程有什么关系&#xff1f;MySQL参数…

H5游戏源码分享-考眼力游戏猜猜金币在哪

H5游戏源码分享-考眼力游戏猜猜金币在哪 <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><meta charset"UTF-8"><meta name"apple-mobile-web-app-capa…

cesium开发引入方式

无独有偶&#xff0c;引入无非两种方式&#xff1a;外部标签引入和import导入。 1、外部引入 外部引入的话需要提前去下载开发包&#xff0c;下载完后&#xff0c;Build文件夹有两个文件夹&#xff1a;Cesium和CesiumUnminified&#xff0c;Cesium是压缩版的&#xff0c;Cesiu…

Web入门笔记

Web入门笔记 HTTP协议 超文本传输协议 规定了浏览器和服务器之间数据传输的规则&#xff0c;请问数据和响应数据的格式 基于TCP请求-响应模式一次请求对应一次响应无状态的协议 请问数据格式 浏览器版本&#xff1a;解决浏览器兼容问题。GET请求体&#xff1a;存放请求参数…

算法|每日一题|从数量最多的堆取走礼物|最大堆

2558. 从数量最多的堆取走礼物 原题地址&#xff1a; 力扣每日一题&#xff1a;从数量最多的堆取走礼物 给你一个整数数组 gifts &#xff0c;表示各堆礼物的数量。每一秒&#xff0c;你需要执行以下操作&#xff1a; 选择礼物数量最多的那一堆。 如果不止一堆都符合礼物数量最…

Python爬虫基础之Requests详解

目录 1. 简介2. 安装3. 发送请求4. 处理响应5. IP代理6. Cookie登录参考文献 原文地址&#xff1a;https://program-park.top/2023/10/27/reptile_4/ 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由…

深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署

加我微信hezkz17进数字音频系统研究开发交流答疑群(课题组) 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署 项目一 科大讯飞经验 在Matlab平台上实现广义…

Docker安装部署Elasticsearch+Kibana+IK分词器

Docker安装部署ElasticsearchKibanaIK分词器 Docker安装部署elasticsearch拉取镜像创建数据卷创建网络elasticsearch容器&#xff0c;启动&#xff01; Docker安装部署Kibana拉取镜像Kibana容器&#xff0c;启动&#xff01; 安装IK分词器安装方式一&#xff1a;直接从github上…

在Go中处理时间数据

获取时间 这可能是软件包中最常用的方法。我们如何知道当前的时间呢&#xff1f;像这样&#xff1a; t : time.Now() fmt.Println(t)ini复制代码2023-04-16 23:54:45.924965 0800 CST m0.000152293这就是当前的时间。这是很麻烦的&#xff0c;所以我将把它分解成几个部分。 …

赶紧收藏!史上最全IDEA快捷键大全

参考 IntelliJ IDEA 的官网&#xff0c;列举出了IntelliJ IDEA&#xff08;Windows 版&#xff09;的所有快捷键。 建议收藏&#xff0c;有需要的时候根据关键字来查找&#xff01; idea专业版获取 kdocs.cn/l/ctYoaM6evJkl 该快捷键共分 16 类&#xff0c;可以方便的按各类…

【Linux】虚拟机安装Linux、客户端工具,MobaXterm的使用,Linux常用命令

目录 一&#xff0c;安装Linux的centos7版本 具体安装步骤&#xff1a; 二&#xff0c;Linux常见的命令&#xff1a; 三、安装客户端工具 1、介绍 2、安装MobaXterm 3、换源 四、拍照功能 一&#xff0c;安装Linux的centos7版本 介绍&#xff1a; 具体安装步骤&#…

主定理(一般式)

主定理&#xff08;Master Theorem&#xff09;是用于分析递归算法时间复杂度的一个重要工具。它适用于形式化定义的一类递归关系&#xff0c;通常采用分治策略解决问题的情况。 目录 主定理简化版的局限主定理一般形式情况1&#xff1a; n l o g b a n^{log_{b}{a}} nlogb​a …

No174.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

阿里云服务linux系统CentOs8.5安装/卸载nginx1.15.9

说明&#xff1a;尝试使用CentOs8.5安装nginx1.9.9失败&#xff0c;make的时候报错了&#xff0c;后面降低版本为CentOs7.5安装成功了&#xff0c;参考文章:【精选】centos7安装nginx-1.9.9_linx centos nginx 1.9.9版本 nginx error log file: "/-CSDN博客 一、安装ngin…

学习ftp

文章目录 一、FTP介绍二、两种模式&#xff08;主动模式和被动模式&#xff09;三、FTP配置文件详解四、实际场景举例五、黑白名单六、网络限制 一、FTP介绍 1.FTP&#xff08;File Transfer Protocol&#xff09;是一种应用广泛且古老的互联网文件传输协议。 2.主要应用于互联…

python检测序列中的元素是否满足严格升序关系

方法1 def lessThan1(seq):for index, value in enumerate(seq[:-1]):if value > seq[index1]:return Falsereturn True方法2 def lessThan2(seq):func lambda x, y: x < yreturn all(map(func, seq[:-1], seq[1:]))方法3 from operator import ltdef lessThan3(seq)…

信息系统项目管理师教程 第四版【第6章-项目管理概论-思维导图】

信息系统项目管理师教程 第四版【第6章-项目管理概论-思维导图】 课本里章节里所有蓝色字体的思维导图

【Flutter】Flutter 中的图片管理 图片优化的最佳实践

【Flutter】Flutter 中的图片管理 图片优化的最佳实践 文章目录 一、前言二、图片资源的重要性1. 对于项目复杂性的影响2. 性能和资源优化3. 国际化和多平台支持4. UI/UX 的角度看图片管理5. 图片资源与应用安全三、Flutter 中的图片资源分类1. Asset 图片2. 网络图片3. 本地文…