ansible的playbook編寫是yaml語言編寫,掌握yaml語法是編寫playbook的必要條件,格式要求和Python類似,具體教程參考以下
yaml語言教程
附上一個yaml文件轉js格式文件連接
在線免費yaml內容轉json格式html
ansible中yaml語法和上述教程大同小異,如下是我的簡化和總結:
基本語法規則以下node
以 "---" 開頭
大小寫敏感
使用縮進表示層級關係
縮進時不容許使用Tab鍵,只容許使用空格
縮進的空格數目不重要,只要相同層級的元素左側對齊便可
'#' 號表示註釋,從這個字符一直到行尾,都會被解析器忽略;能夠在一行的中間使用,註釋 # 以後的內容。關於註釋,須要注意是否是任意位置都能使用,當分行寫時,不能放在分行的所在行git
YAML 支持的數據結構有三種:github
對象:鍵值對的集合,又稱爲映射(mapping)/ 哈希(hashes) / 字典(dictionary)
數組:一組按次序排列的值,又稱爲序列(sequence) / 列表(list),以 "- " 開頭,有空格間隔
純量(scalars):單個的、不可再分的值(ansible中不多用到)shell
ansible中yaml對象和計算機的中是"key-value"數據結構類似,只是表達的方式不一樣,在ansible中,對能夠採用兩種表達方式。切記 : (冒號)以後必定要加空格,不然報錯json
# 多行式 host: localhost remote_user: root # 行內式,也稱爲單行式,兩邊是大括號包圍 { host: localhost, remote_user: root }
注意數組
在ansible中數組也稱爲列表,以 "- " 開頭,有空格間隔,一樣有兩種表達方式。數據結構
# 多行式 - shell - copy # 單行式,內聯式,兩邊用中括號包圍 [shell, copy]
playbook中的分行寫支持三種格式,分別是:app
在"key"以後使用 "|", 表示保留換行
在"key"以後使用 ">" ,表示摺疊換行
採用多行縮進格式,建議從縮進的第二行用 四個 空格表示縮進。須要注意註釋的位置編輯器
# 如下例子表示三種不一樣的分行寫格式,注意看區別 --- - hosts: lzcx tasks: - shell: echo 'Hello world' >> /tmp/test.txt creates=/tmp/haha.txt # 分行寫注意縮進,同時這行的註釋不能放到上一行,不然報錯 - shell: | # 冒號以後要有空格 echo '張三' >> /tmp/test.txt echo '李四' >> /tmp/test.txt args: creates: /tmp/haha.txt - shell: > # 大於號以後要有空格 echo '王五' >> /tmp/test.txt creates: /tmp/haha.txt
運行效果圖
模塊的參數⼀般來講是key=value格式的,有3種傳遞的⽅式:
直接寫在模塊後,此時要求使⽤"key=value"格式。這是讓ansible內部去解析字符串。由於可分⾏寫,因此有多種寫法
寫成字典型,即"key: value"。此時要求多層縮進。這是讓yaml去解析字典。shell和command模塊不能使用這種格式
使⽤內置屬性args,而後多層縮進定義參數列表。這是讓ansible明確指定⽤yaml來解析
# 參數的多種格式 --- - hosts: lzcx tasks: - shell: echo '1' > /tmp/test.txt creates=/tmp/haha.txt # 單行格式 - shell: echo '2' >> /tmp/test.txt creates=/tmp/haha.txt # 多行格式,注意縮進,,同時這行的註釋不能放到上一行,不然報錯 - shell: echo '3' >> /tmp/test.txt args: creates: /tmp/haha.txt # 使用內置args參數 - shell: > echo '4' >> /tmp/test.txt creates=/tmp/haha.txt # 大於號多行縮進模式 - shell: | echo '5.1' >> /tmp/test.txt echo '5.2' >> /tmp/test.txt args: creates: /tmp/haha.txt - yum: name: dos2unix state: installed
引號的做用,能夠將一個字典中的value值表達式看成總體返回,這個表達式裏面能夠嵌套字典,playbook中定義的都是些列表和字典。絕⼤多數時候,都不須要使⽤引號,但有兩個特殊狀況須要考慮使⽤引號
出現⼤括號"{}"
值(value)出現冒號加空格時": ",即嵌套字典時,須要將嵌套的部分用引號看成總體返回
# 附上一個綜合例子,注意每一個模板內容的區別 --- - hosts: localhost tasks: - 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}}:haha register: hello1 - debug: msg={{hello1.stdout}}:heihei
解釋
⼀個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時,必定要有
--- - hosts: lzcx tasks: - shell: echo haha # 註釋不能出如今task的冒號以後