YAML简介

YAML在配置文件中被大量引用,比如java、playbook、以及K8S等。

在YAML中,使用冒号加缩进代表层级关系,-表示数组元素。
#表示注释行,YAML中只有行注释。

YAML大小写敏感,缩进只能使用空格键,不能使用TAB键,只要是左对齐就是相同层级。
一般使用2个或者4个空格表示缩进。


1.内建格式

在YAML中允许三种格式:常量、对象和数组。

(1)常量

YAML中提供了多种常量结构,包括:整数、浮点数、字符串等。
boolean:
- TRUE #true,True都可以
- FALSE #false,False都可以
float:
- 3.14
- 6.8523015e+5 #可以使用科学计数法
int:
- 123
- 0b1010_0111_0100_1010_1110 #二进制表示
null:
nodeName: 'node'
parent: ~ #使用~表示null
string:
- 哈哈
- 'Hello world' #可以使用双引号或者单引号包裹特殊字符
- newline
newline2 #字符串可以拆成多行,每一行会被转化成一个空格
date:
- 2018-02-17 #日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime:
- 2018-02-17T15:02:31+08:00 #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区

常量的值都是固定值或者内建值。这是与属性的一大区别。


(2)数组

使用短横线(-)加一个空格表示一个数组项
name:
- kebi
- maoxian
也可以这样表示:
-
- kebi
- maoxian
可以简单理解为[[kebi,maoxian]]
下面是一个稍微复杂的例子:
team:
-
id: 1
name: 4AM
-
id: 2
name: OMG
意思是:team的属性是一个数组,每一个数组元素又是由id和name两个属性构成。
数组也可以使用流式(flow)的方式表示:
team: [{id: 1,name: 4AM},{id: 2,name: OMG}]


(3)对象

使用冒号代表,格式为key: value。冒号后面要加一个空格
url: http://www.wolfcode.cn

可以使用缩进表示层级关系:
name:
4AM: 8
OMG: 5

依然支持流式写法:
name: {4AM: 8,OMG: 5}

较为复杂的对象格式,可以使用问号加一个空格代表一个复杂的key,配合一个冒号加一个空格代表一个value。
?
- complexkey1
- complexkey2
:
- complexvalue1
- complexvalue2
意思是对象的key是一个数组[complexkey1,complexkey2],对象的值也是一个数组[complexvalue1,complexvalue2]


下面是一个总是示例:
- kebi
#对象
url: http://www.baidu.com

#数组
server:
- 192.168.1.1
- 192.168.1.2

#常量
date: 2018-02-13
length: 167



2.特殊符号


(1)---:表示一个文档的开始
---
Time: 2018-02-17T15:02:31+08:00
User: ed
Warning:
This is an error message for the log file
---
Time: 2018-02-17T15:05:21+08:00
User: ed
Warning:
A slightly different error message

(2)...:表示一个文档的结束,和---配合使用
---
time: 20:03:20
player: Sammy Sosa
action: strike (miss)
...
---
time: 20:03:47
player: Sammy Sosa
action: grand slam
...


(3)!!:类型强行转换
string:
- !!str 54321
- !!str true
将数字和bool值转化为字符串

(4)>:在字符串中折叠换行,|:保留换行符
accomplishment: >
Mark set a major league
home run record in 1998.
结果就是:
accomplishment=Mark set a major league home run record in 1998.

stats: |
65 Home Runs
0.278 Batting Average
结果就是:
stats=65 Home Runs
0.278 Batting Average,


(5)引用
重复的内容在YAML中可以使用&来完成锚点定义,使用*来完成锚点的引用。
hr:
- Mark McGwire
- &SS Sammy Sosa
rbi:
- *SS
- Ken Griffey

解释:
定义锚点SS,然后*SS引用锚点。
结果:
{rbi=[Sammy Sosa, Ken Griffey], hr=[Mark McGwire, Sammy Sosa]}
注意:不能独立的定义锚点。

下面以一个k8s配置文件作为示例:

apiVersion: v1
kind: Pod  #资源对象类型
metadata:  #pod元数据
  name: volume-pod  #pod名称
spec:  #相关属性定义
  volumes:  #映射卷可能存在多个,因此使用数组
  - name: app-logs
    emptyDir: {}

  containers:  #定义了两种类型的容器
  - name: tomcat
    image: tomcat:latest
    ports:
    - containerPort: 8080  #一个容器可能有多个端口被看起
    volumeMounts:
    - name: app-logs
      mountPath: /usr/local/tomcat/logs

  - name: logreader
    image: busybox:latest
    command: ["sh","-c","tail -f /logs/catalina*.log"]
    volumeMounts:
    - name: app-logs
      mountPath: /logs

YAML文件基本就包含对象和数组两种格式,然后嵌套多层。

原文地址:https://www.cnblogs.com/yangmingxianshen/p/12444966.html