YAML語法入門

Ansible是一個系列文章,我會盡可能以通俗易懂、詼諧幽默的總結方式給你們呈現這些枯燥的知識點,讓學習變的有趣一些。
Ansible系列博文直達連接:Ansible入門系列node

前言

在學習playbook的時候,你可能會被驚訝到,YAML是什麼鬼?我怎麼歷來都沒有接觸過!是的,一開始我也是這樣的。而後就對這個YAML產生了一箇中莫名的恐懼和厭煩感!其實人都是這樣的,對陌生的事務,都會有一種抵觸感,可是沒有辦法,爲了學習Ansible,只能硬着頭皮繼續搞了。apache

YAML簡介

YAML就和XML、JSON同樣,專門用來寫配置文件的語言,很是簡潔和強大。json

下面就經過一段簡單的YAML腳原本感覺它的簡介與強大:數組

---
- hosts: server1
  user: root
  vars:
    http_port: 80
    max_clients: 200

  tasks:
    - name: Write apache config file
      template: src=/home/test1/httpd.j2 dest=/home/test2/httpd.conf
      notify:
        - restart apache
    - name: Ensure apache is running
      service: name=httpd state=started

  handlers:
    - name: restart apache
      service: name=httpd state=restarted

咱們能夠看到,最開始是------它是一個特殊的符號,表示一個文檔的開始。接下來的- 表明一個數組項,後面的user: root這種key: value格式,表明一個對象。具體的接下來繼續細說!數據結構

從上面的一小段代碼,能夠看到它的基本語法規則超級簡單:app

  • 大小寫敏感;
  • 使用縮進表示層級關係;
  • 縮進時不容許使用Tab鍵,只容許使用空格;
  • 縮進的空格數目不重要,只要相同層級的元素左側對齊便可;
  • #表示註釋,只支持單行註釋,不支持多行註釋。

說完語法規則,再來看它支持的數據結構:工具

  • 對象:鍵值對的集合,又稱爲映射(mapping)/ 哈希(hashes) / 字典(dictionary);
  • 數組:一組按次序排列的值,又稱爲序列(sequence) / 列表(list);
  • 標量(scalars):單個的、不可再分的值

再複雜的YAML腳本,基本上也都是上述這三種數據結構組成的。因此,掌握了這三種結構,剩下的就是語法糖了。下面就分別對這三種語法結構展開說明。學習

對象

對象的一組鍵值對,使用冒號結構表示,格式爲key: value(冒號後面必定要記住加一個空格)。scala

key: value

也可使用縮進表示層級關係:rest

vars:
  http_port: 80
  max_clients: 200

YAML也容許另外一種寫法,將全部鍵值對寫成一個行內對象。好比這樣:

vars: {http_port: 80, max_clients: 200}

數組

使用- 表明一個數組項,好比能夠這樣子定義一個數組:

- 192.168.1.2
- 192.168.1.3
- 192.168.1.4

若是數據結構的子成員是一個數組,則能夠在該項下面縮進一個空格,好比這樣:

- 
  - 192.168.1.2
  - 192.168.1.3
  - 192.168.1.4

數組也能夠採用行內表示法,就像這樣子:

- servers: [192.168.1.2, 192.168.1.3, 192.168.1.4]

標量

YAML中提供瞭如下常量結構:

  • 字符串
  • 布爾值
  • 整數
  • 浮點數
  • Null
  • 時間
  • 日期
---
boolean: 
  - TRUE # true,True均可以
  - FALSE # false,False均可以
float:
  - 3.14
  - 6.8523015e+5 # 可使用科學計數法
int:
  - 123 # 整數
null:
  nodeName: 'node'
  parent: ~ # 使用~表示null
string:
  - 哈哈
  - 'Hello world' # 可使用雙引號或者單引號包裹特殊字符
  - newline
    newline2 # 字符串能夠拆成多行,每一行會被轉化成一個空格
date:
  - 2018-02-17 # 日期必須使用ISO 8601格式,即yyyy-MM-dd
datetime: 
  - 2018-02-17T15:02:31+08:00 # 時間使用ISO 8601格式,時間和日期之間使用T鏈接,最後使用+表明時區

複合結構&特殊語法

在YAML中,任何一個複雜的腳本文件都是上面的這三種數據結構再加上一些語法組成的。若是手裏有一個複雜的YAML腳本,撓破頭皮都看不懂,不要緊,咱們能夠將看不懂的YAML經過工具轉成咱們能夠看懂的JSON格式。

對於還有一些特殊的語法,好比引用、錨點、別名等,這些特殊語法,咱們在遇到的時候,再去查詢資料便可!這裏不作詳細的總結!

總結

說實話,我一開始對YAML這種結構並不感冒,感受是一種奇葩的語法結構,若是不是爲了學習Ansible,我想我是不會主動去學習它的,即便我已經學會了它,可是我仍是保留個人見解,它真的是一種奇葩的語法結構,不僅是我一我的是這樣認爲的,好多人都是這麼看的!你覺的呢?

外面大雨,好冷!

果凍想,認真玩技術的地方。

2019年10月3日,於內蒙古呼和浩特。

相關文章
相關標籤/搜索