4、yaml語法應用
ansible的playbook編寫是yaml語言編寫,掌握yaml語法是編寫playbook的必要條件,格式要求和Python相似,具體教程參考如下
yaml語言教程
附上一個yaml文件轉js格式文件鏈接
在線免費yaml內容轉json格式
4.1、 ansible中的yaml語法應用
ansible中yaml語法和上述教程大同小異,以下是個人簡化和總結:
基本語法規則如下
以 "---" 開頭
大小寫敏感
使用縮進表示層級關系
縮進時不允許使用Tab鍵,只允許使用空格
縮進的空格數目不重要,只要相同層級的元素左側對齊即可
'#'?號表示注釋,從這個字符一直到行尾,都會被解析器忽略;可以在一行的中間使用,注釋 # 之后的內容。關于注釋,需要注意是不是任意位置都能使用,當分行寫時,不能放在分行的所在行
YAML 支持的數據結構有三種:
對象:鍵值對的集合,又稱為映射(mapping)/ 哈希(hashes) / 字典(dictionary)
數組:一組按次序排列的值,又稱為序列(sequence) / 列表(list),以 "- " 開頭,有空格間隔
純量(scalars):單個的、不可再分的值(ansible中很少用到)
4.2、對象簡介
ansible中yaml對象和計算機的中是"key-value"數據結構相似,只是表達的方式不同,在ansible中,對可以采用兩種表達方式。切記 : (冒號)之后一定要加空格,否則報錯
# 多行式
host: localhost
remote_user: root
# 行內式,也稱為單行式,兩邊是大括號包圍
{ host: localhost, remote_user: root }
注意
- 在一行表示中,字典的值,可以嵌套其他字典,但是需要用引號包圍起來代表一個整體值,返回的是整體而且不是直接嵌套字典,下面引號部分會給實際案例解釋。
- 冒號加空格加內容即": haha"這個格式代表的是字典的表達式,這個是yaml語法規定的;冒號加內容即":haha",代表的是普通的表達式,沒有特殊意義,所以定義對象需要注意,但是這種普通表達式,有一些情況會用到,例如下文中引號的例子中
4.3、數組簡介
在ansible中數組也稱為列表,以 "- " 開頭,有空格間隔,同樣有兩種表達方式。
# 多行式
- shell
- copy
# 單行式,內聯式,兩邊用中括號包圍
[shell, copy]
4.4、分行寫
playbook中的分行寫支持三種格式,分別是:
在"key"之后使用 "|", 表示保留換行
在"key"之后使用 ">" ,表示折疊換行
采用多行縮進格式,建議從縮進的第二行用 四個 空格表示縮進。需要注意注釋的位置
# 以下例子表示三種不同的分行寫格式,注意看區別
--- - hosts: lzcxtasks:- shell: echo 'Hello world' >> /tmp/test.txtcreates=/tmp/haha.txt # 分行寫注意縮進,同時這行的注釋不能放到上一行,否則報錯- shell: | # 冒號之后要有空格echo '張三' >> /tmp/test.txtecho '李四' >> /tmp/test.txtargs:creates: /tmp/haha.txt- shell: > # 大于號之后要有空格echo '王五' >> /tmp/test.txtcreates: /tmp/haha.txt
運行效果圖
4.5、向模塊傳遞參數
模塊的參數?般來說是key=value格式的,有3種傳遞的?式:
直接寫在模塊后,此時要求使?"key=value"格式。這是讓ansible內部去解析字符串。因為可分?寫,所以有多種寫法
寫成字典型,即"key: value"。此時要求多層縮進。這是讓yaml去解析字典。shell和command模塊不能使用這種格式
使?內置屬性args,然后多層縮進定義參數列表。這是讓ansible明確指定?yaml來解析
# 參數的多種格式
---- hosts: lzcxtasks:- shell: echo '1' > /tmp/test.txt creates=/tmp/haha.txt # 單行格式- shell: echo '2' >> /tmp/test.txtcreates=/tmp/haha.txt # 多行格式,注意縮進,,同時這行的注釋不能放到上一行,否則報錯- shell: echo '3' >> /tmp/test.txtargs: creates: /tmp/haha.txt # 使用內置args參數- shell: >echo '4' >> /tmp/test.txtcreates=/tmp/haha.txt # 大于號多行縮進模式- shell: |echo '5.1' >> /tmp/test.txtecho '5.2' >> /tmp/test.txtargs:creates: /tmp/haha.txt- yum:name: dos2unixstate: installed
4.6、playbook中的引號使用
引號的作用,可以將一個字典中的value值表達式當作整體返回,這個表達式里面可以嵌套字典,playbook中定義的都是些列表和字典。絕?多數時候,都不需要使?引號,但有兩個特殊情況需要考慮使?引號
出現?括號"{}"
值(value)出現冒號加空格時": ",即嵌套字典時,需要將嵌套的部分用引號當作整體返回
# 附上一個綜合例子,注意每個模板內容的區別
---- hosts: localhosttasks:- shell: echo {{inventory_hostname}}:haha- shell: "echo {{inventory_hostname}}:haha"- shell: 'echo {{inventory_hostname}}:haha'- shell: 'echo "{{inventory_hostname}}: haha"'- shell: echo "{{inventory_hostname}}:haha"register: hello- debug: 'msg="{{hello.stdout}}: heihei"'- shell: echo {{inventory_hostname}}:haharegister: hello1- debug: msg={{hello1.stdout}}:heihei
解釋
- 前面三個shell模塊,字典的value都是普通的表達式,有引號和無引號,結果是一樣的,需要注意的是":"冒號之后沒有空格,而是直接跟上內容,這種表達式不是字典,實際上可以把這個冒號當作普通的字符串看待
- 第四個shell模塊中,因為value值嵌套了字典,而且還使用了大括號引用變量,這種表達式需要將整個表達
式括起來,因此需要用單引號將整個表達式括起來,用整體當作一個值賦值給模塊。理解這兩點剩下的模塊也是一樣的意思 - 從打印的結果看,": "和":"的區別是,當字典的值嵌套了字典時,即使用": "時,打印也會按照這個格式打印,也就是冒號的下一個字符串是空格,而":"這個普通的格式則是跟上內容
4.7、playbook和play的關系
?個playbook中可以包含多個play。每個play都?少包含有tasks和hosts這兩項,還可以包含其他?必須項,如vars,vars_f iles,remote_user等。tasks中可以通過模塊調?定義?系列的action。只不過,絕?多數時候,?個playbook都只定義?個play,這樣做的好處是便于維護。
playbook文件中基本結構為:
playbook: [play1, play2, play3]
play: [hosts, gather_facts, connection, become, remote_user, tasks, vars...]
tasks: [變量vars、循環with_xxx、判斷when、命名name、module1, module2,...]
需要注意的是,當play使用了role時,看上去沒有tasks和hosts選項,實際上role里面包含了,所以有沒有tasks和hosts沒關系,但沒有使用role時,一定要有
4.8、yaml編寫總結
- 縮進:關于縮進,空格的多少無關,注重的是層級一致性,個人習慣縮進4或2個空格區分
- 對象的冒號:列表編寫,"-"加內容編寫完之后,換行時會自動對齊到"-"列,這是錯誤的,需要手動對齊"- "后的內容所在列,例如:tasks后添加冒號":"時,會自動對齊"-",實際上所有的冒號添加之后換行時,編輯器默認對齊上一行的第一個字符串位置,需要自行手動對齊
- 注釋:關于注釋,經測試,不能出現在對象的值value上,否則報錯。例如不能放tasks的冒號之后之后
---
- hosts: lzcxtasks:- shell: echo haha # 注釋不能出現在task的冒號之后