ansible自动化运维(四)jinjia2模板

ops/2024/12/15 22:03:58/

Jinjia2模板

前面说到playbook组成的时候,有介绍到template模块,而template模块对模板文件进行渲染时,使用的就是jinja2模板引擎,jinja2本身就是基于python的模板引擎,所以下面先来了解一下jinjia2模板的一些用法

基础语法

{{   }} 用来装载表达式,比如变量、运算表达式、比较表达式等。(%   %)用来装载控制语句,比如 if 控制结构,for循环控制结构。(#    #)用来装载注释,模板文件被渲染后,注释不会包含在最终生成的文件中。

该模板支持的一些数据类型和表达式

字符串:使用单引号或双引号;数字:整数,浮点数;列表:[list1, list2, ...]元组:(item1, item2, ...)字典:{key1:value1, key2:value2, ...}布尔型:true/false算术运算:+, -, *, /, //, %, **比较操作:==, !=, >, >=, <, <=逻辑运算:and, or, not

条件判断

Jinjia2模板本身就是基于python的,所以它if语句也支持多条件判断,嵌套等

与python一样,具有if(如果),elif(在如果),else(否则),只不过结尾变成了endif表示条件的结束

常见的缩进方式为4格,也可以使用 2 个空格或制表符,但要保持一致

单条件:{% if  表达式 %}执行的内容{% endif %}
双条件:{% if 表达式 %}执行内容{% else %}执行内容{% endif %}
多条件:{% if 表达式 %}执行内容{% elif 表达式 %}执行内容{% else %}
执行内容{% endif %}
嵌套:{% if  表达式 %}执行的内容{% if 表达式 %}执行内容{% else %}执行内容{% endif %}{% endif %}

循环

循环同样也具有条件判断的类似操作,这里就不过多举例了。

可以使用{% for %}和{% endfor %}块来实现一个基本的循环。

{% for i in 表达式 %}执行内容{% endfor %}

需要注意的是ansible默认不支持break(跳出循环)和continue(继续)的。

其他控制结构

你会发现jinjia2模板没有函数,但是,jinjia2模板有类似函数的用法,叫做宏,主要用于在模板渲染过程中生成动态的内容。一般有两种用法定义{% macro %}和调用{% call %}jinjia2还支持其他的控制结构如{% include %}用于包含其他模板文件。

定义宏:{% macro one(text = '这是一段默认文本') %}{{ text }}{% endmacro %}

这里one是宏的名称,text为参数,{{text}}则是宏输出的内容

过滤器

Jinja2也支持过滤器,可以使用过滤器来对变量进行操作。

Lookup过滤器

在 Ansible 中,lookup过滤器是一种强大的工具,用于从外部数据源检索数据。

语法格式:{{ lookup(‘插件名称’, ‘插件参数’)}}

常用插件:

file: 用于读取配置文件、脚本、密钥文件等各种文件类型的内容。

env: 用于获取环境变量的值

password: 用于从密码存储(如ansible-vault)中获取密码

#获取/etc/testfile文件内容{{ lookup('file','/etc/testfile') }}#获取PATH环境的变量值{{ lookup('env','PATH') }}
Default过滤器

default过滤器用于在变量未定义或者为假(例如空字符串、False、None、空列表等)的情况下提供一个默认值。

Set是用来设置变量的,想当于声明一个变量

如果variable变量未定义,那么就会把”定义的变量”这个值赋予给它

set default_value=”定义的变量”database_host:{{ variable | default("default_value") }}

template模块

 template模块与copy模块的用法十分类似,只是更多用于jinja2模板的渲染,也就是模板文件中可以引用变量,实现对不同主机有定制化的配置。

参数

解析

src

指定本地jinja2模板文件的位置

dest

指定目标远程主机路径

backup

指定是否备份,默认值no

mode

设置权限

user

设置用户

group

设置用户组

Jinjia2模板示例

jinjia2模板好用的地方在于它支持多种文件可以是html,xml,conf等等,这就极大的方便用template模块使用jinjia2模板对一些服务的配置文件进行修改

安装redis服务:

把需要修改的配置信息写入模板中[root@web01 ansible]# cat redis.conf.j2bind {{ ansible_host }} 127.0.0.1  #  引用了facts组件内置变量port {{ redis_port }}           #这是play文件里定义的变量protected-mode notcp-backlog 511timeout 0tcp-keepalive 300daemonize yessupervised nopidfile /var/run/redis_6379.pidloglevel notice

编写play文件

[root@web01 ansible]# cat redis.yml---- name: 部署redsi服务hosts: web01vars:redis_port: 6379 #指定redis的端口tasks:- name: install redisyum:name: redisstate: present- name: start redisservice:name: redisstate: startednotify: restart- name: upload redis.conftemplate:src: /etc/ansible/redis.conf.j2dest: /etc/redis.confhandlers:- name: restartservice:name: redisstate: restarted

执行命令

[root@web01 ansible]# ansible-playbook redis.yml

查询配置文件是否修改

[root@web01 ansible]# grep [^a-Z$] /etc/redis.confbind 192.168.143.161 127.0.0.1port 6379protected-mode notcp-backlog 511timeout 0tcp-keepalive 300daemonize yessupervised nopidfile /var/run/redis_6379.pidloglevel notice

可以看到此时配置文件和我们模板中写的配置文件内容一致


http://www.ppmy.cn/ops/142214.html

相关文章

.NET中的JSON序列化库:Newtonsoft.Json与System.Text.Json对比与示例

在.NET生态系统中&#xff0c;存在多个用于JSON序列化的库&#xff0c;其中最为常用和知名的包括Newtonsoft.Json&#xff08;也称为Json.NET&#xff09;和System.Text.Json。以下是这两个库的区别&#xff1a; Newtonsoft.Json&#xff08;Json.NET&#xff09; 功能与灵活…

Python的3D可视化库【vedo】2-3 (plotter模块) 增删物体、控制相机

文章目录 4 Plotter类的方法4.3 渲染器内的物体操作4.3.1 添加物体4.3.2 移除物体4.3.3 渲染器的内容列表 4.4 相机控制4.4.1 访问相机对象4.4.2 重置相机状态4.4.3 移动相机位置4.4.4 改变相机焦点4.4.5 改变相机朝向的平面4.4.5 旋转相机4.4.6 对齐相机的上朝向4.4.7 缩放 pl…

在springBoot项目如何对本地配置文件和云服务配置文件独立配置

springBoot中配置文件本地和云服务配置文件独立配置 1.首先我们创建好一个springBoot项目后&#xff0c;需要再创建两个application.yml配置文件&#xff0c;如图 2.然后在各自的配置文件中配置各自环境的信息&#xff0c;注意的是在创建各自环境的yml文件时&#xff0c;必须…

WPF Combox使用 Text无法选择正确获取CHange后的Text

使用固定ComboxItem 无法通过 selectitem as object 来进行回去到 Content内的对香数据。那我只能这个样干&#xff1a; private void CBPaiweiLeixingSelect_Change(object sender, SelectionChangedEventArgs e){ ComboBox ThisBox sender as ComboBox;List<EDaxiaosuixi…

1125 子串与子列 (暴力搜索,PAT甲级中文版,C++实现)

子串是一个字符串中连续的一部分&#xff0c;而子列是字符串中保持字符顺序的一个子集&#xff0c;可以连续也可以不连续。例如给定字符串 atpaaabpabtt&#xff0c;pabt是一个子串&#xff0c;而 pat 就是一个子列。 现给定一个字符串 S 和一个子列 P&#xff0c;本题就请你找…

【Zabbix】解决乱码问题

1. 在控制面板-外观和个性化-字体里面找到楷体 2. 上传至/usr/share/zabbix/assets/fonts/&#xff0c;注意命名要小写 3. 修改/usr/share/zabbix/include/defines.inc.php内容 将defines.inc.php中的内容为simkai 4. 刷新页面解决

Linux 添加spi-nor flash支持

1. spi-nor flash简介 在嵌入式ARM开发过程中通常会使用到spi-nor flash&#xff0c;主要用于固化u-boot镜像以支持spi方式启动系统。目前常用的spi-nor flash有gd25wq128e、w25q128等flash芯片&#xff0c;下述以gd25wq128e为例进行讲解。 2.调试通常遇到的问题 无法识别到…

protobuf c++开发快速上手指南

1、环境准备 在c环境使用 protobuf&#xff0c;需要安装protobuf runtime以及protobuf的编译器&#xff1a;protoc&#xff0c;其作用如下表格&#xff1a; 需要安装的环境作用protoc将proto文件编译成c源码protobuf runtime编译c源码需要链接到protobuf库 注意&#xff1a;…