Что такое YAML?

Поделиться:

Акроним 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 разметки является скаляр. Примером скаляра является простая строка:

1Привет!

Списки

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

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

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

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

1- first
2- second
3- third

Словари

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

1first: 1
2second: 2
3third: 3

Комбинации

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

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

1-
2 age: 21
3 name: Jimbo
4 nickname: Big. J
5-
6 year: 2001
7 title: Domain-Driven Design
8 pages: 1021

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

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

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

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

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

1John:
2  "age": "31"
3Jade:
4  "age": "23"

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

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

 1apiVersion: v1
 2kind: Pod
 3metadata:
 4  name: static-web
 5  labels:
 6    role: myrole
 7spec:
 8  containers:
 9    - name: web
10      image: nginx
11      ports:
12        - name: web
13          containerPort: 80
14          protocol: TCP

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

1apiVersion: v1
2kind: Pod
3metadata: ...
4spec: ...

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

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

1spec:
2  containers: ...

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

1spec:
2  containers:
3    - name: web
4      image: nginx
5      ports:
6        - name: web
7          containerPort: 80
8          protocol: TCP

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

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

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

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

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

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

Related Posts