第3天:YAML语法
YAML是一种可读性很强的数据格式语言。正是由于YAML良好的可读性,其广泛引用于软件配置中。
语法规则
- YAML文件中的第一行为"---",表示这是一个YAML文件;
- YAML中的字段大小写敏感
- YAML与Python一样,使用缩进表示层级关系
- YAML的缩进不允许使用Tab键,只允许使用空格,且空格的数目不重要,只要相同层级的元素左侧对齐即可
- "#"表示注释,从这个字符一直到行尾都会被解析器忽略
YAML支持三种格式的数据,分别是:
- 对象:键值对的集合,又称为映射,类似于Python中的字典
- 数组:一组按次序排列的值,有称为序列,类似于Python中的列表
- 纯量:单个的,不可 再分的值,如字符串、布尔值与数字
YAML例子演示
下面结合Python来看几个YAML的例子,这些自理没有包含YAML的全部语法,但是足够理解和编写Ansible的Playbook.
为了解析YAML格式的文件,需要安装第三方的PyYAML库。直接使用pip安装即可:
pip install PyYAML
在YAML中的数组,只需要用"-"将元素按序列出即可, 比如有一个data.yaml文件,内容如下
--- #一个美味水果的列表 - Apple - Orange - Strawberry - Mango
使用PyYAML库解析YAML文件非常简单,如下
In [1]: import yaml In [2]: with open('data.yaml') as f: ...: print(yaml.load(f)) ...: ['Apple', 'Orange', 'Strawberry', 'Mango']
在YAML中,对象以"key:value"的形式进行定义,如下
--- #以为职工的记录 name: Example Developer job: Developer skill: Elite
转换为python内部对象以后,结果如下:
{'skill': 'Elite', 'job': 'Developer', 'name': 'Example Developer'}
YAML中可以使用多种方式指定布尔值,例如下面的格式都是合法的
---
create_key: yes
needs_agent: no
knows_oopL: True
like_emacs: TRUE
uses_cvs: false
转换为python代码以后,对变量的取值进行了格式化
{'create_key': True, 'like_emacs': True, 'needs_agent': False, 'knows_oopL': True, 'uses_cvs': False}
YAML中的对象和数组也可以任意嵌套
--- #一位职工记录 name: heboan job: sa skill: Elite employed: True foods: - Apple - Orange - Strawberry - Mango languages: ruby: Elite python: Elite dotnet: Lame
将上面的YAML转换为Python的内部对象结果如下
{ 'languages': { 'python': 'Elite', 'dotnet': 'Lame', 'ruby': 'Elite' }, 'foods': [ 'Apple', 'Orange', 'Strawberry', 'Mango' ], 'name': 'heboan', 'employed': True, 'skill': 'Elite', 'job': 'sa' }
在YAML中定义字符串时,甚至都不需要使用单引号或双引号,直接写在文件建中即可:
str: this is a string
如果字符串中包含特殊字符,需要使用双引号包含起来,如冒号
str: "somebody said I should put a colon here: so I did"
如果字符串的内容较长,可以使用">"来折叠换行,也就是说,接下来的缩进的内容都是这个字符串的一部分:
--- str: > my name is heboan cccc
转换成python如下:
{'str': 'my name is heboan cccc\n'}
每天进步一点,加油!