ansible中yaml語法應用

四、yaml語法應用

ansible的playbook編寫是yaml語言編寫,掌握yaml語法是編寫playbook的必要條件,格式要求和Python類似,具體教程參考以下
yaml語言教程
附上一個yaml文件轉js格式文件連接
在線免費yaml內容轉json格式html

4.一、 ansible中的yaml語法應用

ansible中yaml語法和上述教程大同小異,如下是我的簡化和總結:
基本語法規則以下node

以 "---" 開頭
大小寫敏感
使用縮進表示層級關係
縮進時不容許使用Tab鍵,只容許使用空格
縮進的空格數目不重要,只要相同層級的元素左側對齊便可
'#' 號表示註釋,從這個字符一直到行尾,都會被解析器忽略;能夠在一行的中間使用,註釋 # 以後的內容。關於註釋,須要注意是否是任意位置都能使用,當分行寫時,不能放在分行的所在行git

YAML 支持的數據結構有三種:github

對象:鍵值對的集合,又稱爲映射(mapping)/ 哈希(hashes) / 字典(dictionary)
數組:一組按次序排列的值,又稱爲序列(sequence) / 列表(list),以 "- " 開頭,有空格間隔
純量(scalars):單個的、不可再分的值(ansible中不多用到)shell

4.二、對象簡介

ansible中yaml對象和計算機的中是"key-value"數據結構類似,只是表達的方式不一樣,在ansible中,對能夠採用兩種表達方式。切記 : (冒號)以後必定要加空格,不然報錯json

# 多行式
host: localhost
remote_user: root
# 行內式,也稱爲單行式,兩邊是大括號包圍
{ host: localhost, remote_user: root }

注意數組

  • 在一行表示中,字典的值,能夠嵌套其餘字典,可是須要用引號包圍起來表明一個總體值,返回的是總體並且不是直接嵌套字典,下面引號部分會給實際案例解釋。
  • 冒號加空格加內容即": haha"這個格式表明的是字典的表達式,這個是yaml語法規定的;冒號加內容即":haha",表明的是普通的表達式,沒有特殊意義,因此定義對象須要注意,可是這種普通表達式,有一些狀況會用到,例以下文中引號的例子中

4.三、數組簡介

在ansible中數組也稱爲列表,以 "- " 開頭,有空格間隔,一樣有兩種表達方式。數據結構

# 多行式
- shell
- copy
# 單行式,內聯式,兩邊用中括號包圍
[shell, copy]

4.四、分行寫

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

運行效果圖
分行寫

4.五、向模塊傳遞參數

模塊的參數⼀般來講是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

4.六、playbook中的引號使用

引號的做用,能夠將一個字典中的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

解釋

  1. 前面三個shell模塊,字典的value都是普通的表達式,有引號和無引號,結果是同樣的,須要注意的是":"冒號以後沒有空格,而是直接跟上內容,這種表達式不是字典,實際上能夠把這個冒號看成普通的字符串看待
  2. 第四個shell模塊中,由於value值嵌套了字典,並且還使用了大括號引用變量,這種表達式須要將整個表達
    式括起來,所以須要用單引號將整個表達式括起來,用總體看成一個值賦值給模塊。理解這兩點剩下的模塊也是同樣的意思
  3. 從打印的結果看,": "和":"的區別是,當字典的值嵌套了字典時,即便用": "時,打印也會按照這個格式打印,也就是冒號的下一個字符串是空格,而":"這個普通的格式則是跟上內容

4.七、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.八、yaml編寫總結

  1. 縮進:關於縮進,空格的多少無關,注重的是層級一致性,我的習慣縮進4或2個空格區分
  2. 對象的冒號:列表編寫,"-"加內容編寫完以後,換行時會自動對齊到"-"列,這是錯誤的,須要手動對齊"- "後的內容所在列,例如:tasks後添加冒號":"時,會自動對齊"-",實際上全部的冒號添加以後換行時,編輯器默認對齊上一行的第一個字符串位置,須要自行手動對齊
  3. 註釋:關於註釋,經測試,不能出如今對象的值value上,不然報錯。例如不能放tasks的冒號以後以後
---
- hosts: lzcx
  tasks:
    - shell: echo haha   # 註釋不能出如今task的冒號以後
相關文章
相關標籤/搜索