RunToolz iconRunToolz
Welcome to RunToolz!
YAML配置DevOps

YAML:没有混乱的配置文件

YAML已成为Kubernetes、Docker和CI/CD配置的标准格式。了解YAML的基本语法规则、缩进陷阱和常见错误,写出清晰可靠的配置文件。

RunToolz Team2026年1月16日4 min read

每个Kubernetes清单。每个GitHub Actions工作流。每个Docker Compose文件。

YAML到处都是用于配置。它可读、灵活,并且有一些令人惊讶的怪癖。

为什么YAML?

JSON很严格:双引号,不允许注释,不允许尾随逗号。

YAML很宽容:最小语法,允许注释,人类可读。

# YAML配置
database:
  host: localhost
  port: 5432
  name: myapp
{
  "database": {
    "host": "localhost",
    "port": 5432,
    "name": "myapp"
  }
}

相同数据,YAML中噪音更少。

想亲自试试吗?YAML转JSON

基础

键值对:

name: John
age: 30

嵌套结构(使用空格,不是制表符):

person:
  name: John
  age: 30

列表:

colors:
  - red
  - green
  - blue

内联列表和对象:

colors: [red, green, blue]
person: {name: John, age: 30}

挪威问题

country: NO

NO是什么?布尔值false。YAML将NOYesonoff等解释为布尔值。

挪威的国家代码变成false。你的配置以神秘方式崩溃。

修复: 引用可能被解释为布尔值的字符串。

country: "NO"

多行字符串问题

description: This is a long
  description that continues

这是两行还是一行,"that continues"缩进?取决于YAML解析器。

显式多行:

# 字面(保留换行)
description: |
  Line one
  Line two

# 折叠(连接行)
description: >
  This is one long
  line when parsed

缩进很重要

两个空格。不是制表符。不是一个空格。不是三个。

# 正确
parent:
  child: value

# 错误 - 制表符
parent:
	child: value

混合制表符和空格静默破坏YAML。配置你的编辑器使用空格。

数字解释

version: 1.10

那是字符串"1.10"还是数字1.1?大多数解析器将其解释为1.1。

浮点数学再次袭来。引用版本号。

version: "1.10"

锚点和别名

YAML可以引用重复内容:

defaults: &defaults
  timeout: 30
  retries: 3

production:
  <<: *defaults
  timeout: 60

强大以减少重复。过度使用时令人困惑。

验证YAML

YAML的灵活性意味着许多看起来有效的东西不是。

  • 在编辑器中使用linter
  • 尽可能针对模式验证
  • 转换为JSON以查看解析器实际解释的内容

如果你的配置不工作,检查解析器看到的,而不是你写的。

YAML vs JSON vs TOML

YAML: 人类可读,许多特性,怪异的边缘情况。

JSON: 严格,简单,广泛支持,冗长。

TOML: 显式,更少惊喜,配置流行度增长。

对于机器到机器数据,JSON更安全。对于人类编辑的配置,如果你知道陷阱,YAML有效。


YAML优先考虑可读性而不是严格性。这种权衡创造边缘情况。引用看起来像布尔值或数字的字符串,使用显式多行语法,并在部署前验证。