【运维知识进阶篇】Ansible Jinja2模板详解

news2024/12/24 21:13:12

哈喽大家好,我是koten,本篇文章给大家介绍jinja2模板,这是python的全功能模板引擎。在Ansible中,通常会使用jinja2模板来修改被管理主机的配置文件(saltstack中也会用到)

Ansible中使用的jinja2模板其实就是使用template模块,该模块与copy模块一样,都有复制管理机的配置文件到客户机的作用,区别在于template模块可以获取到文件中的变量,而copy则是原封不动把文件内容复制过去。如:我们想把脚本中的变量名改成主机名,如果使用copy推送的就是{
{ ansible_fqdn }},如果使用template,则会变成对应的主机名。

需要注意的是,Ansible允许jinja2模板中使用条件判断和循环,但是不允许在playbook中使用,只能在传输的文件中使用。

Ansible Jinja2模板使用

1、基本语法

1、playbook文件使用template模块
2、模板文件里面变量使用{{名称}},比如{{ port }}或使用facts

2、Jinja2模板逻辑判断

#循环表达式
{% for i in EXPR %}
{% endfor %}

#条件判断
{% if EXPR %}
{% elif EXPR %}
{% else %}
{% endif %}

#注释
{# COMMENT #}

3、Jinja2示例

1、编辑playbook

[root@Ansible test]# cat jinja2.yml
- hosts: web_group
  tasks:
    - name: copy template file
      template:
        src: motd.j2
        dest: /etc/motd

2、准备motd.j2文件

[root@Ansible test]# cat motd.j2
Welcome to {{ ansible_fqdn }}
This system total mem is : {{ ansible_memtotal_mb }} MB
This system free mem is : {{ ansible_memfree_mb }} MB

3、执行playbook并查看效果

[root@Ansible test]# ansible-playbook jinja2.yml 

PLAY [web_group] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [web01]
ok: [web02]

TASK [copy template file] ******************************************************
changed: [web01]
changed: [web02]

PLAY RECAP *********************************************************************
web01                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
web02                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@Ansible test]# ansible web_group -a 'cat /etc/motd'
web01 | CHANGED | rc=0 >>
Welcome to Web01
This system total mem is : 972 MB
This system free mem is : 441 MB
web02 | CHANGED | rc=0 >>
Welcome to Web02
This system total mem is : 972 MB
This system free mem is : 84 MB

Ansible Jinja2管理nginx

Ansible使用jinja2的for循环表达式渲染出nginx负载均衡的配置文件

1、编辑playbook

[root@Ansible test]# cat lb.yml
- hosts: lb_group
  vars:
    http_port: 80
    server_name: www.koten.vip
  tasks:
    - name: copy
      template:
        src: proxy_7.conf.j2
        dest: /etc/nginx/conf.d/proxy_7.conf
      notify: reload nginx

  handlers:
    - name: reload nginx
      systemd:
        name: nginx
        state: reloaded

2、准备配置文件

[root@Ansible test]# cat proxy_7.conf.j2
upstream {{ server_name }} {
{% for n in range(21) %}
	server 172.16.1.{{ n }}:{{ http_port }}
{% endfor %}
}

server{
  listen 80;
  server_name {{ server_name }};

  location / {
	root /code
	index index.html
	proxy_pass http://{{ server_name }}
	proxy_set_header Host $http_host	
  }
}

3、执行playbook并查看客户机上的效果

[root@Ansible test]# ansible-playbook lb.yml

PLAY [lb_group] ****************************************************************

TASK [Gathering Facts] *********************************************************
ok: [lb00]
ok: [lb01]
ok: [lb02]

TASK [copy] ********************************************************************
changed: [lb01]
changed: [lb00]
changed: [lb02]

RUNNING HANDLER [reload nginx] *************************************************
changed: [lb00]
changed: [lb02]
changed: [lb01]

PLAY RECAP *********************************************************************
lb00                       : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
lb01                       : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
lb02                       : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

查看效果 

[root@LB00 ~]# cat /etc/nginx/conf.d/proxy_7.conf
upstream www.koten.vip {
	server 172.16.1.0:80
	server 172.16.1.1:80
	server 172.16.1.2:80
	server 172.16.1.3:80
	server 172.16.1.4:80
	server 172.16.1.5:80
	server 172.16.1.6:80
	server 172.16.1.7:80
	server 172.16.1.8:80
	server 172.16.1.9:80
	server 172.16.1.10:80
	server 172.16.1.11:80
	server 172.16.1.12:80
	server 172.16.1.13:80
	server 172.16.1.14:80
	server 172.16.1.15:80
	server 172.16.1.16:80
	server 172.16.1.17:80
	server 172.16.1.18:80
	server 172.16.1.19:80
	server 172.16.1.20:80
}

server{
  listen 80;
  server_name www.koten.vip;

  location / {
	root /code
	index index.html
	proxy_pass http://www.koten.vip
	proxy_set_header Host $http_host	
  }
}

Ansible Jinja2管理keepalived

ansible使用jinja模板的if判断表达式渲染出keepalived高可用配置文件,并推送到lb主机上

1、编辑playbook

[root@Ansible test]# cat keepalived.yml
- hosts: lb_group
  tasks:
    - name: copy file
      template:
        src: keepalived.conf.j2
        dest: /etc/keepalived/keepalived.conf
      notify: restart keepalived
      when: (ansible_hostname is match "LB01") or (ansible_hostname is match "LB02")

  handlers:
    - name: restart keepalived
      systemd:
        name: keepalived
        state: restarted
      when: (ansible_hostname is match "LB01") or (ansible_hostname is match "LB02")

2、编写keepalived配置文件

可以看着keepalive master配置文件和keepalive backup配置文件参考着编写

[root@Ansible test]# cat keepalived.conf.j2
global_defs {
    router_id {{ ansible_fqdn }}
}

vrrp_instance VI_1 {
{% if ansible_fqdn == "LB01" %}
    state MASTER
    priority 150
{% else %}
    state BACKUP
    priority 100
{% endif %}

    interface eth0
    virtual_router_id 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {         
        10.0.0.3
    }
}

3、执行playbook并查看效果

[root@Ansible test]# ansible-playbook keepalived.yml

PLAY [lb_group] ****************************************************************************************

TASK [Gathering Facts] *********************************************************************************
ok: [lb02]
ok: [lb00]
ok: [lb01]

TASK [copy file] ***************************************************************************************
skipping: [lb00]
changed: [lb02]
changed: [lb01]

RUNNING HANDLER [restart keepalived] *******************************************************************
changed: [lb01]
changed: [lb02]

PLAY RECAP *********************************************************************************************
lb00                       : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
lb01                       : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
lb02                       : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@LB01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
    router_id LB01
}

vrrp_instance VI_1 {
    state MASTER
    priority 150

    interface eth0
    virtual_router_id 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {         
        10.0.0.3
    }
}

[root@LB02 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
    router_id LB02
}

vrrp_instance VI_1 {
    state BACKUP
    priority 100

    interface eth0
    virtual_router_id 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {         
        10.0.0.3
    }
}

我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!

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

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

相关文章

【软件测试】软件测试管理

软件测试管理 软件测试环境测试环境的要素测试环境管理员 软件测试计划⭐测试计划目标测试计划主题测试计划制订过程定义工作进度的过程测试策略 软件缺陷(bug)管理缺陷的主要属性如何报告缺陷⭐如何跟踪缺陷缺陷度量 软件配置管理(SCM)软件配置管理的基…

计算机网络传输层1.0

功能 传输层提供进程到进程的逻辑通信 复用和分用 传输层对收到的报文进行差错检测 TCP/UDP 提供进程到进程的逻辑通信 网络层是提供主机间逻辑通信 从网络层来看,通信双方为两台主机,IP数据包首部给出两台主机的IP地址 而实际上的两台主机通信时两台…

Makefile路径处理:执行路径、绝对路径与相对路径的处理

问题描述 最近编写了一个 编译设备树 的 Makefile,遇到了使用 make -f xx/Makefile,执行路径变了,造成 Makefile 里面的一些操作路径不正确,无法执行 获取当前目录 make 内置的 $(CURDIR),可以把当前路径的全路径打印…

Three.js--》实现图片转3D效果展示

目录 项目搭建 初始化three.js基础代码 加载图片纹理 设置着色器 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。 项目搭建 本案例还是借助框架书写th…

逻辑推理与集合

逻辑推理与集合是同一个过程的不同展示方式,这两者具有不同的特点。 逻辑推理通常是一种思维过程、语言文本的形式。 而集合则很容易采用一种可视化的方式进行展示,并且集合很容易进行交集、并集、补集、差集等计算。 把语言的逻辑推理过程转换为集合…

0602-指针和数组

数组名 数组名是一个地址常量,不允许赋值。它表示数组首元素的地址。 指针操作数组元素 指针访问数组 指针类型变量\常量1等同于指针保存的内存地址sizeof(指针指向的数据类型)。 2个相同类型的指针相减,得到的结果是2个指针的偏移量。其中偏移单位…

STL模型转有限元网格

随着计算机图形学、硬件和3D打印技术的发展,基于曲面三角网格的图形渲染及其文件格式越来越流行。 在有限元分析(FEA)中,工程师有时会得到基于三角形网格的几何文件(如STL文件等)并进行后续分析。 由于曲面…

华为OD机试真题 Java 实现【检查是否存在满足条件的数字组合】【2022Q4 100分】

一、题目描述 给定一个正整数数组,检查数组中是否存在满足规则的数字组合 规则:A B 2C 二、输入描述 第一行输出数组的元素个数。 接下来一行输出所有数组元素,用空格隔开。 三、输出描述 如果存在满足要求的数,在同一行…

【MySQL】不允许你不会SQL语句之DDL

目录 前言: 一.DDL数据库语句 1.1语句讲解 1.2总结 二.DDL表语句 2.1语句讲解 2.2总结 三.DDL字段语句 3.1语句讲解 3.2总结 四.MySQL数据类型 五.结尾 前言: 在从零到一入门MySQL一篇中,我们对数据库已经有了一定的了解&#xf…

Linux 设备树手动反编译 dtb 生成 源文件dts

验证平台 win10 64 位 VMware Workstation Pro 16 ubuntu 20.04 dtc 工具: 来自 linux-6.3.5 中的 scripts/dtc/ 安装 dtc 工具 其实可以通过安装 dtc 软件包,但不建议这么做,最好通过编译Linux 最新的内核,获取这个 dtc 工具…

利用Web Serial API实现Vue与单片机串口通信

一、Web Serial API介绍 Web Serial API 是一项 Web 技术,用于在浏览器中访问串行端口设备(如 Arduino、传感器等)并与之通信。它提供了一组 JavaScript 接口,使得 Web 应用程序可以通过 USB 串行端口连接到硬件设备,并…

华为OD机试真题 Java 实现【报数游戏】【2022Q4 100分】

一、题目描述 100个人围成一圈,每个人有一个编码,编号从1开始到100。他们从1开始依次报数,报到为M的人自动退出圈圈,然后下一个人接着从1开始报数,直到剩余的人数小于M。请问最后剩余的人在原先的编号为多少&#xff…

【JavaSE】Java基础语法(四十五):TCP UDP 全解

文章目录 1. TCP发送数据2. TCP接收数据【应用】3. TCP程序练习4. TCP程序文件上传练习【应用】5. UDP发送数据6. UDP接收数据【应用】7. UDP通信程序练习【应用】8. UDP三种通讯方式 1. TCP发送数据 Java中的TCP通信 Java对基于TCP协议的的网络提供了良好的封装,使…

chatgpt赋能python:Python删除文件目录

Python删除文件目录 Python是一种高级编程语言,广泛应用于开发各种类型的应用程序。Python的许多功能使其成为开发者的首选编程语言之一。在这篇文章中,我们将讨论如何使用Python删除文件和目录。 文件和目录的区别 在开始之前,让我们了解…

16_Linux内核启动流程

目录 链接脚本vmlinux.Ids Linux内核入口stext mmap_switched函数 start_kernel函数 rest_init函数 init进程 链接脚本vmlinux.Ids 要分析Linux启动流程,同样需要先编译一下Linux源码,因为有很多文件是需要编译才会生成的。首先分析Linux内核的连接脚本文件arch/arm/kem…

【Python】Python系列教程-- Python3 字符串(十一)

文章目录 前言Python3 字符串Python 访问字符串中的值Python 字符串更新Python 转义字符Python 字符串运算符Python 字符串格式化Python三引号f-stringUnicode 字符串Python 的字符串内建函数 前言 往期回顾: Python系列教程–Python3介绍(一&#xff…

计算机网络-网络层1.0

传输单位 网络层将分组从源端传到目的端,为分组交换网上的不同主机提供通信服务,传输单位为数据报 路由器 完成路由选择和分组转发 路由选择:按照分布式算法,根据从相邻路由器所得到的的关于整个网络拓扑的变化情况&#xff0…

操作系统第二章​练习题

第一部分 教材习题(P84) 1、什么是前趋图?为什么要引入前趋图?​ 前趋图:是用于描述程序段或进程之间执行的先后顺序的有向无循环图。 引入的原因:为了更好的描述程序的顺序和并发执行的情况。 试画出下面4条语句的前趋图&#…

LeetCode 2559 统计范围内的元音字符串数

LeetCode 2559 统计范围内的元音字符串数 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/count-vowel-strings-in-ranges/description/ 博主Github:https://github.com/GDUT-Rp/LeetCode 题目:…

Vue3小兔鲜:组合式写法入门

Vue3&#xff1a;组合式写法入门 Date: May 11, 2023 认识Vue3 1. Vue3组合式API体验 通过 Counter 案例 体验Vue3新引入的组合式API <script> export default {data(){return {count:0}},methods:{addCount(){this.count}} } </script><script setup> imp…