介紹
YAML 語言(發音 /?j?m?l/ )的設計目標,就是方便人類讀寫。它實質上是一種通用的數據串行化格式。
它的基本語法規則如下。
? 大小寫敏感
? 使用縮進表示層級關系
? 縮進時不允許使用Tab鍵,只允許使用空格。
? 縮進的空格數目不重要,只要相同層級的元素左側對齊即可
? yaml文件以"---"作為文檔的開始,"..."作為文檔的結束
#
表示注釋,從這個字符一直到行尾,都會被解析器忽略。
YAML 支持的數據結構有三種。
? 對象:鍵值對的集合,又稱為映射(mapping)/ 哈希(hashes) / 字典(dictionary)
? 數組:一組按次序排列的值,又稱為序列(sequence) / 列表(list)
? 純量(scalars):單個的、不可再分的值
對象
對象的一組鍵值對,使用冒號結構表示。
job: Developer
列表
---
fruits:
- Apple
- Orange
- Strawberry
- Mango
轉換為python格式
{'fruits': ['Apple', 'Orange', 'Strawberry', 'Mango']}
可以使用行內表示法
---
fruits: ['Apple', 'Orange', 'Strawberry', 'Mango']
字典
---
martin:
name: Martin D'vloper
job: Developer
skill: Elite
轉換為python格式
{'martin': {'job': 'Developer', 'name': "Martin D'vloper", 'skill': 'Elite'}}
可以使用行業內表示法
---
martin: {name: Martin D'vloper, job: Developer, skill: Elite}
復合結構
---
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
轉換為python格式
[{'martin': {'job': 'Developer','name': "Martin D'vloper",'skills': ['python', 'perl', 'pascal']}},{'tabitha': {'job': 'Developer', 'name': 'Tabitha Bitumen','skills': ['lisp', 'fortran', 'erlang']}}]
純量
** 數值**
number: 12
float:12.30
轉換為python格式
{'float': 12.300000000000001, 'number': 12}
** 布爾值**
表示true的值
true, True, TRUE, yes, Yes, YES, on, On, ON, y, Y
表示false的值
false, False, FALSE, no, No, NO, off, Off, OFF, n, N
** 轉換數據類型**
e: !!str 123
f: !!str true
轉換為python格式
{'e': '123', 'f': 'true'}
** 字符串**
字符串默認不使用引號表示。
str: 這是一行字符串
轉換為python格式
{'str': '這是一行字符串'}
如果字符串之中包含空格或特殊字符,需要放在引號之中。
str: '內容: 字符串'
轉換為python格式
{'str': '內容: 字符串'}
單引號和雙引號都可以使用,雙引號不會對特殊字符轉義。
str: 'labor''s day'
轉換為python格式
{'str': "labor's day"}
單引號之中如果還有單引號,必須連續使用兩個單引號轉義。
s1: '內容\n字符串'
s2: "內容\n字符串"
轉換為python格式
{'s1': '內容\\n字符串','s2': '內容\n字符串'}
字符串可以寫成多行,從第二行開始,必須有一個單空格縮進。換行符會被轉為空格。
str: 這是一段
多行
字符串
轉換為python格式
{'str': '這是一段 多行 字符串'}
多行字符串可以使用
|
保留換行符,也可以使用>
折疊換行。
this: |
Foo
Bar
that: >
Foo
Bar
轉換為python格式
{'that': 'Foo Bar', 'this': 'Foo\nBar\n'}
+
表示保留文字塊末尾的換行,-
表示刪除字符串末尾的換行。
s1: |
Foo
s2: |+
Foo
s3: |-
Foo
轉換為python格式
{'s1': 'Foo\n', 's2': 'Foo\n\n\n', 's3': 'Foo'}
字符串之中可以插入 HTML 標記。
message: |
<p style="color: red">
段落
</p>
轉換為python格式
{'message': '\n<p style="color: red">\n 段落\n</p>'}
引用
錨點
&
和別名*
,可以用來引用。
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
轉換為python格式
{'defaults': {'adapter': 'postgres', 'host': 'localhost'},
'development': {'adapter': 'postgres',
'database': 'myapp_development',
'host': 'localhost'},
'test': {'adapter': 'postgres',
'database': 'myapp_test',
'host': 'localhost'}}
&
用來建立錨點(defaults),<<
表示合并到當前數據,*
用來引用錨點。
下面是另一個例子。
- &showell Steve
- Clark
- Brian
- Oren
- *showell
轉換為python格式
['Steve', 'Clark', 'Brian', 'Oren', 'Steve']
yaml中引用變量
foo: "{{ variable }}"
高級YAML語法
!unsafe使用
變量值中保存的數據應被視為不安全的,防止不安全的字符子集和信息披露。
---
hosts: all
vars:
my_unsafe_variable: !unsafe 'unsafe value'
tasks:
...
資料
Playbooks 采用YMAL 語法結構,基本的YMAL 語法請參考
http://docs.ansible.com/YAMLSyntax.html
python利用pyyaml模塊進行解析yaml語言
http://pyyaml.org/wiki/PyYAMLDocumentation
yaml格式在線檢查
http://yaml-online-parser.appspot.com/
更多文章請看 Ansible 專題文章總覽