1、Jinja2 介紹
-
Jinja2 是基于 python 的模板引擎,功能比較類似于 PHP 的 smarty,J2ee 的 Freemarker和velocity。它能完全支持unicode,并具有集成的沙箱執行環境,應用廣泛。
-
jinja2使用BSD授權
-
Jinja2的語法是由 variables(變量) 和 statement(語句) 組成,如下;
1、variables:可以輸出數據
?my_variables mysql_port 3307 ? ?{{ msyql_port | default('3306') }} ? ?# 默認變量
?{{ some_dudes_name | capitalize }}?
2、statements: 可以用來創建條件和循環等
if語句:
{% if my_conditional %}?
...
{% endif %}for 語句:
{% for item in all_items %}
`item`?
……
{% endfor %}
-
jinja2 支持使用帶過濾器的Unix型管道操作符,有很多的內置過濾器可供使用。
-
我們可以用簡單if和for就可以建立幾乎任何的常規配置文件,不過如果你有意更進一步,jinja2 documentation (http://jinja.pocoo.org/docs/dev/)包含了很多有趣的東西可供了解。
3、jinja2 使用實例
1、引用變量?
1、ansible 目錄結構
?[root@ansible-server ansible]# cd roles/template/
.
├── meta
│ ? └── main.yml
├── tasks
│ ? ├── template.yml ?
│ ? └── main.yml
├── templates
│ ? ├── order.j2
└── vars
? ? └── main.yml
?2、調度yml文件
[root@ansible-server ansible]# cat templates.yml
---
- hosts: 192.168.234.102
? user: root
? gather_facts: false
? roles:
? ?- role: template
-
注意: 這里 - role: template 和 - template 是一樣的
3、其他yml文件
[root@ansible-server templates]# cat tasks/main.yml
- include: template.yml[root@ansible-server templates]# cat tasks/template.yml
- name: create {{ PROJECT }} directoryfile: dest=/data/{{ PROJECT }} state=directory
- name: template transfor {{ PROJECT }} dirtemplate: src=order.j2 dest=/data/{{ PROJECT }}/order.conf[root@ansible-server templates]# cat templates/order.j2
project: {{ PROJECT }}
switch: {{ SWITCH }}
dbport: {{ DBPORT }}[root@ansible-server templates]# cat vars/main.yml
PROJECT: "JAVA"
SWITCH: "ON"
DBPORT: "8080"
4、測試
[root@ansible-server ansible]# ansible-playbook templates.yml --syntax-check
playbook: templates.yml
?5、執行
[root@ansible-server ansible]# ansible-playbook templates.yml
PLAY [192.168.234.102] **************************************************************
TASK [template : include] ***************************************************
included: /etc/ansible/roles/template/tasks/template.yml for 192.168.234.102
TASK [template : create JAVA directory] *************************************
changed: [192.168.234.102]
TASK [template : template transfor java dir] ********************************
changed: [192.168.234.102]
PLAY RECAP *********************************************************************
192.168.234.102 : ok=3 changed=2 unreachable=0 failed=0
6、查看結果
[root@ansible-server ansible]# cat /data/JAVA/order.conf
project: JAVA
switch: ON
dbport: 8080
2、for 語句
-
為遠程主機生成服務器列表,加入該列表從192.168.234.102 web01.test.com 到192.168.234.103?web11.test.com 結束,如果手動添加就很不科學了,這里需要使用jinja2語法的for循環通過模板批量生成對應的配置文件,如下:
1、ansible 目錄結構
[root@ansible-server ansible]# cd roles/test_hosts
[root@ansible-server test_hosts]# tree
.
├── meta
│ └── main.yml
├── tasks
│ ├── file1.yml
│ └── main.yml
├── templates
│ └── test1.j2
└── vars└── main.yml
2、調度yml文件
[root@ansible-server ansible]# cat test_hosts.yml
---
- hosts: 192.168.234.102user: rootgather_facts: falseroles:- role: test_hosts
3、各目錄下 yml文件內容:
[root@ansible-server test_hosts]# cat tasks/file1.yml
- name: ansible jinja2 template for hosts configtemplate: src=test1.j2 dest=/tmp/httpd.conf.test[root@ansible-server test_hosts]# cat tasks/main.yml
- include: file1.yml[root@ansible-server test_hosts]# cat templates/test1.j2
{% for id in range(201,212) %}
192.168.234.{{ id }} web{{ "%02d" | format(id-200) }}.test.com
{% endfor %}# 解釋:
{{ id }} # 提取for循環中對應的變量id值
"%02d" # 調用的是python內置的字符串格式化輸出(%d格式化整數)因為是01,02這種格式,所以是保留2位,故用02,然后將結果通過管道符 “|” 傳遞給format 函數做二次處理。
4、執行
[root@ansible-server ansible]# ansible-playbook test_hosts.yml