Jinja2模板概述
阿新 • • 發佈:2020-07-25
例子一
迴圈語句
[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