一、ansible jinja2介绍
ansible通常使用jinja2模板来修改被管理主机的配置文件
ansible如何使用jinja2模板
使用ansible的jinja2模板,也就是template模块,该模块和copy模块一样,都是将文件复制到远端主机上,但是区别在于template模块可以获取要复制的文件中变量的值
而copy则是原封不动的把文件内容复制过去,比如针对不同的主机定义不同的变量,template会在将配置文件分发出去之前读取变量到jinja2模板,然后分发到不通的被管理主机上
ansible使用jinja2模板注意事项
ansible允许jinja2模板中使用条件判断和循环,但是jinja2判断循环语法不允许在playbook中使用
jinja2 文件件以 .j2 为后缀, 也可以不写后缀。
二、ansible jinja2基本使用
1、jinja2 模板基本语法
要在配置文件中使用jinja2,playbook中的tasks必须使用template模块
模板配置文件里面使用变量,比如{{ port }}或者使用{{ facts变量 }}
2、jinja模板逻辑关系
{% for i in EXPR %}...{% endfor %}作为循环表达式
{% if EXPR %}...{% elif EXPR %}...{% endif %}作为条件判断
{# COMMENT #}表示注释
例1 facts变量
[root@db2 memcache]# cat jinja1.yaml
- hosts: all
tasks:
- name: copy template file /etc/motd
template: src=./motd.j2 dest=/etc/motd backup=yes
[root@db2 memcache]# cat motd.j2
Welcome to qingcheng service!!
This System Hostname: {{ ansible_hostname }}
This System total memory is: {{ ansible_memtotal_mb }} MB
This System free memory is: {{ ansible_memfree_mb }} MB
ansible-playbook jinja1.yaml -i hosts
例2 nginx负载均衡变量
[root@db2 memcache]# cat kod_proxy.conf.j2
upstream {{ server_name }} {
{% for i in range(1,10) %}
server 192.168.10.{{ i }};
{% endfor %}
}
server {
listen {{ http_port }};
server_name {{ server_name }};
location / {
proxy_pass http://{{ server_name }};
include proxy_params;
}
}
[root@db2 memcache]# cat jinja2.yaml
- hosts: webserver
vars:
- http_port: 80
- server_name: kod_
tasks:
- name: install nginx server
yum: name=nginx state=latest
- name: configure nginx virt
template: src=./kod_proxy.conf.j2 dest=/etc/nginx/conf.d/proxy_kod.conf
notify: Restart Nginx Server
- name: start nginx server
service: name=nginx state=started enabled=yes
handlers:
- name: Restart Nginx Server
service: name=nginx state=restarted
例3 keepalive主从
inventory中的host_vars根据不同主机设定不同的变量
在playbook中是when判断主机名称,然后分发不同的配置文件
使用jinja2的方式渲染出不同的配置文件
[root@db2 memcache]# cat keepalived.yaml
- hosts: all
tasks:
- name: copy template keepalived configure
template: src=keepalived.j2 dest=/etc/keepalived/keepalived.conf
notify: Restart keepalived service
handler:
- name: Restart keepalived service
service: name=keepalived state=restarted
[root@db2 memcache]# cat keepalived.j2
global_defs {
router_id {{ ansible_fqdn }}
}
vrrp_instance VI_1 {
{% if ansible_fqdn == "web01" %}
state MASTER
priority 150
{% elif ansible_fqdn == "web02" %}
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
}
}