Ansible WSL, минимальная Docker-инфраструктура, которую я создал для поэтапного перехода на SSH-ключи на Ubuntu-серверах. Проект решает типичную проблему: миграция с парольной аутентификации на ключи по всему парку серверов без потери доступа, с возможностью перехода на Semaphore UI для дальнейшей автоматизации. Всё работает через Docker, локальная установка Ansible SSH ключи управление не требуется.
Проблема: управление SSH-ключами на масштабе
Управление SSH-ключами звучит просто, пока не делаешь это на нескольких серверах с разными пользователями, портами и конфигурациями. Одно неверное движение с PasswordAuthentication no — и ты заблокирован. Мне нужна была система, которая генерирует уникальные пары ключей по хосту и пользователю, устанавливает их идемпотентно, проверяет доступ перед отключением паролей и хранит credentials только локально.
Решение: Ansible-плейбуки в Docker-контейнерах, оркестрируемые PowerShell-скриптами для Windows/WSL. После верификации деплоя ключей весь workflow импортируется в Semaphore для веб-управления.
Архитектура и компоненты
- Ansible-плейбуки:
ssh_key_setup.yml(генерация и деплой ключей),verify.yml(тест входа по ключу + sudo),collect_host_keys.yml(сбор known_hosts) - Docker-исполнение: кастомный Dockerfile с Ansible, без локальной установки. Workspace монтируется для персистентности ключей
- PowerShell-скрипты:
run-docker.ps1(setup/verify/raw),semaphore-up.ps1(Docker Compose стек),semaphore-import-all.ps1(массовый импорт шаблонов) - Интеграция Semaphore: локальный Docker Compose стек (Postgres + UI), API-импорт шаблонов с проверкой идемпотентности, очисткой orphan и dry-run
- Безопасность: уникальные ключи по хосту/пользователю,
servers.jsonв gitignore, проверка ключей хоста включена
Система автоимпорта в Semaphore
Скрипт semaphore-import-all.ps1 — продвинутый инструмент: сканирует директорию плейбуков, сопоставляет с существующими шаблонами Semaphore, создаёт или обновляет по необходимости. Поддерживает режим только валидации, очистку orphan с подтверждением, basename-only пути и детальные exit-коды (0 успех, 2 частичные ошибки API, 3 пропуски валидации, 4 отсутствие привязок, 5 несовпадение путей).
Практическое применение
В работе внештатного CTO я управляю инфраструктурой в разных средах. Этот тулкит родился из реальной задачи: три Ubuntu-сервера, которым нужен SSH-хардинг без даунтайма. Поэтапный подход, сначала деплой ключей, потом верификация доступа, потом отключение паролей, исключает риск блокировки при ручной ротации SSH-ключей.
Docker-исполнение означает что любой член команды с Docker может запустить плейбуки без настройки Python, Ansible или SSH локально. В сочетании с веб-UI Semaphore это даёт полный workflow управления безопасностью, доступный операционным командам.
Исходный код
Репозиторий доступен по запросу. Свяжитесь со мной для доступа. Включает Ansible-роли, Docker-конфигурацию, PowerShell-автоматизацию и интеграцию с Semaphore.
Для консультаций по безопасности инфраструктуры — более 15 лет управления серверными парками в 38 странах, 6 патентов в информационной безопасности.
FAQ
Нужна ли локальная установка Ansible?
Нет. Всё работает внутри Docker-контейнера из включённого Dockerfile. Нужны только Docker и PowerShell для вспомогательных скриптов.
Безопасно ли запускать на продакшн-серверах?
Да. Плейбуки идемпотентны, повторный запуск не пересоздаёт существующие ключи. Парольная аутентификация остаётся включённой пока вы не проверите доступ по ключу через verify-плейбук и вручную не отключите пароли.
Для чего нужен Semaphore?
Semaphore даёт веб-интерфейс для запуска Ansible-плейбуков. После проверки работы через Docker CLI можно импортировать плейбуки в Semaphore для постоянного управления с расписанием, аудит-логами и контролем доступа команды.
Как хранятся credentials?
Пароли серверов в локальном servers.json (gitignore). SSH-ключи генерируются в директорию keys/ (тоже gitignore). Ничего секретного не коммитится в репозиторий.
