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   

posted on 2019-11-18 17:05  云襄  阅读(181)  评论(0编辑  收藏  举报

导航