早先的文章《Kubernetes入门实践--部署运行Go项目》里我们使用YAML定义了Deployment对象,Kubernetes推荐的使用方式也是用一个YAML文件来描述你所要部署的 API 对象。然后统一使用kubectl apply命令完成对这个对象的创建和更新操作。YAML是一种序列化语言,它通常被用作配置文件的一种格式。除了在Kubernetes项目以外像Docker-ComposeGitlab CI/CD项目的配置文件使用的也是YAML格式。通过这些在技术领域的明星项目也能反映出YAML在过去几年里的流行度。

这篇文章我们就详细地对YAML做一下入门,后面学习Kubernetes的过程中需要自己动手写那些API对象的声明配置文件时也好拿这个教程做个参考。

YAML是"Yet Another Markup Language"(另一种标记语言)的缩写。但后来项目的维护者将其重命名成了"YAML Ain‘t Markup Language"(YAML 不止是标记语言),以更加强调其面向数据的特性。所以你看,文章的标题,并不是我想标题党,是我真不知道起啥标题好才拿过来用的~。

一个简单的YAML文件

让我们先来看一个YAML文件的示例,做一个简要的概述。

--- doe: "a deer, a female deer"ray: "a drop of golden sun"pi: 3.14159xmas: truefrench-hens: 3calling-birds: - huey- dewey- louie- fredxmas-fifth-day: calling-birds: fourfrench-hens: 3golden-rings: 5partridges: count: 1location: "a pear tree"turtle-doves: two

文件以三个短横线开头。这些短横线表示新YAML文档的开始。YAML支持在单个文件里存放多个文档,解析器会将每组短横线识别为新文档的开始。

接下来,我们将看到构成大部分典型YAML文档的常用结构:键-值对。Doe是一个指向字符串值"a deer, a female deer."的键。

YAML支持的不仅仅是字符串值。上面的文件以六个键-值对开始。它们的值有四种不同的数据类型。键doeray的值都是字符串。pi是一个浮点数。xmas是一个布尔值。french-hens是一个整数。可以用单引号或双引号将字符串括起来,也可以根本不用引号。YAML将无引号的数字识别为整数或浮点数。

第七项是个数组。calling-birds有四个元素,每个数组元素都由一个短横线开头。

我用两个空格缩进了calling-birds中的元素。缩进是YAML表示嵌套的方式。空格缩进的数量可以因文件而异,相同层级的元素左侧对齐即可,但是不允许使用Tab制表符。

最后,我们看到xmas-fifth-day,里面还有五个元素,每个元素都缩进了。我们可以将xmas-fifth-day视为包含两个字符串、两个整数和另一个字典值的字典。YAML支持这种键值嵌套和混合类型。

在我们深入研究YAML之前,让我们先看看这个文档用JSON表示是什么样子。可以在百度或者Google上搜一下YAMLJSON的网页工具,这类工具有很多。

{"doe": "a deer, a female deer","ray": "a drop of golden sun","pi": 3.14159,"xmas": true,"french-hens": 3,"calling-birds": ["huey","dewey","louie","fred"],"xmas-fifth-day": {"calling-birds": "four","french-hens": 3,"golden-rings": 5,"partridges": {"count": 1,"location": "a pear tree"},"turtle-doves": "two"}
}

缩进和空白符

空白符是YAML格式的一部分,其中换行符表示字段的结束,缩进用于组织YAML文档的结构,用来表示文档的层级或者叫嵌套关系。不过YAML值允许使用空格符进行缩进,不允许使用制表符Tab键,这是因为不同的工具对待制表符的方式不同。缩进的空格数目不重要,只要相同层级的元素左侧对齐即可,比如下面这个文档,因为同级元素未对齐,在解析器里会报错

foo: barpleh: helpstuff:foo: barbar: foo

所以总结下来记住下面四点即可:

  • 换行符表示字段的结束。

  • 使用缩进表示层级关系。

  • 缩进时不允许使用制表符Tab键,只允许使用空格。

  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可。

注释

YAML中的注释以#号开头。它们可以出现在字段值之后,也可以占据整行。

___
# This is a full line comment
foo: bar # this is a comment, too

YAML数据类型

键-值对是YAML的基本构建块。YAML文档中的每一项都是至少一个字典的成员。键的类型始终是字符串。

YAML的键-值对中的值是标量。它们的表现行为类似于JavascriptPython等语言中的标量类型。通常我们只要记住将字符串括在引号中,数字不加引号就足够了,解析器会自动解析出值的类型。

下面我们就详细看一下YAML的值都支持哪些数据类型,我们先从数组和字典这两种符合类型说起,然后再逐步拆解看里面的普通类型。一般看完这两种复合类型就可以掌握YAML的基本用法,上手编写和修改YAML文档了。

数组

YAML的数组可以写在一行里

items: [ 1, 2, 3, 4, 5 ]
names: [ "one", "two", "three", "four" ]

也可以写在多行里,每一行指定一个元素

---
items:- 1 - 2 - 3- 4 - 5
names:- "one"- "two"- "three"- "four"

多行格式对于包含复杂对象的列表非常有用。

___
items:- things:thing1: hueythings2: deweything3: louie- other things:key: value

数组可以包含任何有效的YAML值。同一个数组中的值不必是同一类型。

字典

与数组一样,可以将字典放入单行内。我们在上面看到了这种格式。类型Python打印字典的格式:

---
foo: { thing1: huey, thing2: louie, thing3: dewey }

也见过在多行里指定字典元素的格式:

---
foo: bar
bar: foo

当然字典也可以自由嵌套,并且持有任何有效的YAML值。

---
foo:bar:- bar- rab- plop

数字类型

YAML可以识别数字类型。我们在上面看到了浮点和整数。YAML还支持其他几种数字类型。

整数可以用十进制、十六进制或八进制表示,Ox表示一个值是十六进制的,前导零表示一个八进制值。

 foo: 12345bar: 0x12d4plop: 023332

转换成JSON后整数都是十进制表示的

{"foo": 12345,"bar": 4820,"plop": 9946
}

YAML既支持固定浮点数,也支持指数浮点数。

 foo: 1230.15bar:  12.3015e+05

最后YAML里也可以表示正负无穷和非数字NaN (Not a Number的缩写)

foo: .inf
bar: -.Inf
plop: .NAN

字符类型

YAML的字符串为Unicode编码。在大多数情况下,不必用引号将它们括起来。

foo: this is a normal string

但是如果我们想要处理转义序列,我们需要使用双引号的字符串。

foo: "this is not a normal string\n"
bar: this is not a normal string\n

YAML将上面第一个值处理为以回车符和换行符结尾。由于第二个值未加引号,因此YAML\n视为两个普通的字符。

foo: this is not a normal string
bar : this is not a normal string\n

YAML不会对使用单引号的字符串进行转义,但是单引号可以避免将字符串内容解释为文档格式。

字符串值可以写在多行里。使用大于号,可以指定字符串块。

bar: >this is not a normal string itspans more thanone linesee?

但是解析器会把他们解析成单行字符串:

bar : this is not a normal string it spans more than one line see?

如果想让YAML把上面的字符串也解析成多行的,需要使用管道符  |

bar: |this is not a normal string itspans more thanone linesee?

Null

YAML里用波浪号~或者不带引号的null直接表示空值。

foo: ~
bar: null

布尔值

YAML用关键字TrueOnYes表示真。用FalseOffNo表示假。

---
foo: True
bar: False
light: On
TV: Off

高级选项

多文档

YAML文档以三个短横线开始,以三个英文句号结束。一些YAML处理程序会强制要求文档以三个短横线开始,结束运算符通常是可选的。例如,JavaJackson不会在没有开始的情况下处理YAML文档,但是PythonPyYAML会。

当一个文件包含多个文档时,通常使用文档结束操作符。比如下面这个例子

---
bar: foo
foo: bar
...
---
one: two
three: four

使用下面的Python脚本解析这个YAML文件:

import yamlif __name__ == '__main__':stream = open("foo.yaml", 'r')dictionary = yaml.load_all(stream)for doc in dictionary:print("New document:")for key, value in doc.items():print(key + " : " + str(value))if type(value) is list:print(str(len(value)))

脚本会解析出YMAL文件里的两个文档对象:

New document:
bar : foo
foo : bar
New document:
one : two
three : four

总结

YAML是一种功能强大的语言,可用于配置文件、应用程序之间的消息和保存应用程序状态。我们介绍了它最常用的特性,包括如何使用内置数据类型和构造复杂文档。它还支持自定义函数、正则表达式这样的高级功能。后面学习Kubernetes的过程中需要自己动手写那些API对象的声明配置文件时可以拿这个教程做个参考。

参考链接

YAML tutorial get started

YAML1.2规范

- END -

关注公众号,获取更多精选技术原创文章

YAML,另一种标记语言?不止是标记语言!相关推荐

  1. (自创) 一种新的轻量级文本标记语言 - MarkOwl

    设计目标 语法优雅 标记简洁 & 易于书写 语法健全. 不能出现自相矛盾, 漏洞百出, 解释不清的地方 标记含义明确, 不要有歧义 标记不可以对正文文字造成视觉干扰 (不能让阅读者看着眼花缭乱 ...

  2. HTML超文本描述语言,HTML超文本标记语言的介绍

    一.概念 1.定义 超级文本标记语言是标准通用标记语言下的一个应用,也是一种规范,一种标准, 它通过标记符号来标记要显示的网页中的各个部分. 简而言之:一种为普通文件中某些字句加上标示的语言,其目的在 ...

  3. html(+css)/01/html语言基础,标记,标记语法,html文档结构

    厚积薄发 html(+css)/01/html语言基础,标记,标记语法,html文档结构 工资:4500元左右/月 最好的学习html的方法,就是多参考别人的网页源代码: 查看源代码: 1,打开网页/ ...

  4. java和c语言的区别_C语言为何不会过时?你需要掌握多少种语言?

    关注.星标公众号,不错过精彩内容 整理/排版:付斌 转自:嵌入式ARM 01 为什么C语言不会过时 评价任何一门编程语言,都是招人骂的.永远是这样.就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过 ...

  5. window直接运行不需要环境的软件是什么语言开发的_C语言为何不会过时?你需要掌握多少种语言?_C 语言...

    01为什么C语言不会过时 评价任何一门编程语言,都是招人骂的.永远是这样.就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过,双方一定是同时在心里出现了两个字:"s b!"这个在 ...

  6. python 语句块标记_什么是python中的语言语句块标记

    什么是python中的语言语句块标记 发布时间:2020-07-16 10:05:20 来源:亿速云 阅读:172 作者:Leah 什么是python中的语言语句块标记?很多新手对此不是很清楚,为了帮 ...

  7. 认识标记语言html,认识标记语言HTML课件

    认识标记语言HTML课件 阿迪达斯三条纹标志是由阿迪达斯的创办人阿迪·达斯勒设计的,三条纹的阿迪达斯标志代表山区,指出实现挑战.成就未来和不断达成目标的愿望. 第二章 第五节 阿迪达斯三条纹标志是由阿 ...

  8. c语言注释的开始标记符和结束标记符分别为,C语言程序设计填空题

    C语言程序设计填空题Tag内容描述: 1.面向对象程序设计期末综合练习二 填空题 填空题 1 C 语言是在 语言的基础上发展起来的 2 C 语言的编译单位是扩展名为 的 文件 3 行尾使用注释的开始标 ...

  9. 随机森林c语言编程,一种基于随机森林的C语言源代码静态评分方法与流程

    本发明涉及评分领域及机器学习领域,它特别涉及一种基于随机森林的c语言源代码静态评分的构建方法. 背景技术: c语言源代码静态评分是指对根据一定的题目描述做出解答的c语言源代码进行评分.目前,主要流行的 ...

最新文章

  1. 【RocketMQ工作原理】消息的消费
  2. 构建城市大脑的未来标准,9个值得探索的规范
  3. 自学python还是报班-零基础学Python是应该报课还是自学?
  4. asp程序错误详细说明例表
  5. python封装函数、实现将任意的对象序列化到磁盘上_Python系列之lambda、函数、序列化...
  6. HTML标签语义化——使用b标签,还是strong标签
  7. boost官方文档同步机制Synchronization mechanisms overview
  8. 用python批量执行VBA代码
  9. 操作系统考研辅导教程(计算机专业研究生入学考试全真题解) pdf,计算机组成原理考研辅导教程:计算机专业研究生入学考试全真题解...
  10. nuxt.js 引入第三方插件报window is not defined
  11. SAP License:如何获取采购订单一次性供应商的地址信息
  12. 17个品牌,113款5G手机,你选哪款?
  13. 如何发布自己的 Composer 包
  14. linux 发送at指令,AT指令发送短信流程
  15. 微信端input输入框在ios手机上连续输入卡顿
  16. python搬家具_Python语言之学会Python之后!亲朋好友都夸我厉害!用Python买到最优惠的家具...
  17. 小薛读论文04:预测、解决方案与滚动时域 (UTD24期刊MSOM重要综述)
  18. 苹果app的几种发布方式
  19. 值得收藏的 5 款iPhone 数据恢复软件
  20. 多传感器融合定位七-惯性导航解算及误差分析其一

热门文章

  1. 《HTML5 2D游戏编程核心技术》——第2章,第2.3节使用CSS背景
  2. jQuery的无new实例化
  3. server2008密码不满足密码策略的要求,检查最小密码长度、密码复杂性和密码历史的要求”的解决办法...
  4. 一位 女生在第一次应聘软件开发工作时成功被淘汰的例子
  5. 新手学信息检索4:向量空间模型与相似度计算
  6. 转载java中synchronized用法
  7. 端口映射原理,公网,内网,NA
  8. 查找系列合集-二分查找
  9. VirtualBox下安装MacOS11
  10. “针对即席工作负荷进行优化”如何影响你的计划缓存