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 可以看到此时配置文件和我们模板中写的配置文件内容一致

相关推荐
碎梦归途2 小时前
Linux 软件安装方式全解(适用于 CentOS/RHEL 系统)
linux·运维·centos
啃火龙果的兔子2 小时前
CentOS 7.9 安装 宝塔面板
linux·运维·centos
DexterLien2 小时前
基于 Alpine 定制单功能用途(kiosk)电脑
linux·alpine·kiosk
半导体守望者2 小时前
英福康INFICON VGC501, VGC502, VGC503 单通道、双通道和三通道测量装置
经验分享·笔记·功能测试·自动化·制造
小和尚敲木头2 小时前
krpano 字符串拼接,传参。
java·linux·前端
tanyyinyu3 小时前
Python函数参数详解:从位置参数到灵活调用的艺术
运维·开发语言·python
国际云,接待3 小时前
阿里云无影云桌面深度测评
运维·服务器·阿里云·云原生·云计算
#君君#3 小时前
解决 Ubuntu 20.04 虚拟机中 catkin_make 编译卡死问题
linux·运维·ubuntu
IT布道3 小时前
强制卸载openssl-libs导致系统异常的修复方法
linux·运维·服务器
太空1号3 小时前
飞腾D2000,麒麟系统V10,docker,ubuntu1804,小白入门喂饭级教程
linux·c++·docker