zoukankan      html  css  js  c++  java
  • jinjia模板

    课前回顾

    sqliet3也是一种数据库
    
    ansible变量
    	系统变量
    	自定义变量
    playbook,yml语法
    jinjia2模板,'带有变量的',使用Python格式调用,需要使用playbook中template'模块'拷贝到别的服务器的 模板文件
    
    mysql占用的物理磁盘大小一般是内存的75%~80%,不要和zabbix装在同一服务器上,避免内存不够
    
    /etc/motd 文件,每次窗口打开都会加载
    centos6系统,centos7系统,两个系统安装的httpd默认版本是不一样的
    
    jinjia模板不能随便用,因为jinjia模板会用jinjia的语法去解析,如果该文件中有jinjia不识别的语法的话(; - ),要对该文件修改一下
    
    #显示不完整主机名
    [root@m01 ~]# hostname
    m01
    
    [root@m01 ~]# ansible m01 -m setup -a 'filter=ansible_hostname'
    m01 | SUCCESS => {
        "ansible_facts": {
            "ansible_hostname": "m01", 
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": false
    }
    #显示完整主机名
    [root@m01 ~]# ansible m01 -m setup -a 'filter=ansible_fqdn'
    m01 | SUCCESS => {
        "ansible_facts": {
            "ansible_fqdn": "m01",
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": false
    }
    

    sqlite详解

    SQLite嵌入

    ansible_jinjia2

    jinjia2模板的使用

    jinjia2文档

    不能登录

    Ansible Jinja2模板使用

    Jinja模板基本语法

    {{ EXPR }}输出变量值,会输出自定义的变量值或facts
    1)playbook文件使用template模块'调用'
    2)'模板文件'里面的'变量',自定义变量或者facts
    
    在一个文件中使用Python格式调用了变量,呢么就可以说这个文件是jinjia模板
    

    Ansible如何使用Jinja2

    使用Ansible的jinja2模板也就是使用template模块,该模块和copy模块一样,都是讲文件复制到远端主机上去,但是区别在于,template模块可以获取到文件中的变量,而copy则是原封不动的把文件内容复制过去。之前我们在推送rsync的backup脚本时,想把脚本中的变量名改成主机名,如果使用copy模块则推送过去的就是{{ ansible_fqdn }},不变,如果使用template,则会变成对应的主机名。

    ansible变量可以在playbook中使用,也可以在别的文件中使用,但是jinjia2只能在文件中使用


    Jinja2模板逻辑判断

    #循环表达式
    
    {% for i in EXPR %}
    ...
    {% endfor %}
    
    i: 变量名
    EXPR:数据 1,3,4  		#不连续数字的循环直接写入,可以使用变量
    range(10)  			# 0~9
    range(1,10)	         # 1~9
    
    {% for sj in 10,11 %}		
    echo num{{$sj}}=>>> {{$sj}}
    {% endfor %}
    ---------------------------------------------------------
    #条件判断
    {% if EXPR %}
    ...
    {% elif EXPR %}
    ...
    {% else %}
    ...
    {% ednif %}
    -------------------------------------------------------------
    #注释
    {# COMMENT #}
    
    #Python循环(连续)
    [root@m01 ~]# vim lb.conf.j2
    upstream {{ ansible_fqdn}} {
    {% for n in range(21) %}
            server 172.16.1.{{n}}:{{80}};
    {% endfor %}
    }
    
    #Python循环(不连续),小括号可以去掉,#不能只写一个数字,必须是一个数组
    [root@m01 ~]# vim lb.conf.j2
    upstream {{ ansible_fqdn}} {
    {% for n in (20,21) %}		
            server 172.16.1.{{n}}:{{80}};
    {% endfor %}
    }
    
    #bash里面的语法,不能在ansible也就是说不能在Python中直接调用,Python代码中,有自己的循环或者判断的方式
    [root@m01 ~]# vim lb.conf.j2
    #!/bin/bash
    for n in 20;do
            server 172.16.1.$n:80;
    done
    
    

    Ansible Jinja2管理motd

    Jinja2示例

    1.编辑playbook

    #motd文件,窗口每次开启都会运行该文件
    [root@m01 ~]# vim jinja2.yml
    - hosts: web_group
      tasks:
        - name: Copy Template File
          template:
            src: ./motd.j2		#yml所在目录
            dest: /etc/motd
    

    2.准备motd.j2文件

    [root@m01 ~]# 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
    

    3.执行playbook

    [root@m01 ~]# ansible-playbook jinja2.yml
    
    #查看结果
    [root@m01 ~]# ansible web_group -a 'cat /etc/motd'
    web01 | CHANGED | rc=0 >>
    Welcome to web01
    This system total mem is : 1982 MB
    This system free mem is: 1106 MB
    
    web02 | CHANGED | rc=0 >>
    Welcome to web02
    This system total mem is : 1982 MB
    This system free mem is: 1096 MB
    
    

    该示例展示了如何利用jinjia2模板使用facts变量,达到我们想要的目的,实现自动化的需求。

    可以理解为,获取自定义变量信息--获取相应主机的变量信息--写入jinjia模板--拷贝

    Ansible Jinja2管理nginx(负载均衡)

    Ansible使用jinja2的for循环表达式渲染出nginx负载均衡的配置文件


    使用playbook推送文件

    1.编辑playbook

    [root@m01 ~]# vim lb.yml
    - hosts: lb_group
      vars:
        http_port: 80
        server_name: www.drz.com
      tasks:
        - name: copy
          template:
            src: /root/lb.conf.jinjia2
            dest: /root
          notify: reload nginx
      handlers:
        - name: reload nginx
          systemd:
            name: nginx
            state: reloaded
    

    2.准备配置文件

    [root@m01 ~]# vim lb.conf.jinjia2
    upstream {{ ansible_fqdn }} {
    {% for n in range(21) %}
            server 172.16.1.{{ n }}:{{ up_port }};
    {% endfor %}
    }
    
    server {
            listen 80;
            server_name wp.com;
    
            location / {
                    root /code;
                    index index.html;
                    proxy_pass http://{{ ansible_fqdn }};
                    proxy_set_header Host $http_host;
            }
    }
    

    Ansible Jinja2管理keepalived

    ansible使用jinja2模板的if判断表达式渲染出keepalived高可用配置文件,并推送到lb主机上。


    推送keepalived配置文件

    [root@m01 ~]# vim keepalived.yml
    - hosts: lb_group
      tasks:
        - name: copy file
          template:
            src: ./keepalived.j2
            dest: /etc/keepalived/keepalived.conf
          notify: restart keepalived
    
      handlers:
        - name: restart keepalived
          systemd:
            name: keepalived
            state: restarted
    

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

    准备keepalived配置文件

    [root@m01 ~]# vim keepalived.j2
    global_defs {
        router_id {{ ansible_fqdn }}
    }
    
    vrrp_instance VI_1 {
    {% if ansible_fqdn == "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
        }
    }
    

    使用jinjia2管理mysql配置文件

    [root@m01 ~]# vim /etc/my.cnf
    [mysqld]
    basedir=/usr
    datadir=/var/lib/mysql/
    socket=/var/lib/mysql/mysql.sock
    log_error=/var/log/mariadb/mariadb.log
    
    {% if ansible_memtotal_mb == %}
    innodb_buffer_pool_size={{ ansible_memtotal_mb * 4/5 }}		
    
    
  • 相关阅读:
    antd表单验证图片 必须上传
    interface和type的区别
    Typescript+React封装路由拦截组件
    redux和sessionStorage,localStorage的区别
    ES6中数组和对象的扩展运算符拷贝问题以及常用的深浅拷贝方法
    从变量提升角度看待暂时性死区
    MySQL修改root密码
    用VScode配置Python开发环境
    element UI 制作带月份快捷选项的时间选择器
    React v16.4 的生命周期
  • 原文地址:https://www.cnblogs.com/syy1757528181/p/13166190.html
Copyright © 2011-2022 走看看