• 第十六章 Ansibleplaybook模板化(Jinja2)


    一、jinja2概述

    jinja2是Python的全功能模板引擎,就是一个配置文件的模板,支持变量
    
    Ansible通常会使用jinja2模板来修改被管理主机的配置文件等...在saltstack中同样会使用到jinja2
    如果在100台主机上安装nginx,每台nginx的端口都不一样,如何解决?
    
    使用Ansible的jinja2模板也就是使用template模块,该模块和copy模块一样,都是将文件复制到远端主机上去,但是区别在于,template模块可以获取到文件中的变量,而copy则是原封不动的把文件内容复制过去。之前我们在推送rsync的backup脚本时,想把脚本中的变量名改成主机名,如果使用copy模块则推送过去的就是{{ ansible_fqdn }},不变,如果使用template,则会变成对应的主机名
    
    Ansible允许jinja2模板中使用条件判断和循环,但是不允许在playbook中使用。
    
    ps:不是每个管理员都需要这个特性,但是有些时候jinja2模块能大大提高效率。
    

    二、jinja2使用方式

    {{ EXPR }} 输出变量值,会输出自定义的变量值或facts
    1.playbook文件使用template模块
    2.模板文件里面变量使用{{名称}},比如{{PORT}}或使用facts
    

    三、jinja2模板逻辑判断

    1.循环

    #shell脚本的循环
    [root@m01 ~]# vim xh.sh
    #!/bin/bash
    for i in `seq 10`
    do
        echo $i
    done
    
    #Jinja2的循环表达式
    {% for i in range(10) %}
    echo $i
    {% endfor %}
    

    2.判断

    #shell脚本的判断
    [root@m01 ~]# vim pd.sh 
    #!/bin/bash
    age=$1
    if [ $age -lt 18 ];then
        echo "小姐姐"
    else
        echo "大妈"
    fi
    
    #Jinja2的条件判断
    {% if EXPR %}
    {% elif EXPR %}
    {% else %}
    {% endif %}
    
    #注释
    {# COMMENT #}
    

    四、jinja2模板测试

    1.登录文件测试

    #编写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

    #配置模板
    [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模板配置负载均衡

    1.正经的配置

    [root@m01 ~]# cat conf/proxy_new.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;
    		include proxy_params;
    	}
    }
    

    2.不正经的配置

    [root@m01 ~]# vim conf/proxy.j2
    upstream {{ server_name }} {
    {% for i in range(7,9) %}
        server {{ ip }}.{{ i }};
    {% endfor %}
    }
    
    server {
        listen {{ port }};
        server_name {{ server_name }};
    
        location / {
            proxy_pass http://{{ server_name }};
            include proxy_params;
        }
    }
    

    3.配置额外变量

    [root@m01 ~]# vim upstream_vars.yml 
    ip: 172.16.1
    web: web
    port: 80
    server_name: linux.wp.com
    

    4.配置剧本推送

    [root@m01 ~]# vim proxy.yml 
    - hosts: lb01
      vars_files: upstream_vars.yml
      tasks:
        - name: Config SLB
          template:
            src: /root/conf/proxy.j2
            dest: /etc/nginx/conf.d/proxy.conf
    
        - name: Restart SLB Nginx
          systemd:
            name: nginx
            state: restarted
    

    六、jinja2模板配置keepalived

    1.配置keepalived配置文件(正经配置)

    #keepalived master 配置文件
    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
        }
    }
    
    
    #keepalived backup配置文件
    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
        }
    }
    

    2.配置keepalived配置文件(不正经配置)

    [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 }}
        }
    }
    

    3.配置变量

    [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.配置主机清单

    #配置主机清单
    [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剧本

    [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
    
  • 相关阅读:
    uva 11248 最大流 ISAP
    【力扣】133. 克隆图
    【力扣】125. 验证回文串
    【力扣】130. 被围绕的区域
    【力扣】337. 打家劫舍 III
    【力扣】104. 二叉树的最大深度-及二叉树的遍历方式
    【力扣】392. 判断子序列
    【力扣】95. 不同的二叉搜索树 II
    【力扣】120. 三角形最小路径和
    【力扣】两个数组的交集 II
  • 原文地址:https://www.cnblogs.com/jhno1/p/15723292.html
Copyright © 2020-2023  润新知