1. 程式人生 > 其它 >Ansible Jinja2 模板

Ansible Jinja2 模板

Ansible Jinja2 模板

Jinja2介紹

什麼是Jinja2

jinja2是Python的全功能模板引擎

Jinja2跟ansible的關係

Ansible通常會使用jinja2模板來修改被管理主機的配置檔案等...在saltstack中同樣會使用到jinja2 如果在100臺主機上安裝nginx,每臺nginx的埠都不一樣,如何解決?

使用Jinja2

使用Ansible的jinja2模板也就是使用template模組,該模組和copy模組一樣,都是講檔案複製到遠端主機上去,但是區別在於,template模組可以獲取到檔案中的變數,而copy則是原封不動的把檔案內容複製過去。之前我們在推送rsync的backup指令碼時,想把指令碼中的變數名改成主機名,如果使用copy模組則推送過去的就是{{ ansible_fqdn}},不變,如果使用template,則會變成對應的主機名。

注意事項

Ansible允許jinja2模板中使用條件判斷和迴圈,但是不允許在playbook中使用。
只能在template模組要推送的檔案中使用Jinja2語法
使用Jinja2要注意,配置檔案中是否有特殊符號

Jinja2語法

## 變數呼叫語法
{{ 變數名 }}:呼叫變數,輸出變數的值
playbook使用template模組

## 判斷語法:

{% if 條件 %}
xxx
{% else %}
aaa
{% endif %}

## for迴圈語法

{% for n in 變數 %}
xxx
{% endfor %}

## 註釋
{# 這裡是註釋內容 #}

Ansible中的Jinja2規範

所有的Jinja2模板檔案要以j2結尾

簡單的Jinja2使用

jinja2管理開機介面檔案

[root@m01 ~]# cat motd.j2

本機記憶體: {{ ansible_memtotal_mb }}
剩餘記憶體: {{ ansible_memfree_mb }}
本機外網: {{ ansible_default_ipv4.address }}
本機內網: {{ ansible_eth1.ipv4.address }}
本機名字: {{ ansible_hostname }}

[root@m01 ~]# cat a.yml
- hosts: all
  tasks:
    - name: motd
      template:
        src: ./motd.j2
        dest: /etc/motd

Jinja2管理nginx配置檔案

upstream {{ server_name }} {
{% for num in range(1,11) %}
         server 172.16.1.{{ num }};
{% endfor %}
}
server {
        listen 80;
        server_name {{ server_name }};
        location / {
                proxy_pass http://{{ server_name }};
        }
}

[root@m01 ~]# vim a.yml
- hosts: all
  vars:
    server_name: blog.drz.com
  tasks:
    - name: nginx
      template:
        src: ./nginx_upstream.j2
        dest: /root/nginx_upstream.conf

Jinja2管理keepalived配置檔案

global_defs {                        #全域性配置
    router_id lb01                   #標識身份->名稱
}
    vrrp_instance VI_1 {
    state MASTER                     #標識角色狀態
    interface eth0                   #網絡卡繫結介面
    virtual_router_id 50             #虛擬路由id
    priority 150                     #優先順序
    advert_int 1                     #監測間隔時間
    authentication {                 #認證
        auth_type PASS               #認證方式
        auth_pass 1111               #認證密碼
    }
    virtual_ipaddress {
        10.0.0.3                     #虛擬的VIP地址
    }
}

[root@m01 ~]# cat keep.j2
global_defs {
    router_id {{ ansible_hostname }}
}
vrrp_instance VI_1 {
{% if ansible_hostname == 'lb01' %}
    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
    }
}

Jinja2模板計算

mysql配置檔案
記憶體大小要根據實體記憶體的 80%


[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
innodb_buffer_pool_size={{ ansible_memtotal_mb * 0.8 }}


[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

!includedir /etc/my.cnf.d


[root@m01 ~]# cat a.yml
- hosts: all
  tasks:
    - name: db
      template:
        src: ./my.j2
        dest: /root/my.cnf

本文來自部落格園,作者:遠方還很遠,轉載請註明原文連結:https://www.cnblogs.com/moqiqingyu/p/15152582.html