YAML是什么?

news/2025/3/29 6:09:02/

在这里插入图片描述

YAML(YAML Ain’t Markup Language)是一种以数据为中心、高度可读的序列化语言,广泛应用于配置文件、数据交换和自动化工具中。以下从多个维度对其进行全面解析:


1. 定义与历史演变

  • 全称与定位
    YAML的全称最初为“Yet Another Markup Language”(另一种标记语言),后更改为“YAML Ain’t Markup Language”,强调其数据描述属性而非文档标记功能。它被设计为人类友好、跨语言的通用数据格式,尤其适合表达复杂数据结构。

  • 发展历程

    • 2001年:由Clark Evans、Ingy döt Net和Oren Ben-Kiki共同提出,旨在替代XML的复杂性。
    • 2004年:发布YAML 1.0标准,确立基本语法。
    • 2010年:推出YAML 1.2版本,成为JSON的超集(兼容JSON语法),并优化了可读性和扩展性。
    • 2010年后:随着容器化(Docker、Kubernetes)和DevOps(Ansible)的兴起,成为现代基础设施即代码(IaC)的核心配置格式。

2. 核心语法特性

  • 结构规则

    • 缩进分层:使用空格(禁止制表符)表示层级关系,缩进长度灵活但需对齐。
    • 注释支持:以#开头,增强可读性。
    • 多文档分隔:用---分隔多个文档,...表示结束。
  • 数据类型与结构

    • 标量(Scalars) :包括字符串、布尔值、整数、浮点数、日期、空值(null~)等,字符串通常无需引号。
    • 序列(Sequences/列表) :以连字符-开头或方括号[]表示。
    • 映射(Mappings/对象) :键值对用冒号:分隔,支持嵌套。
    • 复合结构:可嵌套序列与映射,如列表中的字典。
  • 高级功能

    • 多行字符串:通过|保留换行符或>折叠换行符。
    • 锚点与引用:使用&定义锚点,*引用锚点,避免重复数据。
    • 合并映射:通过<<合并多个映射,简化配置

3. 主要应用场景

  • 配置文件

    • DevOps工具:如Kubernetes的Pod定义、Ansible的Playbook、Docker Compose文件等。
    • 框架配置:Ruby on Rails、Spring等框架的配置文件。
  • 数据交换与序列化

    • 跨语言数据共享:支持Python、Java、JavaScript等语言的序列化库(如PyYAML、SnakeYAML)。
    • API定义:OpenAPI(Swagger)规范使用YAML描述接口。
  • 复杂数据表示

    • 日志与监控规则:Prometheus、Grafana等工具的配置
    • 基础设施即代码(IaC) :Terraform、AWS CloudFormation的模板。

4. YAML与JSON的对比

维度YAMLJSON
可读性依赖缩进和自然语言风格,支持注释,适合人工编辑依赖大括号和引号,结构紧凑,适合机器解析
数据类型支持更复杂类型(如日期、多行字符串、锚点引用)仅支持基本类型(字符串、数字、数组、对象)
语法简洁性无需冗余符号(如引号、逗号),结构清晰需要严格符号(引号、逗号)
兼容性自1.2版本起完全兼容JSON,可混合使用JSON语法是YAML的子集,独立作为数据交换标准
适用场景配置文件、复杂数据结构API通信、Web服务

5. 工具与生态

  • 解析库

    • Python:PyYAML、ruemal.yaml
    • JavaScript:js-yaml
    • Java:SnakeYAML。
    • Ruby:内置YAML模块。
  • 验证与格式化工具

    • yamllint:检查语法和格式规范。
    • 在线转换器:实现YAML与JSON、XML的互转。

6. 局限性及注意事项

  • 格式敏感性:缩进错误易导致解析失败,需严格对齐。
  • 安全性问题:部分解析器可能执行不安全代码,需禁用危险功能(如PyYAML的FullLoader)。
  • 性能:处理大规模数据时,解析速度可能逊于JSON。

YAML凭借其可读性、灵活性和跨平台特性,成为现代软件开发中不可或缺的配置和数据交换工具。尽管与JSON存在竞争,但两者在不同场景下互补:YAML擅长人工维护的配置,而JSON更适合机器间的轻量级通信。随着云原生和自动化技术的普及,YAML的应用范围将持续扩展。

以下是一个结合 Kubernetes Deployment 配置的实际例子,展示YAML在容器编排中的典型应用,并逐段解析其语法和功能:


示例:Kubernetes 的 Deployment 配置文件

yaml">apiVersion: apps/v1          # API版本(字符串)
kind: Deployment             # 资源类型(字符串)
metadata:name: nginx-deployment     # 元数据:名称labels:app: nginx               # 标签键值对
spec:replicas: 3                # 整数:副本数selector:matchLabels:app: nginxtemplate:                  # Pod模板(嵌套结构)metadata:labels:app: nginxspec:containers:            # 列表(以 - 开头)- name: nginximage: nginx:1.25     # 字符串值ports:- containerPort: 80  # 整数:容器端口resources:           # 嵌套映射limits:memory: "128Mi"  # 带单位的字符串需要引号cpu: "500m"requests:memory: "64Mi"cpu: "250m"command: ["/bin/sh"] # 列表的另一种语法(JSON风格)args:- -c- echo "Hello, YAML!" # 多行参数示例(隐式字符串)restartPolicy: Always

逐段解析

1. 基本结构
  • apiVersionkind
    定义Kubernetes资源的类型和版本,均为字符串。YAML允许省略引号(除非包含特殊字符)。

  • metadata
    描述资源的元数据,如名称(name)和标签(labels)。
    缩进规则namelabels需对齐,表示同层级。

2. 标签与选择器
  • labelsselector
    通过键值对(app: nginx)标识资源,selector.matchLabels确保Deployment管理带有此标签的Pod。
    映射嵌套matchLabelsselector的子键。
3. 副本数与模板
  • replicas: 3
    直接使用整数,无需引号。Kubernetes将启动3个Pod副本。

  • template
    定义Pod的嵌套结构,包含metadataspec
    层级缩进template下的所有内容需缩进2个空格(或统一倍数)。

4. 容器配置
  • containers
    以连字符-开头的列表,每个列表项是一个容器定义。
    • nameimage:容器名称和镜像版本,均为字符串。
    • ports:列表中的嵌套映射(containerPort: 80)。
    • resources:复杂映射,包含limitsrequests的资源限制。
      引号规则"128Mi"因包含字母Mi,需加引号避免解析错误。
5. 命令与参数
  • command
    使用JSON风格的列表(["/bin/sh"]),显式表示数组。与YAML的-列表语法等价。
  • args
    多行参数通过缩进和连字符表示,- -c- echo "..."会被解析为["-c", "echo 'Hello, YAML!'"]
6. 数据类型与风格
  • 隐式类型推断
    replicas: 3自动识别为整数,containerPort: 80同理。
  • 显式字符串
    memory: "128Mi"强制保留字符串格式,避免Kubernetes误解析为数值。

YAML在此场景的优势

  1. 可读性
    缩进和注释让复杂的容器配置清晰易读,比JSON更适合人工维护。

    // 对比JSON(相同配置):
    {"apiVersion": "apps/v1","kind": "Deployment","metadata": {"name": "nginx-deployment","labels": {"app": "nginx"}},"spec": {"replicas": 3,"selector": {"matchLabels": {"app": "nginx"}},"template": {"metadata": {"labels": {"app": "nginx"}},"spec": {"containers": [{"name": "nginx","image": "nginx:1.25","ports": [{"containerPort": 80}],"resources": {"limits": {"memory": "128Mi", "cpu": "500m"},"requests": {"memory": "64Mi", "cpu": "250m"}},"command": ["/bin/sh"],"args": ["-c", "echo \"Hello, YAML!\""]}],"restartPolicy": "Always"}}}
    }
    
  2. 灵活性
    支持多行字符串、锚点引用(如重复的app: nginx可通过锚点&app_label简化)。

  3. 生态集成
    Kubernetes、Ansible等工具原生支持YAML,直接通过配置文件驱动基础设施。


扩展:YAML的高级用法

yaml"># 示例:使用锚点(&)和引用(*)避免重复
base_config: &basetimeout: 30retries: 3service_a:<<: *base         # 合并base_config的键值对endpoint: "api.a.com"service_b:<<: *baseendpoint: "api.b.com"

通过这种模式,YAML可以显著减少冗余配置,适合管理多个相似服务。


该示例展示了YAML在真实场景中的核心语法和结构化表达能力,结合注释和缩进,使其成为DevOps领域配置管理的首选格式。


http://www.ppmy.cn/news/1583299.html

相关文章

uv - pip 接口

文章目录 pip 接口Python 环境创建虚拟环境使用虚拟环境关闭环境使用任意的 Python 环境 管理软件包安装一个包可编辑包从文件安装包卸载一个包 检查环境列出已安装的包检查一个包验证环境 声明依赖使用 pyproject.toml使用 requirements.in 锁定环境锁定要求升级要求同步环境添…

记录firefly的3566-sdk的下载及解压更新

文章目录 &#xff08;一&#xff09;下载及解压&#xff08;二&#xff09;还原仓库1. 检查.git 目录的内容&#xff0c;确保包含 objects、refs 等子目录。2. 在.git目录的父目录下&#xff0c;创建一个新的工作目录。该命令将创建一个新的分支&#xff0c;并尝试检出最新的提…

在 Qt 中,不带参数或整形的参选的信号能够从 std::thread 发送成功,而带枚举离线的信号却发送失败

在 Qt 中&#xff0c;不带参数或整形的参选的信号能够从 std::thread 发送成功&#xff0c;而带枚举离线的信号却发送失败 当信号和槽在不同线程时&#xff0c;默认使用 队列连接&#xff08;Qt::QueuedConnection&#xff09;&#xff0c;信号会被放入接收线程的事件队列&…

阿里云平台域名

目录&#xff1a; 1、域名的简介2、域名绑定3、域名备案4、查找域名对应地址 1、域名的简介 2、域名绑定 将域名和你的ip地址进行绑定&#xff0c;这样域名在访问时解析域名才能到对应ip服务器上。 3、域名备案 不进行域名的备案&#xff0c;域名可能会被封禁。 4、查找域名对…

react-activation 实现页面保活记录

这里写目录标题 一、安装插件&#xff08;可选&#xff09;1、react-activation &#xff08;推荐&#xff09;2、umi-plugin-keep-alive 二、AliveScope的两种配置方式1、在src/app.ts 中配置2、在src/layout/index.tsx中配置 三、umi中的配置四、使用问题记录1、drop使用不生…

Ubuntu 24.04 启动后某些应用程序启动非常慢

ubuntu 开机卡个1分钟才能开终端&#xff0c;火狐&#xff0c;edge vscode没这问题 执行这个就好了 sudo apt remove xdg-desktop-portal-gnome 参考&#xff1a;Ubuntu 24.04 启动后某些应用程序启动非常慢 - ubuntu 参考&#xff1a;https://askubuntu.com/questions/152…

ffmpeg系列(三)—— 音频重采样

SwrContext 一、SwrContext 的重要字段 SwrContext 是音频重采样的核心配置对象&#xff0c;其关键字段决定了重采样的行为和性能。以下是常用字段及其作用&#xff1a; 字段名称类型作用典型值示例in_sample_rateint输入音频的采样率&#xff08;Hz&#xff09;。44100out_…

蓝之洋科技以AI智能制造引领变革,推动移动电源产业迈向高端智能化!

在全球智能制造加速发展的背景下&#xff0c;深圳市蓝之洋科技有限公司凭借十余年的行业深耕、先进的生产体系、严格的质量标准及持续的技术创新&#xff0c;已成为移动电源领域的领先制造商。作为众多国际品牌的长期合作伙伴&#xff0c;蓝之洋科技不仅在生产制造方面树立了行…