194 lines
5.0 KiB
Markdown
194 lines
5.0 KiB
Markdown
# 🛠 Универсальный скрипт для запуска команд Windows с логированием
|
||
|
||
## Введение
|
||
|
||
Привет! Одна из частых задач — **выполнить серию системных команд**, зафиксировать результат, отловить ошибки и сохранить лог. Чтобы не делать это вручную каждый раз, я подготовил универсальный скрипт, который:
|
||
|
||
- Выполняет команды из YAML-файла
|
||
- Сохраняет логи в отдельную папку
|
||
- Показывает stdout, stderr и статус выполнения
|
||
- Удобен для расширения и автоматизации
|
||
|
||
---
|
||
|
||
## 🧩 Структура проекта
|
||
|
||
```
|
||
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`.
|
||
|
||
---
|
||
|
||
## ⚙️ Настройка Ansible
|
||
|
||
### Структура проекта
|
||
```
|
||
graylog-collector/
|
||
├── inventory/
|
||
│ └── hosts.ini
|
||
├── playbook.yml
|
||
└── roles/
|
||
└── graylog_collector/
|
||
├── tasks/
|
||
│ ├── main.yml
|
||
│ ├── 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
|
||
```json
|
||
source:server01 AND "Domain Admins"
|
||
```
|
||
|
||
### Визуализация в Grafana
|
||
```sql
|
||
SELECT host, COUNT(*)
|
||
FROM graylog_messages
|
||
WHERE full_message LIKE '%error%'
|
||
GROUP BY host
|
||
```
|
||
|
||
## 🛠️ Кастомизация
|
||
|
||
### Добавление своих команд
|
||
1. Для Windows: редактируем `files/commands.yaml`
|
||
```yaml
|
||
- name: Check DNS
|
||
command: nslookup example.com
|
||
```
|
||
|
||
2. Для Linux: редактируем `files/collect_info.sh`
|
||
```bash
|
||
commands+=("dig example.com")
|
||
```
|
||
|
||
### Настройка Graylog
|
||
В `defaults/main.yml`:
|
||
```yaml
|
||
graylog_host: logs.mycompany.com
|
||
graylog_port: 12201
|
||
windows_log_dir: C:\Collector\Logs
|
||
linux_log_dir: /var/log/collector
|
||
```
|
||
|
||
## ⚠️ Решение проблем
|
||
|
||
### Частые ошибки Windows
|
||
```fix
|
||
# В PowerShell:
|
||
Enable-PSRemoting -Force
|
||
Set-NetFirewallRule -Name "WINRM-HTTP-In-TCP" -RemoteAddress Any
|
||
```
|
||
|
||
### Ошибки подключения Linux
|
||
```bash
|
||
# На целевой машине:
|
||
sudo systemctl restart sshd
|
||
```
|
||
|
||
### Проблемы с Graylog
|
||
1. Проверить открытость порта:
|
||
```bash
|
||
nc -vz logs.mycompany.com 12201
|
||
```
|
||
2. Проверить GELF input в веб-интерфейсе Graylog
|
||
|
||
## 📈 Расширенные сценарии
|
||
|
||
### Планирование регулярного сбора
|
||
Добавляем в `tasks/main.yml`:
|
||
```yaml
|
||
- name: Schedule daily collection (Windows)
|
||
win_scheduled_task:
|
||
name: "Daily System Info"
|
||
description: "Collect system information"
|
||
actions:
|
||
- path: "python"
|
||
arguments: "C:\\Collector\\run_commands.py"
|
||
triggers:
|
||
- type: daily
|
||
start_time: "03:00"
|
||
```
|
||
|
||
### Обработка ошибок
|
||
В скриптах добавляем обработку исключений:
|
||
```python
|
||
try:
|
||
# выполнение команды
|
||
except Exception as e:
|
||
logging.error(f"Command failed: {str(e)}")
|
||
```
|
||
|
||
## 💡 Советы из практики
|
||
|
||
### 1. **Фильтрация чувствительных данных:**
|
||
|
||
```python
|
||
# В run_commands.py
|
||
if "password" in command.lower():
|
||
logging.warning("Skipping potential sensitive command")
|
||
continue
|
||
```
|
||
|
||
### 2. **Сжатие логов** перед отправкой:
|
||
|
||
```python
|
||
import zlib
|
||
compressed = zlib.compress(log_content.encode())
|
||
```
|
||
|
||
### 3. **Маркировка хостов** в Graylog:
|
||
```python
|
||
message["_environment"] = "production"
|
||
```
|
||
|
||
### 4. Запускаем плейбук
|
||
```bash
|
||
ansible-playbook -i inventory/hosts.ini playbook.yml
|
||
```
|
||
---
|