一,jinja2
1.概述
Jinja2 是一个现代的,设计者友好的,模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全。
当利用jinja2进行渲染的时候,它会把这些特殊的占位符进行填充/替换,jinja2支持python中所有的Python数据类型比如列表、字段、对象等。
2.Ansible 如何使用 jinja2 模板
Ansible 使用 jinja2 模板,也就是 template 模板。该模块和 copy 模块一样,都是将文件复制到目标机器,但是区别在于 template 模块可以获取要复制文件中的变量的值,而 copy 则是原封不动的把文件内容复制过去。
比如:针对不同的主机定义不同的变量,template 会在将文件分发前读取变量到 jinja2 模板,之后再然后分发到不同的被管理主机上。
3.jinja2渲染NginxProxy配置文件用到的语法三种语法
控制结构 {% %} 变量取值 {{ }} 注释 {# #}。
二,演示
| 1 变量中的循环语句 | 案例:nginx proxy |
|---|---|
| 2 变量中的判断语法 | 案例:keeplive不同主机的配置 |
| 3 Inventory方式实现 | 案例:keeplive不同主机的配置 |
| **4. jinja变量方式实现 | 案例:keeplive不同主机的配置 |
1. 变量中的循环语句
给10台主机装上Nginx服务,但是要求每台主机的端口都不一样,如何解决?
( jinja配置文件模板,根据不同主机生成不同文件配置nginx proxy)
主机清单:
[root@manager ansible_roles]# cat proxy_blog.oldxu.com.conf.j2
upstream {{ blog_site }} {{% for host in groups['webservers'] %}server {{ host }};{% endfor %}server {listen 80;server_name localhost;location / {proxy_pass http://{{ blog_site }};include proxy_params;}}
playbook —- 将nginx.conf文件批量拷到对端
[root@manager ansible_roles]# cat nginx_proxy.yml
- hosts: webserversvars:- blog_site: blog.oldxu.comtasks:- name: Configure Nginx Proxy Vurtual Filetemplate:src: ./proxy_blog.oldxu.com.conf.j2dest: /tmp/proxy_blog.oldxu.com.conf
2. 使用判断语法推送不同文件
常规写法:首先需要写好两个不同配置的文件,再判断不同主机推送不同配置(太笨重)
[root@manager ansible_roles]# cat keepalived.yml #keepalive的安装,配置,启动
- hosts: lbserverstasks:- name: Install Keepalived Serveryum:name: keepalivedstate: present- name: Configure Keepalived Servercopy:src: ./keepalived-master.conf.j2dest: /etc/keepalived/keepalived.confwhen: ( ansible_hostname == "lb01" )notify: Restart Keepalived Server- name: Configure Keepalived Servercopy:src: ./keepalived-backup.conf.j2dest: /etc/keepalived/keepalived.confwhen: ( ansible_hostname == "lb02" )notify: Restart Keepalived Server- name: Started Keepalived Serversystemd:name: keepalivedstate: startedenabled: yeshandlers:- name: Restart Keepalived Serversystemd:name: keepalivedstate: restarted
3. 使用inventory 方式来生成不同配置文件
主机清单 #预先定义好变量
hosts:[lbservers]172.16.1.5 state=MASTER priority=150172.16.1.6 state=BACKUP priority=120
[root@manager ansible_roles]# cat keepalived-template.conf.j2 #keepalvie配置文件
global_defs {router_id {{ ansible_hostname }}}vrrp_instance VI_1 {state {{ state }}priority {{ priority }}interface eth0virtual_router_id 50advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.0.0.3}}
[root@manager ansible_roles]# cat keepalived.yml #keepalive的安装,配置,启动
- hosts: lbserverstasks:- name: Install Keepalived Serveryum:name: keepalivedstate: present- name: Configure Keepalived Servertemplate:src: keepalived-template.conf.j2dest: /etc/keepalived/keepalived.confnotify: Restart Keepalived Server- name: Started Keepalived Serversystemd:name: keepalivedstate: startedenabled: yeshandlers:- name: Restart Keepalived Serversystemd:name: keepalivedstate: restarted
*4. 使用 jinja方式来生成不同文件(if,变量)
主机清单
[root@manager ansible_roles]# cat hosts
[lbservers]172.16.1.5172.16.1.6
[root@manager ansible_roles]# cat keepalived-template.conf.j2 #keepalive配置的 jinja2文件
global_defs {router_id {{ ansible_hostname }}}vrrp_instance VI_1 {{% if ansible_hostname == "lb01" %}state MASTERpriority 200{% elif ansible_hostname == "lb02" %}state BACKUPpriority 100{% endif %}interface eth0virtual_router_id 50advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.0.0.3}}
[root@manager ansible_roles]# cat keepalived.yml #keepalive的安装,配置,启动
- hosts: lbserverstasks:- name: Install Keepalived Serveryum:name: keepalivedstate: present- name: Configure Keepalived Servertemplate:src: keepalived-template.conf.j2dest: /etc/keepalived/keepalived.confnotify: Restart Keepalived Server- name: Started Keepalived Serversystemd:name: keepalivedstate: startedenabled: yeshandlers:- name: Restart Keepalived Serversystemd:name: keepalivedstate: restarted
