Создание ВМ через 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.tfpublic_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 = 22port_range_max = 22remote_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"}
Чтобы получить список доступных типов дисков, воспользуйтесь командой из раздела Просмотр списка типов дисков.
Чтобы получить список доступных образов Платформы, воспользуйтесь командой из раздела Просмотр списка образов ВМ.
# 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-адресов подсети в нотации CIDRcidr = "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 = 22port_range_max = 22remote_ip_prefix = "0.0.0.0/0"security_group_id = "${vkcs_networking_secgroup.secgroup_test.id}"}# Блок создания дискаresource "vkcs_blockstorage_volume" "volume" {name = "storage"size = 10image_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 = 0destination_type = "volume"delete_on_termination = true}}
После создания ВМ начинается подготовка её к использованию. В данном примере показано удалённое подключение и выполнение cli-команд.
provisioner "remote-exec" {# Реквизиты соединенияconnection {# Данный адрес можно получить на вычислительном узле при создании ВМhost = vkcs_compute_instance.instance1.access_ip_v4# Пользователь, от имени которого запускается SSH-соединениеuser = "ubuntu"# Приватный ключ, который будет использован# В этом примере он лежит в одной директории с main.tfprivate_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}"}
Чтобы выполнить развёртывание инфраструктуры:
-
Выполните загрузку параметров подключения из конфигурационного файла.
source ~/users_projects-openrc.shгде
~/users_projects-openrc.sh— путь к конфигурационному файлу для подключения. -
При необходимости введите пароль от пользователя проекта, для которого был скачан конфигурационный файл.
Пример запроса пароля проектаPlease enter your OpenStack Password for project 54683335ee6e4675b66fdd5419793462 as user test@mcs.mail.ru: -
Перейдите в каталог с собранным tf-файлом.
-
Выполните инициализацию окружения terraform:
terraform init -
Убедитесь в корректности составления конфигурации виртуальной инфраструктуры, выполнив команду:
terraform plan -
Если после выполнения команды не обнаружено ошибок, запустите развёртывание указанной виртуальной инфраструктуры:
terraform apply