發現不少開源的軟件的配置文件都使用了這種語言來描述,聽說是簡單強大,很不巧,ansible也使用了這種語言來描述配置,學習ansible以前,先學習一下YAML語言。javascript
YAML基本語法規則以下:java
大小寫敏感python
使用縮進表示層級關係web
縮進時不容許使用Tab建,只容許使用空格。數組
縮進的空格數目不重要,只要是相同層級的元素左對齊便可ruby
#表示註釋,從這個字符一直到行尾,都會被解析器忽略。數據結構
YAML支持的數據結構有三種。app
對象:鍵值對的集合,又稱爲映射(mapping)/哈希(hashed)/字典(dictionary)post
數組:一組按次序排列的值,又稱爲序列(sequence)/列表(list)學習
純量(scalars):單個的、不可再分的值
下面分別介紹這三種數據結構。
對象
------------------------------------------------------------------
對象是一組鍵值對,使用冒號結構來表示。
animal:pets
YAML也容許另一種寫法,將全部的鍵值對寫成一個行內對象。
hash:{name:Steve,foo:bar}
數組
--------------------------------------------------------------------
一組連詞線開頭的行,構成一個數組。
- Cat
- Dog
- Goldfish
數組結構的子成員是一個數組,則能夠在該項下面縮進一個空格表示。
-
- Cat
- Dog
- Goldfish
數組也能夠採用行內元素的表示方法。
animal:[Cat,Dog]
複合結構
-----------------------------------------------------------------------
對象和數組能夠結合使用,造成複合結構。
languages:
- Ruby
- Perl
- Python
websites:
YAML: yaml.org
Ruby: ruby-lang.org
Python: python.org
Perl: usr.perl.org
純量
-------------------------------------------------------------------------
純量主要有一下幾種。
字符串
布爾值
整數
浮點數
Null
時間
日期
數值直接以字面量的形式表示。
number:12.30
布爾值用true和false表示。
isSet:true
null使用~表示。
parent:~
時間採用ISO8601格式。
iso8601: 2001-12-14t21:59:43.10-05:00
日期採用ISO8601格式。
date: 1976-07-31
YAML容許使用兩個感嘆號強制轉換數據類型。
e: !!str 123
f: !!str true
字符串
-------------------------------------------------------------------------
字符串是最多見,也是最複雜的一種數據類型。
默認字符串不使用引號表示。
str:這是一行字符串
若是字符串中包含空格或特殊字符,需放在引號之中。
str:'內容:字符串'
單引號和雙引號均可以使用,雙引號不會對特殊字符串轉義。
s1:'內容\n字符串'
s2:"內容\n字符串"
轉爲 JavaScript 以下。
{ s1: '內容\\n字符串', s2: '內容\n字符串' }
單引號之中若是還有單引號,必須連續使用兩個單引號轉義。
str: 'labor''s day'
轉爲 JavaScript 以下。
{ str: 'labor\'s day' }
字符串能夠寫成多行,從第二行開始,必須有一個單空格縮進。換行符會被轉爲空格。
str: 這 是一段
多行
字串
轉爲 JavaScript 以下。
{ str: '這是一段 多行 字符串' }
多行字符串能夠使用|
保留換行符,也能夠使用>
摺疊換行。
this: | Foo Bar that: > Foo Bar
轉爲 JavaScript 代碼以下。
{ this: 'Foo\nBar\n', that: 'Foo Bar\n' }
+
表示保留文字塊末尾的換行,-
表示刪除字符串末尾的換行。
s1: |
Foo
s2: |+
Foo
s3: |-
Foo
轉爲 JavaScript 代碼以下。
{ s1: 'Foo\n', s2: 'Foo\n\n\n', s3: 'Foo' }
引用
------------------------------------------------------------------------
錨點&
和別名*
,能夠用來引用。
defaults: &defaults
adapter: postgres
host: localhost
development:
database: myapp_development
<<: *defaults
test:
database: myapp_test
<<: *defaults
等同於下面的代碼。
defaults:
adapter: postgres
host: localhost
development:
database: myapp_development
adapter: postgres
host: localhost
test:
database: myapp_test
adapter: postgres
host: localhost
&
用來創建錨點(defaults
),<<
表示合併到當前數據,*
用來引用錨點。
下面是另外一個例子。
- &showell Steve
- Clark
- Brian
- Oren
- *showell
轉爲 JavaScript 代碼以下。
[ 'Steve', 'Clark', 'Brian', 'Oren', 'Steve' ]