什么是jinja2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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注意事项 Ansible允许jinja2模板中使用条件判断和循环,但是不允许在playbook中使用。 注意:不是每个管理员都需要这个特性,但是有些时候jinja2模块能大大提高效率。 |
jinja2的使用
Jinja2模板逻辑判断
1)循环
1 2 3 4 5 6 7 |
#shell脚本的循环 [root@m01 ~]# vim xh.sh #!/bin/bash for i in <code>seq 10 do echo $i done |
1 2 3 4 |
#Jinja2的循环表达式 {% for i in range(10) %} echo $i {% endfor %} |
2)判断
1 2 3 4 5 6 7 8 9 |
#shell脚本的判断 [root@m01 ~]# vim pd.sh #!/bin/bash age=$1 if [ $age -lt 18 ];then echo "小姐姐" else echo "大妈" fi |
1 2 3 4 5 6 7 8 |
#Jinja2的条件判断 {% if EXPR %} {% elif EXPR %} {% else %} {% endif %} #注释 {# COMMENT #} |
jinja2模板测试
1)登录文件测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#编写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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#配置模板 [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模板配置keepalived
1)配置keepalived配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[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 }} } } |
2)配置变量
1 2 3 4 5 6 |
[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)配置主机清单
1 2 3 4 5 6 7 8 9 10 |
#配置主机清单 [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剧本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
[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 |