概述

YAML:“YAML Ain’t Markup Language”的缩写,常用于配置文件编写,语法简洁,后缀为.yaml.yml。适用于范围非常广泛,如k8s容器编排、JAVA/PYTHON等主流语言数据持久化、spring/mybatis等开源框架的配置文件。

YAML与JSON异同

  • 相同点:它们都是用来定义结构化数据,语法结构相似,是通用的数据序列化语言。
  • 不同点:JSON使用冒号: + {}[]定义层级关系,YAML则使用缩进表示层级关系。JSON常用于数据传输,YAML常用于配置文件编写。yaml更偏向于人性化。

YAML语法糖

YAML基本语法

  • 大小写敏感。
  • 冒号:后面必须跟空格。
  • #表示注释,支持行内注释单行注释
  • 使用缩进表示层级关系。
  • 缩进不能使用tab,只能用空格
  • 缩进的空格数不重要,但相同层级的元素左侧必须对齐
  • 3个破折号---,表示新文档开始。
  • 3个点...,表示文档结束(可选项)。
  • &anchor_name:在yaml对象上创建锚点,并为锚点取个名称anchor_name
  • *anchor_name:引用锚点anchor_name
  • <<:表示合并到当前数据,一般结合*anchor_name使用。

1.大小写敏感和注释

# Name和name是两个yaml对象
Name: zhangsan
name: zhangsan  # 行内注释

2.缩进

# 1.不能使用tab键,只能使用空格。
key: 
  - value1  # 空格数没有要求,不像python缩进严格需要4个空格,此处2个空格。
  - value2  # 需要与value1缩进空格个数保持一致,表示同层级元素。

3.分割文档内容:---...

yaml文件会被加载成为一个流对象(比如IO流),在流对象中可以使用---表示每个文档开始的分隔符,...作为文档结束的分隔符(可选)。
---:通常用在多文档的yaml流中,分割指令文档内容。若没有指令,则作为文档开始的分隔符。
...:通常用于网络传输或者流,有明确的结束符号,有利于软件处理。

# file name: yaml_stream_demo.yaml
# 表示第一个文档的前导注释
---
name: zhangsan
age: 19
...

# 第二个文档的前导注释
---
name: lisi
age: 17
...
import yaml
file_name = "yaml_stream_demo.yaml"
# 获得文件句柄
file_handle = open(file_name, "r")
# 加载在yaml解析器中
yaml_obj = yaml.load_all(file_name.read(), Loader=yaml.loader)
# 打印解析后的python对象
print(yaml_obj ) # [{'age': 19, 'name': 'zhangsan'}, {'age': 17, 'name': 'lisi'}]

4.锚点&与引用*、数据合并<<

# 1. 字典对象-锚点创建
---
defaults: &defaults_anchor  # 创建锚点,锚点名称为defaults_anchor
  user: yaml
  host: localhost

develop:
  database: app_development
  <<: *defaults_anchor  # 引用锚点defaults_anchor,并将其合并到develop字典中
...

# 2. 列表元素-锚点创建
---
- &game_role Steve  # 创建锚点
- Oren 
- *game_role # 引用锚点game_role
...

相当于:

defaults: 
  user: yaml
  host: localhost
develop: 
  database: app_development
  user: yaml
  host: localhost

---
- Steve
- dead
- Steve

YAML基础数据结构

YAML数据结构千变万化,实际上都是基于映射(哈希/字典/关联数组)序列(数组/列表)标量|纯量(字符串/数字/布尔/时间/空值)这3种基础数据结构的演化。

1.映射(哈希/字典/关联数组)

# python
var = {"k1": "A", "k2": "B"}
# 1. yaml常规格式
var:
  k1: A
  k2: B
# 2. yaml内联格式
var: {k1: A, k2: B}
// json
"var": {"k1": "A", "k2": "B"}
"var": {
   "k1": "A", 
   "k2": "B"
   }

2.序列(数组/列表)
示例 1

# python
var = ["A", "B"]
# 1. yaml内联格式
var: [A, B]
# 2. yaml常规格式,连字符 -
var:
  - A
  - B
// json
"var": ["A", "B"]

示例 2

# python
var = [{"name": "li si", "age": 10}, {"name": "ma zi", "age": 12}]
# 1. yaml内联格式
var: [{name: li si, age: 10}, {name: ma zi, age: 12}]
# 2. yaml常规格式
var:
  - {name: li si, age: 10}
  - name: ma zi  # 表示同一代码块{}
    age: 12
// json 1
"var": [{"name": "li si", "age": 10}, {"name": "ma zi", "age": 12}]
// json 2
"var": [{
  "name": "li si", 
  "age": 10
  }, 
  {
  "name": "ma zi", 
  "age": 12
  }]

3.标量|纯量(字符串/数字/布尔/时间/空值)

标量是最yaml基本的数据类型,不可再分的值。比如:字符串、布尔值、数字、空值、时间戳、

  • 字符串
    ---
    # 1. 单行字符串
    my_strings1:  # 将标量映射到序列对象my_strings
      - hello  # hello就是字符串标量
      - hello world  # hello world是字符串标量,通常不需要使用引号包裹。
      - "hello \r\r"  # 使用转义字符"\"的字符串,需要双引号包裹。
    
    ---
    # 2. 多行字符串-保留换行:|。去掉每行的缩进和行尾空白,保留换行和额外缩进。
    my_strings2: |
       第1行定义缩进空格
       第2行保留换行符
           第3行保留4个空格
       最后一行
    // json
    "my_strings2": "第1行定义缩进空格\n第2行保留换行符\n    第3行保留4个空格\n最后一行"
    
    ---
    # 3. 多行字符串-折叠换行:>。将换行转换为空格,将空白行转换为换行。
    my_strings3: >
       第1行定义缩进空格
       第2行
       最后一行
    // json
    "my_strings3": "第1行定义缩进空格 第2行 最后一行"
    
    # + 表示保留字符串行末尾的换行,- 表示删除字符串末尾的换行。与>或者|结合使用。
    ---
    E 4. 多行字符串 +
    my_strings4: |+
       第1行定义缩进空格
       第2行
       最后一行
    // json
    "my_strings4": "第1行定义缩进空格 第2行 最后一行\n"
    
    ---
    E 5. 多行字符串 -
    my_strings5: |-
       第1行定义缩进空格
       第2行
       最后一行
    // json
    "my_strings5": "第1行定义缩进空格 第2行 最后一行"
    
  • 布尔值
    my_boolean:  # 将标量映射到序列对象my_boolean
      - true   # True/true 就是字符串标量,表示 真。
      - false  # False/false 表示 假。
      - yes    # Yes/yes    表示 真。
      - no     # No/no     表示 假。
    // json
    "my_boolean": [true, false]
    
  • 数字
    my_int:  # 将标量映射到序列对象my_int
      - 123   # 整数标量
      - 0o14 # 八进制标量
      - 0xC  # 十六进制标量
      - 0010_1010  # 二进制标量
    // json
    "my_int": [123, 42]
    
       my_float: 
         - 3.14  # 浮点数标量
         - 3.63e+5  # 科学技术标量
         - -.inf  # 负无穷大标量
         - .NaN  # 非数字标量
    
  • 空值
    my_null: 
      - 
      - null
      - Null
      - ~
    
  • 时间戳
    my_data1: 2024-03-26  # 必须ISO 8601格式,即yyyy-MM-dd。
    my_data2: 2024-03-26T05:00:00+08:00  # 使用ISO 8601格式,用T连接时间和日期,用+代表时区
    

YAML应用

通常在应用yaml时,一些主流应用会在yaml基础语法的基础上,拓展很多语法糖。如helm语法,拓展了内置对象Release|Values|Chart|Template

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐