ansible-判斷

when

絕大多數(shù)語言中,都使用"if"作為條件判斷的關(guān)鍵字,而在ansible中,條件判斷的關(guān)鍵字是"when",我們來看一個(gè)簡單的示例,如下

---
- hosts: test3
  tasks:
  - debug:
      msg: "ni hao"
    when:
      ansible_distribution == "CentOS"
#結(jié)果

PLAY [test3] ********************************************************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************************************
ok: [test3]

TASK [debug] ********************************************************************************************************************************************************************************
ok: [test3] => {
    "msg": "ni hao"
}

PLAY RECAP **********************************************************************************************************************************************************************************
test3                      : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

條件判斷+循環(huán)

---
- hosts: test3
  tasks:
  - debug:
      msg: "{{item}}"
    with_items:
    - 1
    - 2
    - 3
    when: item > 1

上例表示當(dāng)item的值大于1時(shí),才會調(diào)用debug模塊輸出對應(yīng)的信息,很簡單吧~

在上述兩個(gè)示例中,我們使用了 "==" 和 ">" 兩個(gè)比較運(yùn)算符,在ansible中,我們可以使用如下比較運(yùn)算符。

== :比較兩個(gè)對象是否相等,相等為真

!= :比較兩個(gè)對象是否不等,不等為真

:比較兩個(gè)值的大小,如果左邊的值大于右邊的值,則為真

< :比較兩個(gè)值的大小,如果左邊的值小于右邊的值,則為真

= :比較兩個(gè)值的大小,如果左邊的值大于右邊的值或左右相等,則為真

<= :比較兩個(gè)值的大小,如果左邊的值小于右邊的值或左右相等,則為真

我們總結(jié)的這些運(yùn)算符其實(shí)都是jinja2的運(yùn)算符,ansible使用jinja2模板引擎,在ansible中也可以直接使用jinja2的這些運(yùn)算符

說完了比較運(yùn)算符,再來說說邏輯運(yùn)算符,可用的邏輯運(yùn)算符如下

and :邏輯與,當(dāng)左邊與右邊同時(shí)為真,則返回真

or :邏輯或,當(dāng)左邊與右邊有任意一個(gè)為真,則返回真

not :取反,對一個(gè)操作體取反

( ) :組合,將一組操作體包裝在一起,形成一個(gè)較大的操作體

運(yùn)算符例子:判斷操作系統(tǒng)和操作系統(tǒng)版本

---
- hosts: test3
  tasks:
  - debug:
      msg: "System release is centos7"
    when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7" 

或,與,組合:

---
- hosts: test3
  tasks:
  - debug:
      msg: "System release is centos7"
    when: ansible_distribution == "CentOS" and (ansible_distribution_major_version == "7" or ansible_distribution_major_version == "6" )

判斷目錄

通過 ignore_errors: true 忽略報(bào)錯(cuò),繼續(xù)執(zhí)行(默認(rèn)報(bào)錯(cuò)就會停止)

---
- hosts: test2,test3
  tasks:
  - name: task1
    shell: "ls /tmp"
    register: abc
    ignore_errors: true
  - name: task2
    debug:
     msg: "have"
    when: abc.rc == 0
  - name: task3
    debug:
     msg: "no have"
    when: abc.rc != 0

jinja2的tests

---
- hosts: test2,test3
  gather_facts: no
  vars:
   testpath: /tmp
  tasks:
  - debug: 
    msg: "file exist"
    when: testpath is exists

如上例所示,我們定義了一個(gè)testpath變量,這個(gè)變量的值是"/testdir"路徑,我通過when判斷"/testdir"路徑是否存在,沒錯(cuò),就是這么簡單,"is exists"中的"exists"就是tests的一種,它與"test -e"命令的作用是相同的,通過"exists"可以判斷ansible主機(jī)中的對應(yīng)路徑是否存在(注意:是ansible控制主機(jī)中的路徑,與目標(biāo)主機(jī)沒有關(guān)系),當(dāng)對應(yīng)的路徑存在于ansible控制節(jié)點(diǎn)時(shí),"is exists"為真

判斷變量的一些tests

defined :判斷變量是否已經(jīng)定義,已經(jīng)定義則返回真

undefind :判斷變量是否已經(jīng)定義,未定義則返回真

none :判斷變量值是否為空,如果變量已經(jīng)定義,但是變量值為空,則返回真

---
- hosts: test70
  remote_user: root
  gather_facts: no
  vars:
    testvar: "test"
    testvar1:
  tasks:
  - debug:
      msg: "Variable is defined"
    when: testvar is defined
  - debug:
      msg: "Variable is undefined"
    when: testvar2 is undefined
  - debug:
      msg: "The variable is defined, but there is no value"
    when: testvar1 is none

判斷執(zhí)行結(jié)果的一些tests

success 或 succeeded:通過任務(wù)的返回信息判斷任務(wù)的執(zhí)行狀態(tài),任務(wù)執(zhí)行成功則返回真

failure 或 failed:通過任務(wù)的返回信息判斷任務(wù)的執(zhí)行狀態(tài),任務(wù)執(zhí)行失敗則返回真

change 或 changed:通過任務(wù)的返回信息判斷任務(wù)的執(zhí)行狀態(tài),任務(wù)執(zhí)行狀態(tài)為changed則返回真

skip 或 skipped:通過任務(wù)的返回信息判斷任務(wù)的執(zhí)行狀態(tài),當(dāng)任務(wù)沒有滿足條件,而被跳過執(zhí)行時(shí),則返回真

判斷路徑的一些tests

注:如下tests的判斷均針對于ansible主機(jī)中的路徑,與目標(biāo)主機(jī)無關(guān)

file : 判斷路徑是否是一個(gè)文件,如果路徑是一個(gè)文件則返回真

directory :判斷路徑是否是一個(gè)目錄,如果路徑是一個(gè)目錄則返回真

link :判斷路徑是否是一個(gè)軟鏈接,如果路徑是一個(gè)軟鏈接則返回真

mount:判斷路徑是否是一個(gè)掛載點(diǎn),如果路徑是一個(gè)掛載點(diǎn)則返回真

exists:判斷路徑是否存在,如果路徑存在則返回真

其他的一些testst

version:可以用于對比兩個(gè)版本號的大小,或者與指定的版本號進(jìn)行對比,使用語法為 version('版本號', '比較操作符')

block

在ansible中,可以使用"block"關(guān)鍵字將多個(gè)任務(wù)整合成一個(gè)"塊",這個(gè)"塊"將被當(dāng)做一個(gè)整體,我們可以對這個(gè)"塊"添加判斷條件,當(dāng)條件成立時(shí),則執(zhí)行這個(gè)塊中的所有任務(wù),我們來看一個(gè)小示例,如下

---
- hosts: test3
  tasks:
  - debug:
     msg: "abc"
    when: 2 > 1
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容