Jinja2模板介绍
jinja2是什么?
jinja2是Python的全功能模板引擎
Ansible与Jinja2啥关系?
在Ansible中通常会用到jinja2模板来修改被管理机配置文件等。在Saltstack中同样也会用到jinja2。
Ansible如何使用Jinja2
使用Ansible的jinja2模板也就是使用template模块,该模块和copy模块一样,都是将文件复制到远端主机上去,但是区别在于,template模块可以获取到文件中的变量,而copy则是原封不动的把文件内容复制过去。
Ansible使用Jinja2注意事项
Jinja2文件中可以使用判断和循环(见下),注意与playbook中的判断和循环不同。playbook中是when和with_item
Jinja2模板语法
基本语法
1)playbook文件使用template模块
2)模板文件里面变量使用{{}},比如{{PORT}},或使用facts
怎么调用变量
{{ 变量名 }} 可以在配置文件中使用,也可以在playbook里用
注释
BASH、Python、YAML都是# 注释
<!--html注释 ->
{# jinja2注释 #} 仅可以在配置文件中使用
判断
仅可以在配置文件中使用
{% if%}
{% elif%}
{% else%}
{% endif%}
{% if $?== 0%}
echo xxx
{% else%}
echo aaa
{% endif%}
循环
{% for 条件%}
{% end 条件%}
Jinja2模板实践
例一:在motd文件调用变量
例一:在motd文件调用变量
/etc/motd:这个文件是在你登录之后显示的,不管你是 TTY 还是 PTS 登录,也不管是 Telnet 或 SSH 都会显示这个文件里面的信息。
[ ]
- hosts: web_group
tasks:
- name: 复制模板文件
template:
src: /root/ansible/motd.j2
dest: /etc/motd
vim /root/ansible/motd.j2
=========================================
欢迎使用:{{ ansible_fqdn }}
本机总内存:{{ ansible_memtotal_mb }}
本机可用内存:{{ ansible_memfree_mb }}
本机内网IP: {{ ansible_eth0 ['ipv4']['address'] }}
=========================================
[ ]
total 8
-rw-r--r-- 1 root root 126 Oct 7 05:52 jinja2.yml
-rw-r--r-- 1 root root 264 Oct 7 05:53 motd.j2
[ ]
...
[ ]
=========================================
欢迎使用:web01
本机总内存:972
本机可用内存:145
本机内网IP: 10.0.0.7
=========================================
Last login: Mon Aug 14 08:11:23 2023 from 172.16.1.61
=========================================
欢迎使用:web01
本机总内存:972
本机可用内存:145
本机内网IP: 10.0.0.7
=========================================
例二:使用jinja2模板的if判断渲染keepalived配置文件,并推送到不同lb主机上
例二:使用jinja2模板的if判断渲染keepalived配置文件,并推送到不同lb主机上
#playbook:
cat config_keepalived.yml
hosts: all
tasks:
name: 下发keeepalived配置文件
template:
src: /root/ansible/keepalived/keepalived.j2
dest: /etc/keepalived/keepalived.conf
when: ansible_fqdn is match 'lb*'
#配置文件
cat /root/ansible/keepalived/keepalived.j2 #//不使用jinja2的话需要准备两份配置文件,MASTER的与BACKUP
global_defs {
router_id {{ ansible_fqdn }}
}
if ansible_fqdn == 'lb01' %}
vrrp_script check_ngx {
script "/root/check_web.sh"
interval 5
vrrp_instance VI_1 {
track_script {
check_ngx
}
state MASTER
priority 150
else %}
vrrp_instance VI_1 {
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的for循环管理nginx负载均衡配置文件
#playbook
~/ansible]# vim lb_blog.yml
hosts: lb_group
vars:
nginx_port: 80
domain_name: blog.andrew.com
pool_name: blog_pools
tasks:
name: 下发nginx配置文件
template:
src: /root/ansible/blog_lb_conf.j2
dest: /opt/nginx.conf
notify: 重载nginx
handlers:
name: 重载nginx
systemd:
name: nginx
state: reloaded
#配置文件
~/ansible]# vim blog_lb_conf.j2
upstream {{ pool_name }} {
for number in range(7,17) %}
server 10.0.0.{{ number }}:{{ nginx_port }};
endfor %}
}
server{
listen {{ nginx_port }};
server_name {{ domain_name }};
location / {
proxy_pass http://{{ pool_name }};
include /etc/nginx/conf.d/proxy_params;
}
}
#执行playbook
~/ansible]# ansible-playbook lb_blog.yml
#查看结果
/opt]# cat nginx.conf
/opt]# cat nginx.conf
upstream blog_pools {
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80;
server 10.0.0.10:80;
server 10.0.0.11:80;
server 10.0.0.12:80;
server 10.0.0.13:80;
server 10.0.0.14:80;
server 10.0.0.15:80;
server 10.0.0.16:80;
}
server{
listen 80;
server_name blog.andrew.com;
location / {
proxy_pass http://blog_pools;
include /etc/nginx/conf.d/proxy_params;
}
}
例四:使用jinja2管理MySQL配置文件
[ ]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
innodb_buffer_pool_size=800M
[ ]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d
[ ]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
innodb_buffer_pool_size={{ (ansible_memtotal_mb * 0.8)|int }}M
[ ]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d
扫描二维码
收获更多精彩
Andrew
发表评论