Что такое YAML и для чего он используется в DevOps?

«Что такое YAML и для чего он используется в DevOps?» — вопрос из категории Скриптинг и автоматизация, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

YAML (YAML Ain't Markup Language) — это человекочитаемый формат сериализации данных, использующий отступы для обозначения структуры. В DevOps это де-факто стандарт для декларативных конфигурационных файлов, описывающих инфраструктуру, пайплайны и развёртывания.

Основные конструкции в DevOps-контексте:

  • Скаляры: Строки, числа, булевы значения.
  • Списки (Sequences): Элементы, начинающиеся с -.
  • Словари (Mappings): Пары ключ-значение.

Типичные примеры использования:

  1. Kubernetes манифесты: Описание Pod'ов, Deployment'ов, Service'ов.
  2. CI/CD конфигурации: .gitlab-ci.yml, GitHub Actions Workflows (.yml).
  3. Конфигурация инфраструктуры как код: Ansible Playbooks, Docker Compose файлы.

Пример: простой Kubernetes Deployment и Service в одном файле:

# Разделитель '---' позволяет объединить несколько документов в одном файле
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21-alpine
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP

Плюсы:

  • Читаемость и лаконичность по сравнению с JSON/XML.
  • Широкая поддержка инструментами.

Минусы и подводные камни:

  • Чувствительность к отступам (пробелам, не табам). Это частая причина ошибок.
  • Сложность с многострочными строками: Нужно знать разницу между | (сохранить переносы), > (свернуть в одну строку), |- / >- (отрезать последний перенос).
  • Потенциальная уязвимость: Некоторые парсеры YAML могут выполнять произвольный код при загрузке ненадёжных файлов. Всегда используйте безопасные загрузчики (например, yaml.safe_load в Python).