YAML語法入門

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

前言

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

YAML簡介

YAML就和XML、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格式,代表一個對象。具體的接下來繼續細說!

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

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

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

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

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

對象

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

key: value

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

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日,於內蒙古呼和浩特。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章