Initial commit: Terraform configuration for Proxmox VM with Loki and Promtail
This commit is contained in:
44
.gitignore
vendored
Normal file
44
.gitignore
vendored
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
|
||||||
|
# Local .terraform directories
|
||||||
|
**/.terraform/*
|
||||||
|
|
||||||
|
# .tfstate files
|
||||||
|
*.tfstate
|
||||||
|
*.tfstate.*
|
||||||
|
|
||||||
|
# Crash log files
|
||||||
|
crash.log
|
||||||
|
crash.*.log
|
||||||
|
|
||||||
|
# Exclude all .tfvars files, which might contain sensitive data
|
||||||
|
*.tfvars
|
||||||
|
*.tfvars.json
|
||||||
|
|
||||||
|
# Ignore override files
|
||||||
|
override.tf
|
||||||
|
override.tf.json
|
||||||
|
*_override.tf
|
||||||
|
*_override.tf.json
|
||||||
|
|
||||||
|
# SSH keys
|
||||||
|
*.pem
|
||||||
|
*.key
|
||||||
|
ssh_key*
|
||||||
|
|
||||||
|
# Lock files
|
||||||
|
.terraform.lock.hcl
|
||||||
|
|
||||||
|
# Backup files
|
||||||
|
*.backup
|
||||||
|
*.bak
|
||||||
|
|
||||||
|
# OS files
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# IDE files
|
||||||
|
.idea/
|
||||||
|
.vscode/
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*~
|
||||||
392
README.md
Normal file
392
README.md
Normal file
@@ -0,0 +1,392 @@
|
|||||||
|
|
||||||
|
# Terraform конфигурация для развертывания Grafana Loki на Proxmox
|
||||||
|
|
||||||
|
Этот проект содержит полный набор Terraform файлов для автоматического развертывания виртуальной машины на Proxmox с установкой и настройкой Grafana Loki и Promtail для сбора и хранения логов.
|
||||||
|
|
||||||
|
## 📋 Описание проекта
|
||||||
|
|
||||||
|
Проект автоматизирует следующие задачи:
|
||||||
|
- Создание SSH ключей для безопасного доступа к VM
|
||||||
|
- Развертывание виртуальной машины на Proxmox с заданными параметрами
|
||||||
|
- Установка и настройка Grafana Loki (система хранения и агрегации логов)
|
||||||
|
- Установка и настройка Promtail (агент для сбора логов)
|
||||||
|
- Настройка автоматического сбора системных логов из `/var/log`
|
||||||
|
|
||||||
|
## 🎯 Параметры виртуальной машины
|
||||||
|
|
||||||
|
- **CPU**: 4 ядра
|
||||||
|
- **RAM**: 4 GB
|
||||||
|
- **Диск**: 31 GB
|
||||||
|
- **ОС**: Ubuntu 22.04 (из cloud-init template)
|
||||||
|
- **Сеть**: DHCP (динамическое получение IP)
|
||||||
|
|
||||||
|
## 📦 Установленные компоненты
|
||||||
|
|
||||||
|
### Grafana Loki
|
||||||
|
- Версия: 2.9.3
|
||||||
|
- Порт: 3100
|
||||||
|
- Режим: Standalone
|
||||||
|
- Хранилище: Filesystem
|
||||||
|
- Retention: 31 день
|
||||||
|
|
||||||
|
### Promtail
|
||||||
|
- Версия: 2.9.3
|
||||||
|
- Порт: 9080
|
||||||
|
- Собирает логи из:
|
||||||
|
- `/var/log/*log` (все системные логи)
|
||||||
|
- `/var/log/syslog`
|
||||||
|
- `/var/log/auth.log`
|
||||||
|
- `/var/log/kern.log`
|
||||||
|
- Systemd journal
|
||||||
|
- Apache, Nginx, Docker (если установлены)
|
||||||
|
|
||||||
|
## 🔧 Требования
|
||||||
|
|
||||||
|
### На локальной машине:
|
||||||
|
- [Terraform](https://www.terraform.io/downloads) >= 1.0
|
||||||
|
- Доступ к Proxmox API
|
||||||
|
- Proxmox API Token (Token ID и Secret)
|
||||||
|
|
||||||
|
### В Proxmox:
|
||||||
|
- Ubuntu 22.04 Cloud-Init template (можно создать из cloud image)
|
||||||
|
- Достаточно ресурсов (4 CPU, 4GB RAM, 31GB диск)
|
||||||
|
- Настроенная сеть с DHCP
|
||||||
|
- Хранилище (storage) для дисков VM
|
||||||
|
|
||||||
|
## 📁 Структура проекта
|
||||||
|
|
||||||
|
```
|
||||||
|
proxmox-loki-terraform/
|
||||||
|
├── main.tf # Основная конфигурация Terraform
|
||||||
|
├── variables.tf # Переменные
|
||||||
|
├── outputs.tf # Выходные данные
|
||||||
|
├── install_loki.sh # Скрипт установки Loki
|
||||||
|
├── install_promtail.sh # Скрипт установки Promtail
|
||||||
|
├── loki-config.yaml # Конфигурация Loki
|
||||||
|
├── promtail-config.yaml # Конфигурация Promtail
|
||||||
|
├── README.md # Эта инструкция
|
||||||
|
├── terraform.tfvars # Файл с вашими значениями переменных (создать)
|
||||||
|
└── ssh_key.pem # SSH ключ (будет создан после apply)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🚀 Инструкция по использованию
|
||||||
|
|
||||||
|
### Шаг 1: Подготовка Proxmox
|
||||||
|
|
||||||
|
1. Создайте API Token в Proxmox:
|
||||||
|
```bash
|
||||||
|
# В Proxmox Web UI:
|
||||||
|
# Datacenter → Permissions → API Tokens → Add
|
||||||
|
# Сохраните Token ID и Secret
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Убедитесь, что у вас есть Ubuntu 22.04 Cloud-Init template:
|
||||||
|
```bash
|
||||||
|
# Пример создания template в Proxmox (выполнить на Proxmox сервере):
|
||||||
|
wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img
|
||||||
|
qm create 9000 --memory 2048 --net0 virtio,bridge=vmbr0 --scsihw virtio-scsi-pci
|
||||||
|
qm importdisk 9000 jammy-server-cloudimg-amd64.img local-lvm
|
||||||
|
qm set 9000 --scsi0 local-lvm:vm-9000-disk-0
|
||||||
|
qm set 9000 --boot c --bootdisk scsi0
|
||||||
|
qm set 9000 --ide2 local-lvm:cloudinit
|
||||||
|
qm set 9000 --serial0 socket --vga serial0
|
||||||
|
qm set 9000 --agent enabled=1
|
||||||
|
qm template 9000
|
||||||
|
qm set 9000 --name ubuntu-22.04-cloudimg
|
||||||
|
```
|
||||||
|
|
||||||
|
### Шаг 2: Настройка переменных
|
||||||
|
|
||||||
|
Создайте файл `terraform.tfvars` в директории проекта:
|
||||||
|
|
||||||
|
```hcl
|
||||||
|
# terraform.tfvars
|
||||||
|
proxmox_api_url = "https://your-proxmox-server.com:8006/api2/json"
|
||||||
|
proxmox_token_id = "user@pam!token_name"
|
||||||
|
proxmox_token_secret = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
|
||||||
|
target_node = "pve" # Имя вашего Proxmox узла
|
||||||
|
storage = "local-lvm" # Ваше хранилище
|
||||||
|
template_name = "ubuntu-22.04-cloudimg" # Имя вашего template
|
||||||
|
network_bridge = "vmbr0" # Ваш сетевой мост
|
||||||
|
|
||||||
|
# Опционально - можно изменить параметры VM:
|
||||||
|
vm_name = "loki-vm"
|
||||||
|
vm_cores = 4
|
||||||
|
vm_memory = 4096
|
||||||
|
vm_disk_size = "31G"
|
||||||
|
ssh_user = "ubuntu"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Шаг 3: Инициализация Terraform
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /home/ubuntu/proxmox-loki-terraform
|
||||||
|
terraform init
|
||||||
|
```
|
||||||
|
|
||||||
|
### Шаг 4: Проверка плана развертывания
|
||||||
|
|
||||||
|
```bash
|
||||||
|
terraform plan
|
||||||
|
```
|
||||||
|
|
||||||
|
Проверьте, что все параметры корректны и соответствуют вашим требованиям.
|
||||||
|
|
||||||
|
### Шаг 5: Развертывание
|
||||||
|
|
||||||
|
```bash
|
||||||
|
terraform apply
|
||||||
|
```
|
||||||
|
|
||||||
|
Введите `yes` для подтверждения. Процесс займет 5-10 минут:
|
||||||
|
1. Создание SSH ключей
|
||||||
|
2. Создание VM в Proxmox
|
||||||
|
3. Ожидание запуска cloud-init
|
||||||
|
4. Установка Grafana Loki
|
||||||
|
5. Установка Promtail
|
||||||
|
|
||||||
|
### Шаг 6: Получение информации о VM
|
||||||
|
|
||||||
|
После успешного развертывания вы получите:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Просмотр всех outputs:
|
||||||
|
terraform output
|
||||||
|
|
||||||
|
# IP адрес VM:
|
||||||
|
terraform output vm_ip_address
|
||||||
|
|
||||||
|
# SSH команда для подключения:
|
||||||
|
terraform output ssh_connection_command
|
||||||
|
|
||||||
|
# Сохранение SSH ключа:
|
||||||
|
terraform output -raw ssh_private_key > ssh_key.pem
|
||||||
|
chmod 600 ssh_key.pem
|
||||||
|
|
||||||
|
# URL Loki:
|
||||||
|
terraform output loki_url
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔐 Подключение к VM
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Сохраните SSH ключ
|
||||||
|
terraform output -raw ssh_private_key > ssh_key.pem
|
||||||
|
chmod 600 ssh_key.pem
|
||||||
|
|
||||||
|
# Подключитесь к VM
|
||||||
|
ssh -i ssh_key.pem ubuntu@<VM_IP>
|
||||||
|
```
|
||||||
|
|
||||||
|
## ✅ Проверка работы сервисов
|
||||||
|
|
||||||
|
### Проверка Loki:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Статус сервиса
|
||||||
|
sudo systemctl status loki
|
||||||
|
|
||||||
|
# Проверка здоровья
|
||||||
|
curl http://localhost:3100/ready
|
||||||
|
|
||||||
|
# Просмотр логов
|
||||||
|
sudo journalctl -u loki -f
|
||||||
|
|
||||||
|
# Проверка метрик
|
||||||
|
curl http://localhost:3100/metrics
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проверка Promtail:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Статус сервиса
|
||||||
|
sudo systemctl status promtail
|
||||||
|
|
||||||
|
# Просмотр логов
|
||||||
|
sudo journalctl -u promtail -f
|
||||||
|
|
||||||
|
# Проверка метрик
|
||||||
|
curl http://localhost:9080/metrics
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проверка сбора логов:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка, что логи поступают в Loki
|
||||||
|
curl -G -s "http://localhost:3100/loki/api/v1/query" --data-urlencode 'query={job="varlogs"}' | jq
|
||||||
|
|
||||||
|
# Получить последние логи
|
||||||
|
curl -G -s "http://localhost:3100/loki/api/v1/query_range" \
|
||||||
|
--data-urlencode 'query={job="syslog"}' \
|
||||||
|
--data-urlencode 'limit=10' | jq
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📊 Интеграция с Grafana
|
||||||
|
|
||||||
|
Для визуализации логов рекомендуется установить Grafana:
|
||||||
|
|
||||||
|
1. Установите Grafana на этой же VM или отдельной машине
|
||||||
|
2. Добавьте Loki как Data Source:
|
||||||
|
- URL: `http://<VM_IP>:3100`
|
||||||
|
- Type: Loki
|
||||||
|
3. Создайте дашборды для визуализации логов
|
||||||
|
|
||||||
|
### Быстрая установка Grafana на той же VM:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Подключитесь к VM
|
||||||
|
ssh -i ssh_key.pem ubuntu@<VM_IP>
|
||||||
|
|
||||||
|
# Установите Grafana
|
||||||
|
sudo apt-get install -y apt-transport-https software-properties-common wget
|
||||||
|
sudo mkdir -p /etc/apt/keyrings/
|
||||||
|
wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null
|
||||||
|
echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install grafana
|
||||||
|
|
||||||
|
# Запустите Grafana
|
||||||
|
sudo systemctl enable grafana-server
|
||||||
|
sudo systemctl start grafana-server
|
||||||
|
|
||||||
|
# Grafana будет доступна на http://<VM_IP>:3000
|
||||||
|
# Логин по умолчанию: admin/admin
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🛠️ Управление инфраструктурой
|
||||||
|
|
||||||
|
### Изменение конфигурации:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Внесите изменения в terraform.tfvars или конфигурационные файлы
|
||||||
|
# Примените изменения:
|
||||||
|
terraform apply
|
||||||
|
```
|
||||||
|
|
||||||
|
### Удаление VM:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Удалит VM и все связанные ресурсы
|
||||||
|
terraform destroy
|
||||||
|
```
|
||||||
|
|
||||||
|
### Пересоздание VM:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Пометить ресурс для пересоздания
|
||||||
|
terraform taint proxmox_vm_qemu.loki_vm
|
||||||
|
terraform apply
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📝 Полезные команды LogQL
|
||||||
|
|
||||||
|
LogQL - язык запросов для Loki (похож на PromQL):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Все логи с job="syslog"
|
||||||
|
{job="syslog"}
|
||||||
|
|
||||||
|
# Логи с фильтром по содержимому
|
||||||
|
{job="syslog"} |= "error"
|
||||||
|
|
||||||
|
# Логи с регулярным выражением
|
||||||
|
{job="auth"} |~ "Failed password.*"
|
||||||
|
|
||||||
|
# Количество ошибок за последний час
|
||||||
|
count_over_time({job="syslog"} |= "error" [1h])
|
||||||
|
|
||||||
|
# Логи из нескольких источников
|
||||||
|
{job=~"syslog|auth"}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 Настройка и кастомизация
|
||||||
|
|
||||||
|
### Изменение retention period:
|
||||||
|
|
||||||
|
Отредактируйте `loki-config.yaml`:
|
||||||
|
```yaml
|
||||||
|
limits_config:
|
||||||
|
retention_period: 744h # Измените на нужное значение
|
||||||
|
```
|
||||||
|
|
||||||
|
### Добавление новых источников логов:
|
||||||
|
|
||||||
|
Отредактируйте `promtail-config.yaml`, добавьте новый `job_name`:
|
||||||
|
```yaml
|
||||||
|
scrape_configs:
|
||||||
|
- job_name: my-app
|
||||||
|
static_configs:
|
||||||
|
- targets:
|
||||||
|
- localhost
|
||||||
|
labels:
|
||||||
|
job: my-app
|
||||||
|
__path__: /var/log/my-app/*.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### Изменение ресурсов VM:
|
||||||
|
|
||||||
|
В `terraform.tfvars`:
|
||||||
|
```hcl
|
||||||
|
vm_cores = 8 # Увеличить CPU
|
||||||
|
vm_memory = 8192 # Увеличить RAM
|
||||||
|
vm_disk_size = "50G" # Увеличить диск
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🐛 Решение проблем
|
||||||
|
|
||||||
|
### VM не получает IP адрес:
|
||||||
|
```bash
|
||||||
|
# Проверьте настройки DHCP в сети Proxmox
|
||||||
|
# Проверьте, что cloud-init работает на VM
|
||||||
|
```
|
||||||
|
|
||||||
|
### Не удается подключиться по SSH:
|
||||||
|
```bash
|
||||||
|
# Проверьте, что VM запущена в Proxmox
|
||||||
|
# Проверьте firewall правила
|
||||||
|
# Убедитесь, что SSH ключ сохранен с правильными правами (chmod 600)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Loki не запускается:
|
||||||
|
```bash
|
||||||
|
# Проверьте логи
|
||||||
|
sudo journalctl -u loki -n 100
|
||||||
|
|
||||||
|
# Проверьте конфигурацию
|
||||||
|
sudo /usr/local/bin/loki -config.file=/etc/loki/loki-config.yaml -verify-config
|
||||||
|
```
|
||||||
|
|
||||||
|
### Promtail не отправляет логи:
|
||||||
|
```bash
|
||||||
|
# Проверьте логи
|
||||||
|
sudo journalctl -u promtail -n 100
|
||||||
|
|
||||||
|
# Проверьте, что Promtail может читать логи
|
||||||
|
sudo -u promtail ls -la /var/log/
|
||||||
|
|
||||||
|
# Проверьте positions файл
|
||||||
|
sudo cat /var/lib/promtail/positions.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📚 Дополнительные ресурсы
|
||||||
|
|
||||||
|
- [Официальная документация Loki](https://grafana.com/docs/loki/latest/)
|
||||||
|
- [Официальная документация Promtail](https://grafana.com/docs/loki/latest/clients/promtail/)
|
||||||
|
- [LogQL синтаксис](https://grafana.com/docs/loki/latest/logql/)
|
||||||
|
- [Terraform Proxmox Provider](https://registry.terraform.io/providers/Telmate/proxmox/latest/docs)
|
||||||
|
- [Grafana Labs](https://grafana.com/)
|
||||||
|
|
||||||
|
## 📄 Лицензия
|
||||||
|
|
||||||
|
Этот проект предоставляется "как есть" для личного и коммерческого использования.
|
||||||
|
|
||||||
|
## 🤝 Поддержка
|
||||||
|
|
||||||
|
Если у вас возникли проблемы или вопросы:
|
||||||
|
1. Проверьте раздел "Решение проблем"
|
||||||
|
2. Изучите логи сервисов
|
||||||
|
3. Обратитесь к официальной документации
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Примечание**: Не забудьте защитить ваш `terraform.tfvars` файл и не публикуйте его в публичных репозиториях, так как он содержит конфиденциальные данные (API токены).
|
||||||
76
install_loki.sh
Normal file
76
install_loki.sh
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
|
||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "=== Установка Grafana Loki ==="
|
||||||
|
|
||||||
|
# Версия Loki
|
||||||
|
LOKI_VERSION="2.9.3"
|
||||||
|
|
||||||
|
# Создание пользователя для Loki
|
||||||
|
echo "Создание пользователя loki..."
|
||||||
|
if ! id -u loki > /dev/null 2>&1; then
|
||||||
|
sudo useradd --system --no-create-home --shell /bin/false loki
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Создание директорий
|
||||||
|
echo "Создание необходимых директорий..."
|
||||||
|
sudo mkdir -p /etc/loki
|
||||||
|
sudo mkdir -p /var/lib/loki
|
||||||
|
sudo mkdir -p /var/lib/loki/chunks
|
||||||
|
sudo mkdir -p /var/lib/loki/index
|
||||||
|
|
||||||
|
# Скачивание Loki
|
||||||
|
echo "Скачивание Grafana Loki ${LOKI_VERSION}..."
|
||||||
|
cd /tmp
|
||||||
|
wget -q "https://github.com/grafana/loki/releases/download/v${LOKI_VERSION}/loki-linux-amd64.zip"
|
||||||
|
unzip -o loki-linux-amd64.zip
|
||||||
|
sudo mv loki-linux-amd64 /usr/local/bin/loki
|
||||||
|
sudo chmod +x /usr/local/bin/loki
|
||||||
|
rm loki-linux-amd64.zip
|
||||||
|
|
||||||
|
# Копирование конфигурационного файла
|
||||||
|
echo "Установка конфигурации Loki..."
|
||||||
|
sudo cp /tmp/loki-config.yaml /etc/loki/loki-config.yaml
|
||||||
|
|
||||||
|
# Установка прав доступа
|
||||||
|
sudo chown -R loki:loki /etc/loki
|
||||||
|
sudo chown -R loki:loki /var/lib/loki
|
||||||
|
|
||||||
|
# Создание systemd service файла
|
||||||
|
echo "Создание systemd service для Loki..."
|
||||||
|
sudo tee /etc/systemd/system/loki.service > /dev/null <<EOF
|
||||||
|
[Unit]
|
||||||
|
Description=Grafana Loki
|
||||||
|
Documentation=https://grafana.com/docs/loki/latest/
|
||||||
|
After=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=loki
|
||||||
|
Group=loki
|
||||||
|
ExecStart=/usr/local/bin/loki -config.file=/etc/loki/loki-config.yaml
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=10s
|
||||||
|
LimitNOFILE=65536
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Перезагрузка systemd и запуск сервиса
|
||||||
|
echo "Запуск Loki service..."
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
sudo systemctl enable loki
|
||||||
|
sudo systemctl start loki
|
||||||
|
|
||||||
|
# Проверка статуса
|
||||||
|
echo "Проверка статуса Loki..."
|
||||||
|
sleep 5
|
||||||
|
sudo systemctl status loki --no-pager || true
|
||||||
|
|
||||||
|
echo "=== Установка Grafana Loki завершена ==="
|
||||||
|
echo "Loki доступен на порту 3100"
|
||||||
|
echo "Проверить статус: sudo systemctl status loki"
|
||||||
|
echo "Проверить логи: sudo journalctl -u loki -f"
|
||||||
|
echo "Проверить здоровье: curl http://localhost:3100/ready"
|
||||||
77
install_promtail.sh
Normal file
77
install_promtail.sh
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
|
||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "=== Установка Promtail ==="
|
||||||
|
|
||||||
|
# Версия Promtail (должна совпадать с версией Loki)
|
||||||
|
PROMTAIL_VERSION="2.9.3"
|
||||||
|
|
||||||
|
# Создание пользователя для Promtail
|
||||||
|
echo "Создание пользователя promtail..."
|
||||||
|
if ! id -u promtail > /dev/null 2>&1; then
|
||||||
|
sudo useradd --system --no-create-home --shell /bin/false promtail
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Создание директорий
|
||||||
|
echo "Создание необходимых директорий..."
|
||||||
|
sudo mkdir -p /etc/promtail
|
||||||
|
sudo mkdir -p /var/lib/promtail
|
||||||
|
|
||||||
|
# Скачивание Promtail
|
||||||
|
echo "Скачивание Promtail ${PROMTAIL_VERSION}..."
|
||||||
|
cd /tmp
|
||||||
|
wget -q "https://github.com/grafana/loki/releases/download/v${PROMTAIL_VERSION}/promtail-linux-amd64.zip"
|
||||||
|
unzip -o promtail-linux-amd64.zip
|
||||||
|
sudo mv promtail-linux-amd64 /usr/local/bin/promtail
|
||||||
|
sudo chmod +x /usr/local/bin/promtail
|
||||||
|
rm promtail-linux-amd64.zip
|
||||||
|
|
||||||
|
# Копирование конфигурационного файла
|
||||||
|
echo "Установка конфигурации Promtail..."
|
||||||
|
sudo cp /tmp/promtail-config.yaml /etc/promtail/promtail-config.yaml
|
||||||
|
|
||||||
|
# Установка прав доступа
|
||||||
|
sudo chown -R promtail:promtail /etc/promtail
|
||||||
|
sudo chown -R promtail:promtail /var/lib/promtail
|
||||||
|
|
||||||
|
# Добавление promtail в группу adm для чтения системных логов
|
||||||
|
sudo usermod -a -G adm promtail
|
||||||
|
|
||||||
|
# Создание systemd service файла
|
||||||
|
echo "Создание systemd service для Promtail..."
|
||||||
|
sudo tee /etc/systemd/system/promtail.service > /dev/null <<EOF
|
||||||
|
[Unit]
|
||||||
|
Description=Promtail service
|
||||||
|
Documentation=https://grafana.com/docs/loki/latest/clients/promtail/
|
||||||
|
After=network-online.target loki.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=promtail
|
||||||
|
Group=promtail
|
||||||
|
ExecStart=/usr/local/bin/promtail -config.file=/etc/promtail/promtail-config.yaml
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=10s
|
||||||
|
LimitNOFILE=65536
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Перезагрузка systemd и запуск сервиса
|
||||||
|
echo "Запуск Promtail service..."
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
sudo systemctl enable promtail
|
||||||
|
sudo systemctl start promtail
|
||||||
|
|
||||||
|
# Проверка статуса
|
||||||
|
echo "Проверка статуса Promtail..."
|
||||||
|
sleep 3
|
||||||
|
sudo systemctl status promtail --no-pager || true
|
||||||
|
|
||||||
|
echo "=== Установка Promtail завершена ==="
|
||||||
|
echo "Promtail доступен на порту 9080"
|
||||||
|
echo "Проверить статус: sudo systemctl status promtail"
|
||||||
|
echo "Проверить логи: sudo journalctl -u promtail -f"
|
||||||
|
echo "Проверить метрики: curl http://localhost:9080/metrics"
|
||||||
85
loki-config.yaml
Normal file
85
loki-config.yaml
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
|
||||||
|
auth_enabled: false
|
||||||
|
|
||||||
|
server:
|
||||||
|
http_listen_port: 3100
|
||||||
|
grpc_listen_port: 9096
|
||||||
|
log_level: info
|
||||||
|
|
||||||
|
common:
|
||||||
|
path_prefix: /var/lib/loki
|
||||||
|
storage:
|
||||||
|
filesystem:
|
||||||
|
chunks_directory: /var/lib/loki/chunks
|
||||||
|
rules_directory: /var/lib/loki/rules
|
||||||
|
replication_factor: 1
|
||||||
|
ring:
|
||||||
|
instance_addr: 127.0.0.1
|
||||||
|
kvstore:
|
||||||
|
store: inmemory
|
||||||
|
|
||||||
|
query_range:
|
||||||
|
results_cache:
|
||||||
|
cache:
|
||||||
|
embedded_cache:
|
||||||
|
enabled: true
|
||||||
|
max_size_mb: 100
|
||||||
|
|
||||||
|
schema_config:
|
||||||
|
configs:
|
||||||
|
- from: 2020-10-24
|
||||||
|
store: boltdb-shipper
|
||||||
|
object_store: filesystem
|
||||||
|
schema: v11
|
||||||
|
index:
|
||||||
|
prefix: index_
|
||||||
|
period: 24h
|
||||||
|
|
||||||
|
ruler:
|
||||||
|
alertmanager_url: http://localhost:9093
|
||||||
|
|
||||||
|
# Настройки хранения данных
|
||||||
|
limits_config:
|
||||||
|
retention_period: 744h # 31 день
|
||||||
|
enforce_metric_name: false
|
||||||
|
reject_old_samples: true
|
||||||
|
reject_old_samples_max_age: 168h
|
||||||
|
ingestion_rate_mb: 10
|
||||||
|
ingestion_burst_size_mb: 20
|
||||||
|
per_stream_rate_limit: 5MB
|
||||||
|
per_stream_rate_limit_burst: 15MB
|
||||||
|
max_cache_freshness_per_query: 10m
|
||||||
|
|
||||||
|
# Настройки компактора для очистки старых данных
|
||||||
|
compactor:
|
||||||
|
working_directory: /var/lib/loki/boltdb-shipper-compactor
|
||||||
|
shared_store: filesystem
|
||||||
|
retention_enabled: true
|
||||||
|
retention_delete_delay: 2h
|
||||||
|
retention_delete_worker_count: 150
|
||||||
|
|
||||||
|
# Настройки производительности
|
||||||
|
ingester:
|
||||||
|
chunk_idle_period: 1h
|
||||||
|
max_chunk_age: 1h
|
||||||
|
chunk_target_size: 1048576
|
||||||
|
chunk_retain_period: 30s
|
||||||
|
max_transfer_retries: 0
|
||||||
|
wal:
|
||||||
|
enabled: true
|
||||||
|
dir: /var/lib/loki/wal
|
||||||
|
flush_on_shutdown: true
|
||||||
|
|
||||||
|
# Настройки для работы в standalone режиме
|
||||||
|
storage_config:
|
||||||
|
boltdb_shipper:
|
||||||
|
active_index_directory: /var/lib/loki/boltdb-shipper-active
|
||||||
|
cache_location: /var/lib/loki/boltdb-shipper-cache
|
||||||
|
cache_ttl: 24h
|
||||||
|
shared_store: filesystem
|
||||||
|
filesystem:
|
||||||
|
directory: /var/lib/loki/chunks
|
||||||
|
|
||||||
|
# Аналитика и метрики
|
||||||
|
analytics:
|
||||||
|
reporting_enabled: false
|
||||||
128
main.tf
Normal file
128
main.tf
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
|
||||||
|
terraform {
|
||||||
|
required_version = ">= 1.0"
|
||||||
|
required_providers {
|
||||||
|
proxmox = {
|
||||||
|
source = "telmate/proxmox"
|
||||||
|
version = "~> 2.9"
|
||||||
|
}
|
||||||
|
tls = {
|
||||||
|
source = "hashicorp/tls"
|
||||||
|
version = "~> 4.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Proxmox Provider Configuration
|
||||||
|
provider "proxmox" {
|
||||||
|
pm_api_url = var.proxmox_api_url
|
||||||
|
pm_api_token_id = var.proxmox_token_id
|
||||||
|
pm_api_token_secret = var.proxmox_token_secret
|
||||||
|
pm_tls_insecure = var.proxmox_tls_insecure
|
||||||
|
}
|
||||||
|
|
||||||
|
# Generate SSH Key Pair
|
||||||
|
resource "tls_private_key" "vm_ssh_key" {
|
||||||
|
algorithm = "RSA"
|
||||||
|
rsa_bits = 4096
|
||||||
|
}
|
||||||
|
|
||||||
|
# Proxmox VM Resource
|
||||||
|
resource "proxmox_vm_qemu" "loki_vm" {
|
||||||
|
name = var.vm_name
|
||||||
|
target_node = var.target_node
|
||||||
|
clone = var.template_name
|
||||||
|
|
||||||
|
# VM Resources
|
||||||
|
cores = var.vm_cores
|
||||||
|
sockets = 1
|
||||||
|
memory = var.vm_memory
|
||||||
|
|
||||||
|
# Boot Configuration
|
||||||
|
boot = "order=scsi0"
|
||||||
|
agent = 1
|
||||||
|
onboot = true
|
||||||
|
|
||||||
|
# Disk Configuration
|
||||||
|
disk {
|
||||||
|
size = var.vm_disk_size
|
||||||
|
type = "scsi"
|
||||||
|
storage = var.storage
|
||||||
|
iothread = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Network Configuration
|
||||||
|
network {
|
||||||
|
model = "virtio"
|
||||||
|
bridge = var.network_bridge
|
||||||
|
}
|
||||||
|
|
||||||
|
# Cloud-init Configuration
|
||||||
|
os_type = "cloud-init"
|
||||||
|
ipconfig0 = "ip=dhcp"
|
||||||
|
|
||||||
|
# SSH Keys
|
||||||
|
sshkeys = tls_private_key.vm_ssh_key.public_key_openssh
|
||||||
|
|
||||||
|
# Wait for cloud-init to complete
|
||||||
|
lifecycle {
|
||||||
|
ignore_changes = [
|
||||||
|
network,
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Connection settings for provisioners
|
||||||
|
connection {
|
||||||
|
type = "ssh"
|
||||||
|
user = var.ssh_user
|
||||||
|
private_key = tls_private_key.vm_ssh_key.private_key_pem
|
||||||
|
host = self.default_ipv4_address
|
||||||
|
timeout = "5m"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Wait for VM to be ready
|
||||||
|
provisioner "remote-exec" {
|
||||||
|
inline = [
|
||||||
|
"cloud-init status --wait",
|
||||||
|
"echo 'VM is ready'",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Copy Loki configuration
|
||||||
|
provisioner "file" {
|
||||||
|
source = "${path.module}/loki-config.yaml"
|
||||||
|
destination = "/tmp/loki-config.yaml"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Copy Promtail configuration
|
||||||
|
provisioner "file" {
|
||||||
|
source = "${path.module}/promtail-config.yaml"
|
||||||
|
destination = "/tmp/promtail-config.yaml"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Copy Loki installation script
|
||||||
|
provisioner "file" {
|
||||||
|
source = "${path.module}/install_loki.sh"
|
||||||
|
destination = "/tmp/install_loki.sh"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Copy Promtail installation script
|
||||||
|
provisioner "file" {
|
||||||
|
source = "${path.module}/install_promtail.sh"
|
||||||
|
destination = "/tmp/install_promtail.sh"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Execute installation scripts
|
||||||
|
provisioner "remote-exec" {
|
||||||
|
inline = [
|
||||||
|
"echo 'Starting installation...'",
|
||||||
|
"sudo chmod +x /tmp/install_loki.sh",
|
||||||
|
"sudo chmod +x /tmp/install_promtail.sh",
|
||||||
|
"echo 'Installing Grafana Loki...'",
|
||||||
|
"sudo /tmp/install_loki.sh",
|
||||||
|
"echo 'Installing Promtail...'",
|
||||||
|
"sudo /tmp/install_promtail.sh",
|
||||||
|
"echo 'Installation completed!'",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
43
outputs.tf
Normal file
43
outputs.tf
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
|
||||||
|
# VM IP Address
|
||||||
|
output "vm_ip_address" {
|
||||||
|
description = "IP адрес созданной виртуальной машины"
|
||||||
|
value = proxmox_vm_qemu.loki_vm.default_ipv4_address
|
||||||
|
}
|
||||||
|
|
||||||
|
# VM ID
|
||||||
|
output "vm_id" {
|
||||||
|
description = "ID виртуальной машины в Proxmox"
|
||||||
|
value = proxmox_vm_qemu.loki_vm.vmid
|
||||||
|
}
|
||||||
|
|
||||||
|
# SSH Private Key
|
||||||
|
output "ssh_private_key" {
|
||||||
|
description = "SSH приватный ключ для подключения к VM"
|
||||||
|
value = tls_private_key.vm_ssh_key.private_key_pem
|
||||||
|
sensitive = true
|
||||||
|
}
|
||||||
|
|
||||||
|
# SSH Public Key
|
||||||
|
output "ssh_public_key" {
|
||||||
|
description = "SSH публичный ключ"
|
||||||
|
value = tls_private_key.vm_ssh_key.public_key_openssh
|
||||||
|
}
|
||||||
|
|
||||||
|
# Connection String
|
||||||
|
output "ssh_connection_command" {
|
||||||
|
description = "Команда для подключения к VM по SSH"
|
||||||
|
value = "ssh -i ssh_key.pem ${var.ssh_user}@${proxmox_vm_qemu.loki_vm.default_ipv4_address}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Loki URL
|
||||||
|
output "loki_url" {
|
||||||
|
description = "URL для доступа к Grafana Loki"
|
||||||
|
value = "http://${proxmox_vm_qemu.loki_vm.default_ipv4_address}:3100"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Loki Health Check
|
||||||
|
output "loki_health_check" {
|
||||||
|
description = "URL для проверки здоровья Loki"
|
||||||
|
value = "http://${proxmox_vm_qemu.loki_vm.default_ipv4_address}:3100/ready"
|
||||||
|
}
|
||||||
107
promtail-config.yaml
Normal file
107
promtail-config.yaml
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
|
||||||
|
server:
|
||||||
|
http_listen_port: 9080
|
||||||
|
grpc_listen_port: 0
|
||||||
|
log_level: info
|
||||||
|
|
||||||
|
positions:
|
||||||
|
filename: /var/lib/promtail/positions.yaml
|
||||||
|
|
||||||
|
clients:
|
||||||
|
- url: http://localhost:3100/loki/api/v1/push
|
||||||
|
|
||||||
|
scrape_configs:
|
||||||
|
# Системные логи
|
||||||
|
- job_name: system
|
||||||
|
static_configs:
|
||||||
|
- targets:
|
||||||
|
- localhost
|
||||||
|
labels:
|
||||||
|
job: varlogs
|
||||||
|
host: ${HOSTNAME}
|
||||||
|
__path__: /var/log/*log
|
||||||
|
|
||||||
|
# Логи syslog
|
||||||
|
- job_name: syslog
|
||||||
|
static_configs:
|
||||||
|
- targets:
|
||||||
|
- localhost
|
||||||
|
labels:
|
||||||
|
job: syslog
|
||||||
|
host: ${HOSTNAME}
|
||||||
|
__path__: /var/log/syslog
|
||||||
|
|
||||||
|
# Логи auth
|
||||||
|
- job_name: auth
|
||||||
|
static_configs:
|
||||||
|
- targets:
|
||||||
|
- localhost
|
||||||
|
labels:
|
||||||
|
job: auth
|
||||||
|
host: ${HOSTNAME}
|
||||||
|
__path__: /var/log/auth.log
|
||||||
|
|
||||||
|
# Логи kern
|
||||||
|
- job_name: kern
|
||||||
|
static_configs:
|
||||||
|
- targets:
|
||||||
|
- localhost
|
||||||
|
labels:
|
||||||
|
job: kern
|
||||||
|
host: ${HOSTNAME}
|
||||||
|
__path__: /var/log/kern.log
|
||||||
|
|
||||||
|
# Логи systemd journal
|
||||||
|
- job_name: systemd-journal
|
||||||
|
journal:
|
||||||
|
max_age: 12h
|
||||||
|
labels:
|
||||||
|
job: systemd-journal
|
||||||
|
host: ${HOSTNAME}
|
||||||
|
relabel_configs:
|
||||||
|
- source_labels: ['__journal__systemd_unit']
|
||||||
|
target_label: 'unit'
|
||||||
|
- source_labels: ['__journal__hostname']
|
||||||
|
target_label: 'hostname'
|
||||||
|
- source_labels: ['__journal_priority_keyword']
|
||||||
|
target_label: 'level'
|
||||||
|
|
||||||
|
# Логи Apache (если установлен)
|
||||||
|
- job_name: apache
|
||||||
|
static_configs:
|
||||||
|
- targets:
|
||||||
|
- localhost
|
||||||
|
labels:
|
||||||
|
job: apache
|
||||||
|
host: ${HOSTNAME}
|
||||||
|
__path__: /var/log/apache2/*.log
|
||||||
|
|
||||||
|
# Логи Nginx (если установлен)
|
||||||
|
- job_name: nginx
|
||||||
|
static_configs:
|
||||||
|
- targets:
|
||||||
|
- localhost
|
||||||
|
labels:
|
||||||
|
job: nginx
|
||||||
|
host: ${HOSTNAME}
|
||||||
|
__path__: /var/log/nginx/*.log
|
||||||
|
|
||||||
|
# Логи Docker (если установлен)
|
||||||
|
- job_name: docker
|
||||||
|
static_configs:
|
||||||
|
- targets:
|
||||||
|
- localhost
|
||||||
|
labels:
|
||||||
|
job: docker
|
||||||
|
host: ${HOSTNAME}
|
||||||
|
__path__: /var/lib/docker/containers/*/*.log
|
||||||
|
pipeline_stages:
|
||||||
|
- json:
|
||||||
|
expressions:
|
||||||
|
output: log
|
||||||
|
stream: stream
|
||||||
|
attrs:
|
||||||
|
- labels:
|
||||||
|
stream:
|
||||||
|
- output:
|
||||||
|
source: output
|
||||||
46
terraform.tfvars.example
Normal file
46
terraform.tfvars.example
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
|
||||||
|
# Пример файла terraform.tfvars
|
||||||
|
# Скопируйте этот файл в terraform.tfvars и заполните своими значениями
|
||||||
|
|
||||||
|
# === Обязательные параметры ===
|
||||||
|
|
||||||
|
# URL Proxmox API (включая порт и путь /api2/json)
|
||||||
|
proxmox_api_url = "https://your-proxmox-server.com:8006/api2/json"
|
||||||
|
|
||||||
|
# Proxmox API Token ID (формат: user@pam!token_name)
|
||||||
|
proxmox_token_id = "user@pam!token_name"
|
||||||
|
|
||||||
|
# Proxmox API Token Secret
|
||||||
|
proxmox_token_secret = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
|
||||||
|
|
||||||
|
# Имя целевого Proxmox узла (например: pve, node1, etc.)
|
||||||
|
target_node = "pve"
|
||||||
|
|
||||||
|
# === Опциональные параметры ===
|
||||||
|
|
||||||
|
# Имя хранилища в Proxmox (по умолчанию: local-lvm)
|
||||||
|
storage = "local-lvm"
|
||||||
|
|
||||||
|
# Имя шаблона Ubuntu 22.04 (по умолчанию: ubuntu-22.04-cloudimg)
|
||||||
|
template_name = "ubuntu-22.04-cloudimg"
|
||||||
|
|
||||||
|
# Сетевой мост Proxmox (по умолчанию: vmbr0)
|
||||||
|
network_bridge = "vmbr0"
|
||||||
|
|
||||||
|
# Имя виртуальной машины (по умолчанию: loki-vm)
|
||||||
|
vm_name = "loki-vm"
|
||||||
|
|
||||||
|
# Количество CPU ядер (по умолчанию: 4)
|
||||||
|
vm_cores = 4
|
||||||
|
|
||||||
|
# Размер RAM в MB (по умолчанию: 4096)
|
||||||
|
vm_memory = 4096
|
||||||
|
|
||||||
|
# Размер диска (по умолчанию: 31G)
|
||||||
|
vm_disk_size = "31G"
|
||||||
|
|
||||||
|
# SSH пользователь (по умолчанию: ubuntu)
|
||||||
|
ssh_user = "ubuntu"
|
||||||
|
|
||||||
|
# Отключить проверку SSL сертификата (по умолчанию: true)
|
||||||
|
proxmox_tls_insecure = true
|
||||||
80
variables.tf
Normal file
80
variables.tf
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
|
||||||
|
# Proxmox API Configuration
|
||||||
|
variable "proxmox_api_url" {
|
||||||
|
description = "URL для Proxmox API (например: https://proxmox.example.com:8006/api2/json)"
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "proxmox_token_id" {
|
||||||
|
description = "Proxmox API Token ID (например: user@pam!token_name)"
|
||||||
|
type = string
|
||||||
|
sensitive = true
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "proxmox_token_secret" {
|
||||||
|
description = "Proxmox API Token Secret"
|
||||||
|
type = string
|
||||||
|
sensitive = true
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "proxmox_tls_insecure" {
|
||||||
|
description = "Отключить проверку SSL сертификата"
|
||||||
|
type = bool
|
||||||
|
default = true
|
||||||
|
}
|
||||||
|
|
||||||
|
# Proxmox Target Configuration
|
||||||
|
variable "target_node" {
|
||||||
|
description = "Имя целевого Proxmox узла"
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "storage" {
|
||||||
|
description = "Имя хранилища в Proxmox"
|
||||||
|
type = string
|
||||||
|
default = "local-lvm"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "template_name" {
|
||||||
|
description = "Имя шаблона Ubuntu 22.04"
|
||||||
|
type = string
|
||||||
|
default = "ubuntu-22.04-cloudimg"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "network_bridge" {
|
||||||
|
description = "Сетевой мост Proxmox"
|
||||||
|
type = string
|
||||||
|
default = "vmbr0"
|
||||||
|
}
|
||||||
|
|
||||||
|
# VM Configuration
|
||||||
|
variable "vm_name" {
|
||||||
|
description = "Имя виртуальной машины"
|
||||||
|
type = string
|
||||||
|
default = "loki-vm"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "vm_cores" {
|
||||||
|
description = "Количество CPU ядер"
|
||||||
|
type = number
|
||||||
|
default = 4
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "vm_memory" {
|
||||||
|
description = "Размер RAM в MB"
|
||||||
|
type = number
|
||||||
|
default = 4096
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "vm_disk_size" {
|
||||||
|
description = "Размер диска (например: 31G)"
|
||||||
|
type = string
|
||||||
|
default = "31G"
|
||||||
|
}
|
||||||
|
|
||||||
|
# SSH Configuration
|
||||||
|
variable "ssh_user" {
|
||||||
|
description = "SSH пользователь для подключения к VM"
|
||||||
|
type = string
|
||||||
|
default = "ubuntu"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user