Terraform: Основы
Теория: Архитектура
Провайдером в Terraform может быть не только облако. Любой сервис или инструмент может быть реализован в виде провайдера, если есть подходящее HTTP API. Так через Terraform можно управлять мессенджерами, Docker, кластером Kubernetes, DNS, настройкой алертов в системах мониторинга и многим другим. Ниже пример алерта для мониторинга в сервисе DataDog:
Terraform постепенно превратился в универсальный инструмент управления сервисами и многими инструментами, такими как, Kubernetes. Практически все, что имеет подходящее HTTP API, может быть добавлено в Terraform.
Архитектура
Для лучшего понимания того, как применять Terraform в разных ситуациях, нужно немного посмотреть на то как он работает и почему он работает.
Высокоуровнево работа Terraform выглядит просто. Мы описываем нужные нам ресурсы в виде кода, а он выполняет необходимые HTTP-запросы, для создания этих ресурсов. А что в случае удаления или модификации ресурсов? Как Terraform понимает что ресурс уже есть и его нужно модифицировать, а не создавать заново? И здесь в игру вступает главная особенность Terraform - контроль состояния уже созданных ресурсов.
После добавления нового ресурса, Terraform записывает информацию о нем в файл terraform.tfstate. Информация о том, что из себя представляет текущая инфраструктура, называется состоянием. Главная задача состояния, соотносить ресурсы описанные в Terraform с реальной инфраструктурой.
Затем, когда ресурс изменяется, Terraform сравнивает, что было и что нужно было получить. На основе этого строит план, по которому видно, как ресурсы будут изменяться, что придется добавить, изменить или удалить. И если план нас устраивает, то Terraform формирует и выполняет HTTP-запросы в API нужного сервиса или инструмента. Как только изменения сделаны, они отражаются на файле с состоянием.
Во время построения плана, Terraform сверяет состояние в файле с реальной инфраструктурой и обновляет его в случае расхождения. Это сделано на случай, если кто-то изменит инфраструктуру в обход Terraform, что считается плохой практикой. Если какой-то ресурс попал под контроль Terraform, то его изменение должно идти только через Terraform.
С другой стороны, Terraform не отслеживает ресурсы, которые были добавлены в обход. Если создать сервер руками, то Terraform его проигнорирует.
Изменение и удаление ресурсов
Благодаря наличию состояния, Terraform сам определяет как произвести изменения. Для удаления ресурса из инфраструктуры, достаточно удалить его описание из Terraform, для изменения - достаточно поменять его описание.
Изменение работает чуть сложнее. Некоторые изменения требуют пересоздания ресурса, другие нет. Это может быть связано как с физическими ограничениями, например сменой машины на более мощную, так и с ограничениями API, конкретного сервиса. Очень важно следить за этим в плане, иначе можно случайно удалить ресурс, который удалять ни в коем случае нельзя.
Но бывает и наоборот, Terraform может и пытается обновить ресурс без пересоздания, когда мы хотим пересоздания. В такой ситуации поможет команда terraform taint, которая указывает на ресурс, требующий пересоздания:
Список всех ресурсов и их адресов можно посмотреть командой terraform state list
Импортирование ресурсов
Terraform может внедряться в проект, в котором часть или вся инфраструктура уже была создана до его внедрения. В таком случае возникает задача переноса ресурса внутрь без его удаления. В terraform для этого есть механизм импорта ресурсов. В документации каждого ресурса, в самом конце показана команда, с помощью которой можно добавить существующий ресурс в Terraform. Ниже пример с виртуальной машиной:
Эта команда ничего не меняет в самом Yandex Cloud. С ее помощью Terraform извлекает информацию о ресурсе по API и добавляет ее в файл с состоянием.



