Python自動化運維之ansible的條件語句和循環語句

一 條件語句

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語句循環引用定義好的列表變量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章