当前位置: 首页 > article >正文

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 }} directory
  file: dest=/data/{{ PROJECT }} state=directory
- name: template transfor {{ PROJECT }} dir
  template: 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.102
  user: root
  gather_facts: false
  roles:
   - role: test_hosts

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

[root@ansible-server test_hosts]# cat tasks/file1.yml 
- name: ansible jinja2 template for hosts config
  template: 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.kler.cn/a/465035.html

相关文章:

  • QML使用Popup实现弹出Message
  • 分析服务器 systemctl 启动gozero项目报错的解决方案
  • SQLALchemy如何将SQL语句编译为特定数据库方言
  • 多层设计模式:可否设计各层之间公用的数据定义模块?
  • 【LC】191. 位1的个数
  • 【STM32】项目实战——OV7725/OV2604摄像头颜色识别检测(开源)
  • Oracle 数据库使用SPM固定执行计划
  • 在Ubuntu系统中生成授信域名https证件文件
  • 利用Python爬虫获取店铺所有商品:技术实践与应用指南
  • Netty学习 - 编译Netty4.2
  • 【TextIn—智能文档解析与DocFlow票据AI自动化处理:赋能企业文档数字化管理与数据治理的双重利器】
  • C语言笔记之strnlen遇到第一个‘\0‘时会停止计数导致字符串被截断吗?
  • 基于嵌入式无人机UAV通信系统的实时最优资源分配算法matlab仿真
  • WPS计算机二级•数据快速录入
  • GeoTrust True BusinessID Wildcard
  • GO 快速升级Go版本
  • 【Python运维】用Python和Ansible实现高效的自动化服务器配置管理
  • 七大设计原则之单一职责原则
  • 【洛谷】5026、Lycanthropy 落水后水的高度
  • php获取字符串中的汉字
  • 图书项目:整合SSM
  • C++软件设计模式之解释器模式
  • 高职人工智能数据工程技术专业教学解决方案(2025年新专业)
  • 【每日学点鸿蒙知识】RelativeContainer组件、List回弹、Flutter方法调用、Profiler工具等
  • logback之配置文件使用详解
  • 使用 Bash 脚本中的time命令来统计命令执行时间:中英双语