AI для DevOps: автоматизация инфраструктуры с помощью LLM

aidevopsautomationllm

LLM — это не только чат-боты. В DevOps они решают реальные задачи: разбирают логи, генерируют конфиги, помогают с инцидентами. Покажу конкретные сценарии, которые использую.

Серверная комната

1. Анализ логов

Классическая задача: в логах 10 000 строк, нужно найти причину проблемы. LLM справляется:

import ollama
import subprocess

def analyze_logs(service: str, lines: int = 100) -> str:
    # Берём последние N строк из journald
    result = subprocess.run(
        ["journalctl", "-u", service, "-n", str(lines), "--no-pager"],
        capture_output=True, text=True
    )

    response = ollama.chat(
        model="llama3.1:8b",
        messages=[{
            "role": "user",
            "content": f"""Проанализируй логи сервиса {service}.
Найди ошибки, предупреждения и аномалии.
Предложи решение, если есть проблемы.

Логи:
{result.stdout[-5000:]}"""  # ограничиваем контекст
        }]
    )
    return response["message"]["content"]

print(analyze_logs("nginx"))

Результат:

Обнаружены проблемы:
1. 15 ошибок "upstream timed out" за последние 5 минут — бэкенд не успевает
   отвечать. Рекомендация: увеличить proxy_read_timeout или проверить нагрузку
   на бэкенд.
2. 3 ошибки "worker_connections are not enough" — пул воркеров переполнен.
   Рекомендация: увеличить worker_connections в nginx.conf.

2. Генерация конфигурации

Описываем задачу на естественном языке — получаем конфиг:

def generate_config(description: str, config_type: str) -> str:
    response = ollama.chat(
        model="llama3.1:8b",
        messages=[{
            "role": "system",
            "content": f"Ты — DevOps-инженер. Генерируй только {config_type} "
                       "конфигурации. Без объяснений, только код."
        }, {
            "role": "user",
            "content": description
        }]
    )
    return response["message"]["content"]

# Nginx
nginx = generate_config(
    "Reverse proxy для FastAPI на порту 8000 с rate limiting 10 req/sec, "
    "SSL от Let's Encrypt для домена api.example.com",
    "nginx"
)

# Docker Compose
compose = generate_config(
    "PostgreSQL 16 + Redis 7 + pgAdmin, "
    "с healthcheck-ами, volumes для данных, сеть app-network",
    "docker-compose"
)

# Ansible task
ansible = generate_config(
    "Установить и настроить fail2ban: защита SSH (5 попыток, бан на 1 час), "
    "логирование в /var/log/fail2ban.log",
    "Ansible YAML (FQCN модули)"
)

Мониторинг

3. Alertmanager → LLM → рекомендация

Подключаем LLM к алертам для автоматической диагностики:

from fastapi import FastAPI, Request
import ollama

app = FastAPI()

@app.post("/webhook/alertmanager")
async def handle_alert(request: Request):
    payload = await request.json()

    for alert in payload.get("alerts", []):
        labels = alert["labels"]
        annotations = alert.get("annotations", {})

        diagnosis = ollama.chat(
            model="llama3.1:8b",
            messages=[{
                "role": "system",
                "content": "Ты — SRE-инженер. Анализируй алерты и предлагай "
                           "действия для устранения. Кратко, по пунктам."
            }, {
                "role": "user",
                "content": f"""Алерт: {labels.get('alertname')}
Severity: {labels.get('severity')}
Instance: {labels.get('instance')}
Описание: {annotations.get('description', 'нет')}
Значение: {annotations.get('value', 'нет')}"""
            }]
        )

        # Отправляем в Telegram
        await send_telegram(
            f"🔔 {labels['alertname']}\n"
            f"📊 {annotations.get('description', '')}\n\n"
            f"🤖 AI-диагностика:\n{diagnosis['message']['content']}"
        )

    return {"status": "ok"}

4. Diff-ревью для конфигов

Перед применением изменений — проверка через LLM:

def review_config_change(old_config: str, new_config: str, config_type: str) -> str:
    response = ollama.chat(
        model="llama3.1:8b",
        messages=[{
            "role": "system",
            "content": "Ты — senior DevOps-инженер. Проверяй изменения в конфигах "
                       "на ошибки, проблемы безопасности и best practices."
        }, {
            "role": "user",
            "content": f"""Тип конфига: {config_type}

БЫЛО:
{old_config}

СТАЛО:
{new_config}

Проверь:
1. Есть ли ошибки синтаксиса?
2. Есть ли проблемы безопасности?
3. Соответствует ли best practices?
4. Могут ли изменения вызвать даунтайм?"""
        }]
    )
    return response["message"]["content"]

5. Автогенерация документации

def document_ansible_role(role_path: str) -> str:
    """Генерирует README для Ansible-роли."""
    import os

    files_content = ""
    for root, _, files in os.walk(role_path):
        for f in files:
            if f.endswith(('.yml', '.yaml', '.j2')):
                path = os.path.join(root, f)
                content = open(path).read()
                files_content += f"\n### {path}\n```yaml\n{content}\n```\n"

    response = ollama.chat(
        model="llama3.1:8b",
        messages=[{
            "role": "user",
            "content": f"""Сгенерируй README.md для Ansible-роли.
Включи: описание, переменные (defaults), зависимости, пример использования.

Файлы роли:
{files_content[:8000]}"""
        }]
    )
    return response["message"]["content"]

Ограничения

  • Не доверяйте слепо: LLM может сгенерировать синтаксически правильный, но логически неверный конфиг
  • Всегда проверяйте: nginx -t, ansible-playbook --check, docker compose config
  • Контекст ограничен: LLM не знает вашу инфраструктуру, если не дать ей контекст
  • Не для продакшена без review: AI-сгенерированные конфиги — это черновик, а не финальная версия

Итого

LLM в DevOps — это ускоритель, а не замена инженера. Анализ логов, генерация конфигов, диагностика алертов — всё это экономит время. Но финальное решение всегда за человеком.

© 2026 Terminal Notes. Built with SvelteKit.