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

Данная статья расскажет, как создать в MCS виртуальную машину через Terraform.

Предполагаем, что вы уже установили и подготовили Terraform по этой инструкции.

Важно

На момент написания статьи актуальная версия Terraform - 0.12.24.

C помощью Terraform нельзя создать виртуальную машину с указанием типа диска. Это обусловлено версионированием API OpenStack. Единственная опция — создавать диск заранее и после этого создавать виртуальную машину.

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

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

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

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

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

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

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

resource "openstack_compute_secgroup_v2" "rules" {
  name = "terraform__security_group"
  description = "security group for terraform instance"
  rule {
    from_port = 22
    to_port = 22
    ip_protocol = "tcp"
    cidr = "0.0.0.0/0"
  }
  rule {
    from_port = 80
    to_port = 80
    ip_protocol = "tcp"
    cidr = "0.0.0.0/0"
  }
  rule {
    from_port = -1
    to_port = -1
    ip_protocol = "icmp"
    cidr = "0.0.0.0/0"
  }
}

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

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

resource "openstack_blockstorage_volume_v2" "volume" {
  # Название диска.
  name = "storage"
  
  # Тип создаваемого диска.
  volume_type = "dp1"
  
  # Размер.
  size = "10"

  # uuid индикатор образа, в примере используется Ubuntu-18.04-201910
  image_id = "cd733849-4922-4104-a280-9ea2c3145417"
}

Доступные типы дисков можно посмотреть с помощью команды 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

Описание флейвора (размера инстанса)

  # Какой размер используем для инстанса (соотношение vCPU - RAM).
  flavor_name = "Basic-1-1-10"

Получить список доступных конфигураций можно через CLI, командой `openstack flavor list`.
При выборе ориентируйтесь на первые две цифры, они задают кол-во vCPU и RAM.

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

Собираем все воедино:

resource "openstack_compute_instance_v2" "instance" {
  # Название создаваемой ВМ.
  name = "terraform"

  # Имя и uuid образа с ОС.
  image_name = "Ubuntu-18.04-201910"
  image_id = "cd733849-4922-4104-a280-9ea2c3145417"
  
  # Размер инстанса.
  flavor_name = "Basic-1-1-10"

  # Публичный ключ, который мы описывали выше.
  key_pair = openstack_compute_keypair_v2.ssh.name

  # Указываем, что при создании использовать config drive.
  # Без этой опции ВМ не будет создана корректно в сетях без DHCP
  config_drive = true

  # Присваиваем security group для нашей vm.
  security_groups = [
   openstack_compute_secgroup_v2.rules.name
  ]

  # В данном примере мы используем сеть ext-net.
  network {
    name = "ext-net"
  }

  # Блочное устройство
  block_device {
    uuid = openstack_blockstorage_volume_v2.volume.id
    boot_index = 0
    source_type = "volume"
    destination_type = "volume"
    delete_on_termination = true
  }
}

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

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

  provisioner "remote-exec" {
    # Сначала описываем соединение
    connection {
      # Данный адрес мы получаем из compute node при создании вм.
      # Сам же адрес получаем из ext-net.
      host = openstack_compute_instance_v2.instance.access_ip_v4

      # Пользователь, из под которого нужно запустить ssh соединение.
      user = "ubuntu"

      # Приватный ключ, который будет использован.
      # В нашем примере он лежит рядом с main.tf
      private_key = file("${path.module}/terraform.pem")
    }

    # cli команды, которые необходимо использовать.
    # Не забывайте, что это array type и необходимо вводить full text
    inline = [
      "sudo apt-get update",
      "sudo apt-get -y install nginx",
    ]

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

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

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

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

$ terraform plan

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

В случае, если тестовое подключение успешно завершено, выполните для развертывания конфигурации:

$ terraform apply