Terraform — инструмент с открытым исходным кодом, автоматизирующий развертывание и настройку инфраструктуры (провижининг). Он позволяет описывать желаемое состояние инфраструктуры, а не последовательность действий для его достижения.
Проблема без Terraform
Представьте: команда разработчиков запрашивает серверы для нового приложения. Вам необходимо создать виртуальные машины, подготовить базы данных и хранилища, настроить Docker, сеть и безопасность. Другая команда запрашивает тестовый и стейджинг-контуры — и всё повторяется. Постоянные изменения требований приводят к трудоёмким ручным действиям.
Решение: Terraform
Terraform автоматизирует эти действия. Вы описываете желаемую инфраструктуру в специальном файле, а Terraform создаёт, изменяет или удаляет ресурсы, чтобы соответствовать этому описанию. Это декларативный подход: вы описываете что нужно получить, а не как это сделать.
Ключевые компоненты Terraform
Terraform состоит из двух основных компонентов:
- Ядро (Core): Работает с файлом конфигурации и состоянием.
- Файл конфигурации: Описание желаемого состояния инфраструктуры на языке HCL (HashiCorp Configuration Language), похожем на JSON или YAML.
- Состояние (State): Хранит текущее состояние инфраструктуры. Ядро сравнивает желаемое состояние (из файла конфигурации) с текущим и создаёт план действий: что создать, изменить или удалить.
- Провайдеры (Provider): «Плагины», обеспечивающие взаимодействие с различными технологиями. Это могут быть облачные провайдеры (AWS, Google Cloud Platform, Microsoft Azure, Selectel) или локальные решения (OpenStack, KVM, VMware). Провайдеры определяют доступные ресурсы (серверы, базы данных, сети и т.д.).
Ресурсы (Resource)
Ресурс — это часть инфраструктуры, с которой можно взаимодействовать через Terraform. Это могут быть серверы, базы данных, сети, репозитории и многое другое, доступное через выбранный провайдер.
Конфигурационный файл (.tf)
Конфигурационный файл Terraform (.tf) содержит:
- Блок terraform: Глобальные настройки, включая используемые провайдеры.
- Блок provider: Настройки для каждого провайдера (например, данные для подключения).
- Блок resource: Описание ресурсов: тип ресурса, его имя и настройки. Пример: resource "aws_instance" "example" { … }
Основные команды Terraform
- terraform init: Инициализация проекта.
- terraform plan: Создание плана изменений.
- terraform apply: Применение плана изменений.
- terraform state: Просмотр текущего состояния инфраструктуры.
- terraform destroy: Удаление всей инфраструктуры.
Множественное использование одного файла состояния
Использование одного и того же файла состояния несколькими инженерами может привести к конфликтам и непредсказуемому поведению.
Сравнение с Ansible
Terraform и Ansible могут использоваться совместно: Terraform развёртывает инфраструктуру, а Ansible её настраивает.