ansible jinja2

什么是jinjia2模板

jinjia2是Python的全功能模块引擎

Jinjia2与Ansible的关系

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

如果在100台主机上安装nginx,每台nginx的端口都不一样,如何解决?

Ansible如何使用Jinjia2

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

Ansible使用Jinjia2注意事项

Ansible允许jinjia2模板中使用条件判断和循环,但是不允许在playbook中使用。

注意:不是每个管理员都需要这个特性,但是有些时候jinjia2模块能大大提高效率。

Ansible Jinjia2模板使用

jinja2基本 语法

{{ EXPR }}输出变量值,会输出自定义的变量值或facts
1)playbook文件使用template模块
2)模板文件里面变量使用{{名称}},比如{{PORT}}或使用facts

jinjia2模板逻辑判断

#循环表达式
{% for i in EXPR %}
{% endfor %} #条件判断
{% if EXPR %}
{% elif EXPR %}
{% else %}
{% endif %} #注释
{# COMMENT #}

测试jinja2

#编辑playbook
[root@m01 ~]# vim jinja2.yml
- hosts: all
tasks:
- name: scp motd
template:
src: /etc/motd
dest: /etc/motd #准备motd文件
[root@m01 ~]# vim /etc/motd
Welcome to {{ ansible_fqdn }}
This system total mem is : {{ ansible_memtotal_mb }} MB
This system free mem is: {{ ansible_memfree_mb }} MB #执行playbook
[root@m01 ~]# ansible-playbook 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 #查看结果
[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

该示例展示了如何利用jinjia2模板使用facts变量,达到我们想要的目的,实现自动化的需求。

Ansible Jinjia2管理nginx

Ansible使用jinjia2的for循环表达式渲染出nginx负载均衡的配置文件

使用playbook推送文件

#编辑playbook
[root@m01 ~]# vim lb.yml
- hosts: lb_group
vars:
http_port: 80
server_name: www.drz.com
tasks:
- name: copy
template:
src: ./www.drz.com.conf.j2
dest: /etc/nginx/conf.d/www.drz.com.conf
notify: reload nginx
handlers:
- name: reload nginx
systemd:
name: nginx
state: reloaded #准备配置文件
[root@m01 ~]# vim www.drz.com.conf.j2
upstream {{ server_name }} {
{% for n in range(21) %}
server 172.16.1.{{ n }}:{{ up_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;
}
}

Ansible jinja2渲染负载均衡配置文件

[root@m01 ~]# cat nginx.conf.j2
upstream {{ domain_name }} {
{% for ip in range(1,16) %}
server 172.16.1.{{ ip }}:{{ upstream_port }};
{% endfor %}
} server {
listen {{ server_port }};
server_name {{ domain_name }}; location / {
root {{ code_dir }};
index index.html;
proxy_pass http://{{ domain_name }};
proxy_set_header HOST $http_host;
}
}
[root@m01 ~]# cat  nginx.yml
- hosts: all
vars_files: ./wordpress_vars.yml
tasks:
- name: configure nginx conf
template:
src: ./nginx.conf.j2
dest: /opt/{{ domain_name }}.conf
[root@m01 ~]# cat wordpress_vars.yml
domain_name: www.drz.com
upstream_port: 8080
server_port: 80
code_dir: /code/wordpress

Ansible jinja2 管理keepalived配置文件

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

推送keepalived配置文件

[root@m01 ~]# vim keepalived.yml
- 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

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 keepalived.conf.j2
global_defs {
router_id {{ ansible_fqdn }}
} vrrp_instance VI_1 {
{% if ansible_fqdn == 'web01' %}
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
}
}
[root@m01 ~]# cat keep.yml
- hosts: webs
tasks:
- name: configure keep conf
template:
src: ./keepalived.conf.j2
dest: /opt/keepalive.conf

Ansible --05 ansible jinja2的更多相关文章

  1. ansible基础-ansible角色的使用

    ansible基础-ansible角色的使用 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们建议把多个节点都会用到的功能将其定义模块,然后谁要用到该模块就直接调用即可!而在a ...

  2. ansible配置文件 ansible.cfg的一点说明

    ansible配置文件 ansible.cfg的一点说明 > ansible --version ansible 2.1.1.0 config file = /etc/ansible/ansib ...

  3. 什么是 Ansible - 使用 Ansible 进行配置管理

    [注]本文译自:https://www.edureka.co/blog/what-is-ansible/   Ansible 是一个开源的 IT 配置管理.部署和编排工具.它旨在为各种自动化挑战提供巨 ...

  4. 009.Ansible模板管理 Jinja2

    一 Jinja2简介 Jinja2是基于python的模板引擎. 假设说现在我们需要一次性在10台主机上安装redis,这个通过playbook现在已经很容易实现.默认情况下,所有的redis安装完成 ...

  5. Ansible配置文件ansible.cfg详解

    Ansible是一个系列文章,我会尽量以通俗易懂.诙谐幽默的总结方式给大家呈现这些枯燥的知识点,让学习变的有趣一些. Ansible系列博文直达链接:Ansible入门系列 前言 此时外面小雨淅淅沥沥 ...

  6. 【Ansible】ansible循环

    Ansible 循环 一.简单介绍 在ansible2.5之前,大多数人使”with_XXX”类型的关键字来操作循环,但是从2.6版本开始,官方推荐是”loop”关键字代替” with_XXX”. 1 ...

  7. 【Ansible】ansible 任务失败控制

    任务失败控制 Ansible 通常默认会确保检测模块和命令的返回码并且会快速失败 – 专注于一个错误除非你另作打算. 有时一条命令会返回 0 但那不是报错.有时命令不会总是报告它 ‘改变’ 了远程系统 ...

  8. 【ANSIBLE】ansible控制windows插件安装及运行error与解决方法

    一. 问:因pip版本问题无法安装kerberos 答:安装提示需要先安装pip升级包 下载pip9.0.1升级包: https://pypi.python.org/packages/b6/ac/70 ...

  9. 【ansible】ansible部署方式以及部署包

    最近研究ansible的使用,在使用pip安装的时候遇到很多奇怪的问题,为此采用了手动安装的方式,并编写了一键安装脚本. ansible要求机器必须安装python2.6以上版本,可以通过一下命令查看 ...

随机推荐

  1. Spring之控制反转——IoC、面向切面编程——AOP

      控制反转——IoC 提出IoC的目的 为了解决对象之间的耦合度过高的问题,提出了IoC理论,用来实现对象之间的解耦. 什么是IoC IoC是Inversion of Control的缩写,译为控制 ...

  2. java 一个数组的长度

    package java03; /* *如何获取数组长度 : * 格式: * 数组名称.length * * 这会得到一个int数字,代表数组的长度 * * 数组一旦创建,程序运行期间,长度不可改变 ...

  3. sqlserver 之 将查询结果变为json字符串

    GO /****** Object: StoredProcedure [dbo].[SerializeJSON] Script Date: 6/4/2019 3:58:23 PM 将查询结果变为jso ...

  4. 一张图理解"Figure", "Axes", "Axis"

    Figure is the object with the highest level in the hierarchy. It corresponds to the entire graphical ...

  5. Component series.liquidFill not exists. Load it first.

    vue 项目中使用水波球报错Component series.liquidFill not exists. Load it first. 解决办法:安装 echarts-liquidfill npm ...

  6. 【JVM】垃圾收集器和收集器的选择策略

    前言:新生代的收集器有:Serial,ParNew,Parallel Scavenge等.老年代有:CMS,SerialOld,Paraller Old等.接下来将深入理解各个垃圾收集器的原理,以及它 ...

  7. 因为信仰,油画专业的他自学开发进击阿里技术P9

    大约在1年以前,阿里云视频云团队来了一位热心和气.爱好广泛的老干部新同学,他就是资深技术专家郝冲,花名和招,寓意“和气招财”. 有人说程序员只喜欢安静地写代码,和招偏偏一个户外运动爱好者.他擅长滑雪, ...

  8. CGContextRef 使用小记

    . 用CGContextRef 画文字 在 UIView的 - (void)drawRect:(CGRect)rect {} 方法中进行 CGContextRef context = UIGraphi ...

  9. 安卓Activity布局简述

    Activity布局简述 基于xml的布局 Main.xml(调用工程res/layout/main.xml定义的界面元素完成布局显示) <?xml version="1.0" ...

  10. vue.js循环语句

    vue.js循环语句 循环使用 v-for 指令. v-for 指令需要以 site in sites 形式的特殊语法, sites 是源数据数组, site 是数组元素迭代的别名. v-for 可以 ...