一 條件語句
1 點睛
有時候一個playbook的結果取決於一個變量,或者取決於上一個任 務(task)的執行結果值,在某些情況下,一個變量的值可以依賴於其他變量的值,當然也會影響Ansible的執行過程。
2 when聲明
2.1 點睛
有時候我們想跳過某些主機的執行步驟,比如符合特定版本的操 作系統將不安裝某個軟件包,或者磁盤空間爆滿了將進行清理的步驟。 在Ansible中很容易做到這一點,通過When子句實現,其中將引用Jinja2 表達式。
2.2 示例
tasks:
- name: "shutdown Debian flavored systems"
command: /sbin/shutdown -t now
when: ansible_os_family == "Debian"
2.3 說明
通過定義任務的Facts本地變量ansible_os_family(操作系統版本名 稱)是否爲Debian,結果將返回BOOL類型值,爲True時將執行上一條 語句command:/sbin/shutdown-t now,爲False時該條語句都不會觸發。
3 實戰
3.1 點睛
通過判斷一條命令執行結果做不同分支的二級處 理。
3.2 代碼
tasks:
- command: /bin/false
register: result
ignore_errors: True
- command: /bin/something
when: result|failed
- command: /bin/something_else
when: result|success
- command: /bin/still/something_else
when: result|skipped
3.3 說明
“when:result|success”的意思爲當變量result執行結果爲成功狀態時,將執行/bin/something_else命令,其他同理,其中success爲Ansible內部過濾器方法,返回Ture代表命令運行成功。
二 循環語句
1 點睛
通常一個任務會做很多事情,如創建大量的用戶、安裝很多包, 或重複輪詢特定的步驟,直到某種結果條件爲止,Ansible爲我們提供了此支持。
2 示例
2.1 代碼
- name: add several users
user: name={{ item }} state=present groups=wheel
with_items:
- testuser1
- testuser2
2.3 說明
這個示例實現了一個批量創建系統用戶的功能,with_items會自動循環執行上面的語句“user:name={{item}}state=present groups=wheel”,循環的次數爲with_items的元素個數,這裏有2個元素, 分別爲testuser1、testuser2,會分別替換{{item}}項。
該示例與下面代碼等價:
- name: add user testuser1
user: name=testuser1 state=present groups=wheel
- name: add user testuser2
user: name=testuser2 state=present groups=wheel
當然,元素也支持字典的形式
- name: add several users
user: name={{ item.name }} state=present groups={{ item.groups }}
with_items:
- { name: 'testuser1', groups: 'wheel' }
- { name: 'testuser2', groups: 'root' }
循環也支持列表(List)的形式,不過是通過with_flattened語句來 實現的,例如:
---
# file: roles/foo/vars/main.yml
packages_base:
- [ 'foo-package', 'bar-package' ]
packages_apps:
- [ ['one-package', 'two-package' ]]
- [ ['red-package'], ['blue-package']]
以上定義了兩個列表變量,分別是需要安裝的軟件包名,以便後面進行如下引用:
- name: flattened loop demo
yum: name={{ item }} state=installed
with_flattened:
- packages_base
- packages_apps
通過使用with_flattened語句循環引用定義好的列表變量。