自动化运维工具-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. django和DRF的不同点

    django中封装了drf view 是 父类 class test1(View): def post(self,request): data=request.POST.get('name') ret ...

  2. Django使用联合主键

    今天闲着没事,突然想起一个以前遇到的一个小问题.一直忘了来验证自己的解决方案,所以今天特意来查询了些资料来验证下自己的想法.整理如下: 单张表内建立联合主键: class IotTemp(models ...

  3. PyQt(Python+Qt)学习随笔:纯文本编辑器QPlainTextEdit功能详解

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.概述 QPlainTextEdit是用于纯文本的一个高级文档编辑器 ...

  4. Python中字符串使用单引号、双引号标识和三引号标识,什么是三引号?什么情况下用哪种标识?

    一.三引号是指三个单引号或者三个双引号: 二.Python中字符串如果以单引号.双引号标识和三引号标识开头,则字符串结尾也必须是对应的标识,不能变更: 三.三者的异同: 1.三者都是字符串,大部分情况 ...

  5. 第11.10节 Python正则表达式的非贪婪模式的重复匹配:'*?', '+?',和 '??'

    在<第11.9节 Pytho正则表达式的贪婪模式和非贪婪模式>老猿简单介绍了贪婪模式和非贪婪模式,并说明'', '+',和 '?' 修饰符都是 贪婪的:它们在字符串进行尽可能多的匹配.有时 ...

  6. Hangfire&Autofac与ASP.NET CORE注入失败

    Hangfire.Autofac与ASP.NET CORE注入失败 项目里面使用了Hangfire,因为之前没用过吧,遇到了个问题,就是使用了ico容器后,再用Hangfire总是注入不上对象,总是后 ...

  7. 自学linux——22.粘滞位的了解及使用

    粘滞位的了解及使用 一.权限 1.文件的权限 r (read) :可读取该文件的实际内容w(write):可以编辑,新增或者修改该文件的内容(但不含删除该文件)x(execute):代表该文件可以被系 ...

  8. Spring引用数据库文件配置数据源

    例子:引用 druid.properties 在Spring配置文件(applicationContext.xml)引入外部配置文件,需要指定特定的 key才能被正确识别并使用 在原本的 url.us ...

  9. 换种思路写Mock,让单元测试更简单

    开篇引入 单元测试中的Mock方法,通常是为了绕开那些依赖外部资源或无关功能的方法调用,使得测试重点能够集中在需要验证和保障的代码逻辑上.在定义Mock方法时,开发者真正关心的只有一件事:" ...

  10. Kruskal重构树——[NOI2018] 归程

    题目链接: UOJ LOJ 感觉 Kruskal 重构树比较简单,就不单独开学习笔记了. Statement 给定一个 \(n\) 点 \(m\) 边的无向连通图,用 \(l,a\) 描述一条边的长度 ...