Что же такое YAML?

YAML (Yet Another Markup Language) — это ещё один язык разметки. Да, именно так он изначально назывался. Конкурировать со «взрослыми» языками разметки, такими как JSON и XML с таким названием сложно, поэтому Кларк Эванс — автор концепции разметки, изменил расшифровку YAML на «Ain’t Markup Language» — не язык разметки.

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

  1. быть понятным человеку;
  2. поддерживать структуры данных, родственные для языков программирования;
  3. быть переносимым между языками программирования;
  4. использовать цельную модель данных для поддержки обычного инструментария;
  5. поддерживать потоковую обработку;
  6. быть выразительным и расширяемым;
  7. быть легким в реализации и использовании.

Особенности 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