Ansible Jinja2 模板使用、語法與使用案例
主機規劃

添加用戶賬號
說明:
1、 運維人員使用的登錄賬號;
2、 所有的業務都放在 /app/ 下「yun用戶的家目錄」,避免業務資料亂放;
3、 該用戶也被 ansible 使用,因為幾乎所有的生產環境都是禁止 root 遠程登錄的(因此該 yun 用戶也進行了 sudo 提權),
1 # 使用一個專門的用戶,避免直接使用root用戶 2 # 添加用戶、指定家目錄并指定用戶密碼 3 # sudo提權 4 # 讓其它普通用戶可以進入該目錄查看資訊 5 useradd -u 1050 -d /app yun && echo '123456' | /usr/bin/passwd --stdin yun 6 echo "yun ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers 7 chmod 755 /app/
Ansible 配置清單Inventory
之后文章都是如下主機配置清單
1 [yun@ansi-manager ansible_info]$ pwd 2 /app/ansible_info 3 [yun@ansi-manager ansible_info]$ cat hosts_key 4 # 方式1、主機 + 埠 + 密鑰 5 [manageservers] 6 172.16.1.180:22 7 8 [proxyservers] 9 172.16.1.18[1:2]:22 10 11 # 方式2:別名 + 主機 + 埠 + 密碼 12 [webservers] 13 web01 ansible_ssh_host=172.16.1.183 ansible_ssh_port=22 14 web02 ansible_ssh_host=172.16.1.184 ansible_ssh_port=22 15 web03 ansible_ssh_host=172.16.1.185 ansible_ssh_port=22
Jinja2 模板概述
官網地址
http://docs.jinkan.org/docs/jinja2/
Jinja2 是一個現代的,設計者友好的,仿照 Django 模板的 Python 模板語言, 它速度快,被廣泛使用,并且提供了可選的沙箱模板執行環境保證安全,
Ansible 如何使用 jinja2 模板
Ansible 使用 jinja2 模板,也就是 template 模板,該模塊和 copy 模塊一樣,都是將檔案復制到目標機器,但是區別在于 template 模塊可以獲取要復制檔案中的變數的值,而 copy 則是原封不動的把檔案內容復制過去,
實際運用,比如:針對不同的主機定義不同的變數,template 會在將檔案分發前讀取變數到 jinja2 模板,之后再然后分發到不同的被管理主機上,
Jinja2 常用語法
賦值
為變數賦值,優先級高于 playbook 中的優先級,
1 {% set username = 'zhang' %} 2 {% set navigation = [('index.html', 'Index'), ('about.html', 'About')] %}
注釋
{# ... #}:要把模板中一行或多行注釋掉,默認的注釋語法,
變數
{{ ... }}:把運算式的結果列印到模板上,
你可以使用點( . )來訪問變數的屬性,作為替代,也可以使用所謂的“下標”語 法( [] ),如下示例:
1 {{ foo.bar }} 2 {{ foo['bar'] }}
示例:{{ a_variable }}、{{ foo.bar }}、{{ foo['bar'] }}
花括號不是變數的一部分,而是列印陳述句的重要一部分,
條件判斷
Jinja 中的 if 陳述句可比 Python 中的 if 陳述句,
在最簡單的形式中,你可以測驗一個變數是否未定義,為慷訓 false:
簡單形式:
1 {% if 條件運算式 %} 2 …… 3 {% endif %}
多分支形式:
1 {% if 條件運算式 %} 2 …… 3 {% elif 條件運算式 %} 4 …… 5 {% else %} 6 …… 7 {% endif %}
回圈陳述句
for 回圈陳述句
1 {% for user in users %} 2 {{ user.username }} 3 {% endfor %}
空白控制
默認配置中,模板引擎不會對空白做進一步修改,所以每個空白(空格、制表符、換行符 等等)都會原封不動回傳,
此外,你也可以手動剝離模板中的空白,當你在塊(比如一個 for 標簽、一段注釋或變數運算式)的開始或結束放置一個減號( - ),可以移除塊前或塊后的空白,如下:
1 {% for item in range(1,9) -%} 2 {{ item }} 3 {%- endfor %}
輸出的所有元素前后不會有任何空白,輸出會是 123456789 ,
轉義
有時想要或甚至必要讓 Jinja 忽略部分,而不會把它作為變數或塊來處理,那么有如下兩種方式:
單行轉義:簡單方式
需求:把 “{ {“ 作為原始字串使用,而不是一個變數的開始部分,
{{ '{{' }}
多行轉義:
需求:將如下一塊代碼不進行任何處理,直接列印輸出,
1 {% raw %} 2 <ul> 3 {% for item in seq %} 4 <li>{{ item }}</li> 5 {% endfor %} 6 </ul> 7 {% endraw %}
HTML 手動轉義
如果你有一個可能包含 >、<、& 或 " 字符的變數,那么你需要轉義它;否則會被 HTML 使用,
轉義通過用管道傳遞到過濾器 |e 來實作,如:
{{ user.username|e }}
宏定義
宏類似常規編程語言中的函式,它們用于把常用行為作為可重用的函式,取代手動重復的作業,
如果宏在不同的模板中定義,你需要首先使用 import ,
示例:
1 ## 宏變數順序和具體內容變數順序一致「推薦寫法」 2 {% macro input(name, value=https://www.cnblogs.com/zhanglianghhh/p/'', type='text', size=20) -%} 3 <input name="{{ name }}" value=https://www.cnblogs.com/zhanglianghhh/p/"{{ value|e }}" type="{{ type }}" size="{{ size }}"> 4 {%- endmacro %} 5 ## 宏變數順序和具體內容變數的順序可以交錯「不推薦寫法」 6 {% macro input(name, value=https://www.cnblogs.com/zhanglianghhh/p/'', type='text', size=20) -%} 7 <input type="{{ type }}" name="{{ name }}" value=https://www.cnblogs.com/zhanglianghhh/p/"{{ value|e }}" size="{{ size }}"> 8 {%- endmacro %}
宏變數解釋:
name:默認為空,參考時必填
value:默認為空字串
type:默認為 text
size:默認為 20
在命名空間中,宏之后可以像函式一樣呼叫:
1 <p>{{ input('username') }}</p> ## 結果為:<p><input name="username" value=https://www.cnblogs.com/zhanglianghhh/p/"" type="text" size="20"></p> 2 <p>{{ input('password', type='password') }}</p> ## 結果為:<p><input name="password" value=https://www.cnblogs.com/zhanglianghhh/p/"" type="password" size="20"></p>
import 匯入
匯入宏,并在不同的模板中使用,
1 # 示例:匯入 nginx 變數 2 {% from 'nginx_var.info' import nginx_package_path, nginx_version %}
過濾器
變數可以通過 過濾器 修改,過濾器與變數用管道符號( | )分割,并且也可以用圓括號傳遞可選引數,多個過濾器可以鏈式呼叫,前一個過濾器的輸出會被作為后一個過濾器的輸入,
例如 {{ name|striptags|title }}、{{ list|join(', ') }}
內置過濾器清單
http://docs.jinkan.org/docs/jinja2/templates.html#builtin-filters
ansible 自帶過濾器
https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html?highlight=filter
Tests 測驗
除了過濾器,所謂的「Tests」也是可用的,要測驗一個變數或運算式,你要在變數后加上一個 is 和 Tests 的名稱,當然 Tests 也可以接受引數,
內置測驗清單
http://docs.jinkan.org/docs/jinja2/templates.html#builtin-tests
ansible 自帶測驗
https://docs.ansible.com/ansible/latest/user_guide/playbooks_tests.html
算術
Jinja 允許用計算值,這在模板中很少用到,但是為了完整性允許其存在,
支持如下運算子:
1 +:把兩個物件加到一起,如:{{ 1 + 1 }} 等于 2,但是如果兩者是字串或串列,你可以用這種方式來銜接它們【連接字串推薦使用 ~ 運算子】, 2 3 -:用第一個數減去第二個數,如:{{ 3 - 2 }} 等于 1 , 4 5 /:對兩個數做除法,回傳值會是一個浮點數,如:{{ 1 / 2 }} 等于 {{ 0.5 }} , 6 7 //:對兩個數做除法,回傳整數商,如:{{ 20 // 7 }} 等于 2 , 8 9 %:計算整數除法的余數,如:{{ 11 % 7 }} 等于 4 , 10 11 *:用右邊的數乘左邊的運算元,如:{{ 2 * 2 }} 會回傳 4,也可以用于重復一個字串多次,如:{{ '=' * 80 }} 會列印 80 個等號的橫條, 12 13 **:取左運算元的右運算元次冪,如:{{ 2 ** 3 }} 會回傳 8,
比較
==:比較兩個物件是否相等,
!=:比較兩個物件是否不等,
>:如果左邊大于右邊,回傳 true,
>=:如果左邊大于等于右邊,回傳 true,
<:如果左邊小于右邊,回傳 true,
<=:如果左邊小于等于右邊,回傳 true,
邏輯
對于邏輯判斷,在 for 過濾或 if 運算式中,它可以用于聯合多個運算式:
and:如果左運算元和右運算元同為真,回傳 true,
or:如果左運算元或右運算元有一個為真,回傳 true,
not:對一個運算式取反(見下),
(expr):運算式組,
提示:is 和 in 運算子同樣支持使用中綴記法:foo is not bar 和 foo not in bar,所有的其它運算式需要前綴記法:not (foo and bar) ,
其它運算子
1 in:運行序列/映射包含檢查,如果左運算元 包含于 右運算元,回傳 true ,比如 {{ 1 in [1,2,3] }} 會回傳 true, 2 3 is:運行一個 測驗,參見上述 4 5 |:應用一個 過濾器,參見上述 6 7 ~:把所有的運算元轉換為字串,并且連接它們, {{ "Hello " ~ name ~ "!" }} 會回傳(假設 name 值為 'John' ) Hello John!,
全域函式
range([start], stop[, step]):回傳一個包含整等差級數的串列,
Ansible Jinja2 使用案例-常見功能
本例包含:注釋、賦值、變數、條件判斷、回圈、空白控制、轉義,
目錄結構
1 [yun@ansi-manager jinja]$ pwd 2 /app/ansible_info/jinja 3 [yun@ansi-manager jinja]$ ll 4 total 4 5 drwxrwxr-x 2 yun yun 65 Sep 5 19:34 file 6 -rw-rw-r-- 1 yun yun 188 Sep 5 16:45 test_jinja2_01.yml 7 [yun@ansi-manager jinja]$ ll file/ 8 total 16 9 -rw-rw-r-- 1 yun yun 1562 Sep 5 19:36 test_jinja2_01.conf.j2
組態檔
1 [yun@ansi-manager jinja]$ cat file/test_jinja2_01.conf.j2 # 涉及的檔案 2 ##### 注釋、賦值、變數 示例 3 # 為變數賦值,優先級高于 playbook 中的變數賦值 4 {# 注釋 支持單行或多行 不會在受控機顯示任何注釋資訊 #} 5 {# 簡單賦值 #} 6 {% set username = 'zhangsan' %} 7 {# 賦值一個陣列 #} 8 {% set info = ('name', 'age', 'address') %} {# 或者 {% set info = ['name', 'age', 'address'] %} #} 9 {# 賦值一個二維陣列 #} 10 {% set navigation = [('index.html', 'Index'), ('about.html', 'About')] %} 11 {# 或者如下寫法 12 {% set navigation = (('index.html', 'Index'), ('about.html', 'About')) %} 13 #} 14 15 username = {{ username }} 16 17 info[1] = {{ info[1] }} 18 info = {{ info }} 19 20 navigation[0][1] = {{ navigation[0][1] }} 21 navigation = {{ navigation }} 22 23 # 變數 列印 DNS 資訊 資訊來自于 Ansible Facts 24 host_DNS1 = {{ ansible_dns['nameservers'][0] }} 25 host_DNS2 = {{ ansible_dns.nameservers[0] }} 26 27 ##### 條件判斷、回圈、空白控制、轉義 示例 28 # 條件判斷 29 {# {% if username == 'zhangsan' %} #} 30 {% if username == 'zhangsan1' %} 31 username1 32 {# {% elif username == 'zhangsan' %} #} 33 {% elif username == 'zhangsan2' %} 34 username2 35 {% else %} 36 username_other 37 {% endif %} 38 39 # 回圈 40 {% for host_dns in ansible_dns['nameservers'] %} 41 {{ host_dns }} 42 {% endfor %} 43 44 # 去掉前后空白 45 {% for host_dns in ansible_dns['nameservers'] -%} 46 {{ host_dns }} 47 {%- endfor %} 48 49 # 單行轉義 50 {{ '{{' }} 51 52 # 多行轉義 53 ## 塊中的所有代碼不做任何處理,直接原樣輸出 54 {% raw %} 55 <ul> 56 {% for item in range(1,5) %} 57 <li>{{ item }}</li> 58 {% endfor %} 59 </ul> 60 {% endraw %}
playbook 檔案
1 [yun@ansi-manager jinja]$ cat test_jinja2_01.yml # playbook 檔案 2 --- 3 # ansible jinja2 測驗案例1 4 - hosts: proxyservers 5 vars: 6 - username: coco 7 8 tasks: 9 - name: "test jinja2 01" 10 template: 11 src: ./file/test_jinja2_01.conf.j2 12 dest: /tmp/test_jinja2_01.conf
檔案執行
1 [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key --syntax-check test_jinja2_01.yml # 語法檢測 2 [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key -C test_jinja2_01.yml # 預執行,測驗執行 3 [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key test_jinja2_01.yml # 執行
Ansible Jinja2 使用案例-宏與匯入
本例包含:宏、from 匯入
目錄結構
1 [yun@ansi-manager jinja]$ pwd 2 /app/ansible_info/jinja 3 [yun@ansi-manager jinja]$ ll 4 total 8 5 drwxrwxr-x 2 yun yun 95 Sep 5 20:00 file 6 -rw-rw-r-- 1 yun yun 196 Sep 5 20:08 test_jinja2_02.yml 7 [yun@ansi-manager jinja]$ ll file/ 8 total 12 9 -rw-rw-r-- 1 yun yun 300 Sep 5 20:00 test_jinja2_02.conf.j2 10 -rw-rw-r-- 1 yun yun 209 Sep 5 19:58 test_jinja2_macro.info
宏檔案和組態檔
1 [yun@ansi-manager jinja]$ cat file/test_jinja2_macro.info 2 {# 組態檔中使用宏 #} 3 4 {% macro nginx_package_path(nginx_path="/tmp/package/nginx") -%} 5 {{ nginx_path }} 6 {%- endmacro %} 7 8 {% macro nginx_version(version='1.14.2') -%} 9 {{ version }} 10 {%- endmacro %} 11 12 [yun@ansi-manager jinja]$ cat file/test_jinja2_02.conf.j2 13 {# from 匯入 nginx 變數 #} 14 {% from 'test_jinja2_macro.info' import nginx_package_path, nginx_version %} 15 16 {# 沒有指定,那么就是宏定義的默認值 #} 17 nginx_package_path = {{ nginx_package_path() }} 18 19 {# 有給定值,那么會覆寫默認值 #} 20 nginx_version = {{ nginx_version("1.12.4") }}
playbook 檔案
1 [yun@ansi-manager jinja]$ cat test_jinja2_02.yml 2 --- 3 # ansible jinja2 測驗案例2 4 - hosts: proxyservers 5 6 tasks: 7 - name: "test jinja2 02" 8 template: 9 src: ./file/test_jinja2_02.conf.j2 10 dest: /tmp/test_jinja2_02.conf
檔案執行
1 [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key --syntax-check test_jinja2_02.yml # 語法檢測 2 [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key -C test_jinja2_02.yml # 預執行,測驗執行 3 [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key test_jinja2_02.yml # 執行
Ansible Jinja2 使用案例-算術、比較、邏輯
本例包含:算術、比較、邏輯與其它運算子
目錄結構
1 [yun@ansi-manager jinja]$ pwd 2 /app/ansible_info/jinja 3 [yun@ansi-manager jinja]$ ll 4 total 8 5 drwxrwxr-x 2 yun yun 95 Sep 5 20:00 file 6 -rw-rw-r-- 1 yun yun 196 Sep 5 20:08 test_jinja2_03.yml 7 [yun@ansi-manager jinja]$ ll file/ 8 total 12 9 -rw-rw-r-- 1 yun yun 300 Sep 5 20:00 test_jinja2_03.conf.j2
組態檔
1 [yun@ansi-manager jinja]$ cat file/test_jinja2_03.conf.j2 2 ### 算術 3 加法運算: 3.2 + 5.3 = {{ 3.2 + 5.3 }} 4 減法運算: 5.3 - 3.2 = {{ 5.3 - 3.2 }} 5 除法運算: 5.3 / 3.2 = {{ 5.3 / 3.2 }} 6 取商運算: 5.3 // 3.2 = {{ 5.3 // 3.2 }} 7 取余運算: 5.3 % 3.2 = {{ 5.3 % 3.2 }} 8 乘法運算: 3.2 * 3 = {{ 3.2 * 3 }} 9 次冪運算: 3.2 ** 3 = {{ 3.2 ** 3 }} 10 11 重復一個字符多次:'$' * 20 = {{ '$' * 20 }} 12 13 14 ### 比較 15 比較是否相等: 'zhang' == "zhang" 為:{{ 'zhang' == "zhang" }} 16 比較是否相等: 'zhang' == "zhang1" 為:{{ 'zhang' == "zhang1" }} 17 比較是否不等: 'zhang' != "zhang1" 為:{{ 'zhang' != "zhang1" }} 18 比較是否不等: 'zhang' != "zhang" 為:{{ 'zhang' != "zhang" }} 19 左邊大于右邊: 5.3 > 3.2 為:{{ 5.3 > 3.2 }} 20 左邊大于右邊: 3.2 > 5.3 為:{{ 3.2 > 5.3 }} 21 左邊大于等于右邊: 5.3 >= 5.3 為:{{ 5.3 >= 5.3 }} 22 左邊大于等于右邊: 3.2 >= 5.3 為:{{ 3.2 >= 5.3 }} 23 左邊小于右邊: 5.3 < 3.2 為:{{ 5.3 < 3.2 }} 24 左邊小于右邊: 3.2 < 5.3 為:{{ 3.2 < 5.3 }} 25 左邊小于等于右邊: 5.3 <= 3.2 為:{{ 5.3 <= 3.2 }} 26 左邊小于等于右邊: 5.3 <= 5.3 為:{{ 5.3 <= 5.3 }} 27 28 29 ### 邏輯 30 {% set name1 = 'zhang' %} 31 {% set name2 = "zhang" %} 32 {% set name3 = "li" %} 33 34 ##### and 測驗 35 {% if name1 == 'zhang' and name2 == 'zhang' %} 36 結果:True. 37 {% else %} 38 結果:False. 39 {% endif %} 40 41 {% if name1 == 'zhang' and name3 == 'zhang' %} 42 結果:True. 43 {% else %} 44 結果:False. 45 {% endif %} 46 47 ##### or 測驗 48 {% if name1 == 'zhang' or name2 == 'zhang' %} 49 結果:True. 50 {% else %} 51 結果:False. 52 {% endif %} 53 54 {% if name1 == 'zhang' or name3 == 'zhang' %} 55 結果:True. 56 {% else %} 57 結果:False. 58 {% endif %} 59 60 ##### (expr) 測驗 61 {% if name3 == 'zhang' or ( name1 == 'zhang' and name2 == 'zhang' ) %} 62 結果:True. 63 {% else %} 64 結果:False. 65 {% endif %} 66 67 ##### not 測驗 68 {% if name3 == 'zhang' or not (name1 == 'zhang' and name2 == 'zhang') %} 69 結果:True. 70 {% else %} 71 結果:False. 72 {% endif %}
playbook 檔案
1 [yun@ansi-manager jinja]$ cat test_jinja2_03.yml 2 --- 3 4 # ansible jinja2 測驗案例3 5 - hosts: proxyservers 6 7 tasks: 8 - name: "test jinja2 03" 9 template: 10 src: ./file/test_jinja2_03.conf.j2 11 dest: /tmp/test_jinja2_03.conf
檔案執行
1 [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key --syntax-check test_jinja2_03.yml # 語法檢測 2 [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key -C test_jinja2_03.yml # 預執行,測驗執行 3 [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key test_jinja2_03.yml # 執行
Ansible Jinja2 使用案例-其它運算
本例包含:其它運算子
目錄結構
1 [yun@ansi-manager jinja]$ pwd 2 /app/ansible_info/jinja 3 [yun@ansi-manager jinja]$ ll 4 total 8 5 drwxrwxr-x 2 yun yun 95 Sep 5 20:00 file 6 -rw-rw-r-- 1 yun yun 196 Sep 5 20:08 test_jinja2_04.yml 7 [yun@ansi-manager jinja]$ ll file/ 8 total 12 9 -rw-rw-r-- 1 yun yun 300 Sep 5 20:00 test_jinja2_04.conf.j2
組態檔
1 [yun@ansi-manager jinja]$ cat file/test_jinja2_04.conf.j2 2 # 其他運算子 3 4 ## in 5 左運算元包含于右運算元: {{ 1 in [1,2,3] }} 6 左運算元包含于右運算元: {{ 10 in [1,2,3] }} 7 8 ## is 9 {% set pawd = '123abc' %} 10 Test: {{ pawd is defined }} 11 12 ## ~ 13 {% set name = 'zhang' %} 14 字串連接: "Hello" ~ name ~ '!' ~ 123 = {{ "Hello" ~ name ~ '!' ~ 123 }}
playbook 檔案
1 [yun@ansi-manager jinja]$ cat test_jinja2_04.yml 2 --- 3 4 # ansible jinja2 測驗案例4 5 - hosts: proxyservers 6 7 tasks: 8 - name: "test jinja2 04" 9 template: 10 src: ./file/test_jinja2_04.conf.j2 11 dest: /tmp/test_jinja2_04.conf
檔案執行
1 [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key --syntax-check test_jinja2_04.yml # 語法檢測 2 [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key -C test_jinja2_04.yml # 預執行,測驗執行 3 [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key test_jinja2_04.yml # 執行
Ansible Jinja2 使用案例-過濾器和測驗
本例包含:filters、tests 和 range,
內置過濾清單
http://docs.jinkan.org/docs/jinja2/templates.html#builtin-tests
內置測驗清單
http://docs.jinkan.org/docs/jinja2/templates.html#tests
目錄結構
1 [yun@ansi-manager jinja]$ pwd 2 /app/ansible_info/jinja 3 [yun@ansi-manager jinja]$ ll 4 total 8 5 drwxrwxr-x 2 yun yun 95 Sep 5 20:00 file 6 -rw-rw-r-- 1 yun yun 196 Sep 5 20:08 test_jinja2_05.yml 7 [yun@ansi-manager jinja]$ ll file/ 8 total 12 9 -rw-rw-r-- 1 yun yun 300 Sep 5 20:00 test_jinja2_05.conf.j2
組態檔
1 [yun@ansi-manager jinja]$ cat file/test_jinja2_05.conf.j2 2 {# 變數定義 #} 3 {% set filter01 = -24.5 %} 4 {% set filter02 = 'abcDEGg' %} 5 {% set filter03 = " abCDef G hkIL " %} 6 {% set filter04 = ['physics', 'chemistry', 1997, 2000] %} 7 8 # 過濾器 使用 9 ## 取絕對值 10 {{ filter01|abs() }} 或者 {{ filter01|abs }} 11 ## 首字符大寫,其他小寫 12 {{ filter02|capitalize() }} 或者 {{ filter02|capitalize }} 13 ## 去掉兩端空格 14 |{{ filter03|trim() }}| 或者 |{{ filter03|trim }}| 15 ## 回傳序列的第一個 16 {{ filter04|first() }} 或者 {{ filter04|first }} 17 ## 將序列變為字串,可以指定每個元素間加入什么字符,默認空 18 默認情況: {{ filter04|join() }} 或者 {{ filter04|join }} 19 加入字符: {{ filter04|join('|') }} 20 21 # Tests 測驗 使用 22 ## 變數是否定義 23 未定義: {{ filter00 is defined }} 24 已定義: {{ filter01 is defined }} 25 ## 變數是否是數字 26 {{ filter01 is number }} === {{ filter02 is number }} 27 ## 變數是否是小寫 28 {{ filter02 is lower }} 29 ## 變數是否是字串 30 {{ filter02 is string }} 31 32 ## 變數在 if 中的判斷是否已定義 33 {# ***** 變數已經被定義,直接判斷運算式是 True或False ***** #} 34 {# {% if filter01 %} #}{# 如果變數沒有定義,那么執行會報錯 #} 35 {# 由于 filter00 之前未定義,因此這里定義為 false,不然執行會報錯【生產中會在 playbook中定義】 36 {% set filter00 = false %} 37 {% if filter00 %} 38 #} 39 {# ***** 通過判斷變數是否被定義,得到到True或False ***** #} 40 {# {% if filter01 is defined %} #} 41 {% if filter00 is defined %} 42 variable is defined 43 {% else %} 44 variable is undefined 45 {% endif %} 46 47 # range 使用 48 {% for i in range(1,20) %} 49 server 172.16.1.{{ i }}:80 50 {% endfor %}
playbook 檔案
1 [yun@ansi-manager jinja]$ cat test_jinja2_05.yml 2 --- 3 # ansible jinja2 測驗案例5 4 - hosts: proxyservers 5 6 tasks: 7 - name: "test jinja2 05" 8 template: 9 src: ./file/test_jinja2_05.conf.j2 10 dest: /tmp/test_jinja2_05.conf
檔案執行
1 [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key --syntax-check test_jinja2_05.yml # 語法檢測 2 [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key -C test_jinja2_05.yml # 預執行,測驗執行 3 [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key test_jinja2_05.yml # 執行
Ansible Jinja2 使用案例-在playbook中使用
本例在 ansible 的 playbook 中使用 jinja2.
目錄結構
1 [yun@ansi-manager jinja]$ pwd 2 /app/ansible_info/jinja 3 [yun@ansi-manager jinja]$ ll 4 total 28 5 -rw-rw-r-- 1 yun yun 1103 Jan 15 21:06 test_jinja2_06.yml
playbook 檔案
1 [yun@ansi-manager jinja]$ cat test_jinja2_06.yml 2 --- 3 # 在 playbook 中使用 jinja2 模板 4 - hosts: proxyservers 5 6 7 tasks: 8 - name: "test_jinja2_06.info create" 9 file: 10 path: "/tmp/test_jinja2_06.info" 11 owner: yun 12 group: yun 13 state: touch 14 15 # 這里用了 jinja2 的過濾器,計算,in 判斷,賦值,條件判斷,回圈 16 - name: "test jinja2 06" 17 blockinfile: 18 path: "/tmp/test_jinja2_06.info" 19 marker: "### {mark} ANSIBLE MANAGED BLOCK jinja2 test ###" 20 block: | 21 name: "{{ ansible_eth0['ipv4']['address']|replace('.', '-') }}" 22 host: "{{ ansible_eth0['ipv4']['address'] }}" 23 count: "3.2 + 5.3 = {{ 3.2 + 5.3 }};5.3 - 3.2 = {{ 5.3 - 3.2 }};5.3 / 3.2 = {{ 5.3 / 3.2 }};5.3 % 3.2 = {{ 5.3 % 3.2 }};3.2 ** 3 = {{ 3.2 ** 3 }}" 24 other_count: "{{ 1 in [1,2,3] }}" 25 ifelse: 26 {% set name1 = 'zhang' %} 27 {% if name1 == 'zhang' %} 28 結果:True. 29 {% else %} 30 結果:False. 31 {% endif %} 32 loop: 33 {% for i in range(1,20) %} 34 server 172.16.1.{{ i }}:80 35 {% endfor %}
檔案執行
1 [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key --syntax-check test_jinja2_06.yml # 語法檢測 2 [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key -C test_jinja2_06.yml # 預執行,測驗執行 3 [yun@ansi-manager jinja]$ ansible-playbook -b -i ../hosts_key test_jinja2_06.yml # 執行
受控機結果查看
1 [yun@ansi-haproxy01 ~]$ cat /tmp/test_jinja2_06.info 2 ### BEGIN ANSIBLE MANAGED BLOCK jinja2 test ### 3 name: "172-16-1-181" 4 host: "172.16.1.181" 5 count: "3.2 + 5.3 = 8.5;5.3 - 3.2 = 2.1;5.3 / 3.2 = 1.65625;5.3 % 3.2 = 2.1;3.2 ** 3 = 32.768" 6 other_count: "True" 7 ifelse: 8 結果:False. 9 loop: 10 server 172.16.1.1:80 11 server 172.16.1.2:80 12 server 172.16.1.3:80 13 server 172.16.1.4:80 14 server 172.16.1.5:80 15 server 172.16.1.6:80 16 server 172.16.1.7:80 17 server 172.16.1.8:80 18 server 172.16.1.9:80 19 server 172.16.1.10:80 20 server 172.16.1.11:80 21 server 172.16.1.12:80 22 server 172.16.1.13:80 23 server 172.16.1.14:80 24 server 172.16.1.15:80 25 server 172.16.1.16:80 26 server 172.16.1.17:80 27 server 172.16.1.18:80 28 server 172.16.1.19:80 29 ### END ANSIBLE MANAGED BLOCK jinja2 test ###
以上!
———END———
如果覺得不錯就關注下唄 (-^O^-) !

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/91685.html
標籤:Linux
