- Имя инстанса;
- Образ запуска инстанса;
- Тип флейвора инстанса;
- Указать размер загрузочного диска (необязательный параметр, но рекомендуемый);
- Ключевая пара (Linuх), metadata с ключевой информацией (Windows 10-11);
- Сеть.
Подготовка
- 1. Ознакомитесь со статьей – Terraform быстрый старт.
- 2. Выполните все действия по настройке провайдера, составлению основных конфигурационных файлов.
Добавить описание ресурсов
Пример для инстансов на базе семейства ОС Linux
После блока авторизации provider “openstack” {} необходимо добавить следующее:
resource "openstack_compute_instance_v2"
data "openstack_images_image_v2" "image_name" {
name = "Ubuntu 22.04"
}
resource "openstack_compute_instance_v2" "instance" {
name = "instance"
image_id = data.openstack_images_image_v2.image_name.id
flavor_name = "4vcpu.8ram"
key_pair = "my_key_pair_name"
block_device {
uuid = data.openstack_images_image_v2.image_name.id
source_type = "image"
volume_size = 50
boot_index = 0
destination_type = "volume"
delete_on_termination = true
}
network {
port = openstack_networking_port_v2.port.id
}
}
В примере описан ресурс openstack_compute_instance_v2, который создает инстанс с именем “instance” из образа Ubuntu 22.04 используя flavor – 4vcpu.8ram.
key_pair является не обязательным параметром, однако его необходимо указать для доступа к инстансу. Ключевая пара должна уже существовать, так как обращение происходит к созданной сущности по имени – my_key_pair_name.
Как создать ключевую пару при помощи IaC метода (для инстансов на базе семейства ОС Linux), смотрите статью – “Создание ключевой пары”.
Для удобства обращения к образу используется дополнительный ресурс – data "openstack_images_image_v2" позволяющий считать id образа по имени.
Для расширения базового диска используется – block_device.
Требуется указать volume_size – объем диска в Гб и uuid id образа, который получает следующая конструкция – data.openstack_images_image_v2.image_name.id.
Пример для инстансов на базе ОС Windows 10-11
После блока авторизации provider "openstack" {} необходимо добавить следующее:
openstack_compute_instance_v2
data "openstack_images_image_v2" "image_name_win" {
name = "MS Windows 11"
}
resource "openstack_compute_instance_v2" "instance_win" {
name = "instance_win"
image_id = data.openstack_images_image_v2.image_name_win.id
flavor_name = "4vcpu.8ram"
block_device {
uuid = data.openstack_images_image_v2.image_name_win.id
source_type = "image"
volume_size = 100
boot_index = 0
destination_type = "volume"
delete_on_termination = true
}
metadata = {
admin_pass = "Qwe123#"
}
network {
port = openstack_networking_port_v2.port2.id
}
}
В данном случае в описании metadata необходимо указать пароль администратора Windows для первого входа в ВМ.
При первом входе потребуется указать учётные данные admin и пароль, содержащийся в metadata.
После чего система предложит сменить пароль.
Создание инстанса (ВМ) и добавление в группу хостов
- 1. Создайте группу хостов с политикой размещения.
- 2. В ресурсе
openstack_compute_instance_v2добавить блокscheduler_hints. - 3. Значение
group, в которой указываются ID группы серверов. В неё будет помещён указанный инстанс. - 4. Указывается только 1 группа.
- 5. Исходя из свойств группы серверов, будет применяться разные политики размещения ВМ.
Пример:
resource "openstack_compute_servergroup_v2" "servergroup" {
name = "servergroup"
policies = ["affinity"]
}
data "openstack_images_image_v2" "image_name_win" {
name = "MS Windows 11"
}
resource "openstack_compute_instance_v2" "instance_win" {
name = "instance_win"
image_id = data.openstack_images_image_v2.image_name_win.id
flavor_name = "4vcpu.8ram"
block_device {
uuid = data.openstack_images_image_v2.image_name_win.id
source_type = "image"
volume_size = 100
boot_index = 0
destination_type = "volume"
delete_on_termination = true
}
metadata = {
admin_pass = "Qwe123#"
}
scheduler_hints {
group = openstack_compute_servergroup_v2.servergroup.id
}
network {
port = openstack_networking_port_v2.port2.id
}
}
resource "openstack_compute_instance_v2" "instance_win2" {
name = "instance_win2"
image_id = data.openstack_images_image_v2.image_name_win.id
flavor_name = "4vcpu.8ram"
block_device {
uuid = data.openstack_images_image_v2.image_name_win.id
source_type = "image"
volume_size = 100
boot_index = 0
destination_type = "volume"
delete_on_termination = true
}
metadata = {
admin_pass = "Qwe123#"
}
scheduler_hints {
group = openstack_compute_servergroup_v2.servergroup.id
}
network {
port = openstack_networking_port_v2.port3.id
}
}
В примере cоздается группа серверов с именем servergroup и политикой affinity.
В scheduler_hints указывается, что ВМ instance_win и instance_win2 помещаются в созданную ранее группу серверов – servergroup.
К группе серверов применено правило размещения – affinity. Это означает, что оба Инстанса расположены на одном гипервизоре.
affinity – все экземпляры/серверы, запущенные в этой группе, будут размещены на одном вычислительном узле;
anti-affinity – все экземпляры/серверы, запущенные в этой группе, будут размещаться на разных вычислительных узлах;
soft-affinity – все экземпляры/серверы, запущенные в этой группе, будут, если возможно, размещены на одном вычислительном узле, но если это невозможно, они все равно будут перемещены вместо сбоя;
soft-anti-affinity – все экземпляры/серверы, запущенные в этой группе, будут по возможности размещаться на разных вычислительных узлах, но если это невозможно, они все равно будут перемещены вместо сбоя.
Запуск развертывания
После добавления нового ресурса, стоит проверить корректность выполнения команды – terraform plan:
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the
following symbols:
+ create
# openstack_compute_instance_v2.instance will be created
+ resource "openstack_compute_instance_v2" "instance" {
+ access_ip_v4 = (known after apply)
+ access_ip_v6 = (known after apply)
+ all_metadata = (known after apply)
+ all_tags = (known after apply)
+ availability_zone = (known after apply)
+ created = (known after apply)
+ flavor_id = (known after apply)
+ flavor_name = "4vcpu.8ram"
+ force_delete = false
+ id = (known after apply)
+ image_id = "54fc01dc-****-414f-****-9dde6c1a1a33"
+ image_name = (known after apply)
+ key_pair = "my_key_pair_name"
+ name = "instance"
+ power_state = "active"
+ region = (known after apply)
+ security_groups = (known after apply)
+ stop_before_destroy = false
+ updated = (known after apply)
+ block_device {
+ boot_index = 0
+ delete_on_termination = true
+ destination_type = "volume"
+ multiattach = false
+ source_type = "image"
+ uuid = "54fc01dc-****-414f-****-9dde6c1a1a33"
+ volume_size = 50
}
+ network {
+ access_network = false
+ fixed_ip_v4 = (known after apply)
+ fixed_ip_v6 = (known after apply)
+ floating_ip = (known after apply)
+ mac = (known after apply)
+ name = (known after apply)
+ port = (known after apply)
+ uuid = (known after apply)
}
+ scheduler_hints {
+ different_cell = []
+ different_host = (known after apply)
+ query = []
+ same_host = []
}
}
Plan: 1 to add, 0 to change, 0 to destroy.
Удостоверившись, что ресурсы планируются создаться или удалиться, в зависимости от файла состояний, можно перейти к развертыванию:
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 plan осторожно, во избежание непредвиденных последствий!