ansible jinja2
什么是jinjia2模板
jinjia2是Python的全功能模块引擎
Jinjia2与Ansible的关系
Ansible通常会使用jinjia2模板来修改被管理主机的配置文件等...在saltack中同样会使用到jinjia2
如果在100台主机上安装nginx,每台nginx的端口都不一样,如何解决?
Ansible如何使用Jinjia2
使用Ansible的jinjia2模板也就是使用template模块,该模块和copy模块一样,都是将为文件复制到远端主机上去,但是区别在于template模块可以获取到文件中的变量,而copy则是原封不动的把文件内容复制过去。之前我们在推送rsync的backup脚本时,想把脚本中的变量名改成主机名,如果使用copy模块则推送过去的就是{{ ansible_fqdn }},不变,如果使用template,则会变成对应的主机名。
Ansible使用Jinjia2注意事项
Ansible允许jinjia2模板中使用条件判断和循环,但是不允许在playbook中使用。
注意:不是每个管理员都需要这个特性,但是有些时候jinjia2模块能大大提高效率。
Ansible Jinjia2模板使用
jinja2基本 语法
{{ EXPR }}输出变量值,会输出自定义的变量值或facts
1)playbook文件使用template模块
2)模板文件里面变量使用{{名称}},比如{{PORT}}或使用facts
jinjia2模板逻辑判断
#循环表达式
{% for i in EXPR %}
{% endfor %}
#条件判断
{% if EXPR %}
{% elif EXPR %}
{% else %}
{% endif %}
#注释
{# COMMENT #}
测试jinja2
#编辑playbook
[root@m01 ~]# vim jinja2.yml
- hosts: all
tasks:
- name: scp motd
template:
src: /etc/motd
dest: /etc/motd
#准备motd文件
[root@m01 ~]# vim /etc/motd
Welcome to {{ ansible_fqdn }}
This system total mem is : {{ ansible_memtotal_mb }} MB
This system free mem is: {{ ansible_memfree_mb }} MB
#执行playbook
[root@m01 ~]# ansible-playbook jinja2.yml
PLAY [web_group] *****************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************
ok: [web02]
ok: [web01]
TASK [Copy Template File] ********************************************************************************************************************************************************************************************************************
changed: [web01]
changed: [web02]
PLAY RECAP ***********************************************************************************************************************************************************************************************************************************
web01 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web02 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
#查看结果
[root@m01 ~]# ansible web_group -a 'cat /etc/motd'
web01 | CHANGED | rc=0 >>
Welcome to web01
This system total mem is : 1982 MB
This system free mem is: 1106 MB
web02 | CHANGED | rc=0 >>
Welcome to web02
This system total mem is : 1982 MB
This system free mem is: 1096 MB
该示例展示了如何利用jinjia2模板使用facts变量,达到我们想要的目的,实现自动化的需求。
Ansible Jinjia2管理nginx
Ansible使用jinjia2的for循环表达式渲染出nginx负载均衡的配置文件
使用playbook推送文件
#编辑playbook
[root@m01 ~]# vim lb.yml
- hosts: lb_group
vars:
http_port: 80
server_name: www.drz.com
tasks:
- name: copy
template:
src: ./www.drz.com.conf.j2
dest: /etc/nginx/conf.d/www.drz.com.conf
notify: reload nginx
handlers:
- name: reload nginx
systemd:
name: nginx
state: reloaded
#准备配置文件
[root@m01 ~]# vim www.drz.com.conf.j2
upstream {{ server_name }} {
{% for n in range(21) %}
server 172.16.1.{{ n }}:{{ up_port }};
{% endfor %}
}
server {
listen 80;
server_name {{ server_name }};
location / {
root /code;
index index.html;
proxy_pass http://{{ server_name }};
proxy_set_header Host $http_host;
}
}
Ansible jinja2渲染负载均衡配置文件
[root@m01 ~]# cat nginx.conf.j2
upstream {{ domain_name }} {
{% for ip in range(1,16) %}
server 172.16.1.{{ ip }}:{{ upstream_port }};
{% endfor %}
}
server {
listen {{ server_port }};
server_name {{ domain_name }};
location / {
root {{ code_dir }};
index index.html;
proxy_pass http://{{ domain_name }};
proxy_set_header HOST $http_host;
}
}
[root@m01 ~]# cat nginx.yml
- hosts: all
vars_files: ./wordpress_vars.yml
tasks:
- name: configure nginx conf
template:
src: ./nginx.conf.j2
dest: /opt/{{ domain_name }}.conf
[root@m01 ~]# cat wordpress_vars.yml
domain_name: www.drz.com
upstream_port: 8080
server_port: 80
code_dir: /code/wordpress
Ansible jinja2 管理keepalived配置文件
ansible使用jinja2模板的if判断表达式渲染出keepalived高可用配置文件,并推送到lb
推送keepalived配置文件
[root@m01 ~]# vim keepalived.yml
- hosts: lb_group
tasks:
- name: copy file
template:
src: ./keepalived.j2
dest: /etc/keepalived/keepalived.conf
notify: restart keepalived
handlers:
- name: restart keepalived
systemd:
name: keepalived
state: restarted
keepalived原配
#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
}
}
准备keepalived配置文件
[root@m01 ~]# cat keepalived.conf.j2
global_defs {
router_id {{ ansible_fqdn }}
}
vrrp_instance VI_1 {
{% if ansible_fqdn == 'web01' %}
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
}
}
[root@m01 ~]# cat keep.yml
- hosts: webs
tasks:
- name: configure keep conf
template:
src: ./keepalived.conf.j2
dest: /opt/keepalive.conf