Ansible Jinjia2 模板
Jinjia2模板介绍
什么是jinja2模板
jinja2是Python的全功能模板引擎
Jinja2与Ansible啥关系
Ansible通常会使用jinja2模板来修改被管理主机的配置文件等…在saltstack中同样会使用到jinja2 如果在100台主机上安装nginx,每台nginx的端口都不一样,如何解决?
Ansible如何使用Jinja2
使用Ansible的jinja2模板也就是使用template模块,该模块和copy模块一样,都是讲文件复制到远端主机上去,但是区别在于,template模块可以获取到文件中的变量,而copy则是原封不动的把文件内容复制过去。之前我们在推送rsync的backup脚本时,想把脚本中的变量名改成主机名,如果使用copy模块则推送过去的就是{{ ansible_fqdn }},不变,如果使用template,则会变成对应的主机名。
注意事项
- Ansible允许jinja2模板中使用条件判断和循环,但是不允许在playbook中使用。
- 只能在template模块要推送的文件中使用Jinja2语法
- 使用Jinja2要注意,配置文件中是否有特殊符号
下面的写法是错误的:
[root@web02 ~]# vim a.yml
{% if ansible_hostname == 'db01' %}
yum:
name: mariadb-serveer
state: present
{% else %}
aaaa
{% endif %}
Jinja2语法
# 变量调用语法
{{ 变量名 }}: 调用变量,输出变量的值
playbook使用template模块
#判断语法
{% if 条件 %}
xxx
{% else %}
aaa
{% endif %}
# for语法
{% for n in 变量 %}
xxx
{% endfor %}
# 注释
{# 这里是注释内容 #}
ansible中jinja2 规范
所欲的jinja2模板文件要以 j2 结尾
简单的jinja2使用
准备motd.j2文件
[root@m01 ~]
本机内存: {{ ansible_memtotal_mb }}
剩余内存: {{ ansible_memfree_mb }}
本机外网: {{ ansible_default_ipv4.address }}
本机内网: {{ ansible_eth1.ipv4.address }}
本机名字: {{ ansible_hostname }}vim
准备playbook文件
[root@m01 ~]
- hosts: all
tasks:
- name: motd
template:
src: ./motd.j2
dest: /etc/motd
执行playbook
[root@m01 ~]
PLAY [all] *******************************************************************************
TASK [Gathering Facts] *******************************************************************
ok: [db01]
ok: [nfs]
ok: [backup]
ok: [web02]
ok: [web01]
TASK [motd] ******************************************************************************
changed: [nfs]
changed: [web02]
changed: [db01]
changed: [web01]
changed: [backup]
PLAY RECAP *******************************************************************************
backup : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
db01 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
nfs : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
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
Jinja2管理nginx配置文件
upstream {{ server_name }} {
{% for num in range(1,11) %}
server 172.16.1.{{ num }};
{% endfor %}
}
server {
listen 80;
server_name {{ server_name }};
location / {
proxy_pass http://{{ server_name }};
}
}
[root@m01 ~]
- hosts: all
vars:
server_name: blog.drz.com
tasks:
- name: nginx
template:
src: ./nginx_upstream.j2
dest: /root/nginx_upstream.conf
Jinja2管理keepalived配置文件
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
}
}
[root@m01 ~]
global_defs {
router_id {{ ansible_hostname }}
}
vrrp_instance VI_1 {
{% if ansible_hostname == '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
}
}
Jinja2模板计算
mysql配置文件
内存大小要根据物理内存的 80%
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
innodb_buffer_pool_size={{ ansible_memtotal_mb * 0.8 }}
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d
[root@m01 ~]
- hosts: all
tasks:
- name: db
template:
src: ./my.j2
dest: /root/my.cnf
作业
主机名 | 外网IP | 内网ip | 角色 | 部署服务 |
---|
m01 | 10.0.0.61 | 172.16.1.61 | ansible管理端 | ansible | backup | 10.0.0.41 | 172.16.1.41 | ansible被管理端,rsync服务端,nfs备机 | rsync,nfs | nfs | 10.0.0.31 | 172.16.1.31 | ansible被管理端,rsync客户端,nfs服务端 | rsync,nfs,sersync | web01 | 10.0.0.7 | 172.16.1.7 | ansible被管理端,nfs客户端,web | nginx,nfs,wordpress | web02 | 10.0.0.8 | 172.16.1.8 | ansible被管理端,nfs客户端,web | nginx,nfs,wordpress | db01 | 10.0.0.51 | 172.16.1.51 | ansible被管理端,数据库 | mariadb | lb01 | 10.0.0.5 | 172.16.1.5 | 被管理端,负载均衡 | nginx,keepalived | lb02 | 10.0.0.6 | 172.16.1.6 | 被管理端,负载均衡 | nginx,keepalived |
|