1. 程式人生 > 實用技巧 >Jinja2模板概述

Jinja2模板概述

例子一

迴圈語句

[root@m01 ~]# cat upstream.conf 
upstream web {
        {% for i in range(1,11) %}
           server 172.16.1.{{ i }}
        {% endfor %}
}

server {
	listen 80;
	server_name wp.gong.com;
        location / {
                proxy_pass http://web;
                include proxy_params;
        }
}

[root@m01 ~]# cat send_conf.yml 
- hosts: web01
  tasks:
    - name: send jianja mode
      template:
        src: /root/upstream.conf
        dest: /root/upstream.conf



# 推送生成的效果
[root@web01 ~]# cat upstream.conf 
upstream web {
                   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 172.16.1.10
        }
server {
	listen 80;
	server_name wp.gong.com;
        location / {
                proxy_pass http://web;
                include proxy_params;
        }
}

jinjia2語法

變數

## 呼叫變數
{{ VAR }}		# 會把裡面的變數名轉換為變數值

## 模版檔案
在一個檔案中有{{ vars }}去呼叫變數的,使用template複製,會把變數轉換為值。
模版檔案中可以呼叫自己設定的變數。str_www: www
{{ str_www }}

呼叫facts變數
{{ ansible_fqdn }}  # 獲取主機名
{{ ansible_memtotal_mb }}	# 獲取主機實體記憶體大小

## 邏輯判斷語法
- 註釋
  {# 中間的是註釋 #}
在推送的時候,註釋不會推送到目標主機

- 迴圈
  {% for var in data %}
      {{ var }}					# 表示呼叫變數名,data可以是一個可迭代物件
  {% endfor %}
  
 - 判斷的語法
    {% if ansible_fqdn == "db01" %}
        mem=16G
    {% elif ansible_fqdn == "db02" %}
        mem=8G
    {% else %}
        mem=4G
    {% endif %}

案例一

推送motd

[root@m01 ~]# cat motd.j2 
本機記憶體:{{ ansible_memtotal_mb }}
剩餘記憶體:{{ ansible_memfree_mb }}
ip add : {{ ansible_eth0.ipv4.address }}

[root@m01 ~]# cat send_motd.yml 
- hosts: web01
  tasks:
    - name: send jianja mode
      template:
        src: /root/motd.j2
        dest: /root/motd
        
[root@web01 ~]# cat motd 
本機記憶體:456
剩餘記憶體:9
ip add : 10.0.0.7

fqdn和hostname的區別: 比如主機名是www.baidu.com;使用ansible_hostname得到的變數值是www;ansible_fqdn 取到的值是www.baidu.com

案例二

通過判斷來配置不同的域名的nignx配置檔案

[root@m01 ~]# cat upstream.j2 
upstream web {
        {% for i in range(1,10) %}
           server 172.16.1.{{ i }}
        {% endfor %}
}

server {
	listen 80;
        {% if ansible_fqdn == "web01" %}
        	server_name {{ domain_1 }}
      
        {% elif ansible_fqdn == "web02" %}
        	server_name {{ domain_2 }}
        
        {% elif ansible_fqdn == "web03" %}
        	server_name {{ domain_3 }}
        {% endif %}
        location / {
                proxy_pass http://web;
                include proxy_params;
        }
}

[root@m01 ~]# cat send_up_j2.yml 
- hosts: web_group
  vars:
    - domain_1: www.baidu.com
    - domain_2: www.google.com
    - domain_3: gong.cc.con
  tasks:
    - name: send up_j2 mode
      template:
        src: /root/upstream.j2
        dest: /root/upstream_j2.conf

[root@web01 ~]# cat upstream_j2.conf 
upstream web {
                   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.baidu.com
      
                location / {
                proxy_pass http://web;
                include proxy_params;
        }
}

[root@web02 ~]# cat upstream_j2.conf 
upstream web {
                   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.google.com
        
                location / {
                proxy_pass http://web;
                include proxy_params;
        }
}

案例三

管理keepalived的配置檔案

判斷語法

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf 
global_defs { 
    router_id lb01
}

vrrp_script check_web {
    script "/root/check_web.sh"
    interval 5

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
    }
    track_script {
        check_web
    }   
}



[root@lb02 ~]# cat /etc/keepalived/keepalived.conf 
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
    }
}


[root@lb01 ~]# cat /etc/keepalived/keepalived.conf 
global_defs { 
    router_id lb01
}

vrrp_script check_web {
    script "/root/check_web.sh"
    interval 5

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
    }
    track_script {
        check_web
    }   
}


{# 把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
    }
}

案例四

根據實際實體記憶體的大小來分配給mysql所佔記憶體的百分比

[root@m01 ~]# vi mysql_mem.j2
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
innodb_buffer_pool_size = {{ (ansible_memtotal_mb * 0.8) | 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