Массивы в YAML: понятные примеры

Массивы в YAML: понятные примеры

В YAML массивы (их ещё называют «последовательности») — это упорядоченные списки значений: строки, числа, объекты (словари) и даже другие массивы. Их удобно использовать, когда нужно сгруппировать связанные данные: сервера, шаги пайплайна, контейнеры в Pod и т.п.

Основные способы записи массивов

Блочный (с дефисами)

Самый читаемый и привычный стиль. Каждый элемент начинается с дефиса и пробела.

Пример:

servers:
  - web01.example.com
  - web02.example.com
  - db01.example.com

Здесь servers — это список из трёх значений.

Когда элементы сложные (словари), их пишут многострочно, сохраняя отступы:

tasks:
  - name: Install Apache
    command: apt-get install apache2 -y
  - name: Start Apache service
    command: systemctl start apache2
  - name: Ensure Apache is enabled
    command: systemctl enable apache2

Встроенный (в строку, flow style)

Компактный формат в квадратных скобках, похож на JSON. Удобен для коротких списков.

Пример:

web_servers: [web01.example.com, web02.example.com, web03.example.com]

Экономит место, но хуже читается на длинных списках.

Вложенные и смешанные варианты

Можно вкладывать списки в словари и наоборот, а также комбинировать блочный и встроенный стили — главное, чтобы отступы были аккуратными.

Пример (блочный):

environments:
  - name: production
    servers:
      - prod-web01
      - prod-web02
      - prod-db01
  - name: staging
    servers:
      - stage-web01
      - stage-db01

Пример (встроенный):

environments: [
  { name: production, servers: [prod-web01, prod-web02, prod-db01] },
  { name: staging,    servers: [stage-web01, stage-db01] }
]

Многострочные элементы в массивах

Если элемент — длинная строка (например, конфиг), удобно использовать блочные скаляры:

  • | — «буквальный» стиль, переносы сохраняются
  • > — «свёрнутый» стиль, переносы превращаются в пробелы

Пример с многострочными строками в списке:

config_files:
  - |
    # Nginx HTTP config
    server {
      listen 80;
      server_name example.com;
    }
  - |
    # Nginx HTTPS config
    server {
      listen 443 ssl;
      server_name example.com;
      ssl_certificate /path/to/cert.pem;
      ssl_certificate_key /path/to/key.pem;
    }

Большие списки

Когда элементов много (IP-адреса, пользователи и т.п.), выбирайте блочный стиль — так проще читать:

ip_addresses:
  - 192.168.1.101
  - 192.168.1.102
  - 192.168.1.103
  - 192.168.1.104
  - 192.168.1.105

Практические примеры

IaC (Ansible/Chef/Puppet)

Списки хостов, ролей, задач:

hosts:
  - name: database_servers
    nodes:
      - db01.example.com
      - db02.example.com
      - db03.example.com

Kubernetes манифесты

Списки контейнеров, портов, переменных окружения:

apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
spec:
  containers:
    - name: web-container
      image: nginx:latest
      ports:
        - containerPort: 80
    - name: sidecar-container
      image: alpine:latest
      command: ["sh", "-c", "echo Hello"]

CI/CD (GitHub Actions, GitLab CI, CircleCI)

Список шагов в job’е:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Install dependencies
        run: npm install
      - name: Run tests
        run: npm test

Полезные советы

  • Следите за отступами: только пробелы, табы запрещены.
  • Для булевых значений используйте true/false — так меньше сюрпризов, чем с yes/no.
  • Длинные и сложные элементы списков оформляйте многострочно — легче поддерживать.
  • Короткие списки допустимо писать в одну строку, но не злоупотребляйте.

Массивы — базовый инструмент в YAML. Для читаемости и поддержки чаще выбирайте блочный стиль с дефисами, а встроенный используйте для коротких значений. Не забывайте про многострочные строки — это спасает, когда элемент списка превращается в мини-конфиг.

Копирование материалов сайта возможно только с указанием ссылки на первоисточник.