一、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