YAML 教程 | YAML 入门

您可能是开发人员、管理员、云工程师或 DevOps 工程师,无论您遇到什么角色 YAML 重要的是您要了解 yaml 的内容和方式。 这篇文章的编排方式让您对 yaml 基础.

在开始 YAML 基础之前,请​​允许我给您简单介绍一下数据序列化。

什么是数据序列化?

简单来说,数据序列化是将数据转换为可以存储、通过网络传输并由应用程序解释的格式的过程。

三种最常见的数据序列化格式是 XML, JSON, YAML. 我们还有其他格式,如 BSON、MessagePack 和 Protobuf 等。

本指南仅关注什么是 YAML 以及怎样使用 YAML,并附有实际示例。

什么是 YAML?

YAML,代表 YAML ain’t markup language,是一种数据序列化语言,是 JSON 的超集。 YAML 之所以如此受欢迎是因为它的简单性。 与 XML 或 json 相比,创建和读取 yaml 文件更容易。

现代工具如 ansible、docker、Kubernetes、Chef 等,以及云环境如 Aws、Azure、GCP 使用 yaml。 你会看到很多使用 yaml 编写的配置和部署文件。 为了 example,在 Ansible 中,剧本是用 yaml 编写的。

许多流行的编程语言都有与 yaml 一起使用的库,因此 yaml 可以轻松地与任何环境集成。

YAML 扩展

YAML 文件应保存为 .yml 要么 .yaml 扩展名。 每个流行的文本编辑器,如 Vscode、Atom、Vim、Sublime Text 等,都支持 yaml 语言。

您还可以在您的文本编辑器上安装 yaml linter、yaml 到 json/XML 转换器、yaml 美化等扩展,当您使用 yaml 时,它们将提供更多功能。

基本 Yaml 结构

yaml 的基本结构要么是序列类型,要么是字典类型。 序列类型类似于python列表,字典类型类似于python字典。

字典是键值对,其中键是字符串类型,值可以是任何标量类型。 要分隔键和值,请使用冒号 ()。

Site_name: ostechnix

yaml 流中的每个文档都应使用三个破折号 (---) 和三个点 ()。 三个破折号 (---) 指向文档的开头和三个点 () 指向流中文档的结尾。 如果没有多个文档,则不必使用破折号和点。

---
operating_system: Redhat
version: 8
Same_family:
 - Rocky Linux
 - Alma Linux
 - Fedora Linux
...

---
operating_system: Debian
version: 11
Same_family:
 - Ubuntu
 - Linux Mint
 - Pop!_OS
...

Yaml 使用缩进来定义对象的结构。 不支持制表符,您应该为缩进留出两个空格。 当你按下 <标签> 在文本编辑器中使用 yaml 时,它只会留下两个空格,或者至少 Vscode 是这种情况。

YAML 缩进

您将在接下来的部分中了解有关缩进的更多信息。

我将运行以下一段 python 代码,它将解析 yaml 文件并将数据类型转换为 python 数据类型。

#!/usr/bin/python3

import yaml

with open("input.yaml", 'r') as f:
   dict = yaml.load(f, yaml.FullLoader)
   for k, v in dict.items():
       print (k + " : " + str(v))
       print("data type", " = ", type(v))
       print()

您可以使用此代码或 在线翻译 运行和测试本文中的 yaml 代码。

YAML 注释

注释可以让阅读 yaml 文件的任何人更好地理解。 要在 yaml 文件中添加注释,请使用 # 象征。 Yaml 不支持多行注释。 所以如果你想添加多行注释,你必须在每一行前面加上 # 象征。

# CONFIGURATION FILE BASED ON PoP_!OS COSMIC DESKTOP

OS_NAME: "Pop!_OS"
VERSION: 21.04       # VERSION 21.10 REACHED EOL
CODE_NAME: COSMIC  

在上述 example,添加了两条评测。 块注释在第一行添加,第二个是在第四行添加的内联注释。

YAML 字符串类型

yaml 中的字符串可以用引号或不带引号创建。 Yaml 足够聪明,可以在内部解释数据类型。 这里键是字符串类型,值也设置为字符串类型。

要记住的重要一点。

  • 除非必要,否则不使用引号创建字符串。
  • 如果字符串包含任何特殊的转义字符,请使用双引号。
  • 如果要将特殊字符解释为文字,请使用单引号。
User1_review: Pop_!os is great to work with
User2_review: "Pop_!os t is great to work with"
User3_review: 'Pop_!os t is great to work with'
Yaml 字符串类型

正如我之前所说,yaml 默认知道数据类型。 还有一种明确的方式来指定数据类型。 采用 !! 符号后跟数据类型和字符串值。

User1_review: !!str Pop_!os is great to work with
隐式定义隐式定义

如果您有一长串字符串,但希望在 yaml 文件中多行写入,您可以使用 > 象征。 这就是所谓的 折叠式. 尽管您已将字符串写入多行,但您的解析器会将其解释为单行。

User4_review: >
 Among all the distribution
 I used
 PoP_!OS looks great
折叠式多行字符串折叠式多行字符串

当需要按原样打印多行字符串时,使用 管道 (|) 象征。 这就是所谓的 字面风格.

User5_review: |
 Among all the distribution
 I used
 PoP_!OS looks great
文字样式多行字符串文字样式多行字符串

您可以使用 chomp 修饰符去除或保留值末尾的空格。 您可以使用 "-" 之后的符号 > 要么 | 去除空白。

User4_review: >-
Among all the distribution
I used
PoP_!OS looks great.
User5_review: |-
Among all the distribution
I used
PoP_!OS looks great.

如果你想 保留空白, 你可以加 ”+“后面的符号 | 要么 > 符号。

User4_review: >+
Among all the distribution
I used
PoP_!OS looks great.
User5_review: |+
Among all the distribution
I used
PoP_!OS looks great.

YAML 数字类型

Yaml 支持 Integer、Float、Decimal 或 Hexadecimal 数字类型。 默认情况下,yaml 解析器会检测数据类型,但也有一种明确的方式来定义 int 和 float 数据类型,如下所示 example.

int1: 98765
int2: !!int 56789 # Explicit Integer definition

float1: 20.0481
float2: !!float 20.0482 # Explicit Float definition
Int 和 Float 数据类型Int 和 Float 数据类型

十六进制和八进制值将由解释器转换为十进制值。

hex1: 0x14d3
oct1: 014442
十六进制和八进制值十六进制和八进制值

YAML 布尔类型

Yaml 支持布尔值 “真的“ 和 ”错误的“。你也可以使用”是的“ 要么 ”“指向”真的“, 和 ”“ 要么 ”离开“指向”错误的“。您还可以使用显式定义数据类型 !!布尔.

布尔值没有大小写限制。 在下面 example,你可以看到我写了“真的“在许多情况下,解析器将所有内容解释为”真的“ 价值。

upgrade: True
Reboot_After_Upgrade: TRUE
Enable_Firewall: on
Set_Power_Profile: yes
YAML 布尔真值YAML 布尔真值

类似的条件适用于“错误的“也值。

upgrade: False
Reboot_After_Upgrade: FALSE
Enable_Firewall: off
Set_Power_Profile: no
YAML 布尔假值YAML 布尔假值

小心: 如果您尝试用引号将布尔值括起来,它将被视为字符串。

YAML 空类型

要使值为空,您可以使用“~“符号或”null” 关键字。您还可以定义键并将值留空,这将被视为 null。您还可以使用显式定义 !!null.

与布尔值类似,” 没有大小写限制null” 关键字。您可以在下面看到 example null 关键字是在三种不同的情况下编写的。

upgrade: !!null null
Reboot_After_Upgrade: NULL
Enable_Firewall: Null
Set_Power_Profile: ~
Set_Network_Interface: # NO VALUES PASSED
YAML 空类型YAML 空类型

在 python 中,NULL 值被解释为“None”类型,如果您尝试将 yaml 转换为 json,则 null 值将仅被解释为 null 值。

YAML 序列类型

Yaml 序列是按顺序存储的值列表。 想想 Perl 中的 Python 列表或数组之类的序列,您将在其中定义一个变量并存储一个或多个值。

有几种方法可以在 yaml 中定义序列。 首先是流入样式,您将在其中给出一个键名,然后是方括号内的值列表。 这类似于 蟒蛇列表.

# INFLOW STYLE SEQUENCE
app_to_be_updated: [ "firefox", "timeshift"]
流入式顺序流入式顺序

第二种方法是使用块样式创建序列。 序列中的每个元素都将带有前缀 短跑 其次是 空间元素值. 每个元素都应写在单独的行中。 您可以有两个空格的缩进,也可以创建一个没有缩进的序列。 但作为最佳实践,只需坚持缩进即可。

# BLOCK STYLE SEQUENCE

app_to_be_installed:
 - vscode
 - virtualbox
 - tilix

app_to_be_removed:
- pycharm
- stacer
- ufw
块样式序列块样式序列

也可以创建如下所示的嵌套序列。

# NESTED SEQUENCE
applications:
 - Productivity:
   - vscode
   - vagrant
   - docker
   - python3
 - Browser:
   - firefox
   - chrome
   - brave
嵌套序列嵌套序列

YAML 字典类型

我们已经在本文的开头部分看到了字典类型。 Dictionary 是一个键值对,它是 yaml 中的核心构建块之一。 词典 ”钥匙” 始终是字符串类型,并且值可以是任何标量类型。

与序列类似,字典也可以用多种方式编写。 首先是 流入 风格,这类似于 蟒蛇词典.

application: { Install: "Vscode", Remove: Stacer, Update: Firefox}
字典 - 流入风格字典 – 流入风格

也可以使用创建字典 堵塞 风格。

application1:
 Install: Vscode
 Remove: Stacer
 Update: Firefox
字典 - 块样式字典 – 块样式

您还可以创建嵌套字典列表。

application2:
 Install:
   python: 3.9
   Vscode: 1.58.2
 Remove:
   - Stacer
   - pycharm
 Update: Firefox
嵌套字典嵌套字典

YAML 锚点和别名

您可以使用锚点和别名在 yaml 文件中实现 DRY(不要重复自己)。

锚点用“&” 符号和别名用 ” 表示*“ 象征。

锚点类似于编程中的变量。 您将使用 & 符号后跟关键字,然后使用别名 (* 关键字)来扩展锚值。

看看下面 example. &x 被定义为锚点,然后使用别名对其进行扩展 *x.

User4_review: &x Among all the distribution I used PoP_!OS looks great.
User5_review: *x
User6_review: *x
锚点和别名锚点和别名

使用锚点和别名时,您可以覆盖任何特定值 << 象征。 在这里,我将版本的值从 21.10 覆盖到 21.04。

PoP_OS: &pos
 version: 21.10
 code_name: cosmic desktop
 d_flavour: gnome

rewrite:
 <<: *pos
 version: 21.04
覆盖值覆盖值

结论

在本文中,我们了解了什么是 yaml 以及怎样在 yaml 中使用不同的类型。 在本指南中,我使用 Python 作为 yaml 解析器。

希望这个 YAML 教程对您有用。 如果您是 yaml 新手,那么我建议您练习我们在本文中展示的任何内容,这将帮助您熟悉 yaml,并且您可以根据自己的环境开始使用它。

相关阅读:

  • 怎样使用 Linux 命令行工具解析和打印 JSON