热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ansible剧本day07jinja模板实操

目录Ansible之jinja2模板什么是jinja模板jinja模板使用基本语法jinja模板之循环jinja模板之判断Jinja2的使用案例一:使用变量推送motd案例二:使用

目录

  • Ansible之jinja2模板
    • 什么是jinja模板
    • jinja模板使用基本语法
    • jinja模板之循环
    • jinja模板之判断
      • Jinja2的使用
        • 案例一:使用变量推送motd
        • 案例二:使用Jinja2管理nginx
        • 案例三:使用jinja2管理keepalived
        • 案例四:Jinja2管理MySQL


Ansible之jinja2模板

什么是jinja模板

# jinja模块介绍
jinja2是Python的全功能模板引擎,通常将管理端的文件cp到被管理端,而管理端中的文件存在ansible变量,则此文件被称为jinja模板,一般此模板以.j2结尾命名,如需要使模板中变量生效,及在推送至客户端时需要使用名为template模块。该模块和copy一样,区别就在于template可以获取到文件中的变量。
# 注意:
ansible允许jinja2模板中使用条件判断和循环,但是不允许在playbook中使用

jinja模板使用基本语法

## 模板文件:也就是我们的配置文件(要推送的文件,并且文件中需要变量)
## 调用变量
{{ 变量名 }} ## jinja2会自动把带有{{ 变量名 }} 替换成变量值
## 模板文件里的变量
1.可以调用自己设置的web_user_group: www
{{ web_user_group }}
2.可以调用facts变量:ansible web01 -m setup
{{ ansible_fqdn }} ## 获取主机名
{{ ansible_memtotal_mb }} ## 获取总内存大小
案例:MySQL根据物理主机的内存大小,来设置分配的内存空间
MySQL占物理内存的 75% ~ 80%

jinja模板之循环

## 逻辑判断语法:
注释:{# 被注释的内容 #}
循环:{% for 变量名 in range(1,101) %}
{{ 变量名 }}
{% endfor %}

# 案例演示:
# 1.将配置文件中书写循环,加上变量,并为.j2结尾 (循环1到10,10不算,顾头不顾腚)
[root@m01 ansible]# cat wp.lb.j2
upstream tcy_lb {
{% for num in range(1,10) %}
server 172.16.1.{{ num }};
{% endfor %}
}
server {
listen 80;
server_name www.wp.com;
location / {
proxy_pass http://tcy_lb;
include proxy_params;

proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
}
}
# 2. 使用template模块将模板文件拷贝到被管理端中
[root@m01 nginx]# ansible web_group -m template -a 'src=/ansible/wp.lb.j2 dest=/root/'
# 3. 查看被管理端文件
[root@web01 ~]# cat wp.lb.j2
upstream tcy_lb {
server 172.16.1.1;
server 172.16.1.2;
server 172.16.1.3;
server 172.16.1.4;
server 172.16.1.5;
server 172.16.1.6;
server 172.16.1.7;
server 172.16.1.8;
server 172.16.1.9;
}
server {
listen 80;
server_name www.wp.com;
location / {
proxy_pass http://tcy_lb;
include proxy_params;

proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
}
}

jinja模板之判断

# 判断:
{% if ansible_fqdn == 'db01' %}
mem=16G
{% elif ansible_fqdn == 'db02' %}
mem=8G
{% else %}
mem=4G
{% endif %}

Jinja2的使用


案例一:使用变量推送motd

{# 直接调用变量的方式 #}
[root@m01 ~]# cat motd.j2
欢迎来到红浪漫
总共技师个数: {{ ansible_memtotal_mb }}
剩余技师个数: {{ ansible_memfree_mb }}
红浪漫浦东新区地址: {{ ansible_eth0['ipv4']['address'] }}
[root@m01 ~]# cat push_motd.yml
- hosts: all
tasks:
- name: Push Motd File
template:
src: ./motd.j2
dest: /etc/motd

案例二:使用Jinja2管理nginx

[root@m01 ~]# cat proxy.conf
upstream web {
{# 下面的循环是1-100的IP #}
{% for num in range(1,101) %}
server 10.0.0.{{ num }}:{{ backend_port }}
{% endfor %}
}
server {
listen {{ port }};
{% if ansible_hostname == 'web01' %}
server_name {{ domain_name1 }};
{% elif ansible_hostname == 'web02' %}
server_name {{ domain_name2 }};
{% else %}
server_name {{ domain_name3 }};
{% endif %}
location / {
proxy_pass http://web;
proxy_set_header Host $host;
}
}
[root@m01 ~]# cat a.yml
- hosts: web_group
vars:
- backend_port: 8080
- port: 80
tasks:
- name: config nginx conf
template:
src: ./proxy.conf
dest: /root

案例三:使用jinja2管理keepalived

{# keepalived的配置文件 #}
global_defs {
router_id lb01
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
global_defs {
router_id lb02
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
{# 把keepalived配置文件改成模板文件 #}
global_defs {
router_id {{ ansible_fqdn }}
}
vrrp_instance VI_1 {
{% if ansible_fqdn == 'lb01' %}
state MASTER
priority 150
{% elif ansible_fqdn == 'lb02' %}
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
}
}
{# 推送的文件 #}
[root@m01 ~]# vim a.yml
- hosts: lb_group
vars:
tasks:
- name: config keep conf
template:
src: ./keep.conf
dest: /root
- name: xxx shell
copy:
src:
dest:
when: ansible_fqdn == 'lb01'

案例四:Jinja2管理MySQL

{# 安装配置MySQL #}
- hosts: db_group
tasks:
- name: i m
yum:
name:
- mariadb-server
- MySQL-python
state: present
- name: t c
template:
src: ./my.j2
dest: /etc/my.cnf
{# MySQL的模板文件 #}
[root@m01 ~]# vim my.j2
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
innodb_buffer_pool_size = {{ (ansible_memtotal_mb * 80 / 100)|int }}
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d


推荐阅读
  • 颜色迁移(reinhard VS welsh)
    不要谈什么天分,运气,你需要的是一个截稿日,以及一个不交稿就能打爆你狗头的人,然后你就会被自己的才华吓到。------ ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • #define_CRT_SECURE_NO_WARNINGS#includelist.h#includevoidSListInit(PNode*pHead ... [详细]
  • 本文介绍了Python字典视图对象的示例和用法。通过对示例代码的解释,展示了字典视图对象的基本操作和特点。字典视图对象可以通过迭代或转换为列表来获取字典的键或值。同时,字典视图对象也是动态的,可以反映字典的变化。通过学习字典视图对象的用法,可以更好地理解和处理字典数据。 ... [详细]
  • 本文整理了Java中org.gwtbootstrap3.client.ui.Icon.addDomHandler()方法的一些代码示例,展示了Icon.ad ... [详细]
  • Python中的PyInputPlus模块原文:https ... [详细]
  • 【爬虫】关于企业信用信息公示系统加速乐最新反爬虫机制
    ( ̄▽ ̄)~又得半夜修仙了,作为一个爬虫小白,花了3天时间写好的程序,才跑了一个月目标网站就更新了,是有点悲催,还是要只有一天的时间重构。升级后网站的层次结构并没有太多变化,表面上 ... [详细]
author-avatar
mobiledu2502857147
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有