---
title: 'Автоматизация сбора системной информации и логов с серверов: Ansible + Graylog'
summary: 'Практическое руководство по созданию кроссплатформенной системы автоматического сбора метрик и логов с серверов Windows и Linux с помощью Ansible и отправкой данных в Graylog. Описаны архитектура, примеры скриптов, интеграция и расширяемость.'
date: '2025-01-28'
draft: false
tags:
- ansible
- graylog
- мониторинг
- windows
- linux
- автоматизация
- devops
---
## Универсальная система сбора системной информации с интеграцией в Graylog

### 🔍 Введение  
В современной инфраструктуре критически важен **централизованный сбор системной информации** с разнородных серверов. Ручной сбор данных через SSH/WinRM неэффективен, а разрозненные логи затрудняют анализ. Решение — **автоматизированная кроссплатформенная система**, которая:
- Собирает ключевые метрики на Windows/Linux
- Стандартизирует формат логов
- Отправляет данные в Graylog для централизованного анализа
- Работает через Ansible без ручного вмешательства

---

### ⚙️ Технические требования  
| Компонент       | Windows                     | Linux                     |
|-----------------|-----------------------------|---------------------------|
| **Управление**  | Ansible 2.9+                | Ansible 2.9+              |
| **Доступ**      | WinRM, Python 3.x           | SSH, Bash                 |
| **Целевые хосты**| WinRM включён, порт 5985    | Стандартные утилиты (ip, df) |
| **Сервер логирования** | Graylog с настроенным GELF-input | |

---

### 🧩 Архитектура решения  
```mermaid
graph LR
A[Ansible Control Node] --> B(Windows Hosts)
A --> C(Linux Hosts)
B --> D[run_commands.py]
C --> E[collect_info.sh]
D --> F[Graylog]
E --> F
F[Graylog] --> G[Дашборды]
F --> H[Алерты]
```

---

### 🚀 Быстрый старт  
**Шаг 1. Клонирование репозитория**  
```bash
git clone https://git.fipi.pro/Plata_Upravleniya_RF/commander.git
cd commander
```

**Шаг 2. Настройка инвентаря**  
`inventory/hosts.ini`:
```ini
[windows]
win-server1 ansible_host=192.168.1.10

[linux]
linux-server1 ansible_host=192.168.1.20

[windows:vars]
ansible_user=Admin
ansible_password=SecurePass123
ansible_connection=winrm

[linux:vars]
ansible_user=root
ansible_ssh_private_key_file=~/.ssh/id_rsa
```

**Шаг 3. Запуск системы**  
```bash
ansible-playbook -i inventory/hosts.ini playbook.yml
```

---

### 🔧 Детали реализации  
#### Для Windows  
**Основной скрипт:** `roles/graylog_collector/files/run_commands.py`  
```python
import subprocess, yaml

def execute_command(cmd):
    """Выполнение команды с перехватом вывода"""
    result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
    return {
        'stdout': result.stdout,
        'stderr': result.stderr,
        'returncode': result.returncode
    }
```

**Конфигурация команд:** `commands.yaml`  
```yaml
commands:
  - name: Network Configuration
    command: ipconfig /all
  - name: System Information
    command: systeminfo
```

#### Для Linux  
**Bash-скрипт:** `collect_info.sh`  
```bash
#!/bin/bash
commands=(
  "ip -br a"
  "df -h --output=source,fstype,pcent"
  "free -m"
  "ss -tuln"
)
```

#### Интеграция с Graylog  
**Общий модуль:** `graylog_sender.py`  
```python
def send_gelf(log_entry):
    """Отправка лога в формате GELF"""
    message = {
        "version": "1.1",
        "host": socket.gethostname(),
        "short_message": "System Snapshot",
        "_environment": "production",
        "_log": log_entry
    }
    sock.sendto(json.dumps(message).encode(), (GRAYLOG_HOST, GRAYLOG_PORT))
```

---

### ⚙️ Ansible-интеграция  
**Структура проекта:**
```
commander/
├── playbook.yml
└── roles/
    └── graylog_collector/
        ├── tasks/
        │   ├── windows.yml
        │   └── linux.yml
        ├── files/
        │   ├── run_commands.py
        │   ├── collect_info.sh
        │   └── graylog_sender.py
        └── defaults/
            └── main.yml
```

**Плейбук:** `playbook.yml`  
```yaml
- name: Deploy Graylog Collector
  hosts: all
  roles:
    - graylog_collector
```

---

### 🔍 Пример использования в Graylog  
**Поиск по конкретному серверу:**  
```sql
source:"win-server1" AND "Domain Admins"
```

**Анализ ошибок:**  
```sql
_full_message:"ERROR" AND _environment:"production"
```

**Дашборд в Grafana:**  
```sql
SELECT 
  host, 
  COUNT_IF(_log LIKE '%CRITICAL%') AS criticals
FROM graylog_messages 
WHERE timestamp > NOW() - INTERVAL 1 DAY
GROUP BY host
```

---

### 🛠️ Кастомизация  
**Добавление новых команд:**  
1. Для Windows:  
```yaml
# commands.yaml
- name: Check DNS Resolution
  command: nslookup example.com
```

2. Для Linux:  
```bash
# В collect_info.sh
commands+=("lsof -i :80")
```

**Настройка Graylog:**  
```yaml
# defaults/main.yml
graylog_host: log-collector.company.com
graylog_port: 12201
windows_log_dir: C:\Monitoring\Logs
linux_log_dir: /var/log/monitoring
```

---

### ⚠️ Решение проблем  
**Частые ошибки Windows:**  
```powershell
# Разрешить WinRM:
Enable-PSRemoting -Force
New-NetFirewallRule -Name "WinRM-HTTP" -DisplayName "WinRM HTTP" -Protocol TCP -LocalPort 5985 -Action Allow
```

**Ошибки подключения к Linux:**  
```bash
sudo systemctl restart sshd
sudo ssh-keygen -A
```

**Проверка Graylog:**  
```bash
# Проверка открытости порта
nc -vz graylog.company.com 12201

# Тестовая отправка
echo '{"version":"1.1","host":"test","short_message":"Test"}' | nc -u -w1 graylog.company.com 12201
```

---

### 📈 Расширенные сценарии  
**Планирование регулярного сбора:**  
```yaml
- name: Schedule Daily Collection
  win_scheduled_task:
    name: "Daily System Snapshot"
    actions:
      - path: "python"
        arguments: "C:\\Collector\\run_commands.py"
    triggers:
      - type: daily
        start_time: "02:30"
```

**Безопасная обработка данных:**  
```python
# Фильтрация чувствительных данных
if "password" in command.lower():
    log_entry = "REDACTED: Sensitive command skipped"
```

**Сжатие логов:**  
```python
import zlib
compressed = zlib.compress(log_entry.encode())
sock.sendto(compressed, (GRAYLOG_HOST, GRAYLOG_PORT))
```

---

### 📚 Заключение  
Представленная система решает ключевую задачу DevOps - **автоматизированный сбор критической информации** с инфраструктуры. Благодаря интеграции с Ansible и Graylog, она обеспечивает:

- Единую точку сбора логов
- Возможность оперативного анализа инцидентов
- Автоматическое обнаружение аномалий
- Исторический аудит изменений

**Полный код доступен на Git:**  
https://git.fipi.pro/Plata_Upravleniya_RF/commander.git

Для более простого исполнения есть `/old_script/` это раннее написанные версии скриптов с максимально простой структурой:
## Старая версия

```
old_scripts/
├── run_commands.py # основной скрипт win
├── script.sh # основной скрипт unix
├── commands.yaml # конфигурация команд
└── logs/ # автоматически создаётся, сюда пишутся логи
```

  Файл `commands.yaml` Можно добавлять любые команды. Главное — указать поле `name` и `command`.

### 🔍 Пример запуска

#### ** 1. Python версия скрипта для Windows-хостов**

```bash
python run_commands.py
```
В консоли будет отображаться ход выполнения, а весь лог сохраняется в `logs/commands_*.log`.

---
#### **2. Bash-версия скрипта для Linux-хостов**

> ❗ Не забудь `chmod +x script.sh`
> Можно запускать из Ansible с `shell` или `script`.
---