zoukankan      html  css  js  c++  java
  • Ansible --05 ansible jinja2

    ansible jinja2

    什么是jinjia2模板

    jinjia2是Python的全功能模块引擎

    Jinjia2与Ansible的关系

    Ansible通常会使用jinjia2模板来修改被管理主机的配置文件等...在saltack中同样会使用到jinjia2

    如果在100台主机上安装nginx,每台nginx的端口都不一样,如何解决?

    Ansible如何使用Jinjia2

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

    Ansible使用Jinjia2注意事项

    Ansible允许jinjia2模板中使用条件判断和循环,但是不允许在playbook中使用。

    注意:不是每个管理员都需要这个特性,但是有些时候jinjia2模块能大大提高效率。

    Ansible Jinjia2模板使用

    jinja2基本 语法

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

    jinjia2模板逻辑判断

    #循环表达式
    {% for i in EXPR %}
    {% endfor %}
    
    #条件判断
    {% if EXPR %}
    {% elif EXPR %}
    {% else %}
    {% endif %}
    
    #注释
    {# COMMENT #}
    

    测试jinja2

    #编辑playbook
    [root@m01 ~]# vim jinja2.yml
    - hosts: all
      tasks:
        - name: scp motd
          template:
            src: /etc/motd
            dest: /etc/motd
    
    #准备motd文件
    [root@m01 ~]# vim /etc/motd
    Welcome to {{ ansible_fqdn }}
    This system total mem is : {{ ansible_memtotal_mb }} MB
    This system free mem is: {{ ansible_memfree_mb }} MB
    
    #执行playbook
    [root@m01 ~]# ansible-playbook jinja2.yml
    
    PLAY [web_group] *****************************************************************************************************************************************************************************************************************************
    
    TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************
    ok: [web02]
    ok: [web01]
    
    TASK [Copy Template File] ********************************************************************************************************************************************************************************************************************
    changed: [web01]
    changed: [web02]
    
    PLAY RECAP ***********************************************************************************************************************************************************************************************************************************
    web01                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    web02                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    
    #查看结果
    [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变量,达到我们想要的目的,实现自动化的需求。

    Ansible Jinjia2管理nginx

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

    使用playbook推送文件

    #编辑playbook
    [root@m01 ~]# vim lb.yml
    - hosts: lb_group
      vars:
        http_port: 80
        server_name: www.drz.com
      tasks:
        - name: copy
          template:
            src: ./www.drz.com.conf.j2
            dest: /etc/nginx/conf.d/www.drz.com.conf
          notify: reload nginx
      handlers:
        - name: reload nginx
          systemd:
            name: nginx
            state: reloaded
            
    #准备配置文件
    [root@m01 ~]# vim www.drz.com.conf.j2
    upstream {{ server_name }} {
    {% for n in range(21) %}
            server 172.16.1.{{ n }}:{{ up_port }};
    {% endfor %}
    }
    
    server {
            listen 80;
            server_name {{ server_name }};
    
            location / {
                    root /code;
                    index index.html;
                    proxy_pass http://{{ server_name }};
                    proxy_set_header Host $http_host;
            }
    }
    

    Ansible jinja2渲染负载均衡配置文件

    [root@m01 ~]# cat nginx.conf.j2 
    upstream {{ domain_name }} {
    {% for ip in range(1,16) %}
    	server 172.16.1.{{ ip }}:{{ upstream_port }};
    {% endfor %}
    }
    
    server {
    	listen {{ server_port }};
    	server_name {{ domain_name }};
    
    	location / {
    		root {{ code_dir }};
    		index index.html;
    		proxy_pass http://{{ domain_name }};
    		proxy_set_header HOST $http_host;
    	}
    }
    
    [root@m01 ~]# cat  nginx.yml 
    - hosts: all
      vars_files: ./wordpress_vars.yml
      tasks:
        - name: configure nginx conf
          template:
            src: ./nginx.conf.j2
            dest: /opt/{{ domain_name }}.conf
    
    [root@m01 ~]# cat wordpress_vars.yml 
    domain_name: www.drz.com
    upstream_port: 8080
    server_port: 80
    code_dir: /code/wordpress
    

    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 ~]# cat keepalived.conf.j2 
    global_defs {
        router_id {{ ansible_fqdn }}
    }
    
    vrrp_instance VI_1 {
    {% if ansible_fqdn == 'web01' %}
        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
        }
    }
    
    [root@m01 ~]# cat keep.yml 
    - hosts: webs
      tasks:
        - name: configure keep conf
          template:
            src: ./keepalived.conf.j2
            dest: /opt/keepalive.conf
    

  • 相关阅读:
    UVa 1151 Buy or Build【最小生成树】
    UVa 216 Getting in Line【枚举排列】
    UVa 729 The Hamming Distance Problem【枚举排列】
    HDU 5214 Movie【贪心】
    HDU 5223 GCD
    POJ 1144 Network【割顶】
    UVa 11025 The broken pedometer【枚举子集】
    HDU 2515 Yanghee 的算术【找规律】
    Java基本语法
    Java环境变量,jdk和jre的区别,面向对象语言编程
  • 原文地址:https://www.cnblogs.com/gongjingyun123--/p/11600323.html
Copyright © 2011-2022 走看看