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