Ansible Jinja2 语法简介及使用

1、Jinja2 介绍

  • Jinja2 是基于 python 的模板引擎,功能比较类似于 PHP 的 smarty,J2ee 的 Freemarker和velocity。它能完全支持unicode,并具有集成的沙箱执行环境,应用广泛。

  • jinja2使用BSD授权

  • Jinja2的语法是由 variables(变量) 和 statement(语句) 组成,如下;

1、variables:可以输出数据

 my_variables mysql_port 3307    {{ msyql_port | default('3306') }}    # 默认变量
 {{ some_dudes_name | capitalize }} 

2、statements: 可以用来创建条件和循环等

if语句:
{% if my_conditional %} 
...
{% endif %}

for 语句:
{% for item in all_items %}
`item` 
……
{% endfor %}

  • jinja2 支持使用带过滤器的Unix型管道操作符,有很多的内置过滤器可供使用。

  • 我们可以用简单if和for就可以建立几乎任何的常规配置文件,不过如果你有意更进一步,jinja2 documentation (http://jinja.pocoo.org/docs/dev/)包含了很多有趣的东西可供了解。

3、jinja2 使用实例
1、引用变量 
1、ansible 目录结构

 [root@ansible-server ansible]# cd roles/template/
.
├── meta
│   └── main.yml
├── tasks
│   ├── template.yml  
│   └── main.yml
├── templates
│   ├── order.j2
└── vars
    └── main.yml

 2、调度yml文件

[root@ansible-server ansible]# cat templates.yml
---
- hosts: 192.168.234.102
  user: root
  gather_facts: false
  roles:
   - role: template

  • 注意: 这里 - role: template 和 - template 是一样的

3、其他yml文件
[root@ansible-server templates]# cat tasks/main.yml
- include: template.yml[root@ansible-server templates]# cat tasks/template.yml
- name: create {{ PROJECT }} directoryfile: dest=/data/{{ PROJECT }} state=directory
- name: template transfor {{ PROJECT }} dirtemplate: src=order.j2 dest=/data/{{ PROJECT }}/order.conf[root@ansible-server templates]# cat templates/order.j2
project: {{ PROJECT }}
switch: {{ SWITCH }}
dbport: {{ DBPORT }}[root@ansible-server templates]# cat vars/main.yml
PROJECT: "JAVA"
SWITCH: "ON"
DBPORT: "8080"

4、测试

[root@ansible-server ansible]# ansible-playbook templates.yml --syntax-check
playbook: templates.yml

 5、执行

[root@ansible-server ansible]# ansible-playbook templates.yml 
PLAY [192.168.234.102] **************************************************************
TASK [template : include] ***************************************************
included: /etc/ansible/roles/template/tasks/template.yml for 192.168.234.102
TASK [template : create JAVA directory] *************************************
changed: [192.168.234.102]
TASK [template : template transfor java dir] ********************************
changed: [192.168.234.102]
PLAY RECAP *********************************************************************
192.168.234.102                : ok=3    changed=2    unreachable=0    failed=0  

6、查看结果

[root@ansible-server ansible]# cat /data/JAVA/order.conf
project: JAVA
switch: ON
dbport: 8080
2、for 语句
  • 为远程主机生成服务器列表,加入该列表从192.168.234.102 web01.test.com 到192.168.234.103 web11.test.com 结束,如果手动添加就很不科学了,这里需要使用jinja2语法的for循环通过模板批量生成对应的配置文件,如下:

1、ansible 目录结构
[root@ansible-server ansible]# cd roles/test_hosts
[root@ansible-server test_hosts]# tree
.
├── meta
│   └── main.yml
├── tasks
│   ├── file1.yml
│   └── main.yml
├── templates
│   └── test1.j2
└── vars└── main.yml

2、调度yml文件

[root@ansible-server ansible]# cat test_hosts.yml
---
- hosts: 192.168.234.102user: rootgather_facts: falseroles:- role: test_hosts

3、各目录下 yml文件内容:

[root@ansible-server test_hosts]# cat tasks/file1.yml 
- name: ansible jinja2 template for hosts configtemplate: src=test1.j2 dest=/tmp/httpd.conf.test[root@ansible-server test_hosts]# cat tasks/main.yml 
- include: file1.yml[root@ansible-server test_hosts]# cat templates/test1.j2 
{% for id in range(201,212) %}
192.168.234.{{ id }} web{{ "%02d" | format(id-200) }}.test.com
{% endfor %}# 解释:
{{ id }} # 提取for循环中对应的变量id值
"%02d"   # 调用的是python内置的字符串格式化输出(%d格式化整数)因为是01,02这种格式,所以是保留2位,故用02,然后将结果通过管道符 “|” 传递给format 函数做二次处理。

4、执行

[root@ansible-server ansible]# ansible-playbook test_hosts.yml

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

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

相关文章

SpringCloud系列教程:微服务的未来 (五)枚举处理器、JSON处理器、分页插件实现

在现代 Java 开发中,我们常常需要处理各种通用的功能和需求,诸如枚举的处理、JSON 数据处理,以及分页查询等。这些功能虽然看似简单,但在实际开发中往往涉及到许多细节和优化。为了提高开发效率、减少重复代码的编写,我…

游戏引擎学习第69天

回顾碰撞响应时我们停留的位置 从昨天的讨论开始,我们正准备处理碰撞响应的复杂性。具体来说,我们讨论的是,当两个实体在屏幕上发生碰撞时,如何回应这种情况。碰撞本身并不复杂,但要处理其后的反应和规则则更具挑战性…

【Linux】信号处理

一、Linux系统信号 1、常见的系统信号 常见的Linux系统信号 信号值描述1SIGHUP挂起(hang up)进程2SIGINT中断进(interrupt)程3SIGQUIT停止(stop)进程9SIGKILL无条件终止(terminate)…

开源模型应用落地-qwen2-7b-instruct-LoRA微调-Axolotl-单机多卡-RTX 4090双卡(七)

一、前言 本篇文章将使用Axolotl去高效微调QWen2系列模型,通过阅读本文,您将能够更好地掌握这些关键技术,理解其中的关键技术要点,并应用于自己的项目中。 二、术语介绍 2.1. LoRA微调 LoRA (Low-Rank Adaptation) 用于微调大型语言模型 (LLM)。 是一种有效的自适应策略,…

数据结构与算法学习笔记----快速幂

数据结构与算法学习笔记----快速幂 author: 明月清了个风 first publish time: 2025.1.2 ps⭐️快速幂的两道模版题,快速幂,乘法逆元,费马小定理 Acwing 875. 快速幂 [原题链接](875. 快速幂 - AcWing题库) 给定 n n n组 a i , b i , p i…

爬虫代码中如何添加异常处理?

在编写爬虫代码时,添加异常处理是非常重要的一步,因为它可以帮助我们处理网络请求中可能出现的各种问题,比如网络连接错误、超时、解析错误等。以下是如何在Python爬虫代码中添加异常处理的示例: import requests from bs4 impor…

MAC环境安装(卸载)软件

MAC环境安装(卸载)软件 jdknode安装node,并实现不同版本的切换背景 卸载node从node官网下载pkg安装的node卸载用 homebrew 安装的node如果你感觉删的不够干净,可以再细分删除验证删除结果 jdk 1.下载jdk 先去官网下载自己需要的版…

本地LLM部署--llama.cpp

–图源GitHub项目主页 概述 llama.cpp是以一个开源项目(GitHub主页:llamma.cpp),也是本地化部署LLM模型的方式之一,除了自身能够作为工具直接运行模型文件,也能够被其他软件或框架进行调用进行集成。 其…

uniapp中使用ruoyiPlus中的加密使用(crypto-js)

package.json中添加 "crypto-js": "^4.2.0", "jsencrypt": "^3.3.2",但是vue2中使用 import CryptoJS from cryptojs; 这一步就会报错 参照 参照这里:vue2使用CryptoJS实现信息加解密 根目录下的js文档中新增一个AESwork.…

go项目使用gentool生成model的gen.go问题

Gen Tool 是一个没有依赖关系的二进制文件,可以用来从数据库生成结构。 使用方法: go install gorm.io/gen/tools/gentoollatest在项目根目录,执行连接的数据库中指定某几张表结构生成数据库model层 gentool -dsn "root:123456tcp(localhost:330…

路由基本配置实验

路由器用于实现不同类型网络之间的互联。 路由器转发ip分组的基础是路由表。 路由表中的路由项分为直连路由项、静态路由项和动态路由项。 通过配置路由器接口的ip地址和子网掩码自动生成直连路由项。 通过手工配置创建静态路由项。 热备份路由器协议允许将由多个路由器组…

产品原型设计

🤣🤣目录🤣🤣 一、Axure原型设计(Axure RP 9 )1.1 软件下载安装1.2 产品原型展示1.3 产品原型下载1.4 视频课程推荐 二、磨刀原型设计2.1 软件下载安装2.2 产品原型展示2.3 产品原型下载2.4 视频课程推荐 什…

Android反编译

安卓反编译要用到三个工具, 工具1:apktool反编译出来资源文件和源码 工具2:d2j-dex2jar生成classes_dex2jar.jar文件工具3:jd-gui.exe 打开classes_dex2jar.jar文件查看java代码一、 反编译得到资源文件(工具1&#xf…

计算机网络 (17)点对点协议PPP

一、PPP协议的基本概念 PPP协议最初设计是为两个对等节点之间的IP流量传输提供一种封装协议,它替代了原来非标准的第二层协议(如SLIP)。在TCP/IP协议集中,PPP是一种用来同步调制连接的数据链路层协议(OSI模式中的第二层…

Tailwind CSS 实战:表单设计与验证实现

在 Web 开发中,表单就像是一位尽职的接待员,负责收集和验证用户的输入信息。记得在一个企业级项目中,我们通过重新设计表单交互流程,将表单的完成率提升了 42%。今天,我想和大家分享如何使用 Tailwind CSS 打造一个既美观又实用的表单系统。 设计理念 设计表单就像是在设计一…

信息系统项目管理师——第8章章 项目整合管理 笔记

8 项目整合管理(最后反过来看) 项目整合过程:①制定项目章程(启动过程)、②制订项目管理计划(规划过程)、③指导和管理项目工作、管理项目知识(执行过程)、④监控项目工…

MLP、CNN、Transformer 的区别解析

亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、Java 与 Python 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在未来…

WebRTC线程的启动与运行

WebRTC线程运行的基本逻辑: while(true) {…Get(&msg, …);…Dispatch(&msg);… }Dispatch(Message *pmsg) {…pmsg->handler->OnMessage(pmsg);… }在执行函数内部,就是一个while死循环,只做两件事,从队列里Get取…

CSS 学习之 padding 与图形绘制

padding 属性和 background-clip 属性配合,可以在有限的标签下实现一些 CSS 图形绘制效果,我这里举两个小例子,重在展示可行性。 例 1:不使用伪元素,仅一层标签实现大队长的“三道杠”分类图标效果。此效果在移动端比较常见&…

yolov5核查数据标注漏报和误报

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、误报二、漏报三、源码总结 前言 本文主要用于记录数据标注和模型预测之间的漏报和误报思想及其源码 提示:以下是本篇文章正文内容,…