VK Cloud logo

Создание ВМ с помощью Terraform

Прежде всего убедитесь, что вы установили Terraform и создали файл main.tf с необходимыми провайдерами.

Создание виртуальной сети для ВМ.

Чтобы создать виртуальную машину, необходимо описать ресурсы виртуальной сети, в которой ВМ будет работать. Создайте файл network.tf, где будет описана конфигурация создаваемой сети. Добавьте текст из примера ниже, и исправьте значения настроек для вашей сети.

Для создания ВМ нам потребуются следующие объекты сети:

  1. Ресурсы (resource):
  • vkcs_networking_network — сеть, в которой будет создана ВМ. В примере ниже сеть создается с именем «compute-net».
  • vkcs_networking_subnet — подсеть из сети. В примере: subnet_1.
  • vkcs_networking_router — роутер для внешней сети и взаимодействия с внешним миром. В примере: vm_router.
  • vkcs_networking_router_interface — подключить роутер к внутренней сети.
  1. Источники данных (data source):
  • vkcs_networking_network – внешняя сеть для получения публичного IP (Floating IP).
1data "vkcs_networking_network" "extnet" {
2  name = "ext-net"
3}
4
5resource "vkcs_networking_network" "compute" {
6  name = "compute-net"
7}
8
9resource "vkcs_networking_subnet" "compute" {
10  name       = "subnet_1"
11  network_id = vkcs_networking_network.compute.id
12  cidr       = "192.168.199.0/24"
13  ip_version = 4
14}
15
16resource "vkcs_networking_router" "compute" {
17  name                = "vm-router"
18  admin_state_up      = true
19  external_network_id = data.vkcs_networking_network.extnet.id
20}
21
22resource "vkcs_networking_router_interface" "compute" {
23  router_id = vkcs_networking_router.compute.id
24  subnet_id = vkcs_networking_subnet.compute.id
25}

Создание виртуальной машины

Для создания виртуальной машины, создайте в каталоге файл instance.tf и добавьте следующий текст примера. Исправьте значения настроек для вашей ВМ.

  1. Ресурсы (resource):
  • vkcs_compute_instance — информация о создаваемом инстансе ВМ. В этом ресурсе мы описываем ВМ и используем ранее описанные ресурсы сети:

    • name — имя ВМ.

    • flavor_id — флейвор ВМ, используемый при создании.

    • security_groups — перечень имен security group, приписанных этой ВМ.

    • availability_zone — зона доступности этой ВМ.

    • block_device — виртуальный диск для создаваемой ВМ. В данном примере создается два диска: один из загрузчного образа, другой — пустой. Ресурс block_device описывается следующими параметрами:

      • uuid — уникальный идентификатор диска.
      • source_type — источник загрузки ОС.
      • destination_type — конечная цель загрузочного образа.
      • volume_type — тип тома цели загрузочного образа.
      • volume_size — размер блока тома цели загрузочного образа.
      • boot_index — место диска в порядке загрузки boot.
      • delete_on_termination — Если указан True, диск будет удален при удалении ВМ.
    • network — сеть, подключаемая при создании ВМ.

    • depends_on — ВМ не запустится прежде чем не будет выполнено создание указанных ресурсов.

  • vkcs_networking_floatingip — получает ID доступного плавающего IP от VK Cloud. Включает в себя следующий ресурс:

    • pool — имя пула, к которому принадлежит плавающий IP.
  • vkcs_compute_floatingip_associate — присваивает плавающий IP созданной ВМ. Включается в себя следующие ресурсы:

  • floating_ip — ID плавающего IP, который будет присвоен ВМ.

  • instance_id — ID ВМ, которой будет присвоен плавающий IP.

  1. Источники данных (data source):
  • vkcs_images_image — установочный образ для создаваемого инстанса.

  • vkcs_compute_flavor – флейвор (CPU, RAM, Disk) ВМ. Можно посмотреть в визарде создания ВМ через личный кабинет.

  • output "instance_fip" - выводит в консоль плавающий IP присвоенный ВМ.

1data "vkcs_compute_flavor" "compute" {
2  name = "Basic-1-2-20"
3}
4
5data "vkcs_images_image" "compute" {
6  name = "Ubuntu-18.04-Standard"
7}
8
9resource "vkcs_compute_instance" "compute" {
10  name                    = "compute-instance"
11  flavor_id               = data.vkcs_compute_flavor.compute.id
12  security_groups         = ["default"]
13  availability_zone       = "GZ1"
14
15  block_device {
16    uuid                  = data.vkcs_images_image.compute.id
17    source_type           = "image"
18    destination_type      = "volume"
19    volume_type           = "ceph-ssd"
20    volume_size           = 8
21    boot_index            = 0
22    delete_on_termination = true
23  }
24
25  block_device {
26    source_type           = "blank"
27    destination_type      = "volume"
28    volume_type           = "ceph-ssd"
29    volume_size           = 8
30    boot_index            = 1
31    delete_on_termination = true
32  }
33
34  network {
35    uuid = vkcs_networking_network.compute.id
36  }
37
38  depends_on = [
39    vkcs_networking_network.compute,
40    vkcs_networking_subnet.compute
41  ]
42}
43
44resource "vkcs_networking_floatingip" "fip" {
45  pool = data.vkcs_networking_network.extnet.name
46}
47
48resource "vkcs_compute_floatingip_associate" "fip" {
49  floating_ip = vkcs_networking_floatingip.fip.address
50  instance_id = vkcs_compute_instance.compute.id
51}
52
53output "instance_fip" {
54  value = vkcs_networking_floatingip.fip.address
55}

Добавьте оба файла network.tf и instance.tf в рабочий каталог и выполните следующие команды:

terraform init
terraform apply