База знаний LinxCloud Services

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

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

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

На момент написания этой документации актуальная версия Terraform — 0.12.24.!

C помощью Terraform невозможно создать виртуальную машину с указанием типа диска, правильно создать диск, а после создавать ВМ.

 

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

В директории с конфигурационными файлами terraform создается файл main.tf и добавляются данные для описания конфигурацию виртуальной инфраструктуры:

Описание ключевой пары

Данный сегмент кода отвечает за ssh ключ:

1resource "openstack_compute_keypair_v2" "ssh" {
2  # Название ssh ключа,
3  # Данный ключ будет отображаться в разделе
4  # Облачные вычисления -> Ключевые пары
5  name = "terraform_ssh_key"
6
7  # Путь до публичного ключа
8  # В примере он находится в одной директории с main.tf
9  public_key = file("${path.module}/terraform.pem.pub")
10}

 

Описание группы безопасности

Далее следует создать security group, которая будет назначена создаваемой ВМ, и разрешить прием трафика по портам 22 и 80, а также разрешить icmp трафик с любого источника.

1resource "openstack_compute_secgroup_v2" "rules" {
2  name = "terraform__security_group"
3  description = "security group for terraform instance"
4  rule {
5    from_port = 22
6    to_port = 22
7    ip_protocol = "tcp"
8    cidr = "0.0.0.0/0"
9  }
10  rule {
11    from_port = 80
12    to_port = 80
13    ip_protocol = "tcp"
14    cidr = "0.0.0.0/0"
15  }
16  rule {
17    from_port = -1
18    to_port = -1
19    ip_protocol = "icmp"
20    cidr = "0.0.0.0/0"
21  }
22}

 

Описание блочного устройства

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

1resource "openstack_blockstorage_volume_v2" "volume" {
2  # Название диска
3  name = "storage"
4
5  # Тип создаваемого диска
6  volume_type = "dp1"
7
8  # Размер диска
9  size = "10"
10
11  # uuid индикатор образа, в примере используется Ubuntu-18.04-201910
12  image_id = "cd733849-4922-4104-a280-9ea2c3145417"
13}

 

Доступные типы дисков можно посмотреть с помощью команды OpenStack CLI:

openstack volume type list

 

На момент написания статьи доступны:

volume_type Описание
ko1-high-iops, dp1-high-iops Диски типа high-IOPS-SSD в зонах MS1 и DP1 соответственно.
ko1-ssd, dp1-ssd Диски типа SSD в зонах MS1 и DP1 соответственно.
ssd Геораспределенный SSD.
ms1, dp1 Диски типа hdd в зонах MS1 и DP1 соответственно.
ceph Геораспределенный HDD.

Доступные образы и их UUID можно посмотреть командой OpenStack CLI:

openstack image list

 

Описание флейвора

1# Какую конфигурацию следует использовать для инстанса (объем vCPU и RAM).
2  flavor_name = "Basic-1-2-10"

 

Получить список доступных конфигураций можно через CLI, командой:

openstack flavor list

 

Итоговый вид конфигурации

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

1resource "openstack_compute_instance_v2" "instance" {
2  # Название создаваемой ВМ
3  name = "terraform"
4
5  # Имя и uuid образа с ОС
6  image_name = "Ubuntu-18.04-201910"
7  image_id = "cd733849-4922-4104-a280-9ea2c3145417"
8
9  # Конфигурация инстанса
10  flavor_name = "Basic-1-1-10"
11
12  # Публичный ключ для доступа
13  key_pair = openstack_compute_keypair_v2.ssh.name
14
15  # Указываем, что при создании использовать config drive
16  # Без этой опции ВМ не будет создана корректно в сетях без DHCP
17  config_drive = true
18
19  # Присваивается security group для ВМ
20  security_groups = [
21   openstack_compute_secgroup_v2.rules.name
22  ]
23
24  # В данном примере используется сеть ext-net
25  network {
26    name = "ext-net"
27  }
28
29  # Блочное устройство
30  block_device {
31    uuid = openstack_blockstorage_volume_v2.volume.id
32    boot_index = 0
33    source_type = "volume"
34    destination_type = "volume"
35    delete_on_termination = true
36  }
37}

 

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

После создания виртуальной машины запускается процесс подготовки ее к использованию. Пример удаленного подключения и выполнения cli команд:

1provisioner "remote-exec" {
2    # Сначала описывается соединение
3    connection {
4      # Данный адрес можно получить из compute node при создании ВМ
5      # Сам адрес можно получить из ext-net
6      host = openstack_compute_instance_v2.instance.access_ip_v4
7
8      # Пользователь, от имени которого запускается SSH соединение
9      user = "ubuntu"
10
11      # Приватный ключ, который будет использован
12      # В этом примере он лежит в одной директории с main.tf
13      private_key = file("${path.module}/terraform.pem")
14    }
15
16    # cli команды, которые необходимо использовать
17    # Не стоит забывать, что это array type и необходимо вводить full text
18    inline = [
19      "sudo apt-get update",
20      "sudo apt-get -y install nginx",
21    ]

 

Также можно выводить артефакты, например, IP адрес сети ext-net, который получила ВМ. Для этого нужно добавить следующее:

1output "instances" {
2  value = "${openstack_compute_instance_v2.instance.access_ip_v4}"
3}

 

 

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

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

terraform plan

 

Произойдет тестовое подключение,  проверка на доступность ресурсов,  проверка синтаксиса .tf, и выведен список изменений (add, change, destroy).

Команда для развертывания конфигураци ( только если тестовое подключение успешно завершено):

terraform apply
Что вас интересует?
Получить демо-доступ

Спасибо за ваш запрос, мы свяжемся с вами в ближайшее время!