4.1 YAML语言介绍

Ansible里面的配置文件是通过YAML文件来实现的,这里首先简单介绍下YAML语言。

YAML是一个可读性高的用来表达资料序列的格式。它的主要特点有:可读性高、语法简单明了、表达能力强、扩展性和通用性强等。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

为什么不是我们所熟悉的XML呢?因为:

·YAML的可读性高。

·YAML和脚本语言的交互性好。

·YAML使用实现语言的数据类型。

·YAML有一个一致的信息模型。

·YAML易于实现。

上面5条也是XML不足的地方。此外,YAML也有XML的下列优点:

·YAML可以基于流来处理。

·YAML表达能力强,可扩展性好。

总之,YAML试图用一种比XML更敏捷的方式,来完成XML所完成的任务。

YAML的语法和其他高阶语言类似,并且可以简单地表达列表、字典等数据结构。在该语法中,列表中的所有成员都开始于相同的缩进级别,并且使用一个“-”作为开头(一个横杠和一个空格)。一个字典是由一个简单的“键:键值”的形式组成的(这个冒号后面必须是一个空格)。

另外,建议所有的YAML文件都是以---(3个横杠)作为开始行,这是YAML格式的一部分,表明是一个文件的开始。

下面是一个通用示例,文件内容如下所示:

name: Tom Smith

age: 37

spouse:

name: Jane Smith

age: 35

children:

- name: Jimmy Smith

age: 15

- name1: Jenny Smith

age1: 12

上述示例表示Tom今年37岁,有一个幸福的四口之家,两个孩子Jimmy和Jenny活泼可爱,妻子Jane年轻美貌。

YAML文件的扩展名通常为.yaml,如test.yaml,我们应如何在Python下读取test.yaml文件呢?代码如下所示:

#!/usr/bin/python

#加载

YAML模块

import yaml

#读取

test.yaml文件

file = open("test.yaml")

#导入文件

x = yaml.load(file)

print x

执行这段代码,结果如下所示:

{'age': 37, 'spouse': {'age': 25, 'name': 'Jane Smith'}, 'name': 'Tom Smith', 'children': [{'age': 15, 'name': 'Jimmy Smith'}, {'age1': 12, 'name1': 'Jenny Smith'}]}

YAML文件最常见的层次和结构,对应的就是Python中的列表(list)和字典(dictionary)两种类型,下面举例说明:

- apple

- banana

- orange

- pear

对应的Python结果为:

['apple', 'banana', 'orange', 'pear']

稍为复杂的YAML示例,文件内容如下:

node_a:

conntimeout: 300

external:

iface: eth0

port: 556

internal:

iface: eth0

port: 778

broadcast:

client: 1000

server: 2000

node_b:

0:

ip: 10.0.0.1

name: b1

1:

ip: 10.0.0.2

name: b2

对应的Python结果为:

{'node_b': {0: None, 'ip': '10.0.0.2', 'name': 'b2', 1: None}, 'node_a': {'iface': 'eth0', 'port': 778, 'server': 2000, 'broadcast': None, 'client': 1000, 'external': None, 'conntimeout': 300, 'internal': None}}

列表和字典结构也可以混用,例如下面的例子:

---

# 一位职工记录

name: Example Developer

job: Developer

skill: Elite

employed: True

foods:

- Apple

- Orange

- Strawberry

- Mango

languages:

ruby: Elite

python: Elite

dotnet: Lame

对应的Python结果为:

{'languages': {'python': 'Elite', 'dotnet': 'Lame', 'ruby': 'Elite'}, 'foods': ['Apple', 'Orange', 'Strawberry', 'Mango'], 'name': 'Example Developer', 'employed': True, 'skill': 'Elite', 'job': 'Developer'}

参考文档https://www.ibm.com/developerworks/cn/xml/x-1103linrr/

参考文档http://docs.ansible.com/ansible/YAMLSyntax.html