• 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
    

  • 相关阅读:
    浅谈对java中锁的理解
    Spring 4 支持的 Java 8 特性
    【转】Java线程面试题 Top 50
    JVM知识点总览-中高级Java工程师面试必备
    [LeetCode] 195. Tenth Line 第十行
    [LeetCode] 281. Zigzag Iterator 之字形迭代器
    [LeetCode] 324. Wiggle Sort II 摆动排序 II
    [LeetCode] 280. Wiggle Sort 摆动排序
    [LeetCode] 167. Fraction to Recurring Decimal 分数转循环小数
    [LeetCode] 187. Repeated DNA Sequences 求重复的DNA序列
  • 原文地址:https://www.cnblogs.com/gongjingyun123--/p/11600323.html
Copyright © 2020-2023  润新知