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;
	}
}