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
代码语言:javascript复制#YAML
Imaro:
author: Charles R. Saunders
language: English
publication-year: 1981
pages: 224
JSON格式
代码语言:javascript复制#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构造的基础。
代码语言:javascript复制<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中的字符串不需要用双引号引起来。
代码语言:javascript复制str: Hello World
data: |
These
Newlines
Are broken up
data: >
This text is
wrapped and is a
single paragraph
顺序 (Sequence)
序列是类似于列表或数组的数据结构,它们在同一键下保存多个值。它们是使用块或内联流样式定义的。
块样式使用空格来构造文档。与流程样式相比,它更易于阅读,但结构却不那么紧凑。
代码语言:javascript复制--------
# Shopping List Sequence in Block Style
shopping:
- milk
- eggs
- juice
流样式允许您使用方括号内联编写序列,类似于Python或JavaScript等编程语言中的数组声明。Flow样式更紧凑,但一眼就很难阅读。
代码语言:javascript复制--------
# Shopping List Sequence in Flow Style
shopping: [milk, eggs, juice]
辞典 (Dictionaries)
词典是键-值对的集合,它们都嵌套在同一子组下。它们有助于将数据划分为逻辑类别,以供以后使用。
字典的定义就像映射一样,在字典中,您输入字典名称,冒号和一个空格,后跟一个或多个缩进键/值对。
代码语言:javascript复制# 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等)
- 高级序列/映射类型
- 高级数据类型(时间戳,空值等)
文丨Soundhearer
图丨来源于网络