本節內容:html
當有須要重複性執行的任務時,可使用迭代機制。其使用格式爲將須要迭代的內容定義爲item變量引用,並經過with_items語句來指明迭代的元素列表便可。例如:node
- name: add several users user: name={{ item }} state=present groups=wheel with_items: - testuser1 - testuser2
上面語句的功能等同於下面的語句:nginx
- 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,例如:web
- name: add several users user: name={{ item.name }} state=present groups={{ item.groups }} with_items: - { name: 'testuser1', groups: 'wheel'} - { name: 'testuser2', groups: 'root'}
【注意】:item是固定變量名。apache
假如爲兩臺webserver安裝httpd,而他們的配置文件,172.16.7.152上的httpd須要監聽80端口,172.16.7.153須要監聽8080端口,ServerName也是不同的,因此咱們就須要兩個配置文件,這管理起來極爲不便。vim
在這種狀況下,咱們能夠考慮在配置文件中使用變量來定義。函數
[root@node1 ~]# mkdir templates [root@node1 ~]# cp conf/httpd.conf templates/ [root@node1 ~]# mv templates/httpd.conf templates/httpd.conf.j2
後綴爲j2代表是Jinja2模板。編輯這個模板:spa
[root@node1 ~]# vim templates/httpd.conf.j2
這個模板複製到每臺主機上時都應該將這文件裏的變量換成對應的值。這個模板就是Jinjia2模板。rest
設置每臺主機使用的變量值:code
[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
執行完成後,去查看兩個節點的配置文件,發生變量都被替換了。
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。