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