工程师 - 什么是YAML文件

今天在看Linux kernel里的device tree的documentation时,发现里面的文档格式都是YAML的,用来描述devicetree某类结点的格式,所以就了解了一下。

YAML是一种易理解的数据序列化语言,此文件格式通常用于创建配置文件,它的对象序列化能力使它成为JSON等语言的可行替代品。在过去的几年里,其受欢迎程度稳步上升。

YAML 具有广泛的编程语言支持,并且很容易映射到本地数据结构。它也很容易被人类阅读,这就是为什么它是配置文件的一个好选择。

YAML是为人类互动而设计的,是另一种数据序列化语言JSON的严格超集。但由于它是一个严格的超集,它可以做JSON可以做的一切,甚至更多。一个主要的区别是,换行符和缩进在YAML中实际上是有意义的,而JSON则使用方括号和大括号。

YAML发明于2001年,缩写是"Yet Another Markup Language"。但维护者将其更名为YAML Ain't Markup Language,以更加强调其面向数据的特性。

YAML是一种数据序列化格式,其文件后缀名是 .yml / .yaml。强调人类可读与简洁结构,常用于配置文件与数据交换。

YAML文件的基本结构是一个地图。你可以把它叫做字典、哈希或对象,这取决于你的编程语言或心情。

当前的最新版本是1.2.2。之前版本是1.0,1.1。版本升级到1.2以后,有三个子版本,1.2.0,1.2.1和1.2.2。

Github地址:https://github.com/yaml/

官网:https://yaml.org/

在官网列出了各个编程语言下,使用yaml的库。

总的来说,YAML大部分都是键值对,keys and values。

key: value

让我们来看一个简单的YAML文件:

---

doe: "a deer, a female deer"

ray: "a drop of golden sun"

pi: 3.14159

xmas: true

french-hens: 3

calling-birds:

   - huey

   - dewey

   - louie

   - fred

xmas-fifth-day:

   calling-birds: four

   french-hens: 3

   golden-rings: 5

   partridges:

     count: 1

     location: "a pear tree"

   turtle-doves: two

该文件以三个破折号开始。这些破折号表示一个新的YAML文档的开始。YAML 支持多个文档,符合要求的解析器会将每一组破折号识别为一个新文档的开始。

接下来,我们看到构成一个典型YAML文档的大部分结构:一个键值对。

Doe是一个指向字符串值的键:a deer, a female deer.。YAML支持的不仅仅是字符串值。该文件以六个键值对开始。它们有四种不同的数据类型。Doe和ray是字符串。Pi是一个浮点数字。Xmas是一个布尔值。French-hens是一个整数。你可以用单引号或双引号将字符串括起来,也可以不用引号。YAML 将未加引号的数字识别为整数或浮点数。第七项是一个数组。Calling-birds有四个元素,每个元素都由一个开头的破折号表示。

我在Calling-birds中用两个空格缩进了这些元素。缩进是YAML表示嵌套的方式。各个文件的空格数可以不同,但不允许使用制表符。我们将在下面看看缩进是如何使用的。

最后,我们看到xmas-fifth-day,它里面还有五个元素,每个元素都是缩进的。我们可以把xmas-fifth-day看作一个字典,它包含两个字符串、两个整数和另一个字典。YAML 支持键值的嵌套,以及混合类型。在我们深入研究之前,让我们看看这个文档在JSON中的样子。使用这个方便的JSON到YAML的转换器:

JSON to YAML converter:https://www.json2yaml.com/

{

  "doe": "a deer, a female deer",

  "ray": "a drop of golden sun",

  "pi": 3.14159,

  "xmas": true,

  "french-hens": 3,

  "calling-birds": [

     "huey",

     "dewey",

     "louie",

     "fred"

  ],

  "xmas-fifth-day": {

  "calling-birds": "four",

  "french-hens": 3,

  "golden-rings": 5,

  "partridges": {

    "count": 1,

    "location": "a pear tree"

  },

  "turtle-doves": "two"

  }

}

JSON和YAML有类似的功能,大多数文件都可以在这两种格式之间转换。

Outline Indentation and Whitespace 大纲缩进和空格

空格是YAML格式的一部分。除非另有说明,换行符表示一个字段的结束。你用缩进的方式构造YAML文档。缩进程度可以是一个或多个空格。该规范禁止使用制表符,因为不同工具对它们的处理方式不同。比如上面的例子,缩进就是两个空格。

比如下面格式:

foo: bar

     pleh: help

     stuff:

       foo: bar

       bar: foo

实际的值是:

foo : bar

pleh : help

stuff : {'foo': 'bar', 'bar': 'foo'}

Comments

注释以#符号开始。它们可以出现在一个值之后,也可独占一行。

# This is a full line comment

foo: bar # this is a comment, too

注释是为了人阅读方便,而YAML处理器会忽略它们。

YAML Datatypes

YAML的键值对中的值是标量的。它们的作用类似于Perl、Javascript和Python等语言中的标量类型。通常情况下,将字符串用引号括起来,数字不加引号,解析器就能区分出来了。但这仅仅是冰山一角。YAML 能够做的事情还有很多。

Scalar Types 标量类型

你可以使用各种标量类型作为值:数字、布尔和字符串(无论是否有引号)。比如:

version: 2

键中的单词可以用下划线、破折号或空格分隔。比如:

pinctrl-use-default:

  type: boolean

键值对和字典 Key-Value Pairs and Dictionaries

键值是YAML的基本构建模块。YAML 文档中的每个条目都是至少一个字典的成员。键总是一个字符串。值是一个标量,因此它可以是任何数据类型。所以,正如我们已经看到的,值可以是一个字符串,一个数字,或另一个字典。

数值类型 Numeric types

YAML 可以识别数字类型。我们在上面看到了浮点和整数。YAML 支持其他几种数字类型。一个整数可以是十进制、十六进制或八进制。

---

foo: 12345

bar: 0x12d4

plop: 023332

正如你所期望的,0x表示一个值是十六进制的,而前导零表示一个八进制的值。YAML同时支持固定和指数浮点数。

---

foo: 1230.15

bar:  12.3015e+05

最后,我们可以表示非数字(NAN / not-a-number)或无穷大 / infinity。

---

foo: .inf

bar: -.Inf

plop: .NAN

Foo是无穷大,bar是负的无穷大,plop是NAN。

Strings 字符串

YAML 字符串是 Unicode 的。在大多数情况下,你不需要用引号。

---

foo: this is a normal string

但如果我们想处理转义序列,我们需要使用双引号。

---

foo: "this is not a normal string\n"

bar: this is not a normal string\n

YAML将第一个值处理为以回车键和换行键( carriage return and linefeed)结束。由于第二个值没有引号,YAML将其视为两个字符。

YAML中单引号不会解释转义字符串。字符串的值可以跨越多于一行。通过fold(大于)字符,你可以在一个块中指定一个字符串。

bar: >

  this is not a normal string it

  spans more than

  one line

  see?

但这样赋值后,会忽略换行,实际上相当于:

bar : this is not a normal string it spans more than one line see?

Block(pipe管道)字符有类似的功能,但YAML完全按原样解释该字段。

bar: |

  this is not a normal string it

  spans more than

  one line

  see?

这样的换行符也包含在值中:

bar : this is not a normal string it

spans more than

one line

see?

如果一个键的值是一个多行字符串,你可以使用'|'字符的'literal block'风格。这在定义shell命令时特别有用:

command: |

    if [ "${CIRCLE_BRANCH}" == "master" ];

      then ansible-playbook site.yml -i production;

    fi

注意,多行字符串的前导缩进将被删除。

Nulls 空值

你可以用tilde或无引号的null字符串来输入nulls。

---

foo: ~

bar: null

这样使用工具打印出这个键的值,可能如下:

foo : None

bar : None

这个使用Python打印出的值显示,在Python里,null的显示是None。

Booleans 布尔值

YAML用关键字True、On和Yes表示真。假则用False、Off或No表示。

---

foo: True

bar: False

light: On

TV: Off

Arrays 数组

你可以在单行上指定数组或列表:

---

items: [ 1, 2, 3, 4, 5 ]

names: [ "one", "two", "three", "four" ]

或者放到多行上:

---

items:

  - 1

  - 2

  - 3

  - 4

  - 5

names:

  - "one"

  - "two"

  - "three"

  - "four"

多行格式对包含复杂对象而不是标量的列表很有用。

---

items:

  - things:

      thing1: huey

      things2: dewey

      thing3: louie

  - other things:

      key: value

一个数组可以包含任何有效的YAML值。列表中的值不一定是相同的类型。

Dictionaries 字典 (或者叫Collection Types 集合类型)

我们在上面介绍了字典,但它们还有更多的意义。像数组一样,你可以把字典的内容一行显示。我们在上面看到了这种格式。这是python打印字典的方式。

---

foo: { thing1: huey, thing2: louie, thing3: dewey }

同样的内容,也可以改成像前面一样的跨行显示,你要做的就是使用缩进来创建字典或集合:

---

foo: 

  thing1: huey

  thing2: louie

  thing3: dewey

可以多级嵌套。

Advanced Options 高级选项

Chomp Modifiers

多行的字符串可能以空格(比如换行符)结束,根据你希望文档被处理的方式,你可能希望保留或不保留。YAML 有 strip chomp 和 preserve chomp 操作符。

要保存最后一个字符,请在fold或block运算符上添加一个加号。

bar: >+

  this is not a normal string it

  spans more than

  one line

  see?

这样bar的值就不再是一行,而是多行。

使用| 操作符时,默认时保留换行符,如果要去掉这个结尾换行符,请使用strip(剥离) 操作符,即减号。

bar: |-

  this is not a normal string it

  spans more than

  one line

  see?

Multiple documents 多文档

一个文档以三个破折号(dash)开始,以三个句号(periods)结束。一些YAML处理器需要文档的开始运算符。结束符通常是可选的。例如,Java的Jackson不会处理没有开始的YAML文件,但Python的PyYAML可以。当一个文件包含多个文档时,你通常会使用文档结束操作符。

总结

YAML 是一种强大的语言,可用于配置文件、应用程序之间的消息和保存应用程序的状态。我们介绍了它最常用的功能,包括如何使用内置的数据类型和结构复杂的文件。一些平台支持YAML的高级功能,包括自定义数据类型。

注意,YAML不允许使用制表符tab,所以如果你使用这些字符缩进,请让你的文本编辑器将其转换为空格。

主要参考:

https://www.cloudbees.com/blog/yaml-tutorial-everything-you-need-get-started

其他参考:

1,检查YAML语法的在线工具:

http://www.yamllint.com/

2,YAML官网规范:

https://yaml.org/spec/1.2.2/

3,将JSON转换为YAML的在线工具:

https://www.bairesdev.com/tools/json2yaml/

4,YAML快速学习

https://learnxinyminutes.com/docs/yaml/

5,YAML说明

https://circleci.com/blog/what-is-yaml-a-beginner-s-guide/

<think> 嗯,用户这次在查找jenkins maven-pvc.yaml配置文件的相关信息。从对话历史看,用户之前提供的引用材料主要涉及jenkins-pvc.yaml和k8s部署jenkins的配置,但用户现在明确要的是maven相关的PVC配置。 用户可能是正在搭建Jenkins的Maven构建环境,需要为Maven仓库配置持久化存储。ta引用的三个资料里都没有直接出现maven-pvc.yaml这个文件名,但引用[1]展示了jenkins-data-pvc的配置范式,引用[2]提到了maven环境安装步骤,引用[3]涉及k8s暴露jenkins服务的方法——这些可以整合起来推导maven-pvc的配置要点。 需要特别注意用户上次问题中强调的“手撕yaml”这个关键点,说明ta更关注原生k8s配置而非helm chart等封装方案。考虑到Maven仓库的特性,PVC应该配置为ReadWriteMany访问模式,这点要重点突出。另外用户引用[3]提到NodePort,暗示集群可能使用裸金属方案,所以storageClassName要适配用户实际的存储方案。 在准备示例配置时,决定保留jenkins-pvc.yaml的命名逻辑但改为maven前缀,requests部分维持5Gi但标注可扩容。补充注解时特别说明accessModes的选择依据,因为这是容易出错的点。最后关联到PersistentVolume的配置提醒很重要——很多用户只配PVC却忘了PV。 用户连续询问k8s配置问题,可能是运维工程师正在搭建CI/CD流水线。ta的提问很精准,说明对k8s已有基础认知,但可能缺乏Jenkins与k8s集成的实战经验。下次可以预判ta会问Jenkins Agent的动态配置问题。 </think> 根据您提供的引用信息和典型Jenkins在Kubernetes中的部署实践,**`jenkins-maven-pvc.yaml`** 配置文件通常用于为Maven仓库提供持久化存储。以下是标准配置参考和关键说明: --- ### **典型 `jenkins-maven-pvc.yaml` 配置** ```yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: jenkins-maven-pvc # PVC名称,需与Deployment挂载名一致 namespace: jenkins # 建议指定命名空间 spec: accessModes: - ReadWriteMany # Maven仓库需多节点读写(若存储支持) storageClassName: nfs-storage # 必须与集群中StorageClass匹配 resources: requests: storage: 10Gi # 根据实际需求调整存储大小 ``` --- ### **关键配置解析** 1. **访问模式 (`accessModes`)** - `ReadWriteMany`:确保多个Jenkins Agent Pod可并发读写Maven仓库(如使用NFS后端存储) - *若存储不支持RWX*:可改用 `ReadWriteOnce`,但会限制并行构建能力[^1] 2. **存储类 (`storageClassName`)** - 必须与Kubernetes集群中已配置的`StorageClass`名称匹配(例如引用[1]中的`nfs-storage`) - 通过命令验证:`kubectl get storageclass` 3. **挂载到Deployment** 在Jenkins Deployment中需声明挂载点(片段示例): ```yaml volumes: - name: maven-repo persistentVolumeClaim: claimName: jenkins-maven-pvc # 与PVC的metadata.name一致 containers: - name: jenkins volumeMounts: - mountPath: /root/.m2/repository # Maven默认仓库路径 name: maven-repo ``` --- ### **操作步骤** 1. **应用PVC配置** ```bash kubectl apply -f jenkins-maven-pvc.yaml -n jenkins kubectl get pvc -n jenkins # 验证状态为Bound ``` 2. **检查存储后端** - PVC需绑定到正确的PersistentVolume(PV),PV需提前创建或由StorageClass动态供给 - 动态存储需确保StorageClass配置正确(如NFS Provisioner)[^3] --- ### **常见问题排查** - **PVC一直处于Pending状态** ✅ 检查StorageClass是否存在:`kubectl get sc` ✅ 验证PV资源是否充足(动态供给需检查Provisioner日志) - **构建时无法写入Maven仓库** ✅ 确保挂载路径正确(通常为`/root/.m2/repository`) ✅ 检查Pod是否有读写权限(如NFS导出选项需配置`no_root_squash`) --- ### **进阶建议** - **共享存储选择**:生产环境建议用**NFS/CephFS**支持`ReadWriteMany`,避免单点瓶颈[^2] - **资源规划**:根据依赖库规模预留存储(建议≥10Gi,可动态扩容) - **缓存清理**:定期清理过期构件(可通过Jenkins Pipeline脚本自动化) > 注:若您的集群使用其他存储系统(如Rook/Ceph、Longhorn),需调整`storageClassName`并确保Provisioner正常运行[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜流冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值