VK Private Cloud logo
Помощь
Обновлена 17 июля 2026 г. в 15:55

Создание ВМ через Terraform

Terraform — open-source программное обеспечение Infrastructure as code (IaC) или «инфраструктура как код», созданное HashiCorp. Оно позволяет пользователям определять и предоставлять инфраструктуру центра обработки данных, используя декларативный язык конфигурации, известный как язык конфигурации HashiCorp, или, опционально, JSON.

Предполагается, что Terraform уже подготовлен и настроен в соответствии с официальной инструкцией.

Создание конфигурации

Опишите конфигурацию создаваемой виртуальной инфраструктуры, создав файл main.tf в директории с конфигурационными файлами Terraform. Далее приведён пример заполнения фрагментов файла main.tf.

Ключевая пара

Данный сегмент кода отвечает за SSH-ключ.

resource "vkcs_compute_keypair" "ssh" {  # Название SSH-ключа  # Данный ключ будет отображаться в настройках аккаунта на вкладке «Ключевые пары»  name = "terraform_ssh_key"  # Путь до публичного ключа  # В примере он находится в одной директории с main.tf  public_key = file("${path.module}/terraform.pem.pub")}

Группа безопасности

Можно использовать как существующую в Платформе группу безопасности, так и создать новую, настроив правила для неё.

resource "vkcs_networking_secgroup" "secgroup_test" {  name        = "secgroup_test"  description = "My security group"}resource "vkcs_networking_secgroup_rule" "secgroup_rule_test" {  direction         = "ingress"  protocol          = "tcp"  port_range_min    = 22  port_range_max    = 22  remote_ip_prefix  = "0.0.0.0/0"  security_group_id = "${vkcs_networking_secgroup.secgroup_test.id}"}

Диск

Данный сегмент отвечает за создание диска.

resource "vkcs_blockstorage_volume" "volume" {  # Название диска  name = "storage"  # Размер диска  size = 10  # UUID образа диска  image_id = "4d8bc6c0-5623-43bf-9179-1bebcb943b47"  # Тип создаваемого диска  volume_type = "ceph"  # Зона доступности для диска  availability_zone = "AZ1"}

Чтобы получить список доступных типов дисков, воспользуйтесь командой из раздела Просмотр списка типов дисков.

Чтобы получить список доступных образов Платформы, воспользуйтесь командой из раздела Просмотр списка образов ВМ.

Шаблон ВМ (flavor)

# ID шаблона ВМ для инстанса  flavor_id = "dc84b839-a97b-4074-83d6-233531ffd8b3"

Чтобы получить список доступных шаблонов ВМ, воспользуйтесь командой из раздела Получение списка шаблонов ВМ.

Сеть

Можно использовать как существующую в Платформе сеть, так и создать новую, добавив в неё минимум одну подсеть.

resource "vkcs_networking_network" "network_test" {  # Наименование сети  name = "test_network"  # Признак доступа для администратора  admin_state_up = "true"  # Настройка безопасности для портов сети  port_security_enabled = true}resource "vkcs_networking_subnet" "subnet_test" {  # Наименование подсети  name = "test_subnet"  # Сеть, в которой создаётся данная подсеть  network_id = "${vkcs_networking_network.network_test.id}"  # Диапазон IP-адресов подсети в нотации CIDR  cidr = "192.168.199.0/24"}

Собранный конфигурационный файл

Собранная конфигурация будет иметь следующий вид:

terraform {    required_providers {        vkcs = {            source  = "vk-cs/vkcs"            version = "~> 0.1.12"        }    }}# Блок создания ключевой парыresource "vkcs_compute_keypair" "ssh" {  name = "terraform_ssh_key"  public_key = file("${path.module}/terraform.pem.pub")}# Блок создания группы безопасностиresource "vkcs_networking_secgroup" "secgroup_test" {  name        = "secgroup_test"  description = "My security group"}# Блок создания правила для группы безопасностиresource "vkcs_networking_secgroup_rule" "secgroup_rule_test" {  direction         = "ingress"  protocol          = "tcp"  port_range_min    = 22  port_range_max    = 22  remote_ip_prefix  = "0.0.0.0/0"  security_group_id = "${vkcs_networking_secgroup.secgroup_test.id}"}# Блок создания дискаresource "vkcs_blockstorage_volume" "volume" {  name = "storage"  size = 10  image_id = "4d8bc6c0-5623-43bf-9179-1bebcb943b47"  volume_type = "ceph"  availability_zone = "AZ1"}# Блок создания сетиresource "vkcs_networking_network" "network_test" {  name = "test_network"  admin_state_up = "true"  port_security_enabled = true}# Блок создания подсетиresource "vkcs_networking_subnet" "subnet_test" {  name = "test_subnet"  network_id = "${vkcs_networking_network.network_test.id}"  cidr = "192.168.199.0/24"}# Блок создания ВМresource "vkcs_compute_instance" "instance1" {  # Наименование создаваемой ВМ  name = "terraform-test"  # Шаблон ВМ  flavor_id = "dc84b839-a97b-4074-83d6-233531ffd8b3"  # Используемая ключевая пара  key_pair = "${vkcs_compute_keypair.ssh.name}"  # Группы безопасности для ВМ  security_groups = [    "${vkcs_networking_secgroup.secgroup_test.name}"  ]  # Сеть для ВМ  network {    name = "${vkcs_networking_network.network_test.name}"  }  # Диск для ВМ  block_device {    uuid                  = "${vkcs_blockstorage_volume.volume.id}"    source_type           = "volume"    boot_index            = 0    destination_type      = "volume"    delete_on_termination = true  }}

Дополнительные опции

После создания ВМ начинается подготовка её к использованию. В данном примере показано удалённое подключение и выполнение cli-команд.

provisioner "remote-exec" {  # Реквизиты соединения  connection {    # Данный адрес можно получить на вычислительном узле при создании ВМ    host = vkcs_compute_instance.instance1.access_ip_v4    # Пользователь, от имени которого запускается SSH-соединение    user = "ubuntu"    # Приватный ключ, который будет использован    # В этом примере он лежит в одной директории с main.tf    private_key = file("${path.module}/terraform.pem")  }  # CLI-команды, которые необходимо использовать  inline = [    "sudo apt-get update",    "sudo apt-get -y install nginx",  ]

Чтобы вывести дополнительные артефакты, например, IP-адрес внешней сети (external / ext-net), который получила ВМ, добавьте фрагмент следующего вида:

output "instances" {  value = "${vkcs_compute_instance.instance1.access_ip_v4}"}

Развёртывание инфраструктуры

Чтобы выполнить развёртывание инфраструктуры:

  1. Выполните загрузку параметров подключения из конфигурационного файла.

    source ~/users_projects-openrc.sh

    где ~/users_projects-openrc.sh — путь к конфигурационному файлу для подключения.

  2. При необходимости введите пароль от пользователя проекта, для которого был скачан конфигурационный файл.

    Пример запроса пароля проекта
    Please enter your OpenStack Password for project 54683335ee6e4675b66fdd5419793462 as user test@mcs.mail.ru:
  3. Перейдите в каталог с собранным tf-файлом.

  4. Выполните инициализацию окружения terraform:

    terraform init
  5. Убедитесь в корректности составления конфигурации виртуальной инфраструктуры, выполнив команду:

    terraform plan
  6. Если после выполнения команды не обнаружено ошибок, запустите развёртывание указанной виртуальной инфраструктуры:

    terraform apply