# 🛠 Универсальный скрипт для запуска команд 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 ``` ---