Ansible Jinja2 模板
阿新 • • 發佈:2021-08-17
Ansible Jinja2 模板
Jinja2介紹
什麼是Jinja2
jinja2是Python的全功能模板引擎
Jinja2跟ansible的關係
Ansible通常會使用jinja2模板來修改被管理主機的配置檔案等...在saltstack中同樣會使用到jinja2 如果在100臺主機上安裝nginx,每臺nginx的埠都不一樣,如何解決?
使用Jinja2
使用Ansible的jinja2模板也就是使用template模組,該模組和copy模組一樣,都是講檔案複製到遠端主機上去,但是區別在於,template模組可以獲取到檔案中的變數,而copy則是原封不動的把檔案內容複製過去。之前我們在推送rsync的backup指令碼時,想把指令碼中的變數名改成主機名,如果使用copy模組則推送過去的就是{{ ansible_fqdn}},不變,如果使用template,則會變成對應的主機名。
注意事項
Ansible允許jinja2模板中使用條件判斷和迴圈,但是不允許在playbook中使用。
只能在template模組要推送的檔案中使用Jinja2語法
使用Jinja2要注意,配置檔案中是否有特殊符號
Jinja2語法
## 變數呼叫語法
{{ 變數名 }}:呼叫變數,輸出變數的值
playbook使用template模組
## 判斷語法:
{% if 條件 %}
xxx
{% else %}
aaa
{% endif %}
## for迴圈語法
{% for n in 變數 %}
xxx
{% endfor %}
## 註釋
{# 這裡是註釋內容 #}
Ansible中的Jinja2規範
所有的Jinja2模板檔案要以j2結尾
簡單的Jinja2使用
jinja2管理開機介面檔案
[root@m01 ~]# cat motd.j2 本機記憶體: {{ ansible_memtotal_mb }} 剩餘記憶體: {{ ansible_memfree_mb }} 本機外網: {{ ansible_default_ipv4.address }} 本機內網: {{ ansible_eth1.ipv4.address }} 本機名字: {{ ansible_hostname }} [root@m01 ~]# cat a.yml - hosts: all tasks: - name: motd template: src: ./motd.j2 dest: /etc/motd
Jinja2管理nginx配置檔案
upstream {{ server_name }} {
{% for num in range(1,11) %}
server 172.16.1.{{ num }};
{% endfor %}
}
server {
listen 80;
server_name {{ server_name }};
location / {
proxy_pass http://{{ server_name }};
}
}
[root@m01 ~]# vim a.yml
- hosts: all
vars:
server_name: blog.drz.com
tasks:
- name: nginx
template:
src: ./nginx_upstream.j2
dest: /root/nginx_upstream.conf
Jinja2管理keepalived配置檔案
global_defs { #全域性配置
router_id lb01 #標識身份->名稱
}
vrrp_instance VI_1 {
state MASTER #標識角色狀態
interface eth0 #網絡卡繫結介面
virtual_router_id 50 #虛擬路由id
priority 150 #優先順序
advert_int 1 #監測間隔時間
authentication { #認證
auth_type PASS #認證方式
auth_pass 1111 #認證密碼
}
virtual_ipaddress {
10.0.0.3 #虛擬的VIP地址
}
}
[root@m01 ~]# cat keep.j2
global_defs {
router_id {{ ansible_hostname }}
}
vrrp_instance VI_1 {
{% if ansible_hostname == '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
}
}
Jinja2模板計算
mysql配置檔案
記憶體大小要根據實體記憶體的 80%
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
innodb_buffer_pool_size={{ ansible_memtotal_mb * 0.8 }}
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d
[root@m01 ~]# cat a.yml
- hosts: all
tasks:
- name: db
template:
src: ./my.j2
dest: /root/my.cnf
本文來自部落格園,作者:遠方還很遠,轉載請註明原文連結:https://www.cnblogs.com/moqiqingyu/p/15152582.html