Чтобы развернуть инфраструктуру через OpenTofu:
При использовании OpenTofu команды OpenTofu CLI аналогичны Terraform CLI, но вместо
terraform
используетсяtofu
. Например,tofu init
вместоterraform init
.
План инфраструктуры описывается в манифестах — файлах с расширением
.tf
.
При выполнении команды tofu apply
происходит считывание лежащих в рабочей папке манифестов и отправка в API необходимых запросов для создания инфраструктуры, описанной в них (подробнее ниже).
OpenTofu загружает все манифесты, лежащие в одной директории — создаются все описанные ресурсы. Если необходимо создать несколько инфраструктур, рекомендуется хранить манифесты в разных директориях.
Создайте директорию и файл с расширением .tf
в ней.
Файлы с описанием плана могут иметь любое название, в примере это main.tf.
Провайдеры — это плагины для работы с API того или иного сервиса.
В манифесте нужно указать IaC-провайдер, необходимый для создания инфраструктуры: rustack
(IaC-провайдер РУСТЭК).
Чтобы установить и использовать провайдер, вставьте в файл следующий блок:
terraform {
required_version = ">= 1.0.0"
required_providers {
rustack = {
source = "terraform.rustack.ru/rustack-cloud-platform/rcp"
version = "> 1.1.0"
}
}
}
# Настройка авторизации провайдера
provider "rustack" {
api_endpoint = "Ссылка на API облачной платформы"
token = "Токен пользователя облачной платформы"
}
Если ранее в качестве адреса источника провайдера (
source
) использовался"registry.opentofu.org/rustack-cloud-platform/rcp"
, то при смене адреса на"terraform.rustack.ru/rustack-cloud-platform/rcp"
могут возникнуть различные ошибки при инициализации и работе с инфраструктурой.
Чтобы избежать ошибок, во всём файлеterraform.tfstate
заменитеregistry.opentofu.org/rustack-cloud-platform/rcp
наterraform.rustack.ru/rustack-cloud-platform/rcp
.
Также можно использовать локально установленный IaC-провайдер, подробнее см. в инструкции.
Чтобы получить токен пользователя в портале самообслуживания:
1.Перейдите в раздел меню Настройки → Сессии.
2.Нажмите кнопку Создать сессию.
3.В открывшемся окне введите пароль и нажмите кнопку Создать.
4.В окне отобразится токен, скопируйте его.
Опишите план инфраструктуры в файле с расширением .tf
.
Вы можете:
Пример манифеста для создания инфраструктуры представлен ниже.
Выполните следующие команды в директории, в которой находятся созданные манифесты:
Инициализируйте OpenTofu-окружение:
tofu init
Если используется локальный IaC-провайдер, команду
tofu init
можно пропустить.
Проверьте, что план составлен без ошибок:
tofu plan
Если ошибок в описании нет, будет выведен список ресурсов, готовых к созданию. Если ошибки есть — устраните их.
Разверните инфраструктуру и создайте ресурсы:
tofu apply
Подтвердите создание — введите yes и нажмите Enter.
Созданные ресурсы автоматически отобразятся в портале самообслуживания.
Чтобы изменить уже созданную инфраструктуру или её компоненты, достаточно отредактировать манифест — OpenTofu определит, что нужно дополнительно создать или удалить.
Если вы внесли изменения в инфраструктуру через портал самообслуживания, в манифестах они не отобразятся, и OpenTofu не сможет управлять созданными через портал самообслуживания сущностями.
Чтобы изменить инфраструктуру, отредактируйте манифест и примените изменения:
tofu apply
Подтвердите изменение — введите yes и нажмите Enter.
Чтобы удалить ресурсы, в директории с манифестами выполните:
tofu destroy
Будет выведен список удаляемых ресурсов. Подтвердите удаление — введите yes и нажмите Enter.
После применения манифеста командой tofu apply
OpenTofu создаст файл terraform.tfstate
, в котором хранится состояние созданной инфраструктуры, именно в него попадает информация о запрошенных data sources и создаваемых resources.
С помощью этого файла OpenTofu отслеживает изменения инфраструктуры и определяет какие действия необходимо с ней произвести при изменении и повторном применении манифеста.
Также из этого файла можно узнать некоторые параметры, которые выделяются для сущности уже после создания, например, локальный и публичный IP-адрес сервера.
Чтобы обновить версию IaC-провайдера, в директории с манифестами выполните:
tofu init --upgrade
Применение этого плана создаст инфраструктуру в сегменте РУСТЭК, которая будет содержать:
В примере используется проект Мой проект, который создается автоматически при регистрации аккаунта, также проект можно создать через OpenTofu.
План описан в двух файлах — main.tf
и cloud-config.yaml
.
main.tf
— главный манифест, содержит описание создаваемых ресурсов;cloud-config.yaml
— содержит описание настроек виртуального сервера, которые будут применены при развёртывании с помощью cloud-init
. На файл ссылается манифест.Инструмент cloud-init
позволяет задать список пользователей сервера, дополнительные источники пакетов apt
, ключи SSH, сетевые настройки и т.д. См. примеры Cloud config в официальной документации.
# Инициализация OpenTofu и конфигурация провайдера (шаг 1)
terraform {
required_version = ">= 1.0.0"
required_providers {
rustack = {
source = "terraform.rustack.ru/rustack-cloud-platform/rcp"
version = "> 1.1.0"
}
}
}
provider "rustack" {
api_endpoint = "Ссылка на API облачной платформы"
token = "Ваш токен пользователя"
}
# Получение параметров существующего проекта "Мой проект" по его имени (шаг 2)
data "rustack_project" "my_project" {
name = "Мой проект"
}
# Получение параметров доступного гипервизора KVM (сегмент РУСТЭК) по его имени и по id проекта (шаг 3)
data "rustack_hypervisor" "kvm" {
project_id = data.rustack_project.my_project.id
name = "РУСТЭК"
}
# Создание ВЦОД РУСТЭК.
# Задаём его имя, указываем id проекта, который получили на шаге 2 при обращении к data source rustack_project
# Указываем id гипервизора, который получили на шаге 3 при обращении к data source rustack_hypervisor (шаг 4)
resource "rustack_vdc" "vdc1" {
name = "KVM Terraform"
project_id = data.rustack_project.my_project.id
hypervisor_id = data.rustack_hypervisor.kvm.id
}
# Получение параметров автоматически созданной при создании ВЦОД сервисной сети по её имени и id созданного ВЦОД, который получили на шаге 4 при создании resource rustack_vdc (шаг 5)
data "rustack_network" "service_network" {
vdc_id = resource.rustack_vdc.vdc1.id
name = "Сеть"
}
# Получение параметров доступного типа дисков по его имени и id созданного ВЦОД, который получили на шаге 4 при создании resource rustack_vdc (шаг 6)
data "rustack_storage_profile" "ssd" {
vdc_id = resource.rustack_vdc.vdc1.id
name = "ssd"
}
# Получение параметров доступного шаблона ОС по его имени и id созданного ВЦОД, который получили на шаге 4 при создании resource rustack_vdc (шаг 7)
data "rustack_template" "ubuntu20" {
vdc_id = resource.rustack_vdc.vdc1.id
name = "Ubuntu 20.04"
}
# Получение параметров доступного шаблона профиля безопасности по его имени и id созданного ВЦОД, который получили на шаге 4 при создании resource rustack_vdc (шаг 8)
data "rustack_firewall_template" "allow_default" {
vdc_id = resource.rustack_vdc.vdc1.id
name = "Разрешить исходящие"
}
# Создание порта сервера (шаг 9)
# Указываем ВЦОД в котором порт будет создан, сеть к которой он должен быть присоединён и IP-адрес, а также шаблон профиля безопасности
resource "rustack_port" "vm_port" {
vdc_id = resource.rustack_vdc.vdc1.id
network_id = data.rustack_network.service_network.id
ip_address = "10.0.1.20"
firewall_templates = [data.rustack_firewall_template.allow_default.id]
}
# Создание сервера.
# Задаём его имя и конфигурацию. Выбираем шаблон ОС по его id, который получили на шаге 7. Ссылаемся на скрипт инициализации. Указываем размер и тип основного диска.
# Выбираем порт сервера созданный на шаге 9
# Указываем, что необходимо получить публичный адрес.
resource "rustack_vm" "vm" {
vdc_id = resource.rustack_vdc.vdc1.id
name = "Server 1"
cpu = 1
ram = 1
template_id = data.rustack_template.ubuntu20.id
user_data = file("cloud-config.yaml")
system_disk {
size = 10
storage_profile_id = data.rustack_storage_profile.ssd.id
}
networks {
id = resource.rustack_port.vm_port.id
}
floating = true
}
Первая строка #cloud-config
— директива для cloud-init
, которая указывает на тип пользовательских данных в файле — в данном случае это конфигурация разворачиваемого виртуального сервера.
#cloud-config
debug:
verbose: true
cloud_init_modules:
- migrator
- seed_random
- write-files
- growpart
- resizefs
- set_hostname
- update_hostname
- update_etc_hosts
- users-groups
- ssh
- runcmd
users:
- name: test
sudo: ['ALL=(ALL) NOPASSWD:ALL']
groups: sudo
shell: /bin/bash
chpasswd:
users:
- name: test # логин пользователя
password: password1 # пароль пользователя
type: text
expire: False
ssh_pwauth: true
fqdn: "terraform-vm"