前言

这里只是简单介绍ymal语言


YAML 简介

YAML(YAML Ain’t Markup Language)是一种人性化的数据序列化格式,专为配置文件和数据结构交换而设计。其核心目标是:

  • 易于人类阅读和编写
  • 表达能力强
  • 支持跨语言数据交换
  • 与编程语言原生数据结构兼容

YAML 文件扩展名通常为 .yaml.yml,广泛应用于 Docker Compose、Kubernetes、Ansible、CI/CD 配置等领域。


核心特性

  1. 简洁性:使用缩进表示层级,避免了大括号等符号
  2. 可读性:类似自然语言的表达方式
  3. 扩展性:支持复杂数据类型和引用
  4. 语言无关:几乎所有编程语言都有解析库
  5. 兼容性:可包含 JSON 文档

基本语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 注释以 # 开头
key: value # 键值对使用冒号分隔

# 字符串通常不需要引号
name: John Doe

# 多行字符串
description: |
This is a multi-line
string that preserves
line breaks

# 折叠多行字符串
summary: >
This will be folded
into a single paragraph

重要规则

  • 使用 空格缩进(禁止使用制表符 Tab)
  • 缩进表示层级关系
  • 大小写敏感
  • 文档开头可用 ---,结尾可用 ...(可选)

数据结构

1. 标量(Scalars)

基本数据类型:

1
2
3
4
5
6
string: "Hello World"  # 字符串
integer: 42 # 整数
float: 3.14 # 浮点数
boolean: true # 布尔值
null_value: null # 空值
date: 2023-10-05 # 日期

2. 序列(Sequences/列表)

1
2
3
4
5
6
7
8
# 块样式
fruits:
- Apple
- Banana
- Orange

# 行内样式
colors: [red, green, blue]

3. 映射(Mappings/字典)

1
2
3
4
5
6
7
8
# 块样式
person:
name: Alice
age: 30
is_student: false

# 行内样式
coordinates: { x: 12.5, y: -7.2 }

4. 复合结构

1
2
3
4
5
6
7
8
9
employees:
- id: 001
name: Bob
skills:
- Python
- Docker
- id: 002
name: Carol
skills: [Java, Kubernetes]

高级特性

1. 多文档支持

1
2
3
4
5
6
7
---
# 文档1
name: Document 1
...
---
# 文档2
name: Document 2

2. 锚点与别名(避免重复)

1
2
3
4
5
6
7
8
9
10
11
defaults: &base_config
api_version: v1
timeout: 30s

development:
<<: *base_config # 合并锚点内容
debug: true

production:
<<: *base_config
debug: false

3. 类型转换

1
2
3
# 强制类型转换
string_int: !!str 42
float_number: !!float "3.14"

4. 复杂键

1
2
3
# 使用问号表示复杂键
? [name, age]
: value

使用场景

  1. 配置文件:应用配置(如 Docker Compose, Kubernetes YAML)
  2. 基础设施即代码:Ansible Playbooks, Terraform
  3. API规范:OpenAPI/Swagger
  4. 数据序列化:替代 XML/JSON 用于数据传输
  5. 测试数据:结构化测试用例
  6. 持续集成:GitHub Actions, GitLab CI

注意事项

  1. 缩进敏感:必须使用空格(建议2或4空格)
  2. 避免Tab:YAML 规范禁止使用制表符
  3. 引号使用
    • 包含特殊字符时需加引号:key: "value: with colon"
    • 单引号不转义,双引号支持转义
  4. 键唯一性:同一层级键名必须唯一
  5. 安全限制:解析外部 YAML 时注意安全风险(如 YAML 炸弹)

总结

YAML 核心优势

人类友好:相比 JSON/XML 更易读写
表达力强:支持复杂结构和引用
广泛支持:几乎所有编程语言都有解析库
配置首选:现代 DevOps 工具链的标准配置格式

使用建议

  1. 使用 2 或 4 空格 缩进(禁用 Tab)
  2. 简单值 省略引号,特殊字符值使用引号
  3. 大型配置使用 锚点/别名 减少重复
  4. 验证 YAML 文件:
    1
    2
    # Python 验证
    python -c 'import yaml; yaml.safe_load(open("file.yaml"))'
  5. 搭配 Schema 验证(如 JSON Schema)确保结构正确

典型工作流

1
2
3
4
graph LR
A[编写YAML] --> B[版本控制]
B --> C[CI/CD解析]
C --> D[部署执行]