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

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.j2

bind {{ ansible_host }} 127.0.0.1  #  引用了facts组件内置变量

port {{ redis_port }}           #这是play文件里定义的变量

protected-mode no

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize yes

supervised no

pidfile /var/run/redis_6379.pid

loglevel notice

编写play文件

复制代码
[root@web01 ansible]# cat redis.yml

---

  - name: 部署redsi服务

    hosts: web01

    vars:

      redis_port: 6379 #指定redis的端口

    tasks:

      - name: install redis

        yum:

          name: redis

          state: present

      - name: start redis

        service:

          name: redis

          state: started

        notify: restart
      - name: upload redis.conf

        template:

          src: /etc/ansible/redis.conf.j2

          dest: /etc/redis.conf

    handlers:

      - name: restart

        service:

          name: redis

          state: restarted

执行命令

root@web01 ansible\]# ansible-playbook redis.yml ![](https://i-blog.csdnimg.cn/direct/d737c0b566484bb08e407ebeb7af1de4.png) 查询配置文件是否修改 [root@web01 ansible]# grep [^a-Z$] /etc/redis.conf bind 192.168.143.161 127.0.0.1 port 6379 protected-mode no tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize yes supervised no pidfile /var/run/redis_6379.pid loglevel notice 可以看到此时配置文件和我们模板中写的配置文件内容一致

相关推荐
Wnq1007225 分钟前
DEEPSEEK创业项目推荐:
运维·计算机视觉·智能硬件·ai创业·deepseek
weixin_4284984928 分钟前
Linux系统perf命令使用介绍,如何用此命令进行程序热点诊断和性能优化
linux·运维·性能优化
盛满暮色 风止何安1 小时前
VLAN的高级特性
运维·服务器·开发语言·网络·网络协议·网络安全·php
lemon3106242 小时前
dockerfile制作镜像
linux·运维·服务器·学习
易保山3 小时前
MIT6.S081 - Lab5 Lazy(延迟分配)
linux·操作系统·c
AI享网无代码创作3 小时前
WP Mail 邮件发送:WordPress Mail SMTP设置
运维·服务器·网络
想躺在地上晒成地瓜干4 小时前
树莓派超全系列文档--(14)无需交互使用raspi-config工具其一
linux·树莓派·raspberrypi·树莓派教程
Shier833_Ww4 小时前
目标识别与双目测距(1)环境搭建:Ubuntu+yolov5+pcl库
linux·yolo·ubuntu
唐青枫5 小时前
Linux 历史命令操作教程
linux
愚润求学5 小时前
Linux基础指令(一)
linux·服务器·语法