YAML教程:5分钟内开始使用YAML

2021-05-31 11:22:36 浏览数 (1)

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文档,以使文件组织或数据解析更加容易。

每个文档之间的分隔都用三个破折号(---)标记

代码语言:javascript复制
---
player: playerOne
action: attack (miss)
---
player: playerTwo
action: attack (hit)
--------

内置注释

YAML允许您使用#,类似于Python注释向文件添加注释。

代码语言:javascript复制
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]在值之前添加。

代码语言:javascript复制
# 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)。

代码语言:javascript复制
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

图丨来源于网络

0 人点赞