Что такое YAML?

| July 6, 2022

Акроним YAML изначально расшифровывался создателями как “Yet Another Markup Language”, и задумывался как, действительно, ещё один язык разметки. В последствии, акроним стал расшифровываться создателями как “YAML Ain’t Markup Language” или “YAML не язык разметки”. Так что же такое YAML на самом деле?

YAML - это формат данных, который прекрасно подходит для задач сериализации данных, ориентированный на удобство ввода-вывода структур данных.

За счёт имеющихся в спецификации YAML типов данных, является прекрасным способом описания конфигурации приложений. Например, YAML используется в Spring Boot, для описания настроек приложения. Или же на YAML описывают манифесты ресурсов Kubernetes. Или же статический генератор сайтов Hugo позволяет задавать метаинформацию для страниц сайта в YAML.

Основы YAML

Как не сложно догадаться, YAML разметка обычно хранится в файлах, имеющих расширение *.yaml или *.yml. Однако, для проверки валидности YAML-содержания удобно использовать онлайн валидаторы. Это так же отличное подспорье в деле изучения YAML. Рекоммендую к ознакомлению следующий сервис. В нём удобно набирать YAML разметку и видеть результат, если конструкция валидна, или же видеть сообщение с объяснением произошедшей ошибки.

Скаляр

Простейшей единицей YAML разметки является скаляр. Примером скаляра является простая строка:

Привет!

Списки

Далее, YAML поддерживает списки. Причём, делает это в двух видах - многострочном и однострочном.

Пример, однострочного списка скаляров в YAML:

["first", "second", "third"]

или тот же самый пример в виде многострочного списка скаляров:

- first
- second
- third

Словари

Словари - это набор кортежей, где каждому скаляру - ключу, соответствует скаляр - значение:

first: 1
second: 2
third: 3

Комбинации

Все типы можно комбинировать между собой.

Например, таким образом можно создать список, состоящий из двух словарей:

-
 age: 21
 name: Jimbo
 nickname: Big. J
-
 year: 2001
 title: Domain-Driven Design
 pages: 1021

А вот так, кортеж, ключам которого соответствует список:

books:
- Object-Oriented Programming
- Domain-Driven Design
- Functional Programming
movies:
- Кавказская пленница
- Операция Ы или другие приключения Шурика
- Самогонщики

Ну и наконец, список списков:

- ["a", "b"]
- ["1", "2"]

и словарь словарей:

John:
  "age": "31"
Jade:
  "age": "23"

Пример из жизни

Уже зная самые базовые вещи, описанные в предыдущей секции, можно разобрать реальный пример из жизни. Посмотрим на определение pod’а Kubernetes:

apiVersion: v1
kind: Pod
metadata:
  name: static-web
  labels:
    role: myrole
spec:
  containers:
    - name: web
      image: nginx
      ports:
        - name: web
          containerPort: 80
          protocol: TCP

Что мы видим? Начнём с корневых элементов:

apiVersion: v1
kind: Pod
metadata: ...
spec: ...

У нас есть описание ресурса Kubernetes, в котором определены версия и вид ресурса (поля apiVersion & kind), а так же метаданные и спецификация (поля metadata & spec). Последние два поля особенные - это не просто соответствия скаляров ключей и скаляров значений, а полноценный маппинг ключа на целый объект.

Разберём поле spec:

spec:
  containers: ...

spec содержит в себе ещё один словарь, в котором есть ровно один элемент, ключём которого является строка containers.

spec:
  containers:
    - name: web
      image: nginx
      ports:
        - name: web
          containerPort: 80
          protocol: TCP

Обратите внимание, первая же строка после containers начинается с символа -, что говорит нам о том, что начинается список. То есть, поле containers содержит в себе список определений контейнеров, входящих в состав kubernetes pod’а.

То же самое, можно увидеть и с полем ports. Имеет место перечисление портов, которые должны быть открыты.

Заключительная часть

Спецификация YAML содержит описания элементов, приведённых в этой статье, а так же, описания многих других, таких как многострочные литералы, теги и другие. На неё точно стоит обратить внимание.

Ключевой момент в работе с YAML - соблюдение отступов. Отступы означают область видимости элемента, говоря техническим языком, его скоуп. Правильное расположение элементов - залог правильного YAML. Большинство ошибок с невалидным YAML содержимым сводится к некорректно расположенным отступам.

Список материалов