Что такое Provisioning и зачем он нужен¶
Grafana как код (GaC)¶
Когда вы впервые устанавливаете Grafana, она пустая. Нет источников данных. Нет дашбордов. Нет команд, алертов — ничего. Всё это вы добавляете руками через UI. Это нормально для одного человека и пяти дашбордов. Но только не для командной работы и не для продакшена.
Принцип Provisioning'а простой: конфигурация Grafana хранится не в базе данных, а в текстовых YAML и JSON файлах. Всегда актуально, всегда воспроизводимо.
Представьте себе ресторан. Рецепты блюд хранятся не в голове у шеф-повара (он может заболеть, уйти в отпуск, выиграть в лотерею), а в отдельном блокноте, с которым может работать любой повар на кухне. Provisioning — это ваш блокнот рецептов Grafana.
Три слоя provisioning'а:
- файлы (Grafana читает директорию provisioning/ при старте) — для настройки источников данных и дашбордов
- API (внешние инструменты, например CI/CD-конвейер, сами создают ресурсы через REST API Grafana). Полезно, когда вы разворачиваете через Terraform
- Grafana Operator для Kubernetes — всё выше, но автоматизировано Kubernetes-контроллером, который сам следит за Custom Resources и применяет изменения.
Важно: provisioning через файлы — это не "один раз настроил и забыл". Это "настроил в Git, каждый PR проходит review, CI применяет изменения". Инфраструктура как код — Infrastructure as Code, IaC. А для Grafana — GaC — Grafana as Code.
Provisioning vs Terraform/Crossplane¶
Часто задают вопрос: "Terraform тоже умеет provisioning Grafana. В чём разница?"
-
Provisioning через файлы (родной): Grafana сама считывает YAML из provisioning/ при старте. Изменения применяются только при рестарте или reload'е. Масштабирование — нет общего состояния; каждый экземпляр Grafana читает одни и те же файлы. Простота настройки.
-
Terraform: внешний инструмент, который через Grafana API управляет ресурсами. Он может создать источник данных, когда тот не создавался Provisioning-файлом. Terraform хорош, когда у вас всё: Grafana, Prometheus, базы данных — управляются из одного Terraform-конфига.
-
Crossplane: это Kubernetes-ориентированный Control Plane. Ещё более глубокая автоматизация. Вместо Terraform вы описываете желаемое состояние как Kubernetes Custom Resources, и Crossplane сам приводит всё в соответствие.
Главное правило: используйте Provisioning, когда у вас уже развёрнут Grafana; Terraform — когда Grafana разворачивается вместе со всей инфраструктурой.
Как работает File Provisioning¶
Grafana ищет YAML-файлы в трёх поддиректориях provisioning/ — datasources, dashboards, alerting, plugins, iam:
/etc/grafana/provisioning/
├── datasources/
│ └── datasources.yaml
├── dashboards/
│ ├── dashboards.yaml
│ └── dashboards/
│ └── my-dash.json
├── plugins/
│ └── plugins.yaml
├── alerting/
│ └── alerting.yaml
├── access-control/
│ └── iam.yaml
└── ...
Если вы разворачиваете через Docker, монтируете эту директорию внутрь контейнера. Если через Kubernetes — подаёте через ConfigMap. И Grafana сама всё находит и применяет. Простота, радикальная простота.