自动化运维工具-Ansible之6-Jinja2模板

Ansible Jinja2模板概述

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

Ansible通常会使用jinja2模板来修改被管理主机的配置文件等。在saltstack中同样会使用到jinja2。


使用Ansible的jinja2模板也就是使用template模块。

template模块和copy模块一样,都是将文件复制到远端主机上去,但是区别在于,template模块可以获取到文件中的变量,而copy则是原封不动的把文件内容复制过去。列如我们在推送rsync的backup脚本时,想把脚本中的变量{{ ansible_fqdn }}改成主机名,如果使用copy模块则推送过去的就是{{ ansible_fqdn }},不变,如果使用template,则会变成对应的主机名。

注意:Ansible允许jinja2模板中使用条件判断和循环,但是不允许在playbook中使用。不是每个管理员都需要这个特性,但是有些时候jinja2模块能大大提高效率。

Ansible Jinja2模板使用

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

  1. variables:输出自定义或facts的变量值

{{ custom_variables | facts_variables }}

  1. statements: 可以用来创建条件和循环等
# 循环表达式
{% for i in EXPR %}
{% endfor %} # 条件判断
{% if EXPR %}
{% elif EXPR %}
{% else %}
{% ednif %} # 注释
{# COMMENT #}

Jinja2使用方法

  1. playbook文件,使用template模块
  2. 模板文件,使用变量{{名称}},比如{{PORT}}或使用facts

Ansible使用jinja2模板使用facts变量渲染出登录欢迎词配置文件,并推送到主机

  1. 编辑playbook
[root@m01 ~]# cat > /root/test/jinja2.yml <<EOF
- hosts: web_group
tasks:
- name: Copy Template File
template:
src: ./motd.j2
dest: /etc/motd
EOF
  1. 准备motd.j2文件
[root@m01 ~]# cat > /root/test/motd.j2 <<EOF
Welcome to {{ ansible_fqdn }}
This system total mem is : {{ ansible_memtotal_mb }} MB
This system free mem is: {{ ansible_memfree_mb }} MB
EOF
  1. 执行playbook
[root@m01 ~]# ansible-playbook test/jinja2.yml

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

TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01] 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
  1. 查看结果
[root@m01 ~]# ansible web_group -a 'cat /etc/motd'
web01 | CHANGED | rc=0 >>
Welcome to web01
This system total mem is : 1982 MB
This system free mem is: 1106 MB web02 | CHANGED | rc=0 >>
Welcome to web02
This system total mem is : 1982 MB
This system free mem is: 1096 MB

Ansible Jinja2管理nginx

Ansible使用jinja2的for循环表达式渲染出nginx作负载均衡的配置文件,并推送到lb主机上。


准备nginx配置文件

[root@m01 ~]# cat > /root/test/www.oldboy.com.conf.j2 <<EOF
upstream {{ server_name }} {
{% for n in range(5,6) %}
server 172.16.1.{{ n }}:{{ upstream_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;
}
}
EOF

编辑playbook推送文件并重载nginx

[root@m01 ~]# cat > /root/test/lb.yml <<EOF
- hosts: lb_group
vars:
upstream_port: 80
server_name: www.oldboy.com
tasks:
- name: copy
template:
src: ./www.oldboy.com.conf.j2
dest: /etc/nginx/conf.d/www.oldboy.com.conf
notify: reload nginx handlers:
- name: reload nginx
systemd:
name: nginx
state: reloaded
EOF

Ansible Jinja2管理keepalived

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


根据keepalived原配置文件

# keepalived master 配置文件
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
}
} # keepalived backup配置文件
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配置文件

[root@m01 ~]# cat > /root/test/keepalived.j2 <<EOF
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
}
}
EOF

编辑playbook推送keepalived配置文件并重启restarted

[root@m01 ~]# cat > /root/test/keepalived.yml <<EOF
- hosts: lb_group
tasks:
- name: copy file
template:
src: ./keepalived.j2
dest: /etc/keepalived/keepalived.conf
notify: restart keepalived handlers:
- name: restart keepalived
systemd:
name: keepalived
state: restarted
EOF

自动化运维工具-Ansible之6-Jinja2模板的更多相关文章

  1. 自动化运维工具Ansible详细部署 (转载)

    自动化运维工具Ansible详细部署 标签:ansible 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://sofar.blog. ...

  2. CentOS7Linux中自动化运维工具Ansible的安装,以及通过模块批量管理多台主机

    使用自动化运维工具Ansible集中化管理服务器 Ansible概述 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具.它用Python写成,类似于saltstack和Puppet ...

  3. 自动化运维工具Ansible介绍

    一个由 Python 编写的强大的配置管理解决方案.尽管市面上已经有很多可供选择的配置管理解决方案,但他们各有优劣,而 ansible 的特点就在于它的简洁. 让 ansible 在主流的配置管理系统 ...

  4. 自动化运维工具-Ansible之7-roles

    自动化运维工具-Ansible之7-roles 目录 自动化运维工具-Ansible之7-roles Ansible Roles基本概述 Ansible Roles目录结构 Ansible Roles ...

  5. 自动化运维工具-Ansible之1-基础

    自动化运维工具-Ansible之1-基础 目录 自动化运维工具-Ansible之1-基础 Ansible 基本概述 定义 特点 架构 工作原理 任务执行模式 命令执行过程 Ansible 安装 Ans ...

  6. 自动化运维工具Ansible详细部署 - 人生理想在于坚持不懈 - 51CTO技术博客

    自动化运维工具Ansible详细部署 - 人生理想在于坚持不懈 - 51CTO技术博客 自动化运维工具Ansible详细部署

  7. 在CentOS7.6上安装自动化运维工具Ansible以及playbook案例实操

    前言 Ansible是一款优秀的自动化IT运维工具,具有远程安装.远程部署应用.远程管理能力,支持Windows.Linux.Unix.macOS和大型机等多种操作系统. 下面就以CentOS 7.6 ...

  8. 自动化运维工具-Ansible基础

    目录 自动化运维工具-Ansible基础 什么是Ansible 同类型软件对比 Ansible的功能及优点 Ansible的架构 Ansible的执行流程 安装Ansible ansible配置文件 ...

  9. 自动化运维工具-Ansible之5-流程控制

    自动化运维工具-Ansible之5-流程控制 目录 自动化运维工具-Ansible之5-流程控制 playbook条件语句 单条件 多条件 多条件运算 示例 playbook循环语句 with_ite ...

随机推荐

  1. python批量definition query

    import arcpy mxd = arcpy.mapping.MapDocument("current") for lyr in arcpy.mapping.ListLayer ...

  2. PyQt(Python+Qt)学习随笔:工具箱(QToolBox)的用途及标签部件项(tabbed widget item)作用介绍

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 1.概述 toolBox工具箱是一个容器部件,对应类为QToolBox,在其内有一列从上到下顺序排列 ...

  3. 第14.18节 爬虫实战4: request+BeautifulSoup+os实现利用公众服务Wi-Fi作为公网IP动态地址池

    写在前面:本文相关方法为作者独创,仅供参考学习爬虫技术使用,请勿用作它途,禁止转载! 一. 引言 在爬虫爬取网页时,有时候希望不同的时候能以不同公网地址去爬取相关的内容,去网上购买地址资源池是大部分人 ...

  4. ABP框架使用Mysql数据库,以及基于SQLServer创建Mysql数据库的架构和数据

    ABP默认的数据库是SQLServer,不过ABP框架底层是EF框架,因此也是很容易支持其他类型的数据库的,本篇随笔介绍在ABP框架使用Mysql数据库,以及基于SQLServer创建MySql数据库 ...

  5. C#清除HTML标签方法

    删除字符串中HTML标签代码 public static string ClearHTMLTags1(string HTML) { string[] Regexs ={ @"<scri ...

  6. LeetCode初级算法之数组:350 两个数组的交集 II

    两个数组的交集 II 题目地址:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii/ 给定两个数组,编写一个函数来计算它们的交 ...

  7. jsonp使用post方法

    来源https://www.jb51.net/article/68980.htm

  8. Codeforces Edu Round 63 A-E

    A. Reverse a Substring 容易看出,只要符合递增顺序就符合\(NO\),否则则可以找到一组,每次记录最大值比较即可. #include <cstdio> #includ ...

  9. 四、java多线程核心技术——synchronized同步方法与synchronized同步快

    一.synchronized同步方法 论:"线程安全"与"非线程安全"是多线程的经典问题.synchronized()方法就是解决非线程安全的. 1.方法内的变 ...

  10. Java程序执行过程及内存机制

    本讲将介绍Java代码是如何一步步运行起来的,其中涉及的编译器,类加载器,字节码校验器,解释器和JIT编译器在整个过程中是发挥着怎样的作用.此外还会介绍Java程序所占用的内存是被如何管理的:堆.栈和 ...