大多数格式化语言以非人类可读的格式显示数据。即使是最流行的数据格式 JSON,其代码可读性也很差。YAML 是 JSON 的替代方案,它以自然、易于阅读和简洁的方式格式化数据。本文将向您介绍 YAML 标记语言。我们介绍了这种标记语言背后的基本概念,解释了它的主要特性,并展示了 YAML提供了什么。
什么是 YAML?
YAML 是一种数据序列化语言。早在 2001 年问世时,YAML 就代表“又一种标记语言”。该首字母缩写词后来更改为“ YAML Ain't Markup Language ”,以强调该语言旨在用于数据而不是文档。
它不是真正意义上的编程语言。YAML 文件存储信息,因此它们不包括操作和决策。
与 XML 或 JSON 不同,YAML 以一种易于人类阅读的方式呈现数据。简单的语法不会影响语言的功能。添加到 XML 或 JSON 文件的任何数据或结构也可以存储在 YAML 中。
除了人类可读的代码外,YAML 还具有以下特点:
- 跨语言数据可移植性
- 一致的数据模型
- 一次性处理
- 易于实施和使用
用户可以用任何编程语言编写代码来读取和生成 YAML。YAML 中的扩展名是.yaml和.yml。两个扩展名代表相同的文件类型。
Yaml 功能
YAML 具有多项功能,使其成为数据格式化的绝佳选择。
多文档支持
用户可以将多个文档添加到单个 YAML 文件中。用三个破折号 ( ) 分隔不同的文档---
,如下所示:
--- 时间:19:04:12 玩家:playerOne 行动:罢工(小姐) --- 时间:20:03:47 玩家:playerTwo 动作:打击(击中) ...
三个点(“ …… ”)标记文档的结尾,而不是开始一个新的。
内置评论
YAML 允许用户在他们的代码中添加注释。YAML 注释以#
符号开头,不必位于单独的行:
key: #这是单行注释 - 价值线 10 #这是一个 #多行注释 - 价值线 20
干净的语法
与 Python 一样,YAML 依赖缩进来显示数据中的级别和结构。没有常用的格式符号,例如大括号、方括号、结束标记或引号。语法简洁且易于浏览。
简洁的语法是一些流行工具依赖 YAML 的原因,例如Ansible、Kubernetes 和 OpenStack。
没有标签
YAML 不允许制表符。空格是实现缩进的唯一方法。
最好在文本编辑器中显示空白字符,以防止意外使用制表符。
精准反馈
YAML 反馈是指文件中的特定行。当您知道在哪里查找时,您可以快速找到并修复错误。
支持复杂结构
YAML 提供了引用其他数据对象的能力。通过引用,您可以在 YAML 文件中编写递归数据并构建高级数据结构。
带有标签的显式数据类型
YAML 自动检测数据类型,但用户可以自由指定他们需要的类型。要指定数据类型,请包含“!!” 象征:
# 值应该是一个整数: is-an-int: !!int 5.6 # 将任意值转换为字符串: is-a-str: !!str 90.88 # 下一个值应该是一个布尔值: is-a-bool: !!bool 是的
没有可执行的命令
YAML 是一种数据表示格式。没有可执行命令,这使得该语言在与第三方交换文件时非常安全。
如果用户希望添加可执行命令,YAML 必须与其他语言集成。例如,添加 Perl 解析器以启用 Perl 代码执行。
YAML 的工作原理
YAML 匹配敏捷方法的原生数据结构及其语言,例如 Perl、Python、PHP、Ruby 和 JavaScript。它还派生了其他语言的功能:
- 标量、列表和数组来自 Perl。
- 三破折号分隔符来自 MIME。
- 空格包装来自 HTML。
- 转义序列来自 C.
YAML 支持所有基本数据类型,包括空值、数字、字符串、数组和映射。它识别一些特定于语言的数据类型,例如日期、时间戳和特殊数值。
冒号和一个空格定义一个标量(或变量):
字符串:“17” 整数:17 浮动:17.0 布尔值:否
|
字符表示保留换行符的字符串,字符>
表示折叠换行符的字符串:
数据:| 每个人 这些 换行符 将会 破碎。 数据:> 本文 被包裹 还会 形成 一个段落。
除了基础知识之外,您还需要了解 YAML 中两种重要的结构类型:
- YAML 列表
- YAML 映射
在 YAML 中使用这两种结构进行格式化。
YAML 映射(带示例)
地图关联名称-值对,这是设置数据的一个重要方面。YAML 配置文件可以这样开始:
--- api版本:v3 种类:豆荚
这是相同文件打开的 JSON 等价物:
{ "apiVersion": "v3", “种类”:“豆荚” }
两个代码都有两个值,v3
和Pod
,映射到两个键,apiVersion
和kind
。在 YAML 中,引号是可选的,并且没有括号。
这种标记语言允许您通过创建映射到另一个映射而不是字符串的键来指定更复杂的结构。请参阅下面的 YAML 示例:
--- api版本:v3 种类:豆荚 元数据: 名称:RSS网站 标签: 应用程序:网络
我们有一个键 ( metadata
) 和另外两个键作为它的值name
和labels
。该labels
键具有另一个映射作为其值。YAML 允许您根据需要嵌套地图。
空格的数量无关紧要,但它必须在整个文件中保持一致。在我们的示例中,为了便于阅读,我们使用了两个空格。Name
并且labels
具有相同的缩进级别,因此处理器知道两者都是同一映射的一部分。
相同的映射在 JSON 中如下所示:
{ "apiVersion": "v3", “种类”:“豆荚”, “元数据”:{ “名称”:“RSS站点”, “标签”: { “应用程序”:“网络” } } }
YAML 列表(附示例)
YAML 列表是一系列项目。例如:
参数: - 关掉 - “1000” - 味精 - “重启系统”
一个列表可以包含任意数量的项目。项目以破折号开头,而缩进将其与父项分开。您还可以将地图存储在列表中:
--- api版本:v3 种类:豆荚 元数据: 名称:RSS网站 标签: 应用程序:网络 规格: 容器: - 名称:前端 图片:nginx 端口: - 容器端口:80 - 名称:RSS阅读器 图片:nickchase/rss-php-nginx:v1 端口: - 容器端口:88
我们有一个容器(对象)列表。每个都由名称、图像和端口列表组成。ports 下的每一项都是一个映射,列出了containerPort
及其值。
我们的示例在 JSON 中看起来像这样:
{ “apiVersion”: “v3”, “kind”: “Pod”, “元数据”: { “name”: “rss-site”, “labels”: { “app”: “web” } }, “spec” : { “containers”: [{ “name”: “front-end”, “image”: “nginx”, “ports”: [{ “containerPort”: “80” }] }, { “name”: “rss -reader”、“image”:“nickchase/rss-php-nginx:v1”、“ports”:[{“containerPort”:“88”}] }] } }
YAML 和 JSON 有什么区别?
JSON 和 YAML 可以互换使用,它们的用途相同。但是,两者之间存在显着差异:
YAML | JSON |
---|---|
易于人类阅读 | 人类难以阅读 |
允许评论 | 暂无评论 |
空格字符决定层次结构 | 方括号和大括号表示数组和对象 |
字符串引号支持单引号和双引号 | 字符串必须用双引号 |
根节点可以是任何有效的数据类型 | 根节点是一个对象或一个数组 |
YAML 和 JSON 的主要区别在于代码的可读性。最好的例子是官方 YAML 主页。该网站本身是有效的 YAML,但人类很容易阅读。
YAML 是 JSON 的超集。如果将 JSON 直接粘贴到 YAML 文件中,它会通过 YAML 解析器解析相同的内容。用户还可以在两种格式之间转换大多数文档。可以在线将 JSON 文件转换为 YAML,也可以使用Syck 或 XS 等工具。
IaC 中的 YAML
YAML 是为Infrastructure as Code编写配置文件时的常用选项。这些文件存储所需云环境的参数和设置。
Red Hat 的 Ansible 是最受欢迎的 IaC 工具之一,它使用 YAML 进行文件管理。Ansible 用户创建所谓的用 YAML 代码编写的剧本,这些剧本可以自动执行配置和部署云环境的手动任务。
在下面的示例中,我们定义了一个 Ansible 剧本verify-apache.yml:
--- - 主机:网络服务器 变量: http_port:90 最大客户数:250 远程用户:根 任务: - 名称:确保 apache 是最新版本 百胜: 名称:httpd 状态:最新 - 名称:编写 apache 配置文件 模板: 源代码:/srv/httpd.j2 目标:/etc/httpd.conf 通知: - 重启阿帕奇 - 名称:确保 apache 正在运行 服务: 名称:httpd 状态:开始 处理程序: - 名称:重启apache 服务: 名称:httpd 状态:重启
此 YAML 剧本中有三个任务:
yum
我们使用该命令将 Apache 更新到最新版本。- 我们使用模板来复制 Apache 配置文件。然后 playbook 重新启动 Apache 服务。
- 我们启动 Apache 服务。
设置后,将从命令行运行剧本。虽然路径因设置而异,但以下命令运行 playbook:
ansible-playbook -i 主机/组 verify_apache.yml