本節內容:
- 迭代
- 模板(JInjia2相關)
- Jinja2相關
一、迭代
當有需要重復性執行的任務時,可以使用迭代機制。其使用格式為將需要迭代的內容定義為item變量引用,並通過with_items語句來指明迭代的元素列表即可。例如:
- name: add several users user: name={{ item }} state=present groups=wheel with_items: - testuser1 - testuser2
上面語句的功能等同於下面的語句:
- name: add user testuser1 user: name=testuser1 state=present groups=wheel - name: add user testuser2 user: name=testuser2 state=present groups=wheel
另外,with_items中使用的元素還可以是hashes,例如:
- name: add several users user: name={{ item.name }} state=present groups={{ item.groups }} with_items: - { name: 'testuser1', groups: 'wheel'} - { name: 'testuser2', groups: 'root'}
【注意】:item是固定變量名。
二、模板(JInjia2相關)
假如為兩台webserver安裝httpd,而他們的配置文件,172.16.7.152上的httpd需要監聽80端口,172.16.7.153需要監聽8080端口,ServerName也是不一樣的,所以我們就需要兩個配置文件,這管理起來極為不便。
在這種情況下,我們可以考慮在配置文件中使用變量來定義。
[root@node1 ~]# mkdir templates [root@node1 ~]# cp conf/httpd.conf templates/ [root@node1 ~]# mv templates/httpd.conf templates/httpd.conf.j2
后綴為j2表明是Jinja2模板。編輯這個模板:
[root@node1 ~]# vim templates/httpd.conf.j2


這個模板復制到每台主機上時都應該將這文件里的變量換成對應的值。這個模板就是Jinjia2模板。
設置每台主機使用的變量值:
[root@node1 ~]# vim /etc/ansible/hosts

當然這http_port和maxClients也可以在playbook中定義。但是那樣我們沒法區別每台主機使用不同的值了。因此我們要想讓每個主機變量名相同但值不同時只能使用主機變量來定義。下面定義playbook:
[root@node1 ~]# vim apache.yml - hosts: nginx remote_user: root vars: - package: apache tasks: - name: install httpd package yum: name={{ package }} state=latest - name: install configuration file for httpd template: src=/root/conf/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf notify: - restart httpd - name: start httpd service service: enabled=true name=httpd state=started handlers: - name: restart httpd service: name=httpd state=restarted

[root@node1 ~]# ansible-playbook apache.yml
執行完成后,去查看兩個節點的配置文件,發生變量都被替換了。
三、Jinja2相關
1. 字面量
表達式最簡單的形式就是字面量。字面量表示諸如字符串和數值的Python對象。下面的字面量是可用的:
(1)字符串:“Hello World”
雙引號或單引號中間的一切都是字符串,無論何時你需要在模板中使用一個字符串(比如函數引用、過濾器或只是包含或繼承一個模板的參數),它們都是有用的。
(2)整數和浮點數:42 / 42.23
直接寫下數值就可以創建整數和浮點數。如果有小數點,則為浮點數,否則為整數。在Python里,42和42.0是不一樣的。
(3)列表:['list', 'of', 'object']
一對中括號括起來的東西是一個列表。列表用於存儲和迭代序列化的數據。例如你可以容易地在for循環中用列表和元組創建一個鏈接的列表:
<ul> {% for href, caption in [('index.html', 'Index'), ('about.html', 'About'), ('download.html', 'Downloads')] %} <li><a href="{{ href }}">{{ caption }}</a></li> {% end for %} </ul>
(4)元組:('tuple', 'of', 'values')
元組和列表類似,只是不能修改里面的元素。如果元組中只有一項,你需要使用逗號結尾它。元組通常用於表示兩個或更多元素的項。
(5)字典:{'dict': 'of', 'key': 'and', 'value': 'pairs'}
Python中的字典是一種關聯鍵和值的結構。鍵必須是唯一的,並且鍵必須只有一個值。
(6)Boolen:true / false
2. 算術運算
Jinja2允許你用計算值。這在模板中很少使用,但為了完整性允許其存在,支持下面的運算符:
+ 把兩個對象加到一起,通常對象是整數或浮點數,但是如果兩者是字符串或列表,你可以用這種方式來連接它們。無論如何這不是首選的連接字符串的方式。{{ 1 + 1 }}等於2。
- 用第一個數減去第二個數,{{ 3 - 2 }}等於1.
/ 對兩個數做除法,返回值會是一個浮點數。{{ 1 / 2 }}等於{{ 0.5 }}。
// 對兩個手做除法,返回整數商,{{ 20 / 7 }}等於2。
% 計算整數除法的余數。{{ 11 % 7 }}等於4。
* 用右邊的數乘左邊的操作數。{{ 2 * 2 }}會返回4,也可以用於重復一個字符串多次,{{ '=' * 80 }}會打印80個等號的橫條。
** 取左操作數的右操作數次冪,{{ 2**3 }}會返回8。
3. 比較操作符
== 比較兩個對象是否相等。 != 比較兩個對象是否不等。 > 如果左邊大於右邊,返回true。 < 如果左邊小於右邊,返回true。 >= 如果左邊大於等於右邊,返回true。 <= 如果左邊小於等於右邊,返回true。
