Декларативный vs императивный

Тема дорожной карты · Terraform

Декларативный vs Императивный IaC описывает фундаментальное философское разделение между двумя подходами к созданию инфраструктуры: объявлением желаемого конечного состояния и пошаговым описанием действий для его достижения. Terraform и OpenTofu воплощают декларативную модель — вы пишете HCL resource-блоки, описывающие, какая инфраструктура AWS, Azure, GCP или Kubernetes должна существовать, а движок вычисляет разницу между текущим состоянием (хранящимся в remote-state) и желаемым, затем выполняет terraform apply для её устранения. Императивные инструменты — shell-скрипты, Ansible-плейбуки или команды AWS CLI — требуют от автора перечисления каждой операции создания, обновления и удаления в правильном порядке, перекладывая на него ответственность за идемпотентность, а не на инструмент. Декларативный подход Terraform означает, что terraform plan всегда показывает читаемый предварительный просмотр изменений без побочных эффектов, а дрейф состояния автоматически обнаруживается при следующем цикле планирования. Понимание разницы между декларативным и императивным IaC помогает инженерам выбрать правильный инструмент для каждой задачи: Terraform — для создания долгоживущей инфраструктуры, Ansible или Helm — для управления конфигурацией и развёртывания приложений, где императивный порядок неизбежен.

Как это работает

Декларативный vs императивный относится к инфраструктуре (VM, сети, DNS, S3-бакеты) как к коду: декларативные конфиги, версионируемые в git, применяемые инструментом. Основные инструменты: Terraform / OpenTofu (cloud-agnostic, синтаксис HCL), Pulumi (настоящие языки программирования), AWS CloudFormation / Yandex Cloud Terraform provider (cloud-native). Главное обещание: одинаковый код даёт одинаковую инфру в разных средах, изменения ревьюятся + аудитятся как PR приложения.

Когда применять

IaC — с первого дня для любой cloud или VM-based инфры; ручные клики в веб-консоли не масштабируются за одного разработчика. Terraform/OpenTofu — для cross-cloud + крупнейшей экосистемы. Pulumi — если команда предпочитает настоящие языки программирования (TypeScript, Python, Go) и типизацию. ClickOps — только для самых начальных PoC; кодифицируйте до второго инженера.

Типичные ошибки

Ловушки Декларативный vs императивный: смешение кликов в консоли и IaC ("config drift" — код говорит одно, реальность другое); коммит секретов в git (secrets-менеджер + tf vars); IaC-код как "только ops" без ревью (нужна та же строгость, что и для app-кода); копирование примеров из блогов без понимания state. Плохо сделанный IaC хуже, чем никакого.

Связанные понятия

Полезные ресурсы