当前位置: 首页 > ds >正文

YAML格式笔记

YAML 的全称是 “YAML Ain’t Markup Language”(递归缩写),强调它是以数据为中心,不像 XML 那样以文档标记为中心。

设计目标是:人性化、可读性高、易于编写,适合做配置文件和数据序列化。


核心特点

  1. 使用缩进表示层级关系:类似于 Python,不能使用制表符(Tab),只使用空格(通常为 2 或 4 个)进行缩进。缩进相同的元素属于同一层级。
  2. 大小写敏感keyKEY 是不同的。
  3. 使用 # 表示注释:从 # 开始到行尾的内容都会被解析器忽略。
  4. 支持三种基本数据结构
    • 对象(Maps / Dictionaries):键值对集合。
    • 数组(Lists / Sequences):一组按顺序排列的值。
    • 标量(Scalars):单个的、不可再分的值,如字符串、布尔值、整数、浮点数、Null 等。

基本语法详解

1. 对象(Maps / Dictionaries)

表示键值对,使用冒号 : 加空格来分隔键和值。

# 简单的键值对
name: John Doe
age: 30
is_student: false# 多行对象(嵌套)
person:name: Aliceaddress:city: Beijingstreet: Zhongguancunhobbies:- reading- hiking

等价于 JSON:

{"name": "John Doe","age": 30,"is_student": false,"person": {"name": "Alice","address": {"city": "Beijing","street": "Zhongguancun"},"hobbies": ["reading", "hiking"]}
}

流式风格(Flow style):使用花括号 {} 可以写成类似 JSON 的紧凑格式,常用于单行表示。

person: { name: Alice, age: 25 }
2. 数组(Lists / Sequences)

使用短横线 - 加空格开头表示数组的一项。

# 简单数组
fruits:- Apple- Banana- Orange# 数组内包含对象
employees:- name: Johnjob: Developer- name: Janejob: Designer# 内联数组(流式风格)
colors: [red, blue, green]

等价于 JSON:

{"fruits": ["Apple", "Banana", "Orange"],"employees": [{ "name": "John", "job": "Developer" },{ "name": "Jane", "job": "Designer" }],"colors": ["red", "blue", "green"]
}
3. 标量(Scalars)—— 单个值

这是最复杂但也最灵活的部分,YAML 提供了多种方式来表示字符串、数字等。

  • 字符串:默认不需要引号,但如果字符串包含特殊字符(如 :, {, [, ,, &, *, #, ?, |, -, <, >, =, !, %, @, `),则需要用单引号 '' 或双引号 "" 包裹。
    • 单引号:其中的特殊字符会作为普通字符串处理。'' 是转义单引号本身。
    • 双引号:可以使用转义字符,如 \n 换行,\t 制表符等。
# 无引号字符串(最常用)
unquoted_string: This is a string# 单引号字符串
single_quoted: 'This is a string with a '':'' character'# 双引号字符串(支持转义)
double_quoted: "This is a string\nwith a new line"# 多行字符串(非常实用!)
description: |This is a multi-line string.It will preserve line breaks and indentation.The "|" symbol indicates that the lines will be kept as is.# 折叠多行字符串(将多行合并为一行,换行符替换为空格)
folded_string: >This is a folded string.All these lines will becollapsed into a single line.
  • 数字

    integer: 42
    float: 3.14159
    scientific_notation: 1e-5 # 0.00001
    infinity: .inf # 表示无穷大
    not_a_number: .nan # 表示非数字
    
  • 布尔值

    true_value: true   # 也可以是 True, TRUE
    false_value: false # 也可以是 False, FALSE
    
  • Null

    null_value: null    # 也可以是 Null, NULL, ~
    
  • 时间与日期(ISO 8601 格式)

    datetime: 2001-12-15T02:59:43.1Z # UTC时间
    date: 2001-12-15
    time: 02:59:43.10
    

高级特性

1. 锚点(Anchors)与别名(Aliases)—— 避免重复

使用 & 创建一个锚点(引用),使用 * 来复制这个锚点的内容。这非常适用于需要重复大量相同配置的场景。

# 定义锚点,命名为 'base_settings'
base_settings: &baseapi_version: v1environment: productionreplicas: 3# 服务A配置,使用 <<: *base 来合并 base_settings 的所有内容
service_a:<<: *base # 合并锚点内容name: service-a# 可以覆盖锚点中的值replicas: 1 # 覆盖 base_settings 中的 replicas: 3# 服务B配置
service_b:<<: *basename: service-b# environment 和 replicas 来自 base_settings

等价于:

service_a:api_version: v1environment: productionreplicas: 1 # 被覆盖了name: service-aservice_b:api_version: v1environment: productionreplicas: 3name: service-b
2. 多文档支持

一个 YAML 文件可以用 --- 分隔符来包含多个独立的文档。这在 Kubernetes 中非常常见,可以在一个文件中定义多个资源(如一个 Deployment 和一个 Service)。

# 文档 1
---
apiVersion: v1
kind: ConfigMap
metadata:name: my-config
data:key: value# 文档 2
---
apiVersion: apps/v1
kind: Deployment
metadata:name: my-app
spec:replicas: 3...

完整示例

# Application Configuration
app_name: My Awesome App
version: 1.0.0
debug: false# Server Settings
server:host: 0.0.0.0port: 8080ssl: trueallowed_origins:- https://example.com- https://localhost:3000# Database Connection
database:main_db: &db-prod # 定义锚点adapter: postgresqlhost: db.prod.example.comport: 5432database: app_dbusername: adminpassword: secret_password # 在实际中,应从环境变量读取pool: 5# 测试数据库使用生产数据库的大部分配置,但覆盖了 hosttest_db:<<: *db-prod # 合并锚点host: localhostdatabase: app_db_test# Features Flags
feature_flags:new_ui: truebeta_functionality: false# Long description
about: |This is a multi-line description of the application.It can span multiple lines and preserve its formatting.Very useful for READMEs or detailed comments.

总结与最佳实践

  1. 始终使用空格缩进,不要使用 Tab。
  2. 保持一致的缩进宽度(2 或 4 个空格)。
  3. 对于简单的键值对,避免不必要的引号
  4. 对于复杂的多行字符串,善用 |>
  5. 对于大量重复的配置结构,使用锚点和别名来简化文件,保持 DRY(Don’t Repeat Yourself)原则。
  6. 敏感信息(如密码、密钥)不要直接写在 YAML 文件中,应该使用环境变量或密钥管理服务。

YAML 因其卓越的可读性和灵活性,已成为现代软件开发中配置文件的事实标准,尤其是在 DevOps、云原生(Kubernetes、Docker Compose)和 CI/CD(GitHub Actions、GitLab CI)等领域。

http://www.xdnf.cn/news/18425.html

相关文章:

  • Linux-----《Linux系统管理速通:界面切换、远程连接、目录权限与用户管理一网打尽》
  • Download:几款主流的全球范围的NDVI产品参数说明和下载
  • 领码方案:通用物联网数据采集低代码集成平台——万物智联时代的黄金钥匙
  • 电梯RFID楼层状态采集器的功能需求及参数要求,以下为多奥综合技术解析与参数说明,整合了十几年项目相关技术指标及应用场景:
  • 【java面试day16】mysql-覆盖索引
  • 签名应用APP分发平台的微服务化部署是什么?其有哪些优势?
  • LoRa 网关与节点组网方案
  • Linux I/O 多路复用实战:Select/Poll 编程指南
  • ansible中roles角色是什么意思?
  • 2026 年越南未来能源展
  • 数据清洗(Data Cleansing)——机器学习深度学习所需数据的清洗实战案例 (结构清晰、万字解析、完整代码)包括机器学习方法预测缺失值的实践
  • webrtc弱网-GoogCcNetworkController类源码分析与算法原理
  • MyBatis-Plus基础篇详解
  • Kubernetes 的 YAML 配置文件-kind
  • vue3+element-plus 输入框el-input设置背景颜色和字体颜色,样式效果等同于不可编辑的效果
  • ubuntu24.04 用apt安装的mysql修改存储路径(文件夹、目录)
  • 【CUDA教程--3】通过简单的矩阵运算入门CUDA
  • C# NX二次开发:操作按钮控件Button和标签控件Label详解
  • 华为鸿蒙系统SSH如何通过私钥连接登录
  • RadioIrqProcess函数详细分析与流程图
  • for-else 流程控制结构介绍
  • 3、栈和队列
  • LG P3710 方方方的数据结构 Solution
  • 指针的应用学习日记
  • 算法训练营day55 图论⑤ 并查集理论基础、107. 寻找存在的路径
  • 信号和共享内存
  • Linux------《零基础到联网:CentOS 7 在 VMware Workstation 中的全流程安装与 NAT 网络配置实战》
  • Visual Studio 2022+OpenCV-Python安装及配置方法
  • 涡流-信号完整性分析
  • pytest高级用法之插件开发