第十六章 Ansibleplaybook模板化(Jinja2)

一、jinja2概述

jinja2是Python的全功能模板引擎,就是一个配置文件的模板,支持变量

Ansible通常会使用jinja2模板来修改被管理主机的配置文件等...在saltstack中同样会使用到jinja2
如果在100台主机上安装nginx,每台nginx的端口都不一样,如何解决?

使用Ansible的jinja2模板也就是使用template模块,该模块和copy模块一样,都是将文件复制到远端主机上去,但是区别在于,template模块可以获取到文件中的变量,而copy则是原封不动的把文件内容复制过去。之前我们在推送rsync的backup脚本时,想把脚本中的变量名改成主机名,如果使用copy模块则推送过去的就是{{ ansible_fqdn }},不变,如果使用template,则会变成对应的主机名

Ansible允许jinja2模板中使用条件判断和循环,但是不允许在playbook中使用。

ps:不是每个管理员都需要这个特性,但是有些时候jinja2模块能大大提高效率。

二、jinja2使用方式

{{ EXPR }} 输出变量值,会输出自定义的变量值或facts
1.playbook文件使用template模块
2.模板文件里面变量使用{{名称}},比如{{PORT}}或使用facts

三、jinja2模板逻辑判断

1.循环

#shell脚本的循环
[root@m01 ~]# vim xh.sh
#!/bin/bash
for i in `seq 10`
do
    echo $i
done
#Jinja2的循环表达式
{% for i in range(10) %}
echo $i
{% endfor %}

2.判断

#shell脚本的判断
[root@m01 ~]# vim pd.sh 
#!/bin/bash
age=$1
if [ $age -lt 18 ];then
    echo "小姐姐"
else
    echo "大妈"
fi
#Jinja2的条件判断
{% if EXPR %}
{% elif EXPR %}
{% else %}
{% endif %}

#注释
{# COMMENT #}

四、jinja2模板测试

1.登录文件测试

#编写j2模板
[root@m01 ~]# vim motd.j2
欢迎来到 {{ ansible_fqdn }}
该服务器总内存: {{ ansible_memtotal_mb }} MB
该服务器剩余内存: {{ ansible_memfree_mb }} MB

#编写剧本
[root@m01 ~]# vim motd.yml 
- hosts: all
  tasks:
    - name: Config motd
      template:
        src: /root/motd.j2
        dest: /etc/motd

#执行剧本
[root@m01 ~]# ansible-playbook motd.yml

#查看远端服务器内容
[root@backup ~]# cat /etc/motd 
欢迎来到 backup
该服务器总内存: 972 MB
该服务器剩余内存: 582 MB

[root@db01 ~]# cat /etc/motd
欢迎来到 db01
该服务器总内存: 972 MB
该服务器剩余内存: 582 MB

2.使用jinja2模板管理mysql

#配置模板
[root@m01 ~]# vim /etc/my.j2
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0

{% if ansible_memtotal_mb == 972  %}
innodb_log_buffer_poll_size= 800M
{% elif ansible_memtotal_mb == 1980 %}
innodb_log_buffer_poll_size= 1600M
{% endif %}

... ...

#配置剧本
[root@m01 ~]# vim mysql.yml 
- hosts: db_group
  tasks:
    - name: Config mysql
      template:
        src: /etc/my.cnf
        dest: /etc/

#执行
[root@m01 ~]# ansible-playbook mysql.yml

#查看
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
innodb_log_buffer_poll_size= 800M

[root@db03 ~]# vim /etc/my.cnf
[mysqld]
innodb_log_buffer_poll_size= 1600M

五、jinja2模板配置负载均衡

1.正经的配置

[root@m01 ~]# cat conf/proxy_new.conf 
upstream web {
	server 172.16.1.7;
	server 172.16.1.8;
}

server {
	listen 80;
	server_name linux.wp.com;

	location / {
		proxy_pass http://web;
		include proxy_params;
	}
}

2.不正经的配置

[root@m01 ~]# vim conf/proxy.j2
upstream {{ server_name }} {
{% for i in range(7,9) %}
    server {{ ip }}.{{ i }};
{% endfor %}
}

server {
    listen {{ port }};
    server_name {{ server_name }};

    location / {
        proxy_pass http://{{ server_name }};
        include proxy_params;
    }
}

3.配置额外变量

[root@m01 ~]# vim upstream_vars.yml 
ip: 172.16.1
web: web
port: 80
server_name: linux.wp.com

4.配置剧本推送

[root@m01 ~]# vim proxy.yml 
- hosts: lb01
  vars_files: upstream_vars.yml
  tasks:
    - name: Config SLB
      template:
        src: /root/conf/proxy.j2
        dest: /etc/nginx/conf.d/proxy.conf

    - name: Restart SLB Nginx
      systemd:
        name: nginx
        state: restarted

六、jinja2模板配置keepalived

1.配置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
    }
}

2.配置keepalived配置文件(不正经配置)

[root@m01 ~]# vim conf/keepalived.j2
global_defs {
    router_id {{ ansible_fqdn }}
}

vrrp_instance VI_1 {
	{% if ansible_fqdn == "lb01" %}
    state MASTER
    priority 100
    {% else %}
    state BACKUP
    priority 90
    {% endif %}
    interface eth0
    virtual_router_id 50
    advert_int 1
    authentication {    
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        {{ vip }}
    }
}

3.配置变量

[root@m01 ~]# vim upstream_vars.yml 
ip: 172.16.1
web: web
port: 80
server_name: linux.wp.com
vip: 10.0.0.3

4.配置主机清单

#配置主机清单
[root@m01 ~]# vim /etc/ansible/hosts 
[slb]
lb01 ansible_ssh_pass='1'
lb02 ansible_ssh_pass='1'

#配置hosts
[root@m01 ~]# vim /etc/hosts
....
172.16.1.5 lb02

5.编写keepalived剧本

[root@m01 ~]# cat keepalived.yml 
- hosts: slb
  vars_files: upstream_vars.yml
  tasks:
    - name: Install keepalived
      yum:
        name: keepalived
        state: present

    - name: Config keepalive
      template:
        src: /root/conf/keepalived.j2
        dest: /etc/keepalived/keepalived.conf

    - name: Start keepalived
      systemd:
        name: keepalived
        state: restarted
原文地址:https://www.cnblogs.com/jhno1/p/15723292.html