• jinja2模板


    toc

    调用变量

    Jinja2是 Python 下一个被广泛应用的模版引擎,Ansible 可以使用jinja2模板调用变量等。
    jinja2

    ## 写一个模板文件(使用facts变量)
    [root@Ansible project]# vim jinja.j2
    {{ ansible_distribution }}      ## 受控端系统
    {{ ansible_eth0.ipv4.address }}   ## 受控端eth0的IP
    {{ ansible_hostname }}    ## 受控端主机名
    {{ ansible_memtotal_mb // 4 }}    ## 受控端总内存除以4取整
    ## 模板文件放到受控端(根据变量转换成值)
    [root@Ansible project]# vim copy_file.yml
    - hosts: hosts
      tasks:
        - name: Copy File
          template:        ##copy模块不支持转换模板文件
            src: ./jinja.j2
            dest: /tmp/test.txt
        - name: Cat File
          shell: cat /tmp/test.txt
          register: test_file
        - name: Print test_file
          debug:
            var: test_file.stdout_lines
    ## 执行一下查看结果
    [root@Ansible project]# ansible-playbook copy_file.yml 
    
    PLAY [hosts] *****************************************************************************************************
    
    TASK [Gathering Facts] *******************************************************************************************
    ok: [nfs1]
    ok: [web1]
    
    TASK [Copy File] *************************************************************************************************
    changed: [nfs1]
    changed: [web1]
    
    TASK [Cat File] **************************************************************************************************
    changed: [web1]
    changed: [nfs1]
    
    TASK [Print test_file] *******************************************************************************************
    ok: [nfs1] => {
        "test_file.stdout_lines": [
            "CentOS", 
            "192.168.1.3", 
            "nfs", 
            "243"
        ]
    }
    ok: [web1] => {
        "test_file.stdout_lines": [
            "CentOS", 
            "192.168.1.2", 
            "web", 
            "243"
        ]
    }
    
    PLAY RECAP *******************************************************************************************************
    nfs1 : ok=4 changed=2 unreachable=0 failed=0   
    web1 : ok=4 changed=2 unreachable=0 failed=0

    判断语句

    语句:{% if EXPR %}...{% elif EXPR %}..{% else %}...{% endif %}

    Keepalived配置文件(这里就web作为主,nfs作为备)

    写一个简单keepalived配置文件的jinja模板
    [root@Ansible project]# vim keepalived.conf.j2 
    global_defs {
       router_id {{ ansible_hostname }}
    }
    vrrp_instance VI_1 {
    {% if ansible_hostname=="web" %}     ## ansible_hostname变量等于web就引用下面内容
        state MASTER
        priority 150
    {% elif ansible_hostname=="nfs" %}    ## ansible_hostname变量等于nfs就引用下面内容
        state BACKUP
        priority 100
    {% endif %}      ## 判断语句结束
        interface eth0
        virtual_router_id 51
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.1.2
            192.168.1.3
        }
    }
    ## 配置keepalived加上显示文件内容方便查看结果(这里安装和启动就不写了)
    [root@Ansible project]# vim keepalived.yml
    - hosts: hosts
      tasks:
        - name: Configure Keepalived Server
          template:
            src: ./keepalived.conf.j2
            dest: /etc/keepalived/keepalived.conf
        - name: Cat keeplived Configure
          shell: cat /etc/keepalived/keepalived.conf
          register: keepalived_config
        - name: Print Keepalived Configure
          debug:
            var: keepalived_config.stdout_lines
    ## 执行一下
    [root@Ansible project]# ansible-playbook keepalived.yml 
    PLAY [hosts] *****************************************************************************************************
    
    TASK [Gathering Facts] *******************************************************************************************
    ok: [web1]
    ok: [nfs1]
    
    TASK [Configure Keepalived Server] *******************************************************************************
    changed: [nfs1]
    changed: [web1]
    
    TASK [Cat keeplived Configure] ***********************************************************************************
    changed: [nfs1]
    changed: [web1]
    
    TASK [Print Keepalived Configure] ********************************************************************************
    ok: [nfs1] => {
        "keepalived_config.stdout_lines": [
            "global_defs {", 
            " router_id nfs", 
            "}", 
            "vrrp_instance VI_1 {", 
            " state BACKUP", 
            " priority 100", 
            " interface eth0", 
            " virtual_router_id 51", 
            " advert_int 1", 
            " authentication {", 
            " auth_type PASS", 
            " auth_pass 1111", 
            " }", 
            " virtual_ipaddress {", 
            " 192.168.1.2", 
            " 192.168.1.3", 
            " }", 
            "}"
        ]
    }
    ok: [web1] => {
        "keepalived_config.stdout_lines": [
            "global_defs {", 
            " router_id web", 
            "}", 
            "vrrp_instance VI_1 {", 
            " state MASTER", 
            " priority 150", 
            " interface eth0", 
            " virtual_router_id 51", 
            " advert_int 1", 
            " authentication {", 
            " auth_type PASS", 
            " auth_pass 1111", 
            " }", 
            " virtual_ipaddress {", 
            " 192.168.1.2", 
            " 192.168.1.3", 
            " }", 
            "}"
        ]
    }
    
    PLAY RECAP *******************************************************************************************************
    nfs1 : ok=4 changed=2 unreachable=0 failed=0   
    web1 : ok=4 changed=2 unreachable=0 failed=0   

    循环语句

    语句:{% for i in EXPR %}...{% endfor %}

    ## 循环定义upstream池
    [root@Ansible project]# vim songguoyou.conf.j2 
    uptream {{ server_name }} {
    {% for i in range(1,10) %}
            server 192.168.1.{{i}}:{{ http_port }} weigth=2;
    {% endfor %}
    }
    server {
            listen {{ http_port }};
            server_name {{ server_name }};
            location / {
                    proxy_pass http://{{ server_name }};
                    proxy_set_header Host $http_host;
            }     
    }
    ## 写Playbook,里面定义jinja模板引用的变量
    [root@Ansible project]# vim nginx.yml
    - hosts: web
      vars:
        server_name: www.songguoyou.com
        http_port: 80
      tasks:
        - name: Configure Nginx Server
          template:
            src: ./songguoyou.conf.j2
            dest: /etc/nginx/conf.d/songguoyou.conf
        - name: Cat Nginx Configure
          shell: cat /etc/nginx/conf.d/songguoyou.conf
          register: nginx_config
        - name: Print Nginx Configure
          debug:
            var: nginx_config.stdout_lines
    ## 执行一下
    [root@Ansible project]# ansible-playbook nginx.yml          
    
    PLAY [web] *******************************************************************************************************
    
    TASK [Gathering Facts] *******************************************************************************************
    ok: [web1]
    
    TASK [Configure Nginx Server] ************************************************************************************
    changed: [web1]
    
    TASK [Cat Nginx Configure] ***************************************************************************************
    changed: [web1]
    
    TASK [Print Nginx Configure] *************************************************************************************
    ok: [web1] => {
        "nginx_config.stdout_lines": [
            "uptream www.songguoyou.com {", 
            " server 192.168.1.1:80 weigth=2;", 
            " server 192.168.1.2:80 weigth=2;", 
            " server 192.168.1.3:80 weigth=2;", 
            " server 192.168.1.4:80 weigth=2;", 
            " server 192.168.1.5:80 weigth=2;", 
            " server 192.168.1.6:80 weigth=2;", 
            " server 192.168.1.7:80 weigth=2;", 
            " server 192.168.1.8:80 weigth=2;", 
            " server 192.168.1.9:80 weigth=2;", 
            "}", 
            "server {", 
            " listen 80;", 
            " server_name www.songguoyou.com;", 
            " location / {", 
            " proxy_pass http://www.songguoyou.com;", 
            " proxy_set_header Host $http_host;", 
            " }", 
            "", 
            "}"
        ]
    }
    
    PLAY RECAP *******************************************************************************************************
    web1 : ok=4 changed=2 unreachable=0 failed=0   
  • 相关阅读:
    企业库相关资源下载Enterprise Library Download[2007.5.29更新]
    企业库EntLib初识(3)配置管理应用程序块ConfigurationApplicationBlock
    我喜欢博客园
    今天是个值得纪念的日子
    Three collaboration teamwork Tools
    How to do ‘undo’ in TortoiseSVN
    继承windows service的安装类出现的多余服务被安装的问题
    List Sort 使用的注意几点
    下面两段代码,你认为那一段写的更好?
    asp.net 2.0教程 c#中的接口、抽象、委托
  • 原文地址:https://www.cnblogs.com/songguoyou/p/11883362.html
Copyright © 2020-2023  润新知