Что же такое YAML?
YAML (Yet Another Markup Language) — это ещё один язык разметки. Да, именно так он изначально назывался. Конкурировать со «взрослыми» языками разметки, такими как JSON и XML с таким названием сложно, поэтому Кларк Эванс — автор концепции разметки, изменил расшифровку YAML на «Ain’t Markup Language» — не язык разметки.
Идея сместилась с упора на удобную разметку в сторону работы с данными, при этом удобный человекочитаемый формат, конечно же, сохранился. Благодаря такому решению, со временем YAML стал одним из самых популярных языков разметки. Особо приглянулся он сетевым- и инфраструктурным инженерам, благодаря целям, которые Кларк Эванс изначально поставил перед своим детищем:
- быть понятным человеку;
- поддерживать структуры данных, родственные для языков программирования;
- быть переносимым между языками программирования;
- использовать цельную модель данных для поддержки обычного инструментария;
- поддерживать потоковую обработку;
- быть выразительным и расширяемым;
- быть легким в реализации и использовании.
Особенности YAML:
- понятный человеку код;
- минималистичный синтаксис;
- заточен под работу с данными;
- встроенный стиль, похожий на JSON (YAML является его надмножеством);
- поддерживает комментарии;
- поддерживает строки без кавычек;
- считается «чище», чем JSON;
- дополнительные возможности (расширяемые типы данных, относительные якоря и маппинг типов с сохранением порядка ключей).
Примечание:
YAML позволяет добавлять комментарии после символа #, как в Python или Bash.
В синтаксисе YAML-файлов используется система отступов, как в Python. Необходимо использовать пробелы, а не табуляцию, чтобы избежать путаницы.
Это избавляет от лишних символов, которые есть в JSON и XML (кавычки, скобки, фигурные скобки).
В итоге читаемость файла значительно повышается.
Синтаксис
Пары ключ-значение
Большинство данных в YAML-файле хранятся в виде пары ключ-значение, где ключ — это имя пары, а значение — связанные данные.
Скаляры и маппинг
Скаляр представляет собой одно значение, которому соответствует имя.
YAML поддерживает стандартные типы: int и float, boolean, string и null.
Они могут быть представлены в разных видах: шестнадцатеричном, восьмеричном или экспоненциальном. Также существуют специальные типы для математических сущностей, такие как: бесконечность, -бесконечность и NAN.
Строка — это коллекция символов, которая может содержать слово или предложение. Можно использовать либо |, для отдельных строк, либо >, для параграфов.
Последовательности — это структуры данных похожие на списки или массивы, которые хранят несколько значений под одним ключом. Они определяются с помощью отступов или [].
Словари — это коллекции пар ключ-значение, которые хранятся под одним ключом. Они позволяют разделить данные на логические категории. Словари могут содержать более сложные структуры, что позволяет хранить сложные реляционные данные.
Для проверки синтаксиса составленного YAML файла можно воспользоваться специальным ресурсом проверки валидации:
Проверка YAML, онлайн проверка YAML
Применение
Написание playbook-ов в Ansible
Пример файла playbook.yml
#На какой группе серверов
- hosts: webservers
tasks:
- name: install redis server
# apt-get update && apt-get install redis-server
ansible.builtin.apt: # имя модуля Ansible
name: redis-server
state: present
update_cache: yes
Пример файла docker-compose.yml
# Версия схемы, которую мы используем (Зависит от установленной версии docker).
version: "3"
# Определяем список сервисов — services
services:
app: # Имя сервиса
build:
# Контекст для сборки образа,
# в данном случае, текущая директория
context: .
# Имя Docker-файла из которого будет собран образ
dockerfile: Dockerfile
# Команда, которая будет выполнена после старта сервиса
command: make start
ports: # Проброс портов
- "3000:8000"
# Перечисляем тома (volumes)
# Они будут подключены к файловой системе сервиса
# Например, все что находится в . мы увидим в директории /app
volumes:
# Текущая директория пробрасывается в директорию /app внутри контейнера
# Путь внутри контейнера (после двоеточия) обязательно должен быть абсолютным
- ".:/app"
- "/tmp:/tmp"
# Сервис будет запущен, только после старта db
depends_on:
- db
db:
# Имя образа. Здесь мы используем базу данных Postgres
image: postgres:latest
environment:
# А так задаются переменные окружения
POSTGRES_PASSWORD: password
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
Пример файла конфигурации сетевого интерфейса в Ubuntu 22.04
network:
version: 2
renderer: networkd
ethernets:
ens160:
dhcp4: true
ens168:
dhcp4: no
addresses: [192.168.88.51/24]
routes:
#- to: 0.0.0.0/0
- to: default
via: 192.168.88.1
nameservers:
addresses: [77.88.8.1, 77.88.8.2]
search: [ mydomain.local ]
Пример файла конфигурации умного дома Home-Assistant
# Loads default set of integrations. Do not remove.
default_config:
# Text to speech
tts:
- platform: google_translate
automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
panel_custom:
name: server_state
sidebar_title: 'Система'
sidebar_icon: mdi:server
js_url: /api/hassio/app/entrypoint.js
url_path: 'hassio/system'
embed_iframe: true
require_admin: true
config:
ingress: core_configurator