Python 模板模块-Jinjia2

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 模板模块-Jinjia2相关的知识,希望对你有一定的参考价值。

参考技术A Jinja2 是一个现代的,设计者友好的,仿照 Django 模板的 Python 模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全

以上皆出自<欢迎来到 Jinja2>

jinjia模板

课前回顾

sqliet3也是一种数据库

ansible变量
	系统变量
	自定义变量
playbook,yml语法
jinjia2模板,‘带有变量的‘,使用Python格式调用,需要使用playbook中template‘模块‘拷贝到别的服务器的 模板文件

mysql占用的物理磁盘大小一般是内存的75%~80%,不要和zabbix装在同一服务器上,避免内存不够

/etc/motd 文件,每次窗口打开都会加载
centos6系统,centos7系统,两个系统安装的httpd默认版本是不一样的

jinjia模板不能随便用,因为jinjia模板会用jinjia的语法去解析,如果该文件中有jinjia不识别的语法的话(; - ),要对该文件修改一下
#显示不完整主机名
[root@m01 ~]# hostname
m01

[root@m01 ~]# ansible m01 -m setup -a ‘filter=ansible_hostname‘
m01 | SUCCESS => {
    "ansible_facts": {
        "ansible_hostname": "m01", 
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false
}
#显示完整主机名
[root@m01 ~]# ansible m01 -m setup -a ‘filter=ansible_fqdn‘
m01 | SUCCESS => {
    "ansible_facts": {
        "ansible_fqdn": "m01",
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false
}

sqlite详解

SQLite嵌入

ansible_jinjia2

jinjia2模板的使用

jinjia2文档

不能登录

Ansible Jinja2模板使用

Jinja模板基本语法

{{ EXPR }}输出变量值,会输出自定义的变量值或facts
1)playbook文件使用template模块‘调用‘
2)‘模板文件‘里面的‘变量‘,自定义变量或者facts

在一个文件中使用Python格式调用了变量,呢么就可以说这个文件是jinjia模板

Ansible如何使用Jinja2

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

ansible变量可以在playbook中使用,也可以在别的文件中使用,但是jinjia2只能在文件中使用


Jinja2模板逻辑判断

#循环表达式

{% for i in EXPR %}
...
{% endfor %}

i: 变量名
EXPR:数据 1,3,4  		#不连续数字的循环直接写入,可以使用变量
range(10)  			# 0~9
range(1,10)	         # 1~9

{% for sj in 10,11 %}		
echo num{{$sj}}=>>> {{$sj}}
{% endfor %}
---------------------------------------------------------
#条件判断
{% if EXPR %}
...
{% elif EXPR %}
...
{% else %}
...
{% ednif %}
-------------------------------------------------------------
#注释
{# COMMENT #}
#Python循环(连续)
[root@m01 ~]# vim lb.conf.j2
upstream {{ ansible_fqdn}} {
{% for n in range(21) %}
        server 172.16.1.{{n}}:{{80}};
{% endfor %}
}

#Python循环(不连续),小括号可以去掉,#不能只写一个数字,必须是一个数组
[root@m01 ~]# vim lb.conf.j2
upstream {{ ansible_fqdn}} {
{% for n in (20,21) %}		
        server 172.16.1.{{n}}:{{80}};
{% endfor %}
}

#bash里面的语法,不能在ansible也就是说不能在Python中直接调用,Python代码中,有自己的循环或者判断的方式
[root@m01 ~]# vim lb.conf.j2
#!/bin/bash
for n in 20;do
        server 172.16.1.$n:80;
done


Ansible Jinja2管理motd

Jinja2示例

1.编辑playbook

#motd文件,窗口每次开启都会运行该文件
[root@m01 ~]# vim jinja2.yml
- hosts: web_group
  tasks:
    - name: Copy Template File
      template:
        src: ./motd.j2		#yml所在目录
        dest: /etc/motd

2.准备motd.j2文件

[root@m01 ~]# vim motd.j2
Welcome to {{ ansible_fqdn }}
This system total mem is : {{ ansible_memtotal_mb }} MB
This system free mem is: {{ ansible_memfree_mb }} MB

3.执行playbook

[root@m01 ~]# ansible-playbook jinja2.yml

#查看结果
[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变量,达到我们想要的目的,实现自动化的需求。

可以理解为,获取自定义变量信息--获取相应主机的变量信息--写入jinjia模板--拷贝

Ansible Jinja2管理nginx(负载均衡)

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


使用playbook推送文件

1.编辑playbook

[root@m01 ~]# vim lb.yml
- hosts: lb_group
  vars:
    http_port: 80
    server_name: www.drz.com
  tasks:
    - name: copy
      template:
        src: /root/lb.conf.jinjia2
        dest: /root
      notify: reload nginx
  handlers:
    - name: reload nginx
      systemd:
        name: nginx
        state: reloaded

2.准备配置文件

[root@m01 ~]# vim lb.conf.jinjia2
upstream {{ ansible_fqdn }} {
{% for n in range(21) %}
        server 172.16.1.{{ n }}:{{ up_port }};
{% endfor %}
}

server {
        listen 80;
        server_name wp.com;

        location / {
                root /code;
                index index.html;
                proxy_pass http://{{ ansible_fqdn }};
                proxy_set_header Host $http_host;
        }
}

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 ~]# vim keepalived.j2
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
    }
}

使用jinjia2管理mysql配置文件

[root@m01 ~]# vim /etc/my.cnf
[mysqld]
basedir=/usr
datadir=/var/lib/mysql/
socket=/var/lib/mysql/mysql.sock
log_error=/var/log/mariadb/mariadb.log

{% if ansible_memtotal_mb == %}
innodb_buffer_pool_size={{ ansible_memtotal_mb * 4/5 }}		

以上是关于Python 模板模块-Jinjia2的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点#Python图像处理,cv2模块,OpenCV实现模板匹配

Python 错误:在 SWIG 生成的 C++ 模板代码模块中未定义构造函数

Python Flask模块

Python二分查找,字符串模板,textwrap模块,每天写写Python自然就会了,每日Python第2天

ansible——playbook的模块

Django logging日志模块详解(日志记录模板配置)