Terraform — инструмент для управления инфраструктурой. Он автоматизирует развёртывание, обновление и удаление ресурсов облака, таких как виртуальные серверы, сети, роутеры и т.д. Terraform работает на принципах Infrastructure as Code, позволяя описывать конфигурацию инфраструктуры с помощью конструкций специального языка Terraform.
OpenTofu — форк Terraform с открытым исходным кодом, который был создан в ответ на изменение лицензии Terraform с Mozilla Public License на Business Source License. Работа с OpenTofu аналогична работе с Terraform.
При запуске Terraform/OpenTofu считывает находящиеся в рабочей папке манифесты и, используя предоставленные провайдерами облачного сервиса плагины, приводит инфраструктуру к описанному в файлах состоянию, совершая необходимые вызовы к API.
Terraform/OpenTofu управляет двумя классами сущностей — data sources и resources.
Data sources (источники данных) позволяют получать информацию об объектах, которые не управляются текущей конфигурацией Terraform/OpenTofu. Полученная информация доступна только для чтения и используется для управления или создания других объектов с помощью Terraform/OpenTofu.
Источник данных запрашивается с помощью блока data
:
data "rustack_template" "single_template" {
vdc_id = "ea8d0b43-7480-4893-bf7b-9c69c475dc06"
name = "Debian 10"
}
В этом примере "rustack_template"
— тип источника данных (шаблон ОС), "single_template"
— имя. Имя позволяет ссылаться на этот источник данных в другом месте модуля Terraform/OpenTofu. Тип источника данных и его имя образуют идентификатор объекта, который должен быть уникальным в пределах модуля.
Внутри тела блока (между скобками {}
) — параметры запроса для чтения информации об объекте. Основная часть параметров определяется самим источником данных. В этом примере аргумент vdc_id
— идентификатор ВЦОД, для которого доступен шаблон, name
— имя шаблона.
Далее этот источник данных будет нужен, например, при создании сервера для указания идентификатора шаблона ОС.
Resources (ресурсы) описывают различные объекты инфраструктуры, которые должен создать Terraform/OpenTofu: серверы, сети, DNS-зоны и т.д. Параметры созданных ресурсов могут быть использованы для создания других связанных ресурсов.
Ресурс создаётся с помощью блока resource
:
resource "rustack_disk" "disk2" {
vdc_id = "ea8d0b43-7480-4893-bf7b-9c69c475dc06"
name = "Disk 2"
storage_profile_id = "0e1aead5-ef4b-46e2-b988-64dea6d146f8"
size = 100
}
В этом примере "rustack_disk"
— тип ресурса (диск), "disk2"
— имя. Имя позволяет ссылаться на ресурс в другом месте модуля Terraform/OpenTofu. Тип ресурса и его имя образуют идентификатор объекта, который должен быть уникальным в пределах модуля.
Внутри тела блока (между скобками {}
) — параметры, которые описывают ресурс. Основная часть параметров определяется самим ресурсом. В этом примере аргумент vdc_id
— идентификатор ВЦОД, в котором будет создан диск, storage_profile_id
— идентификатор профиля хранения, size
— размер диска в ГБ.
Список data
и resources
см. в документации к IaC-провайдеру РУСТЭК для Terraform и OpenTofu.
Если необходимо создать большую облачную инфраструктуру с несколькими сетями, роутерами и серверами, а также обеспечить её масштабируемость. Вы можете описать свою инфраструктуру на читаемом утилитой языке в манифесте, а затем применить его. Terraform/OpenTofu совершит все необходимые вызовы к API и инфраструктура будет готова к использованию.
Затем, если необходимо масштабировать созданную инфраструктуру, например, добавить новую сеть или изменить конфигурацию уже созданных серверов или дисков, внесите изменения в манифест и снова примените его. Terraform/OpenTofu проанализирует изменения и перед применением опишет план действий, которые будут выполнены с инфраструктурой. После подтверждения изменений Terraform/OpenTofu снова обратится к API и приведёт уже созданную инфраструктуру к заданному состоянию.
Для взаимодействия Terraform/OpenTofu с облачной платформой используется IaC-провайдер РУСТЭК.