YAML(“YAML Ain't Markup Language”的缩写) 是一种数据序列化格式,用于在不同系统和编程语言之间存储和交换数据。YAML 被设计为易于人类阅读,使其成为旨在供人们阅读的数据的不错选择。
在这篇文章中,我想了解一下 YAML 的基本特性以及它在 DevOps 工具中被广泛使用的原因。
什么是 YAML?
在 YAML 发展之初,它是作为“另一种标记语言”的缩写而得名的。后来,创作者决定将其改为“YAML Ain't Markup Language”,以区别于真正的标记语言并避免混淆。
该语言类似于 XML 和 JSON,但在保持类似功能的同时使用更简约的语法。YAML 通常用于在基础架构即代码 (IAC) 程序中创建配置文件或在 DevOps 工作中管理容器。
在大多数情况下,YAML 用于创建可以执行 YAML 文件中编写的命令序列的自动化协议。这使您的系统更加独立和响应迅速,而无需额外的开发人员关注。
越来越多的公司正在使用 DevOps 和虚拟化,因此 YAML 是现代开发人员的必备工具。此外,YAML 易于集成,支持 Python(使用 PyYAML 库、Docker 或 Ansible)和其他流行技术。
现在让我们看看 YAML、JSON 和 XML 之间的主要区别是什么。
YAML 与 JSON 与 XML
首先,我将列出 YAML 语言的一些基本特征,我认为这些特征可以将其与其他语言区分开来:
- 简约语法;
- 人类可读代码;
- 跨语言兼容性;
- 类似于 JSON 的内联样式(YAML 是它的超集)并且被认为比 JSON 更“干净”;
- 为处理数据而锐化;
- 支持评论;
- 支持不带引号的字符串。
作为附加功能,我提到了可扩展数据类型、相对锚点和保留键顺序的类型映射。
YAML 非常适合使用 DevOps 管道或虚拟机的数据密集型应用程序。此外,提高数据可读性对于开发人员经常与他们交互的团队是有益的。
例如,与 YAML 相比,XML 可以通过以下方式进行描述:
- 比较啰嗦;
- 更难阅读;
- 作为标记语言,YAML 作为数据格式化语言;
- 比 YAML 更多的特性,比如标签属性;
- 更严格的文档架构。
通常,XML 非常适合需要对验证、模式和名称空间进行精细控制的复杂项目。该语言的可读性很差,需要更多的带宽和存储容量,但提供了前所未有的控制。
至于JSON,相对于YAML,它的特点是:
- 明确、严格的语法要求;
- 更难阅读;
- 类似 YAML 的内联样式(一些 YAML 解析器可以读取 JSON 文件);
- 还没有评论;
- 字符串需要双引号。
JSON 通常用于 Web 开发,它是通过 HTTP 连接序列化和传递数据的最佳格式。
在我们了解了上述三种语言之间的差异之后,我想指出许多开发人员喜欢的 YAML 的一些最显着的特性。
YAML 的显着特征
多文档支持 您可以将多个 YAML 文档合并为一个 YAML 文件,以便于文件组织和数据解析。
文档由三个破折号 (---) 分隔:
--- player: playerOne action: attack (miss) --- player: playerTwo action: attack (hit) —-- 复制代码
易于阅读 的语法 YAML 文件的语法使用类似于 Python 的缩进系统。您必须使用空格而不是制表符,以避免混淆。这样可以去除 JSON 和 XML 中的额外字符(引号、方括号和大括号)。结果,文件的可读性大大提高:
#YAML Imaro: author: Aldous Huxley language: English publication-year: 1932 pages: 311 复制代码
现在将其与 JSON 格式进行比较:
#JSON { "Imaro": { "author": "Aldous Huxley", "language": "English", "publication-year": "1932", "pages": 311 } } 复制代码
缺少可执行文件 YAML 不包含可执行文件。因此,与第三方交换 YAML 文件是安全的。要使用可执行文件,YAML 需要与其他语言集成,例如 Perl 或 Java。
注释支持YAML 允许您在#
字符后添加注释,就像在 Python 中一样:
key: #This is a single line comment - value line 2 #This is #a multiline comment - value line 21 复制代码
显式和隐式类型YAML 提供自动类型检测和显式指定数据类型的能力。要使用具体类型,!![typeName]
请在值之前写入。
# This value has been converted to an int: 14.10 is-an-int: !!int # Converts any value to a string: 67.43 is-a-str: !!str # Must be a boolean value: is-a-bool: !!yes bool 复制代码
YAML 语法
键值对YAML 使用键值对来表示数据,类似于 Python 中的字典。例如:
key1: value1 key2: value2 key3: value3 复制代码
字符串
“字符串”是可以包含单词或句子的字符集合。您可以将其|
用于单行或>
段落。YAML 中不需要引号。
str: Hello World data: | This Separate Strings data: > This one paragraph text 复制代码
字典YAML 支持字典,可以使用键值对表示。字典允许您将数据划分为逻辑类别。例如:
key1: value1 key2: key3: value3 key4: value4 复制代码
字典可以包含更复杂的结构,允许您存储复杂的关系数据。
序列序列是类似于列表或数组的数据结构,在同一键下存储多个值。它们使用缩进或定义[]
。
animals: - dog - cat - elephant 复制代码
单行序列看起来更简洁,但可读性较差。
animals: [dog, cat, elephant] 复制代码
标量和映射 标量是名称对应的单个值。YAML 支持标准类型:int
and float
、boolean
、string
和null
。它们可以用不同的方式表示:十六进制、八进制或指数。还有用于数学实体的特殊类型,例如 infinity、-infinity 和 NAN。
integer: 25 hex: 0x12d4 #equal to 4820 octal: 023332 #equal to 9946 float: 25.0 exponent: 12.3015e+05 #equal to 1230150.0 boolean: Yes string: "25" infinity: .inf # converts to infinity neginf: -.Inf #converts to minus infinity not: .NAN #Not a Number null: ~ 复制代码
YAML 还能做什么?
YAML 除了上述的特性外,还有:
- 锚点
- 模板
- 与 Docker、Ansible 等的交互
- 扩展序列和映射
- 扩展数据类型(时间戳、空等)
YAML 语法旨在简单易用,使其成为供人类阅读的数据的流行选择。通过使用缩进和键值对,YAML 能够表示范围广泛的数据类型。
YAML 的主要优点之一是它的可读性。YAML 旨在尽可能简洁,同时仍然易于理解。这使得它成为供人类读取的数据(例如配置文件)的不错选择。
YAML 的另一个好处是它与许多流行的 DevOps 工具集成,例如 Ansible、Docker 和 Kubernetes。这些工具使用 YAML 来定义配置文件,使其成为在这些领域工作的任何人的宝贵技能。
结论
总之,YAML 是一种人类可读的数据序列化格式,用于在不同系统和编程语言之间存储和交换数据。它广泛用于 DevOps 工具,并因其简单性、可读性和灵活性而受到重视。
我希望这篇文章对您学习 YAML 及其功能有用!您在哪些领域使用过 YAML,为什么您认为它是一项值得学习的宝贵技能?在评论中分享您的想法