
什么是 YAML?
YAML(YAML Ain't Markup Language,递归缩写)是一种人类友好的数据序列化标准。YAML 旨在让人类和机器都能轻松阅读,它使用缩进和最少的标点符号来表达数据结构。
YAML 已成为现代基础设施和 DevOps 中配置文件的主流格式:Docker Compose、Kubernetes 清单、GitHub Actions 工作流、Ansible 剧本以及许多应用程序配置框架都使用 YAML。
YAML 数据类型
YAML 会根据值自动推断数据类型:
# 字符串(除非值有歧义,否则不需要引号)
name: Alice
message: "This requires quotes: it has a colon"
long_string: 'Single quotes also work'
# 整数和浮点数
port: 8080
price: 19.99
negative: -5
# 布尔值(注意:许多值被视为真)
enabled: true # 或 yes, on, True, TRUE
disabled: false # 或 no, off, False, FALSE
# 空值
optional: null # 或 ~
empty: # 也是 null
# 日期
birthday: 1990-01-15
created_at: 2025-06-15T14:30:00Z
YAML 集合
映射(对象)
user:
id: 1
name: Alice
email: alice@example.com
address:
city: New York
country: US
# 流式风格(紧凑,类似 JSON)
user: {id: 1, name: Alice, email: alice@example.com}
序列(数组)
# 块风格
tags:
- python
- javascript
- docker
# 流式风格
tags: [python, javascript, docker]
# 对象数组
users:
- id: 1
name: Alice
- id: 2
name: Bob
YAML 锚点和别名
YAML 避免重复的最强大功能:
# 使用 & 定义锚点
default_config: &defaults
database: postgres
pool_size: 10
timeout: 30
retry: 3
# 使用 * 复用
production:
<<: *defaults # 合并所有默认值
pool_size: 50 # 覆盖特定值
environment: prod
staging:
<<: *defaults
environment: staging
多行字符串
YAML 优雅地处理多行字符串:
# 字面块(|)- 保留换行符和尾部换行符
script: |
#!/bin/bash
set -e
echo "Starting deployment"
npm run build
pm2 restart app
# 折叠块(>)- 用空格连接行
description: >
This is a long description that
will be joined into a single
paragraph.
# 截断指示符
text_trim: |- # 无尾部换行符
content
text_keep: |+ # 保留所有尾部换行符
content
YAML 最佳实践
使用一致的缩进
YAML 对缩进敏感。选择 2 或 4 个空格,并在整个文件中保持一致。切勿混用制表符。
对看起来像其他类型的字符串加引号
# 不加引号,这些会变成非字符串
version: "1.0" # 字符串,不是浮点数 1.0
zip: "01234" # 字符串,不是整数 1234(丢失前导零)
active: "yes" # 字符串,不是布尔值 true
使用描述性注释
# 数据库连接设置
database:
host: localhost # 在 Docker Compose 中使用 'db'
port: 5432 # 默认 PostgreSQL 端口
name: myapp
常见 YAML 用例
Kubernetes:每个资源定义(Pod、Deployment、Service、ConfigMap)都是一个 YAML 文件。
GitHub Actions:定义 CI/CD 管道的工作流文件。
Docker Compose:多容器应用程序定义。
Ansible:基础设施自动化剧本和清单文件。
Spring Boot:应用程序配置(application.yml)。
Ruby on Rails:数据库配置(database.yml)、环境配置。
YAML 陷阱
挪威问题:在 YAML 1.1 中,值 NO(挪威的国家代码)被解析为 false。YAML 1.2 修复了这个问题,但许多解析器仍使用 YAML 1.1 行为。如有疑问,请对字符串加引号。
禁止制表符:YAML 1.1 完全禁止使用制表符进行缩进。始终使用空格。
浮点数解析:在某些解析器中,像 1.0、1e5、.inf、.nan 这样的值会被解析为浮点数/特殊值。
使用此工具
粘贴任何 YAML 文档即可立即验证它,以树状结构查看解析后的结构,并查看带有行号的任何语法错误。该工具以不同颜色突出显示每种数据类型,便于识别。
-> 试试 YAML 查看器