Сценарий terraform для развертывания виртуальной машины в VK Cloud

Обновлено Обновлено: Опубликовано Опубликовано:

В рамках данной инструкции мы рассмотрим сценарий terraform, который нам позволит создать в облаке VK виртуальную машину. Также я попробую более подробно описать данный сценарий.

Подготовка

Прежде чем приступить к созданию и запуску сценария, нам нужно установить и инициализировать terraform.

Для начала нам нужно установить пакет unzip. В зависимости от типа Linux, это выполняется разными командами.

а) Для Deb (Ubuntu / Debian / Astra Linux):

apt install unzip

б) Для RPM (Rocky / CentOS / РЕД ОС):

yum install unzip

Зеркала для загрузки Terraform с официального сайта могут быть заблокированы. Но у VK Cloud есть свои копии. Переходим на страницу загрузки Terraform от Mail Ru Group. Смотрим на версию пакета, который мы хотим установить. Например, на момент обновления данной инструкции, это была версия 1.5.2 — создаем переменную:

TR_VER=1.5.2

Скачиваем архив:

wget https://hashicorp-releases.mcs.mail.ru/terraform/${TR_VER}/terraform_${TR_VER}_linux_amd64.zip

Распаковываем его в каталог /usr/local/bin:

unzip terraform_${TR_VER}_linux_amd64.zip -d /usr/local/bin/

Создадим каталог, в котором будет находиться сценарий terraform:

mkdir -p /opt/terraform/vkcloud

Перейдем в него:

cd /opt/terraform/vkcloud

Создадим файл в каталоге пользователя, под которым мы работаем и будем запускать сценарий:

vi ~/.terraformrc

  1. provider_installation {
  2.     network_mirror {
  3.         url = "https://terraform-mirror.mcs.mail.ru"
  4.         include = ["registry.terraform.io/*/*"]
  5.     }
  6.     direct {
  7.         exclude = ["registry.terraform.io/*/*"]
  8.     }
  9. }

* данное содержимое вставляем без изменений. По умолчанию, установка провайдера выполняется из репозитория hashicorp, однако, он может быть заблокирован на территории России, поэтому мы переопределяем путь по которому выполняются запросы.

Теперь создадим main-файл для инициализации настроек:

vi main.tf

  1. terraform {
  2.     required_providers {
  3.         vkcs = {
  4.             source = "vk-cs/vkcs"
  5.         }
  6.     }
  7. }
  8.  
  9. provider "vkcs" {
  10.     username = "foo.bar@mail.ru"
  11.     password = "vk cloud password"
  12.     project_id = "project id"
  13.     region = "RegionOne"
  14. }

Где:

2 - 6 Описание для провайдера. В нашем примере указан только source — исходный адрес провайдера (является его глобальным идентификатором). Он также указывает основное место, откуда Terraform может его загрузить.
9 - 14 Индивидуальные настройки для подключения к провайдеру.
10 Указываем учетную запись, под которой мы логинимся на сервис VK Cloud
11 Пароль для учетной записи сервиса VK Cloud
12 Идентификатор проекта (смотрим в личном кабинете VK Cloud)
13 Регион (по умолчанию, RegionOne. Уточняем в личном кабинете)

Теперь можно выполнить инициализацию — установку провайдера и выполнение подключения к хостинг-провайдеру.

terraform init

Мы должны увидеть:

...
Terraform has been successfully initialized!
...

Мы готовы, чтобы создать сценарий для развертывания виртуальной машины в VK Cloud.

Сценарий

Для написания сценария нам понадобится дополнительная информация, которую удобнее всего получить с помощью запросов openstack cli. Инструкцию по установке и использованию последнего читайте на странице Работа с OpenStack CLI в Linux.

И так, создаем файл:

vi variables.tf

  1. variable "image_flavor" {
  2.   type = string
  3.   default = "Ubuntu-22.04-202208"
  4. }
  5.  
  6. variable "compute_flavor" {
  7.   type = string
  8.   default = "Basic-1-2-20"
  9. }
  10.  
  11. variable "key_pair_name" {
  12.   type = string
  13.   default = "ssh-dmosk"
  14. }
  15.  
  16. variable "availability_zone_name" {
  17.   type = string
  18.   default = "MS1"
  19. }

* данный файл описывает переменные, которые мы будем использовать в сценарии.

1 - 4 Задаем название образа, который будет использоваться для диска.
3 В нашем примере виртуальная машина должна будет создаваться из образа с Ubuntu 22.04
6 - 9 Шаблон виртуальной машины.
8 Базовый шаблон: 1 ядро, 2 Гб оперативной памяти, 20 Гб дискового пространства.
11 - 14 Пара ключей для подключения по SSH.
13 Название для ключа SSH, который должен быть загружен в облако.
16 - 19 Имя зоны доступности

Подробную информацию о том, какие значения можно подставить в данные переменные можно узнать в личном кабинете VK Cloud или с помощью openstack cli:

openstack image list

openstack flavor list

openstack keypair list

openstack availability zone list

Создадим файл с описанием сети:

vi network.tf

  1. data "vkcs_networking_network" "extnet" {
  2.    name = "ext-net"
  3. }
  4.  
  5. resource "vkcs_networking_network" "network" {
  6.    name = "net"
  7. }
  8.  
  9. resource "vkcs_networking_subnet" "subnetwork" {
  10.    name       = "subnet_1"
  11.    network_id = vkcs_networking_network.network.id
  12.    cidr       = "192.168.122.0/24"
  13. }
  14.  
  15. resource "vkcs_networking_router" "router" {
  16.    name                = "router"
  17.    admin_state_up      = true
  18.    external_network_id = data.vkcs_networking_network.extnet.id
  19. }
  20.  
  21. resource "vkcs_networking_router_interface" "db" {
  22.    router_id = vkcs_networking_router.router.id
  23.    subnet_id = vkcs_networking_subnet.subnetwork.id
  24. }
  25.  
  26. resource "vkcs_networking_secgroup" "secgroup" {
  27.    name = "security_group"
  28.    description = "terraform security group"
  29. }
  30.  
  31. resource "vkcs_networking_secgroup_rule" "ssh_rule" {
  32.    direction = "ingress"
  33.    ethertype = "IPv4"
  34.    port_range_max = 22
  35.    port_range_min = 22
  36.    protocol = "tcp"
  37.    remote_ip_prefix = "0.0.0.0/0"
  38.    security_group_id = vkcs_networking_secgroup.secgroup.id
  39.    description = "Open SSH (22) Port"
  40. }
  41.  
  42. resource "vkcs_networking_port" "port" {
  43.    name = "port_1"
  44.    admin_state_up = "true"
  45.    network_id = vkcs_networking_network.network.id
  46.  
  47.    fixed_ip {
  48.    subnet_id =  vkcs_networking_subnet.subnetwork.id
  49.    ip_address = "192.168.122.20"
  50.    }
  51. }
  52.  
  53. resource "vkcs_networking_port_secgroup_associate" "port" {
  54.    port_id = vkcs_networking_port.port.id
  55.    enforce = "false"
  56.    security_group_ids = [
  57.    vkcs_networking_secgroup.secgroup.id,
  58.    ]
  59. }

Описание действий:

1 - 3 Запрашиваем данные по внешней сети ext-net. Результаты доступны в переменной extnet.
5 - 7 Создаем ресурс для внутренней сети. Имя последней будет net, а данные с информацией в переменной network.
9 - 13 Создаем подсеть.
10 Название подсети subnet_1.
11 Будет являться частью сети net, которую мы создали выше (5-7).
12 Адрес подсети 192.168.122.0/24.
15 - 19 Создаем виртуальный маршрутизатор. Привязываем его к внешней сети через сеть ext-net.
21 - 24 Привязываем подсеть subnet_1 к маршрутизатору router.
26 - 29 Создаем группу безопасности security_group.
31 - 40 Создаем правило доступа на брандмауэре.
34, 35 Задаем порт доступа. В нашем примере 22 (SSH).
37 Ограничиваем адреса, с которых можно подключиться. В нашем примере, без ограничений.
38 Привязываем правило к созданной ранее группе безопасности security_group.
42 - 51 Создаем сетевой порт.
43 Имя для порта будет port_1.
45 Порт будет ассоциирован с внутренней сетью net.
48 Используем подсеть subnet_1.
49 Выделяем фиксированный адрес 192.168.122.20.
53 - 59 Связываем группу безопасности security_group с портом port_1.

И, наконец, создаем файл с описанием виртуальной машины:

vi instance.tf

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

Описание сценария:

1 - 3 Получаем значение ранее созданной переменной compute_flavor, которая содержит название шаблона для виртуальной машины.
5 - 7 Читаем переменную image_flavor и образом диска, который нужно использовать при создании сервера.
9 - 34 Создаем виртуальную машину.
10 Задаем имя компьютеру compute-name.
11 В качестве шаблона конфигурации виртуальной машины используем Basic-1-2-20. Его мы определили на уровне создания переменных.
12 Ранее была определена ключевая пара для подключения по SSH.
13 Указываем, какие будем использовать группы безопасности для создаваемой машины.
16 - 24 Создаем диск для виртуальной машины.
17 В качестве образа используем Ubuntu 22.04.
21 Размер диска 8 Гб.
26 - 28 Указываем, что на сервере будет использоваться локальная сеть net.
30 - 33 Инстанс не будет создан, пока не будут созданы такие ресурсы, как сеть и подсеть.
36 - 38 Создаем динамический внешний IP-адрес.
40 - 43 Делаем привязку созданного сервера с динамическим адресом.
45 - 47 Выводим внешних адрес.

Теперь можно запускать наш сценарий:

terraform apply

Утилита проведет анализ и выведет список изменений, которые будут проделаны на хостинге. Подтверждаем эти действия:

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

Ждем выполнения операций. Готово.

Заходим на хостинг и проверяем, что изменения выполнены в соответствии с заданными алгоритмами сценария.

Если инфраструктура нам не нужна, удаляем все выполненные настройки командой:

terraform destroy

Также необходимо подтверждение:

Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: yes

# DevOps # Управление
Дмитрий Моск — частный мастер
Был ли вам полезен этот скрипт?

Да            Нет