jinja2
什么是jinja2
jinja2是Python的全功能模板引擎
jinjia2和ansible有什么关系
Ansible通常会使用jinja2模板来修改被管理主机的配置文件等...在saltstack中同样会使用到jinja2如果在100台主机上安装nginx,每台nginx的端口都不一样,如何解决?
ansible如何使用jinja2
使用Ansible的jinja2模板也就是使用template模块,该模块和copy模块一样,都是讲文件复制到远端主机上去,但是区别在于,template模块可以获取到文件中的变量,而copy则是原封不动的把文件内容复制过去。之前我们在推送rsync的backup脚本时,想把脚本中的变量名改成主机名,如果使用copy模块则推送过去的就是{{ ansible_fqdn }},不变,如果使用template,则会变成对应的主机名。
jinja2使用的注意事项
Ansible允许jinja2模板中使用条件判断和循环,但是不允许在playbook中使用。
注意:不是每个管理员都需要这个特性,但是有些时候jinja2模块能大大提高效率。
jinja2语法
# jinja2的判断
{% if 条件 %}
xxx
{% elif 条件 %}
yyy
{% else %}
zzz
{% endif %}
# jinja2的循环
{% for n in 条件 %}
xxx
{% endfor %}
jinjia2配置高可用
# 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
}
}
############ j2判断 ############
global_defs {
router_id {{ ansible_hostname }}
}
vrrp_script check_web {
script "/root/cnx.sh"
interval 5
}
vrrp_instance VI_1 {
{% if ansible_hostname == 'lb01' %} ### 判断是否为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
track_script {
check_web
}
}
}
###### 循环 #########
## j2的模板
upstream web{
{% for num in seq10 %}
server 172.16.1.{{ num }}; ### 循环 1-10
{% endfor %}
}
server{
listen 80;
server_name {{ wp }};
location /{
proxy_pass http://web;
}
}