自動化運維工具——Ansible(四)——YAML語法
到目前爲止,我們一直都在使用INI的配置風格去配置“清單”,其實,/etc/ansible/hosts不僅能夠識別INI的配置語法,還能夠識別“YAML”的配置語法。
1. 什麼是YAML
YAML(Yet Another Markup Language)語言(發音 /ˈjæməl/ )是一個類似 XML、JSON 的標記性語言。YAML 強調以數據爲中心,並不是以標識語言爲重點。因而 YAML 本身的定義比較簡單,號稱“一種人性化的數據格式語言”。目的就是方便人類讀寫。它實質上是一種通用的數據串行化格式。
我們可以以使用YAML編寫配置文件,而ansible的清單也支持YAML的語法,所以我們可以使用YAML語法編寫清單,從而管理受管主機。
2. YAML配置示例一
在server1中:
vim /etc/ansible/hosts
all:
hosts:
172.25.1.2:
172.25.1.3:
上述配置就是使用YAML語法配置的主機清單,非常簡單
最上方使用all關鍵字,all後面有”:”,你一定聯想到了,我們之前可以使用all關鍵字,管理清單中的所有主機,這裏的”all:”就是這個含義。
第二行開頭使用一個空格作爲縮進,使用hosts關鍵字,表示hosts屬於all的下一級,我們可以這樣理解,all是默認的一個組,這個組是最大的一個組,當我們需要在組中定義受管主機時,就需要使用到hosts關鍵字,當我們進行自定義分組時,也需要使用hosts關鍵字,每個分組指明自己組內的受管主機時,都要使用到hosts關鍵字。
注意,在YAML的語法中,只能使用空格作爲縮進,不能使用tab,否則語法上會報錯,如果你習慣使用vim編輯文件,同時你又習慣使用tab作爲縮進,那麼你可以將ansible主機上的vim進行設置,默認將tab轉化爲空格,這樣就能兼容你的使用習慣了。
第三行開頭使用兩個空格作爲縮進,然後指明瞭主機2的IP地址,沒錯,主機2的IP地址就是hosts元素下一級的元素
第四行開頭使用兩個空格作爲縮進,然後指明瞭主機3的IP地址,你一定想明白了,主機2和主機3的層級是相同的,它們是平級的,因爲它們的左側縮進是對齊的。
測試:
ansible all -m ping
ansible 172.25.1.2 -m ping
ansible 172.25.1.3 -m ping
3. YAML配置示例二
先看一個INI風格的配置
172.25.1.2
[test1]
172.25.1.3
[test2]
172.25.1.4
上述配置表示當前清單中有3臺受管主機,主機2不屬於任何組,主機3屬於test1組,主機4屬於test2組
使用YAML語法進行同等效果的配置如下
(注意,爲了使縮進顯得更加明顯,此處每次縮進使用兩個空格)
all:
hosts:
172.25.1.2
children:
test1:
hosts:
172.25.1.3
test2:
hosts:
172.25.1.4
從上例可以看出,當直接在清單中創建組時,需要在all關鍵字內使用children關鍵字,而定義每個組時,有必須使用hosts關鍵字,指明組內的主機
測試:
ansible test1 -m ping
ansible test2 -m ping
ansible 172.25.1.2 -m ping
4. YAML配置示例三
有了上面的基礎,我們來看一下當組中嵌套組時,使用YAML語法應該怎樣描寫
仍然先寫出INI風格的示例以作對比,如下:
[proA]
172.25.1.2
[proB]
172.25.1.3
[pro:children]
proA
proB
對應YAML格式的配置如下
all:
children:
pro:
children:
proA:
hosts:
172.25.1.2:
proB:
hosts:
172.25.1.3:
上述配置表示,pro組有兩個子組,分別爲proA組和proB組,而這兩個組分別有自己組內的主機。
測試:
ansible pro -m ping
ansible proA -m ping
ansible proB -m ping
細心如你,一定已經發現,當我們使用YAML語法配置清單時,無非是使用hosts、children等關鍵字與我們的自定義名稱進行排列組合罷了。
5. YAML配置示例四
前文中,我們還介紹了使用別名的方式配置受管主機,INI格式的示例如下:
172.25.1.2
server3 ansible_host=172.25.1.3
172.25.1.4
測試:
ansible server3 -m ping
ansible 172.25.1.2 -m ping
ansible 172.25.1.4 -m ping
同等效果的YAML語法配置如下:
all:
hosts:
172.25.1.2:
server3:
ansible_host: 172.25.1.3
172.25.1.4:
注意:上圖中標註的”空格”不可省,這是YAML的語法,省略空格後會報
測試:
ansible server3 -m ping
ansible 172.25.1.2 -m ping
ansible 172.25.1.4 -m ping
你可能已經習慣使用INI的語法編輯清單,或者你對YAML並不熟悉,於是你準備放棄學習YAML語法,這樣並不可行,因爲之後我們會介紹怎樣編寫ansible的劇本,編寫ansible劇本時,只能使用YAML語法,所以,不要放棄YAML,當然,我們也不用過於深究YAML的語法,我們只要記住一些套路(固定格式),就可以編寫ansible劇本了,所以不要着急,船到橋頭自然直,到時候你自然會掌握這些語法的。