Ansible + Terraform

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

Интеграция Ansible и Terraform — широко распространённый паттерн, при котором Terraform отвечает за подготовку неизменяемой инфраструктуры (создание виртуальных машин, сетей и облачных ресурсов через terraform apply), а Ansible — за изменяемый слой конфигурации (установку пакетов, развёртывание приложений и управление состоянием служб на подготовленных хостах). Эти инструменты естественно дополняют друг друга: state-файл Terraform отслеживает, какая инфраструктура существует, а идемпотентные playbook Ansible гарантируют, что конфигурация программного обеспечения соответствует желаемому состоянию независимо от истории машины. Практический рабочий процесс интеграции Ansible и Terraform использует provisioner local-exec в Terraform или шаг CI-конвейера для вызова ansible-playbook после завершения terraform apply, передавая IP-адреса новых хостов в качестве inventory. Альтернативно, collection cloud.terraform для Ansible предоставляет модуль terraform, запускающий terraform apply непосредственно из playbook, что обеспечивает полностью управляемые Ansible рабочие процессы с инфраструктурой без переключения инструментов.

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

Ansible + Terraform использует cloud-специфичные модули для создания cloud-ресурсов (VM, сети, S3-бакеты, DNS). Модули для AWS (amazon.aws), Yandex Cloud (yandex.cloud), Azure (azure.azcollection), GCP (google.cloud), Kubernetes (kubernetes.core). Ansible может быть и IaC, и инструментом конфигурации ("provision и configure"). Сообщество обычно предпочитает Terraform для provisioning + Ansible для конфигурации — разделение ответственности.

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

Ansible для provisioning — только на маленьких + динамичных нагрузках, где Terraform тяжёл. В большинстве случаев Terraform создаёт VM + выводит inventory, потом Ansible конфигурирует (типичный pipeline). add_host — для добавления свежесозданных хостов в inventory посреди play. Dynamic inventory-плагины — вместо ручных списков для облака.

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

Ловушки Ansible + Terraform: Ansible для provisioning без эквивалента state-файла (не видно, что существует — Terraform трекает); resource-drift между запусками (Ansible сводит, но не enforce "удалить то, чего быть не должно"); дыры в идемпотентности некоторых cloud-модулей (двойной запуск создаёт два ресурса из-за неверного lookup key).

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

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