YAML是一种数据序列化语言,它允许您以紧凑且可读的格式存储复杂数据。这对于DevOps和虚拟化非常有用,因为它对于实现高效的数据管理系统和自动化至关重要。
尽管它经常被开发人员所忽略,但它是一个功能强大且简单的工具,只需几个小时的学习就可以学会。
今天,我们将快速学习YAML,并且探索如何在下一个数据驱动的解决方案中使用它。
这是我们今天要介绍的内容:
- 什么是YAML?
- YAML的显著特征
- YAML语法
- 进阶概念
什么是YAML?
YAML是一种数据序列化语言,用于以人类可读的形式存储信息。它最初代表“Yet Another Markup Language”,但后来更改为“ YAML Ain’t Markup Language”,以区别于真正的标记语言。
它类似于XML和JSON文件,但使用更简洁的语法。YAML通常用于在基础架构代码(IoC)程序中创建配置文件或在DevOps开发管道中管理容器。
最近,YAML已用于创建自动化协议,该协议可以执行YAML文件中列出的一系列命令。这意味着您的系统可以更加独立和快速响应,而无需开发人员额外关注。
随着越来越多的公司采用DevOps和虚拟化技术,YAML迅速成为现代开发人员职位的必备技能。通过使用PyYAML库,Docker或Ansible等流行技术(如Python)的支持,YAML还易于与现有技术结合。
YAML与JSON与XML
YAML(.yml)
- 可读代码
- 极简主义语法
- 专为数据设计
- 与JSON类似的内联样式(是JSON的超集)
- 允许注释
- 不带引号的字符串
- 被认为是“更简洁”的JSON
- 高级功能(可扩展的数据类型,关系锚和保留键顺序的映射类型)
用例:YAML最适合使用DevOps管道或VM的数据繁重的应用程序。当团队中的其他开发人员经常使用此数据并因此需要更具可读性时,这也很有用。
JSON格式
- 难以阅读
- 明确而严格的语法要求
- 与YAML相似的内联样式(某些YAML解析器可以读取JSON文件)
- 暂无注释
- 字符串需要双引号
用例:JSON在Web开发中受到青睐,因为它最适合序列化格式和通过HTTP连接传输数据。
XML格式
- 难以阅读
- 更详细
- 充当标记语言,而YAML则用于数据格式化
- 包含比YAML更多的功能,例如标记属性
- 更严格定义的文档架构
用例: XML最适合需要对验证,架构和名称空间进行精细控制的复杂项目。XML不是人类可读的,并且需要更多的带宽和存储容量,但是提供了精细的控制。
YAML的显着特征
以下是YAML提供的一些最佳功能。
多文档支持
您可以在一个YAML文件中包含多个YAML文档,以使文件组织或数据解析更加容易。
每个文档之间的分隔都用三个破折号(---
)标记
--- player: playerOne action: attack (miss) --- player: playerTwo action: attack (hit) --------
内置注释
YAML允许您使用#
,类似于Python注释向文件添加注释。
key: #Here is a single-line comment - value line 5 #Here is a #multi-line comment - value line 13
可读的语法
YAML文件使用类似于Python的缩进系统来显示程序的结构。您需要使用空格而不是制表符来创建缩进,以免造成混淆。
它还削减了JSON和XML文件中的许多“噪声”格式,例如引号,括号和花括号。
这些格式规范一起提高了YAML文件的可读性,超越了XML和JSON。
YAML
#YAML Imaro: author: Charles R. Saunders language: English publication-year: 1981 pages: 224
JSON格式
#JSON { "Imaro": { "author": "Charles R. Saunders", "language": "English", "publication-year": "1981", "pages": 224, } }
注意,他们传达了相同的信息,但是由于YAML文件中删除了双引号,逗号和方括号,因此一目了然,更易于阅读。
隐式和显式输入
YAML在通过自动检测数据类型在输入方面提供了多功能性,同时还支持显式输入选项。要将数据标记为某种类型,只需!![typeName]
在值之前添加。
# The value should be an int: is-an-int: !!int 14.10 # Turn any value to a string: is-a-str: !!str 67.43 # The next value should be a boolean: is-a-bool: !!bool yes
没有可执行命令
作为数据表示格式,YAML不包含可执行文件。因此,与外部方交换YAML文件非常安全。
YAML必须与其他语言(例如Perl或Java)集成,才能添加可执行文件。
YAML语法
YAML具有构成大部分数据的一些基本概念。
键值对
通常,YAML文件中的大多数内容都是键-值对的一种形式,其中键表示对的名称,而值表示链接到该名称的数据。键值对是所有其他YAML构造的基础。
<key>: <value>
标量和映射(Scalars and mapping)
标量表示单个存储的值。标量使用映射分配给键名。您定义一个映射,该映射具有名称,冒号和空格,然后为其保留一个值。
YAML支持常见的类型,例如整数和浮点数值,以及非数字类型的Boolean和String。
每个都可以用不同的方式表示,例如十六进制,八进制或指数。数学概念还有特殊类型,例如无穷大,-无穷大和非数字(NAN
)。
integer: 25 hex: 0x12d4 #evaluates to 4820 octal: 023332 #evaluates to 9946 float: 25.0 exponent: 12.3015e+05 #evaluates to 1230150.0 boolean: Yes string: "25" infinity: .inf # evaluates to infinity neginf: -.Inf #evaluates to negative infinity not: .NAN #Not a Number
String
字符串是代表句子或短语的字符的集合。您可以使用|
将每个字符串打印为新行,>
可以将其打印为段落。
YAML中的字符串不需要用双引号引起来。
str: Hello World data: | These Newlines Are broken up data: > This text is wrapped and is a single paragraph
顺序 (Sequence)
序列是类似于列表或数组的数据结构,它们在同一键下保存多个值。它们是使用块或内联流样式定义的。
块样式使用空格来构造文档。与流程样式相比,它更易于阅读,但结构却不那么紧凑。
-------- # Shopping List Sequence in Block Style shopping: - milk - eggs - juice
流样式允许您使用方括号内联编写序列,类似于Python或JavaScript等编程语言中的数组声明。Flow样式更紧凑,但一眼就很难阅读。
-------- # Shopping List Sequence in Flow Style shopping: [milk, eggs, juice]
辞典 (Dictionaries)
词典是键-值对的集合,它们都嵌套在同一子组下。它们有助于将数据划分为逻辑类别,以供以后使用。
字典的定义就像映射一样,在字典中,您输入字典名称,冒号和一个空格,后跟一个或多个缩进键/值对。
# An employee record Employees: - dan: name: Dan D. Veloper job: Developer team: DevOps - dora: name: Dora D. Veloper job: Project Manager team: Web Subscriptions
字典也可以包含更复杂的结构,例如序列。嵌套序列是表示复杂关系数据的好技巧。
下一步要学习的高级概念
恭喜您迈出了学习YAML的第一步。尽管经常被忽视,但YAML是一种简单有效的工具,可用于开发DevOps工具包。
接下来要讨论的一些高级主题是:
- 锚点
- 范本
- YAML与外部工具(Docker,Ansible等)
- 高级序列/映射类型
- 高级数据类型(时间戳,空值等)