第十六章 Ansible-playbook模板化(Jinja2)
阿新 • • 發佈:2021-12-23
一、jinja2概述
jinja2是Python的全功能模板引擎,就是一個配置檔案的模板,支援變數 Ansible通常會使用jinja2模板來修改被管理主機的配置檔案等...在saltstack中同樣會使用到jinja2 如果在100臺主機上安裝nginx,每臺nginx的埠都不一樣,如何解決? 使用Ansible的jinja2模板也就是使用template模組,該模組和copy模組一樣,都是將檔案複製到遠端主機上去,但是區別在於,template模組可以獲取到檔案中的變數,而copy則是原封不動的把檔案內容複製過去。之前我們在推送rsync的backup指令碼時,想把指令碼中的變數名改成主機名,如果使用copy模組則推送過去的就是{{ ansible_fqdn }},不變,如果使用template,則會變成對應的主機名 Ansible允許jinja2模板中使用條件判斷和迴圈,但是不允許在playbook中使用。 ps:不是每個管理員都需要這個特性,但是有些時候jinja2模組能大大提高效率。
二、jinja2使用方式
{{ EXPR }} 輸出變數值,會輸出自定義的變數值或facts
1.playbook檔案使用template模組
2.模板檔案裡面變數使用{{名稱}},比如{{PORT}}或使用facts
三、jinja2模板邏輯判斷
1.迴圈
#shell指令碼的迴圈
[root@m01 ~]# vim xh.sh
#!/bin/bash
for i in `seq 10`
do
echo $i
done
#Jinja2的迴圈表示式
{% for i in range(10) %}
echo $i
{% endfor %}
2.判斷
#shell指令碼的判斷 [root@m01 ~]# vim pd.sh #!/bin/bash age=$1 if [ $age -lt 18 ];then echo "小姐姐" else echo "大媽" fi
#Jinja2的條件判斷
{% if EXPR %}
{% elif EXPR %}
{% else %}
{% endif %}
#註釋
{# COMMENT #}
四、jinja2模板測試
1.登入檔案測試
#編寫j2模板 [root@m01 ~]# vim motd.j2 歡迎來到 {{ ansible_fqdn }} 該伺服器總記憶體: {{ ansible_memtotal_mb }} MB 該伺服器剩餘記憶體: {{ ansible_memfree_mb }} MB #編寫劇本 [root@m01 ~]# vim motd.yml - hosts: all tasks: - name: Config motd template: src: /root/motd.j2 dest: /etc/motd #執行劇本 [root@m01 ~]# ansible-playbook motd.yml #檢視遠端伺服器內容 [root@backup ~]# cat /etc/motd 歡迎來到 backup 該伺服器總記憶體: 972 MB 該伺服器剩餘記憶體: 582 MB [root@db01 ~]# cat /etc/motd 歡迎來到 db01 該伺服器總記憶體: 972 MB 該伺服器剩餘記憶體: 582 MB
2.使用jinja2模板管理mysql
#配置模板
[root@m01 ~]# vim /etc/my.j2
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
{% if ansible_memtotal_mb == 972 %}
innodb_log_buffer_poll_size= 800M
{% elif ansible_memtotal_mb == 1980 %}
innodb_log_buffer_poll_size= 1600M
{% endif %}
... ...
#配置劇本
[root@m01 ~]# vim mysql.yml
- hosts: db_group
tasks:
- name: Config mysql
template:
src: /etc/my.cnf
dest: /etc/
#執行
[root@m01 ~]# ansible-playbook mysql.yml
#檢視
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
innodb_log_buffer_poll_size= 800M
[root@db03 ~]# vim /etc/my.cnf
[mysqld]
innodb_log_buffer_poll_size= 1600M
五、jinja2模板配置負載均衡
1.正經的配置
[root@m01 ~]# cat conf/proxy_new.conf
upstream web {
server 172.16.1.7;
server 172.16.1.8;
}
server {
listen 80;
server_name linux.wp.com;
location / {
proxy_pass http://web;
include proxy_params;
}
}
2.不正經的配置
[root@m01 ~]# vim conf/proxy.j2
upstream {{ server_name }} {
{% for i in range(7,9) %}
server {{ ip }}.{{ i }};
{% endfor %}
}
server {
listen {{ port }};
server_name {{ server_name }};
location / {
proxy_pass http://{{ server_name }};
include proxy_params;
}
}
3.配置額外變數
[root@m01 ~]# vim upstream_vars.yml
ip: 172.16.1
web: web
port: 80
server_name: linux.wp.com
4.配置劇本推送
[root@m01 ~]# vim proxy.yml
- hosts: lb01
vars_files: upstream_vars.yml
tasks:
- name: Config SLB
template:
src: /root/conf/proxy.j2
dest: /etc/nginx/conf.d/proxy.conf
- name: Restart SLB Nginx
systemd:
name: nginx
state: restarted
六、jinja2模板配置keepalived
1.配置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
}
}
2.配置keepalived配置檔案(不正經配置)
[root@m01 ~]# vim conf/keepalived.j2
global_defs {
router_id {{ ansible_fqdn }}
}
vrrp_instance VI_1 {
{% if ansible_fqdn == "lb01" %}
state MASTER
priority 100
{% else %}
state BACKUP
priority 90
{% endif %}
interface eth0
virtual_router_id 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
{{ vip }}
}
}
3.配置變數
[root@m01 ~]# vim upstream_vars.yml
ip: 172.16.1
web: web
port: 80
server_name: linux.wp.com
vip: 10.0.0.3
4.配置主機清單
#配置主機清單
[root@m01 ~]# vim /etc/ansible/hosts
[slb]
lb01 ansible_ssh_pass='1'
lb02 ansible_ssh_pass='1'
#配置hosts
[root@m01 ~]# vim /etc/hosts
....
172.16.1.5 lb02
5.編寫keepalived劇本
[root@m01 ~]# cat keepalived.yml
- hosts: slb
vars_files: upstream_vars.yml
tasks:
- name: Install keepalived
yum:
name: keepalived
state: present
- name: Config keepalive
template:
src: /root/conf/keepalived.j2
dest: /etc/keepalived/keepalived.conf
- name: Start keepalived
systemd:
name: keepalived
state: restarted