预计阅读本页时间:-
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