Ответ
В контексте DevOps legacy code — это часто не только старый код приложения, но и устаревшая инфраструктура: скрипты на Bash без документации, ручные процессы деплоя, морально устаревшие версии ПО или конфигурации без системы управления (Infrastructure as Code).
Мой подход системный:
- Инвентаризация и понимание. Сначала я документирую, что есть: какие скрипты, cron-задачи, ручные шаги в деплое, версии инструментов. Использую диаграммы и README-файлы в репозитории.
- Стабилизация и контроль. Внедряю базовый мониторинг и логирование для legacy-систем, чтобы понимать их состояние. Настраиваю простейший CI/CD для автоматического запуска существующих скриптов, что сразу даёт контроль и историю выполнения.
- Постепенная модернизация (Strangler Pattern). Вместо полного переписывания я постепенно замещаю части. Например:
- Старый Bash-скрипт деплоя → переписываю на Ansible-плейбук.
- Ручная настройка сервера → описываю её в Packer-образе или Terraform-модуле.
- Монолитное приложение → начинаю выносить из него stateless-сервисы в контейнеры.
Пример: Был старый скрипт бэкапа /opt/scripts/backup.sh. Я не переписывал его сразу, а сначала обернул в Docker-контейнер для изоляции зависимостей, затем добавил его вызов в Jenkins-пайплайн с логированием и алертами, и только потом начал переводить логику на Python с использованием современных библиотек.