源本科技 | 码上会

理解 YAML 语言

2025/12/24
60
0

学习目标

通过本课件,你将掌握:

  1. YAML 的本质:它不是编程语言,也不是标记语言

  2. YAML 的核心语法规则与书写规范

  3. YAML 与 JSON、XML 的关键区别与适用场景

  4. YAML 在 DevOps 和云原生生态中的典型应用

  5. 使用 YAML 的最佳实践与安全注意事项


为什么 YAML

在现代软件开发中,我们经常需要编写配置文件——无论是 Kubernetes 的部署清单、Docker Compose 的服务定义,还是 CI/CD 流水线脚本。这些文件需要既能让机器解析,又便于人类阅读和修改

YAML(读作 /ˈjæməl/)正是为此而生。它的设计哲学是:“代码即文档”

关键认知:YAML 不是用来写逻辑的,而是用来描述数据结构的。


YAML 是什么

官方定义

YAML 是一种开源的、基于 Unicode 的数据序列化语言,专为人类可读性而设计。

名称的双重含义

YAML 的全称有两种解释,且都正确:

  • Yet Another Markup Language(又一种标记语言)— 最初命名

  • YAML Ain’t Markup Language(YAML 不是标记语言)— 现在的官方解释

这个递归缩写强调了一个事实:YAML 不用于标记文档(如 HTML),而是用于表示数据


YAML 核心语法规则

缩进决定结构

  • 使用 空格禁止使用 Tab)表示层级关系;

  • 推荐每级缩进 2 个空格

  • 缩进错误会导致解析失败。

metadata:
  name: nginx-deployment
  labels:
    app: nginx

键值对

  • 格式:key: value

  • 冒号后必须有一个空格

✅ 正确:

name: Alice
age: 28

❌ 错误:

name:Alice   # 缺少空格

列表

  • 每项以 - (短横线 + 空格)开头

hobbies:
  - reading
  - coding
  - hiking

标量-基本数据类型

YAML 支持多种标量写法:

类型

示例

说明

纯文本

key: value

无特殊字符时可不加引号

单引号

key: 'value'

原样输出,忽略转义

双引号

key: "line1\nline2"

支持 \n\t 等转义

多行字符串示例:

description: |
  This is a multi-line
  string in YAML.
  Each line break is preserved.

summary: >
  This is a folded
  string. Line breaks
  become spaces.

文件扩展名

  • .yaml(推荐)

  • .yml(兼容旧习惯)


YAML vs JSON vs XML

特性

YAML

JSON

XML

可读性

⭐⭐⭐ 极佳

⭐⭐ 良好

⭐ 冗长

注释支持

# 这是注释

❌ 不支持

<!-- 注释 -->

语法简洁度

高(无括号)

中(需引号、逗号)

低(需闭合标签)

数据类型支持

丰富(日期、二进制、锚点等)

基础(字符串、数字、布尔、数组、对象)

文本为主

典型用途

配置文件(K8s, Docker Compose)

API 数据交换

企业系统、文档标记

是否为超集

✅ YAML 是 JSON 的超集

重要事实任何合法的 JSON 文件都是合法的 YAML 文件


高级特性

多文档支持

使用 --- 分隔多个独立文档:

# 第一个文档
apiVersion: v1
kind: ConfigMap
---
# 第二个文档
apiVersion: apps/v1
kind: Deployment

常用于 Kubernetes 的单文件多资源定义。

锚点与引用

避免重复定义:

defaults: &defaults
  image: nginx:1.25
  ports: [80]

service-a:
  <<: *defaults
  name: web-a

service-b:
  <<: *defaults
  name: web-b

典型应用场景

场景

示例

Kubernetes

Pod、Service、Deployment 清单

Docker Compose

多容器应用编排

GitHub Actions

CI/CD 工作流定义

Ansible

自动化运维 Playbook

Spring Boot

application.yml 配置文件

在云原生时代,不会 YAML 几乎无法高效使用 Kubernetes


为什么选择 YAML

原因

说明

更易读写

无引号、无大括号,视觉干扰少

支持注释

配置文件可添加说明,便于团队协作

结构清晰

缩进天然表达层级,减少语法错误

适合人工编辑

开发者、运维、测试都能轻松修改

但注意:YAML 解析器可能存在反序列化漏洞(如 Python 的 yaml.load()),生产环境应使用安全模式(如 yaml.safe_load())。


最佳实践

  1. 始终使用空格,禁用 Tab

  2. 统一缩进风格(推荐 2 空格)

  3. 字符串尽量不加引号,除非包含特殊字符

  4. 复杂配置使用锚点避免重复

  5. 敏感信息不要硬编码在 YAML 中(应使用 Secrets 或外部注入);

  6. 使用 YAML 校验工具(如 VS Code 插件、YAML Lint)。


总结

关键点

说明

YAML 是什么

数据序列化语言,非编程语言,非标记语言

核心优势

人类可读、支持注释、语法简洁

主要用途

配置文件、声明式基础设施定义

生态地位

云原生和 DevOps 的“通用语言”

使用原则

“能用 YAML,就不用 JSON 写配置”


思考题

  1. 为什么 YAML 禁止使用 Tab 缩进?这背后的设计哲学是什么?

  2. 在 Kubernetes 中,如果 YAML 文件缩进错误,会报什么类型的错误?如何快速定位?

  3. YAML 的锚点功能能否跨文件引用?为什么?


📘 延伸阅读