YAML是什么?

在这里插入图片描述

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 配置文件

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的高级用法

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

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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/41683.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

熔断降级(Sentinel解决)

问题概述 在微服务架构中一定要预防微服务雪崩问题&#xff0c;微服务雪崩问题就是指在微服务架构中&#xff0c;当一个服务出现故障时&#xff0c;由于服务之间的依赖关系&#xff0c;故障可能会传播到其他服务&#xff0c;从而导致了大规模的服务失败&#xff0c;系统无法正…

反序列化漏洞

前提概要 本文章主要用于分享反序列化漏洞基础学习&#xff0c;以下是对反序列化漏洞的一些个人解析&#xff0c;请大家结合参考其他文章中的相关信息进行归纳和补充。 反序列化漏洞描述 反序列化漏洞是指程序在对输入的字节流进行反序列化时&#xff0c;因缺乏充分的验证和过…

吐血整理:Air8201如何使用LuatOS进行电源管理功能!

在物联网应用场景中&#xff0c;设备续航能力直接影响其部署成本与运维效率。LuatOS操作系统通过软件层面的精细化控制&#xff0c;为Air8201提供了灵活且高效的电源管理策略。本文将从系统架构、API接口、实战配置三个维度&#xff0c;解析如何利用LuatOS实现Air8201的智能电源…

STM32学习笔记之存储器映射(原理篇)

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

合宙780E开发学习-LUATOS-SOC云编译自定义固件

登录https://luatos.com 点击登录&#xff0c;使用合宙erp账号登录即可 点击右上角构建&#xff0c;点击右上角菜单新构建&#xff0c;自定义构建名称&#xff0c;可新建多个 勾选想要的组件 点击右上角保存修改&#xff0c;只有点击准备就绪&#xff08;注意&#xff1a;一定…

react 15-16-17-18各版本的核心区别、底层原理及演进逻辑的深度解析

一、React 15&#xff08;2016&#xff09; 核心架构&#xff1a;Stack Reconciler&#xff08;栈协调器&#xff09; 工作原理&#xff1a; 同步递归渲染&#xff1a;采用深度优先遍历方式递归处理 Virtual DOM&#xff0c;形成不可中断的调用栈渲染流程&#xff1a;1. 触发 …

【HarmonyOS NEXT】EventHub和Emitter的使用场景与区别

一、EventHub是什么&#xff1f; 移动应用开发的同学应该比较了解EventHub&#xff0c;类似于EventBus。标准的事件广播通知&#xff0c;订阅&#xff0c;取消订阅的处理。EventHub模块提供了事件中心&#xff0c;提供订阅、取消订阅、触发事件的能力。 类似的框架工具有很多…

QT记事本

记事本应用程序提供了基本的文本编辑功能&#xff0c;支持文件的新建、打开、保存和另存为操作&#xff0c;同时具备修改提示和关闭窗口时的保存确认功能。使用 UTF - 8 编码确保了对多语言文本的支持。 1. 项目整体结构 main.cpp&#xff1a;程序的入口点&#xff0c;负责初…

如何用 Postman 发送 POST 请求?

POST 请求是 HTTP 协议中用于提交数据的一种方法&#xff0c;Postman 提供了丰富的功能来支持用户发送包含各种信息的 POST 请求&#xff0c;如文本数据、JSON 或 XML 数据结构、文件等。 Postman 发送 post 请求教程

Ant Design Vue 中的table表格高度塌陷,造成行与行不齐的问题

前言&#xff1a; Ant Design Vue: 1.7.2 Vue2 less 问题描述&#xff1a; 在通过下拉框选择之后&#xff0c;在获取接口数据&#xff0c;第一列使用了fixed:left&#xff0c;就碰到了高度塌陷&#xff0c;查看元素的样式结果高度不一致&#xff0c;如&#x…

Flink 通过 Chunjun Oracle LogMiner 实时读取 Oracle 变更日志并写入 Doris 的方案

文章目录 一、 技术背景二、 关键技术1、 Oracle LogMiner2、 Chunjun 的 LogMiner 关键流程3、修复 Chunjun Oracle LogMiner 问题 一、 技术背景 在大数据实时同步场景中&#xff0c;需要将 Oracle 数据库的变更数据&#xff08;CDC&#xff09; 采集并写入 Apache Doris&am…

qt+opengl 加载三维obj文件

1前面我们已经熟悉了opengl自定义顶点生成一个立方体&#xff0c;并且我们实现了立方体的旋转&#xff0c;光照等功能。下面我们来用opengl来加载一个obj文件。准备我们首先准备一个简单的obj文件&#xff08;head.obj&#xff09;。资源在本页下载 2 在obj文件里面&#xff0c…

计算机组成原理的学习day01

一 计算机系统层次结构 1 计算机硬件的基本组成 好的&#xff0c;上个小节中我们了解了计算机系统的概念&#xff0c;还有计算机的一个发展历程&#xff0c;那这个小节中我们会着重的探讨计算机硬件的一个基本组成。我们需要掌握这样的两种结构&#xff0c;第一种是早期的冯诺…

ASP 应用HTTP.SYS短文件文件解析Access 注入数据库泄漏

#ASP- 默认安装 -MDB 数据库泄漏下载&#xff08;路径是知道的话可以直接下载&#xff09; 由于大部分 ASP 程序与 ACCESS 数据库搭建&#xff0c;但 ACCESS 无需连接&#xff0c;都在脚本文件中定 义配置好数据库路径即用&#xff0c;不需要额外配置安装数据库&#x…

Redis 版本演进及主要新特性

Redis 版本发布历史 稳定版本时间线 Redis 2.6 (2012年)Redis 2.8 (2013年11月)Redis 3.0 (2015年4月) - 首次支持集群Redis 3.2 (2016年5月)Redis 4.0 (2017年7月)Redis 5.0 (2018年10月)Redis 6.0 (2020年4月)Redis 6.2 (2021年2月)Redis 7.0 (2022年4月) - 最新稳定版(截至…

从 MySQL 到时序数据库 TDengine:Zendure 如何实现高效储能数据管理?

小T导读&#xff1a;TDengine 助力广州疆海科技有限公司高效完成储能业务的数据分析任务&#xff0c;轻松应对海量功率、电能及输入输出数据的实时统计与分析&#xff0c;并以接近 1 : 20 的数据文件压缩率大幅降低存储成本。此外&#xff0c;taosX 强大的 transform 功能帮助用…

NVM安装速通使用手册(Windows版)NVM管理node版本命令手册 NVM使用手册

nvm&#xff08;Node Version Manager&#xff09;是一个用于管理Node.js版本的命令行工具。通过nvm&#xff0c;你可以在同一台机器上安装和切换多个Node.js版本&#xff0c;非常适合开发和测试在不同Node.js版本上运行的应用程序 一、安装地址 1. 官方下载&#xff1a; &…

qt QQuaternion详解

1. 概述 QQuaternion 是 Qt 中用于表示三维空间中旋转的四元数类。它包含一个标量部分和一个三维向量部分&#xff0c;可以用来表示旋转操作。四元数在计算机图形学中广泛用于平滑的旋转和插值。 2. 重要方法 默认构造函数 QQuaternion::QQuaternion(); // 构造单位四元数 (1…

Axure项目实战:智慧城市APP(四)医疗信息(动态面板、选中交互应用)

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;智慧城市APP医疗信息模块 主要内容&#xff1a;医疗信息模块原型设计与交互 应用场景&#xff1a;医疗信息行业 案例展示&#xff1a; 案例视频&…

DeepSeek助力文案,智能音箱如何改变你的生活?

你好&#xff0c;我是三桥君 你有没有为写智能音箱的宣传文案而抓耳挠腮过&#xff1f;三桥君在这方面可是有些感想&#xff0c;今天就来给你唠唠怎么用DeepSeek写出超赞的智能音箱宣传文案。 首先&#xff0c;你得给DeepSeek喂足“料”。这就好比做饭&#xff0c;你得准备好各…