• ansible剧本--day07--jinja模板实操


    Ansible之jinja2模板

    什么是jinja模板

    # jinja模块介绍
    jinja2是Python的全功能模板引擎,通常将管理端的文件cp到被管理端,而管理端中的文件存在ansible变量,则此文件被称为jinja模板,一般此模板以.j2结尾命名,如需要使模板中变量生效,及在推送至客户端时需要使用名为template模块。该模块和copy一样,区别就在于template可以获取到文件中的变量。
    
    # 注意:
    ansible允许jinja2模板中使用条件判断和循环,但是不允许在playbook中使用
    

    jinja模板使用基本语法

    ## 模板文件:也就是我们的配置文件(要推送的文件,并且文件中需要变量)
    
    ## 调用变量
    {{ 变量名 }}  ## jinja2会自动把带有{{ 变量名 }} 替换成变量值
    
    ## 模板文件里的变量
    1.可以调用自己设置的web_user_group: www
    {{ web_user_group }}
    
    2.可以调用facts变量:ansible web01 -m setup
    {{ ansible_fqdn }}  ## 获取主机名
    {{ ansible_memtotal_mb }}  ## 获取总内存大小
    案例:MySQL根据物理主机的内存大小,来设置分配的内存空间
    MySQL占物理内存的 75% ~ 80%
    

    jinja模板之循环

    ## 逻辑判断语法:
    注释:{# 被注释的内容 #}
    
    循环:{% for 变量名 in range(1,101) %}
            {{ 变量名 }}
    	 {% endfor %}
    	 
    # 案例演示:
    # 1.将配置文件中书写循环,加上变量,并为.j2结尾 (循环1到10,10不算,顾头不顾腚)
    [root@m01 ansible]# cat wp.lb.j2 
    upstream tcy_lb {
    	{% for num in range(1,10) %}
    	server 172.16.1.{{ num }};
    	{% endfor %}
    }
    
    server {
            listen 80;									
            server_name www.wp.com;						 
    
            location / {
                    proxy_pass http://tcy_lb;			
                    include proxy_params;				
     
     proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
            }
    }
    # 2. 使用template模块将模板文件拷贝到被管理端中
    [root@m01 nginx]# ansible web_group -m template -a 'src=/ansible/wp.lb.j2 dest=/root/'
    
    # 3. 查看被管理端文件 
    [root@web01 ~]# cat wp.lb.j2 
    upstream tcy_lb {
    		server 172.16.1.1;
    		server 172.16.1.2;
    		server 172.16.1.3;
    		server 172.16.1.4;
    		server 172.16.1.5;
    		server 172.16.1.6;
    		server 172.16.1.7;
    		server 172.16.1.8;
    		server 172.16.1.9;
    	}
    
    server {
            listen 80;									
            server_name www.wp.com;						 
    
            location / {
                    proxy_pass http://tcy_lb;			
                    include proxy_params;				
     
     proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
            }
    }
    

    jinja模板之判断

    # 判断: 
    {% if ansible_fqdn == 'db01' %}
    	mem=16G
    {% elif ansible_fqdn == 'db02' %}
    	mem=8G
    {% else %}
    	mem=4G
    {% endif %}
    

    Jinja2的使用

    案例一:使用变量推送motd

    {# 直接调用变量的方式 #}
    [root@m01 ~]# cat motd.j2
    欢迎来到红浪漫
    总共技师个数: {{ ansible_memtotal_mb }}
    剩余技师个数: {{ ansible_memfree_mb }}
    红浪漫浦东新区地址: {{ ansible_eth0['ipv4']['address'] }}
    
    [root@m01 ~]# cat push_motd.yml 
    - hosts: all
      tasks:
        - name: Push Motd File
          template:
            src: ./motd.j2
            dest: /etc/motd
    

    案例二:使用Jinja2管理nginx

    [root@m01 ~]# cat proxy.conf 
    upstream web {
    	{# 下面的循环是1-100的IP #}
    	{% for num in range(1,101) %}
    	server 10.0.0.{{ num }}:{{ backend_port }}
    	{% endfor %}
    }
    server {
    	listen {{ port }};
    
    	{% if ansible_hostname == 'web01' %}
    		server_name {{ domain_name1 }};
    	{% elif ansible_hostname == 'web02' %}
    		server_name {{ domain_name2 }};
    	{% else %}
    		server_name {{ domain_name3 }};
    	{% endif %}
    
    	location / {
    		proxy_pass http://web;
    		proxy_set_header Host $host;
    	}
    }
    
    
    [root@m01 ~]# cat a.yml 
    - hosts: web_group
      vars:
        - backend_port: 8080
        - port: 80
      tasks:
        - name: config nginx conf
          template:
            src: ./proxy.conf
            dest: /root
    

    案例三:使用jinja2管理keepalived

    {# keepalived的配置文件 #}
    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
        }
    }
    
    
    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配置文件改成模板文件 #}
    global_defs {
        router_id {{ ansible_fqdn }}
    }
    
    vrrp_instance VI_1 {
    	{% if ansible_fqdn == 'lb01' %}
        state MASTER
        priority 150
        {% elif ansible_fqdn == 'lb02' %}
        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
        }
    }
    
    {# 推送的文件 #}
    
    [root@m01 ~]# vim a.yml
    - hosts: lb_group
      vars:
      tasks:
        - name: config keep conf
          template:
            src: ./keep.conf
            dest: /root
    
        - name: xxx shell
          copy:
            src:
            dest:
          when: ansible_fqdn == 'lb01'
    

    案例四:Jinja2管理MySQL

    {# 安装配置MySQL #}
    - hosts: db_group
      tasks:
        - name: i m
          yum:
            name:
              - mariadb-server
              - MySQL-python
            state: present
    
        - name: t c
          template:
            src: ./my.j2
            dest: /etc/my.cnf
    
    {# MySQL的模板文件 #}
    [root@m01 ~]# vim my.j2 
    
    [mysqld]
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    innodb_buffer_pool_size = {{ (ansible_memtotal_mb * 80 / 100)|int }}
    symbolic-links=0
    [mysqld_safe]
    log-error=/var/log/mariadb/mariadb.log
    pid-file=/var/run/mariadb/mariadb.pid
    
    !includedir /etc/my.cnf.d
    
  • 相关阅读:
    ios arc __strong与__weak的一个小实例
    ObjectiveC block详解
    网站开发中JS中的常用语句
    js数组的操作
    sql常用语句
    复制myeclipse工程,注意事项
    JSP入门代码
    传智播客——struts2添加request/session/application属性
    WEB 开发前传——js笔记
    jdbc初步(转)
  • 原文地址:https://www.cnblogs.com/tcy1/p/13144631.html
Copyright © 2020-2023  润新知