一、jinja2模板概述
#jinja2是什么
Jinja2 是一个用 Python 开发的高性能模板引擎,那么什么是模板?
所谓模板,指的是在纯文本字符串中嵌入一些特殊语法格式的表达式,
然后使用模板引擎去解析整个模板,将其中嵌入的特殊语法部分解析替换成对应的结果字符串
其中,解析并替换模板表达式的过程称为渲染。
#Jinja2与Ansible啥关系
Ansible通常会使用jinja2模板来修改被管理主机的配置文件等
如果在100台主机上安装redis,每台redis的监听地址都不一样,如何解决?
#Ansible如何使用Jinja2
使用Ansible的jinja2模板也就是使用template模块,该模块和copy模块一样,都是将文件复制到远端主机上去,但是区别在于,template模块可以获取到文件中的变量,而copy则是原封不动的把文件内容复制过去。
#Ansible使用Jinja2注意事项
Ansible允许jinja2模板中使用模版语法的条件判断和循环,但是这些语法不允许在playbook中使用。
注意:不是每个管理员都需要这个特性,但是有些时候jinja2模块能大大提高效率。
二、Ansible Jinja2 模板使用
1、变量使用语法
{{ EXPR }} 引用变量值,模版文件与剧本文件中都可以用该语法引用变量
2、Jinja2模板逻辑判断语法
#Jinja2模板判断语法
#条件判断
{% if EXPR %}
{% elif EXPR %}
{% else %}
{% endif %}
3.Jinja2模板循环语法
#Jinja2模板循环语法
#循环表达式
{% for i in EXPR %}
{% endfor %}
4.注释
#Jinja2模板注释语法
{# COMMENT #}
三、jinja2模板使用示例
示例一
配置登陆文件的 jinja2 模板
[root@m01 project]# vim motd.j2
Welcome to {{ ansible_fqdn }}
This system total mem is : {{ ansible_memtotal_mb }} MB
This system free mem is: {{ ansible_memfree_mb }} MB
编写剧本:用template模块渲染
[root@m01 project]# vim motd.yml
- hosts: group5
tasks:
- name: Config motd
template:
src: ./motd.j2
dest: /etc/motd
示例二
1)配置数据库配置文件
[root@m01 project]# vim /etc/my.cnf
innodb_buffer_pool_size = {{ ansible_memtotal_mb * 0.8 }}M
2)编写剧本
[root@m01 project]# cat my.yml
- hosts: db01
tasks:
- name: Config Mariadb
template:
src: /etc/my.cnf
dest: /etc/
3)执行并查看
[root@m01 project]# ansible-playbook my.yml
#检查
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
innodb_buffer_pool_size = 777.6M
示例三
1)配置数据库配置文件
cat > /workspace/my.cnf << "EOF"
[mysqld]
{% if ansible_memtotal_mb == 972 %}
innodb_buffer_pool_size = 800M
{% elif ansible_memtotal_mb == 1980 %}
innodb_buffer_pool_size = 1600M
{% else %}
innodb_buffer_pool_size = 1000M
{% endif %}
EOF
2)编写剧本
[root@m01 workspace]# cat my.yml
- hosts: group5
tasks:
- name: Config Mariadb
template:
src: /workspace/my.cnf
dest: /etc/
3)执行查看
#查看服务器
1.如果服务器内存是 972M,则配置为 innodb_buffer_pool_size = 800M
2.如果服务器内存是 1980M,则配置为 innodb_buffer_pool_size = 1600M
3.其他,则配置为innodb_buffer_pool_size = 1000M
示例四:使用jinja2模板配置nginx负载均衡
0)先给负载均衡安装nginx
1)准备负载均衡配置文件
#参考:正常的配置文件
[root@m01 workspace]# vim upstream.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;
proxy_set_header Host $http_host;
}
}
#编写:不正经的配置文件
[root@m01 workspace]# vim /workspace/upstream.j2
upstream {{ server_name }} {
{% for i in range(7,20) %}
server {{ net_ip }}.{{ i }};
{% endfor %}
}
server {
listen {{ web_port }};
server_name {{ server_name }};
location / {
proxy_pass http://{{ server_name }};
proxy_set_header Host $http_host;
}
}
3)配置变量文件
cat > /workspace/upstream_vars.yml << "EOF"
server_name: linux.wp.com
web_port: 80
net_ip: 172.16.1
EOF
4)编写剧本
[root@lb workspace]# cat lb.yaml
- hosts: group5
vars_files: /workspace/upstream_vars.yml
tasks:
- name: Config Nginx Upstream
template:
src: /workspace/upstream.j2
dest: /etc/nginx/conf.d/upstream.conf
notify: restert_upstream
- name: Start Nginx Server
systemd:
name: nginx
state: started
handlers:
- name: restert_upstream
systemd:
name: nginx
state: restarted
4)执行并测试
[root@m01 workspace]# ansible-playbook lb.yml
示例五:使用jinja2模板配置keepalived
1)准备keepalived配置文件
#参考:正经的配置文件
[root@m01 project]# vim conf/keepalived.conf
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
}
}
#编写:不正经的配置文件
[root@m01 workspace]# vim /workspace/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 {
10.0.0.3
}
}
2)配置剧本
[root@m01 workspace]# cat /workspace/keepalived.yml
- hosts: lb_server
tasks:
- name: Install keepalived Server
yum:
name: keepalived
state: present
- name: Config keepalived Server
template:
src: /workspace/keepalived.j2
dest: /etc/keepalived/keepalived.conf
- name: Start keepalived Server
systemd:
name: keepalived
state: started