Sergey Antropoff 15e6260ac3 feat: добавлен коллектор proxvms и обновлена документация
- Добавлен новый коллектор proxvms для сбора информации о виртуальных машинах и контейнерах Proxmox
- Реализован парсинг конфигураций VM/контейнеров с структурированием данных
- Добавлена поддержка парсинга сетевых интерфейсов, IP конфигураций, SCSI/IDE устройств
- Реализован парсинг JSON из поля description с переводом русских ключей на английский
- Добавлена генерация уникальных идентификаторов (cluster_uid, node_uid, machine_uid)
- Обновлена документация для всех коллекторов:
  - proxcluster (существующая)
  - gpu (существующая)
  - proxnode (новая)
  - proxvms (новая)
  - system (новая)
  - docker (новая)
  - hba (новая)
  - sensors (новая)
  - kubernetes (новая)
  - macos (новая)
  - uptime (новая)
- Обновлен основной файл docs/collectors.md с полным списком коллекторов
- Добавлена поддержка платформ для каждого коллектора
- Включены примеры использования и устранение неполадок

Автор: Сергей Антропов, сайт: https://devops.org.ru
2025-09-15 12:47:44 +03:00

387 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Коллектор proxvms
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
## Описание
Коллектор `proxvms` собирает подробную информацию о виртуальных машинах и LXC контейнерах в Proxmox кластере. Включает полную конфигурацию каждой VM/контейнера, структурированные данные о сетевых интерфейсах, дисковых устройствах, IP конфигурациях и другую важную информацию.
## Поддерживаемые платформы
- **Linux**: Полная поддержка
- **macOS/Windows**: Не поддерживается (возвращает пустой JSON)
## Собираемые данные
### Основная информация о кластере
```json
{
"cluster": {
"cluster_name": "production-cluster", // Имя кластера
"cluster_uid": "a1b2c3d4e5f67890", // Уникальный ID кластера (SHA256, 16 символов)
"cluster_uuid": "12345678-1234-1234-1234-123456789abc", // UUID кластера
"version": "8.1.4" // Версия Proxmox VE
}
}
```
### Информация о виртуальных машинах и контейнерах
```json
{
"vms": [
{
"vmid": 100, // ID виртуальной машины/контейнера
"name": "web-server", // Имя VM/контейнера
"status": "running", // Статус (running, stopped, suspended)
"type": "QEMU", // Тип: QEMU или LXC
"node_name": "pve1", // Имя ноды
"cluster_uid": "a1b2c3d4e5f67890", // ID кластера
"node_uid": "d8b7a93c2f0e4f16", // ID ноды
"machine_id": "pc-i440fx-7.2", // Machine ID
"machine_uid": "f3e2d1c0b9a8f7e6", // Уникальный ID машины (SHA256, 16 символов)
"is_template": false, // Является ли шаблоном
"cpu_type": "kvm64", // Тип CPU
"boot_disk": "scsi0", // Загрузочный диск
"resources": { // Ресурсы
"memory_mb": 4096, // Память в МБ
"max_memory_mb": 8192, // Максимальная память в МБ
"cpu_cores": 4, // Количество ядер CPU
"max_disk_gb": 100 // Максимальный размер диска в ГБ
},
"config": { // Полная конфигурация
"description_parsed": { // Парсированный JSON из description
"vm_name": "web-server",
"description": "Веб-сервер для продакшена",
"responsible": "Иван Петров",
"creation_date": "01.01.2024",
"deletion_date": "01.01.2025"
},
"network": { // Сетевые интерфейсы
"net0": {
"bridge": "vmbr0", // Мост
"virtio": "52:54:00:12:34:56", // MAC адрес
"ip": { // IP конфигурация
"ip": "192.168.1.100", // IP адрес
"mask": "255.255.255.0", // Маска подсети
"mask_cidr": "/24", // Маска в формате CIDR
"gw": "192.168.1.1" // Шлюз
}
}
},
"ipconfig": { // IP конфигурации
"ipconfig0": {
"ip": {
"ip": "192.168.1.100",
"mask": "255.255.255.0",
"mask_cidr": "/24",
"gw": "192.168.1.1"
}
}
},
"scsi": { // SCSI устройства
"scsi0": {
"pool": "local-lvm", // Пул хранения
"pool_disk": "vm-100-disk-0", // Диск в пуле
"pool_disk_size": "50G", // Размер диска в пуле
"aio": "threads", // Асинхронный I/O
"cache": "writeback", // Кэширование
"discard": "on", // Поддержка discard
"enable": true, // Включено
"iothread": "1" // I/O поток
}
},
"ide": { // IDE устройства
"ide2": {
"pool": "local", // Пул хранения
"pool_disk": "vm-100-cloudinit", // Диск в пуле
"media": "cdrom", // Тип носителя
"enable": true // Включено
}
}
}
},
{
"vmid": 200,
"name": "db-container",
"status": "running",
"type": "LXC", // LXC контейнер
"node_name": "pve1",
"cluster_uid": "a1b2c3d4e5f67890",
"node_uid": "d8b7a93c2f0e4f16",
"machine_id": "db-container",
"machine_uid": "a1b2c3d4e5f67890",
"is_template": false,
"os_template": "ubuntu-22.04-standard_22.04-1_amd64.tar.zst",
"resources": {
"memory_mb": 2048,
"max_memory_mb": 4096,
"cpu_cores": 2,
"max_disk_gb": 20
},
"config": {
"description_parsed": {
"vm_name": "db-container",
"description": "Контейнер базы данных",
"responsible": "Мария Сидорова"
},
"network": {
"net0": {
"bridge": "vmbr1",
"hwaddr": "02:00:00:00:00:01",
"ip": {
"ip": "10.0.0.100",
"mask": "255.255.255.0",
"mask_cidr": "/24",
"gw": "10.0.0.1"
},
"name": "eth0",
"tag": "100",
"type": "veth"
}
},
"rootfs": { // Корневая файловая система LXC
"pool": "local-lvm",
"pool_disk": "vm-200-disk-0",
"pool_disk_size": "20G",
"enable": true
},
"mp": { // Точки монтирования LXC
"mp0": {
"pool": "nfs-storage",
"pool_disk": "vm-200-disk-1",
"pool_disk_size": "100G",
"mp": "/var/lib/postgresql", // Точка монтирования
"backup": "1", // Включен бэкап
"enable": true
}
}
}
}
]
}
```
## Особенности парсинга
### Структурированные данные
Коллектор автоматически парсит и структурирует следующие типы конфигураций:
1. **Сетевые интерфейсы** (`net0`, `net1`, `netX`)
- Парсит строки типа `bridge=vmbr0,virtio=52:54:00:12:34:56`
- Извлекает IP адреса с масками подсети
- Включает шлюз в секцию IP
2. **IP конфигурации** (`ipconfig0`, `ipconfig1`, `ipconfigX`)
- Парсит IP адреса с масками в формате CIDR
- Конвертирует маски в формат 255.255.255.0
- Включает шлюз в секцию IP
3. **SCSI устройства** (`scsi0`, `scsi1`, `scsiX`)
- Парсит пулы и диски в формате `pool:disk`
- Переименовывает `size` в `pool_disk_size`
- Извлекает все параметры конфигурации
4. **IDE устройства** (`ide0`, `ide1`, `ide2`, `ideX`)
- Аналогично SCSI устройствам
- Поддерживает различные типы носителей
5. **LXC устройства** (`rootfs`, `mp0`, `mp1`, `mpX`)
- Парсит корневую файловую систему
- Обрабатывает точки монтирования
- Извлекает параметры пулов и дисков
6. **Описания** (`description`)
- Парсит JSON из поля description
- Переводит русские ключи на английский
- Удаляет оригинальное поле при успешном парсинге
### Удаление дублирования
- Если парсинг прошел успешно, оригинальные поля удаляются
- Если парсинг не удался, оригинальные поля остаются
- Это обеспечивает чистоту данных без потери информации
## Конфигурация
### config.yaml
```yaml
collectors:
proxvms:
enabled: true
type: exec
key: proxvms
interval: "1800s" # 30 минут
timeout: "300s" # 5 минут
exec: "./collectors/proxvms"
platforms: [linux]
```
### Переменные окружения
- `COLLECTOR_TIMEOUT`: Таймаут выполнения коллектора (по умолчанию 30s)
## Требования
### Системные требования
- Proxmox VE кластер
- Доступ к файлам конфигурации:
- `/etc/corosync/corosync.conf` (основной)
- `/etc/pve/corosync.conf` (альтернативный)
- `/var/lib/pve-cluster/corosync.conf` (альтернативный)
### Команды
Коллектор использует следующие команды (должны быть доступны):
- `pvesh` - утилита командной строки Proxmox VE
- `pveversion` - версия Proxmox VE
## Уникальные идентификаторы
### cluster_uid
Генерируется на основе:
- `cluster_name` из corosync.conf
- `cluster_uuid` из corosync.conf
Формула: `SHA256(cluster_name + ":" + cluster_uuid)[:16]` (первые 16 символов SHA256 хеша)
### node_uid
Генерируется на основе:
- `cluster_uuid` кластера
- `node_id` ноды
Формула: `SHA256(cluster_uuid + ":" + node_id)[:16]` (первые 16 символов SHA256 хеша)
### machine_uid
Генерируется на основе:
- Для QEMU VM: UUID из `smbios1` или `machine_id`
- Для LXC контейнеров: `hostname` или `machine_id`
Формула: `SHA256(machine_identifier)[:16]` (первые 16 символов SHA256 хеша)
## Примеры использования
### Проверка работы коллектора
```bash
# Запуск коллектора напрямую
./bin/agent/collectors/proxvms
# Запуск через агент
make run
```
### Фильтрация данных
```bash
# Информация о кластере
./bin/agent/collectors/proxvms | jq '.cluster'
# Все виртуальные машины
./bin/agent/collectors/proxvms | jq '.vms[] | select(.type == "QEMU")'
# Все LXC контейнеры
./bin/agent/collectors/proxvms | jq '.vms[] | select(.type == "LXC")'
# Только запущенные VM
./bin/agent/collectors/proxvms | jq '.vms[] | select(.status == "running")'
# VM с высоким использованием памяти (>4GB)
./bin/agent/collectors/proxvms | jq '.vms[] | select(.resources.memory_mb > 4096)'
# VM с определенным именем
./bin/agent/collectors/proxvms | jq '.vms[] | select(.name == "web-server")'
# Сетевые конфигурации
./bin/agent/collectors/proxvms | jq '.vms[] | select(.config.network != null) | {name, network: .config.network}'
# SCSI устройства
./bin/agent/collectors/proxvms | jq '.vms[] | select(.config.scsi != null) | {name, scsi: .config.scsi}'
# IP адреса с масками
./bin/agent/collectors/proxvms | jq '.vms[] | select(.config.network != null) | {name, ip: .config.network.net0.ip}'
# Парсированные описания
./bin/agent/collectors/proxvms | jq '.vms[] | select(.config.description_parsed != null) | {name, description: .config.description_parsed}'
# LXC с точками монтирования
./bin/agent/collectors/proxvms | jq '.vms[] | select(.type == "LXC" and .config.mp != null) | {name, mp: .config.mp}'
# VM с определенным пулом хранения
./bin/agent/collectors/proxvms | jq '.vms[] | select(.config.scsi.scsi0.pool == "local-lvm")'
```
## Устранение неполадок
### Частые проблемы
1. **"no cluster data found"**
- Проверьте, что система является Proxmox VE кластером
- Убедитесь в доступности файла corosync.conf
- Проверьте права доступа к файлам конфигурации
2. **"failed to parse corosync.conf"**
- Проверьте формат файла corosync.conf
- Убедитесь, что в файле есть cluster_name и cluster_uuid
3. **"cluster version not found"**
- Убедитесь, что установлен Proxmox VE
- Проверьте доступность команды pveversion
4. **Пустые данные о VM/контейнерах**
- Проверьте доступность команды pvesh
- Убедитесь в правильности конфигурации кластера
- Проверьте права доступа к Proxmox API
### Отладка
```bash
# Проверка доступности команд
which pvesh pveversion
# Проверка файлов конфигурации
ls -la /etc/corosync/corosync.conf /etc/pve/corosync.conf
# Проверка статуса сервисов
systemctl status pve-cluster corosync pveproxy pvedaemon
# Проверка VM через pvesh
pvesh get /nodes --output-format json
# Проверка конкретной ноды
pvesh get /nodes/pve1/qemu --output-format json
pvesh get /nodes/pve1/lxc --output-format json
# Проверка конфигурации VM
pvesh get /nodes/pve1/qemu/100/config --output-format json
```
## Безопасность
- Коллектор требует права на чтение системных файлов конфигурации
- Не передает пароли или секретные ключи
- Собирает только публичную информацию о VM/контейнерах
- Не выполняет привилегированные операции
## Производительность
- Время выполнения: ~30-300 секунд (зависит от количества VM/контейнеров)
- Интервал сбора: рекомендуется 30 минут (1800s)
- Потребление ресурсов: минимальное
- Собирает информацию только с локальной ноды
## Совместимость
- **Proxmox VE**: 6.0+
- **VM**: QEMU виртуальные машины
- **Контейнеры**: LXC контейнеры
- **Хранилища**: все поддерживаемые типы (local, nfs, ceph, lvm, zfs и др.)
- **Сети**: все типы интерфейсов (eth, ens, enp, vmbr и др.)
- **Диски**: все типы устройств (scsi, ide, virtio и др.)