Новости
Семь Чёрных пятниц на неделе — и все в Serverspace!
Serverspace Black Friday
DC
26 августа 2022
Обновлено 14 сентября 2022

Как автоматизировать развертывание VM с помощью Terraform

Terraform VPS

Terraform

Terraform-провайдер Serverspace позволяет управлять облачными ресурсами, используя подход Infrastructure as Code. Управление осуществляется с помощью специальных конфигурационных файлов, в которых вы описываете желаемое состояние вашей инфраструктуры.

Установка Terraform

Для начала установите Terraform на вашу операционную систему. Рекомендуем воспользоваться инструкцией разработчика Terraform.

Конфигурация провайдера

    1. Для работы с Terraform создайте API-ключ для проекта.
    2. Создайте и перейдите в каталог, в котором вы будете работать с Terraform-провайдером.
    3. Создайте и откройте конфигурационный файл provider.tf.
    4. Вставьте в файл информацию о провайдере, где <api-ключ> это ваш API ключ, и сохраните изменения:

terraform {
required_providers {
serverspace = {
source = "itglobalcom/serverspace"
version = "0.2.0"
}
}
}

variable "s2_token" {
type = string
default = "<api-ключ>"
}

provider "serverspace" {
key = var.s2_token
}

  1. Откройте командную строку и перейдите в каталог, в котором вы создали файл. Выполните инициализацию для проверки корректности:
    terraform init

    В случае успеха вы увидите следующее сообщение:

    Initializing the backend...Initializing provider plugins...
    - Finding itglobalcom/serverspace versions matching "0.2.0"...
    - Installing itglobalcom/serverspace v0.2.0...
    - Installed itglobalcom/serverspace v0.2.0 (self-signed, key ID 062XXXXXXXXXXXX)

    Partner and community providers are signed by their developers.
    If you'd like to know more about provider signing, you can read about it here: https://www.terraform.io/docs/cli/plugins/signing.html

    Terraform has created a lock file .terraform.lock.hcl to record the provider selections it made above. Include this file in your version control repository so that Terraform can guarantee to make the same selections by default when you run "terraform init" in the future.

    Terraform has been successfully initialized!

    You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure. All Terraform commands should now work.

    If you ever set or change modules or backend configuration for Terraform, rerun this command to reinitialize your working directory. If you forget, other commands will detect it and remind you to do so if necessary.

Описание вашей инфраструктуры

С помощью Terraform-провайдера Serverspace вы можете создавать инфраструктуру разной конфигурации. Подробную документацию вы можете найти в Terraform Registry.

Рассмотрим пример создания простой инфраструктуры из двух серверов, объединенных в изолированную сеть:

  • Сервер в Амстердаме под названием “server-1” с операционной системой Ubuntu 20.04, конфигурация сервера 2 ГБ RAM, 2 CPU, загрузочный диск 40 ГБ SSD, дополнительный диск 20 ГБ SSD, 50 Мбит/с. Подключение к серверу будет осуществляться через SSH-ключ. На сервер будет установлено хранилище данных Redis.
  • Сервер в Амстердаме под названием “server-2” с операционной системой Ubuntu 20.04, конфигурация сервера 8 ГБ RAM, 4 CPU, загрузочный диск 40 ГБ SSD, 70 Мбит/с.
  • Изолированная сеть в Амстердаме с адресацией 192.168.0.0/24

Для создания инфраструктуры выполните следующие шаги.

    1. Создайте и откройте файл ssh_key.tf, в котором будет находиться публичная часть ssh-ключа для создания сервера.
    2. Вставьте в файл информацию о публичной части ssh-ключа и сохраните изменения, замените содержимое переменной public_key своим значением:

      resource "serverspace_ssh" "terraform" {
      name = "terraform-key"
      public_key = "ssh-rsa AAAAB3Nza...JUDjlM= root@CentOS.local"
      }variable "pvt_key"
      type = string
      default = "<путь до приватного ключа>"
      }
    3. Создайте и откройте файл main.tf, в котором будет находиться описание инфраструктуры.
    4. Вставьте в файл описание вашей инфраструктуры.

    5. resource "serverspace_server" "server1" {
      image = "Ubuntu-20.04-X64"
      name = "server-1"
      location = "am2"
      cpu = 2
      ram = 2048boot_volume_size = 40*1024

      volume {
      name = "bar"
      size = 20*1024
      }

      nic {
      network = ""
      network_type = "PublicShared"
      bandwidth = 50
      }
      nic {
      network = resource.serverspace_isolated_network.my_net.id
      network_type = "Isolated"
      bandwidth = 0
      }

      ssh_keys = [
      resource.serverspace_ssh.terraform.id,
      ]

      connection {
      host = self.public_ip_addresses[0]
      user = "root"
      type = "ssh"
      private_key = file(var.pvt_key)
      timeout = "2m"
      }

      provisioner "remote-exec" {
      inline = [
      "export PATH=$PATH:/usr/bin",
      "sudo apt-get update",
      "sudo apt-get install -y redis-server",
      "exit 0"
      ]
      }
      }

      resource "serverspace_server" "server2" {
      image = "Ubuntu-20.04-X64"
      name = "server-2"
      location = "am2"
      cpu = 4
      ram = 8192

      boot_volume_size = 40*1024

      nic {
      network = ""
      network_type = "PublicShared"
      bandwidth = 70
      }
      nic {
      network = resource.serverspace_isolated_network.my_net.id
      network_type = "Isolated"
      bandwidth = 0
      }
      }

      resource "serverspace_isolated_network" "my_net" {
      location = "am2"
      name = "my_net"
      description = "Example for Terraform"
      network_prefix = "192.168.0.0"
      mask = 24
      }

    6. Для создания инфраструктуры, описанной выше выполните команду:
      terraform apply

      В результате появится диалоговое окно:

      Terraform used the selected providers to generate the following execution plan.
      Resource actions are indicated with the following symbols:
      + create

      Terraform will perform the following actions:\

      # serverspace_isolated_network.my_net will be created
      + resource "serverspace_isolated_network" "my_net" {
      + description    = "Example for Terraform"
      + id             = (known after apply)
      + location       = "am2"
      + mask           = 24
      + name           = "my_net"
      + network_prefix = "192.168.0.0"
      }

      # serverspace_server.server1 will be created
      + resource "serverspace_server" "server1" {
      + boot_volume_id      = (known after apply)
      + boot_volume_size    = 40960
      + cpu                 = 2
      + id                  = (known after apply)
      + image               = "Ubuntu-20.04-X64"
      + location            = "am2"
      + name                = "server-1"
      + public_ip_addresses = (known after apply)
      + ram                 = 2048
      + ssh_keys            = (known after apply)

      + nic {
      + bandwidth    = 0
      + id           = (known after apply)
      + ip_address   = (known after apply)
      + network      = (known after apply)
      + network_type = "Isolated"
      }
      + nic {
      + bandwidth    = 50
      + id           = (known after apply)
      + ip_address   = (known after apply)
      + network_type = "PublicShared"
      }

      + volume {
      + id   = (known after apply)
      + name = "bar"
      + size = 20480
      }
      }

      # serverspace_server.server2 will be created
      + resource "serverspace_server" "server2" {
      + boot_volume_id      = (known after apply)
      + boot_volume_size    = 40960
      + cpu                 = 4
      + id                  = (known after apply)
      + image               = "Ubuntu-20.04-X64"
      + location            = "am2"
      + name                = "server-2"
      + public_ip_addresses = (known after apply)
      + ram                 = 8192
      + ssh_keys            = (known after apply)

      + nic {
      + bandwidth    = 0
      + id           = (known after apply)
      + ip_address   = (known after apply)
      + network      = (known after apply)
      + network_type = "Isolated"
      }
      + nic {
      + bandwidth    = 70
      + id           = (known after apply)
      + ip_address   = (known after apply)
      + network_type = "PublicShared"
      }
      }

      # serverspace_ssh.terraform will be created
      + resource "serverspace_ssh" "terraform" {
      + id         = (known after apply)
      + name       = "terraform-key"
      + public_key = "ssh-rsa AAAAB3Nza...JUDjlM= root@CentOS.local"
      }

      Plan: 4 to add, 0 to change, 0 to destroy.

      Do you want to perform these actions?
      Terraform will perform the actions described above.
      Only 'yes' will be accepted to approve.

    7. Для создания инфраструктуры введите yes.

      Enter a value: yesserverspace_ssh.terraform: Creating...
      serverspace_isolated_network.my_net: Creating...
      serverspace_ssh.terraform: Creation complete after 1s [id=3181]
      serverspace_isolated_network.my_net: Creation complete after 8s [id=l2n403]
      serverspace_server.server2: Creating...
      serverspace_server.server1: Creating...
      serverspace_server.server1: Still creating... [10s elapsed]
      serverspace_server.server2: Still creating... [10s elapsed]
      ...
      serverspace_server.server1 (remote-exec): (Reading database ...
      serverspace_server.server1 (remote-exec): (Reading database ... 5%
      serverspace_server.server1 (remote-exec): (Reading database ... 10%
      ...
      serverspace_server.server1: Creation complete after 1m3s [id=l2s190038]

      Apply complete! Resources: 4 added, 0 changed, 0 destroyed.

    8. Для просмотра текущей инфраструктуры выполните команду:
terraform show

В результате будет отображена текущая конфигурация инфраструктуры:


# serverspace_isolated_network.my_net:
resource "serverspace_isolated_network" "my_net" {
description    = "Example for Terraform"
id             = "l2n403"
location       = "am2"
mask           = 24
name           = "my_net"
network_prefix = "192.168.0.0"
}

# serverspace_server.server1:
resource "serverspace_server" "server1" {
boot_volume_id      = 58909
boot_volume_size    = 40960
cpu                 = 2
id                  = "l2s190038"
image               = "Ubuntu-20.04-X64"
location            = "am2"
name                = "server-1"
public_ip_addresses = [
"45.138.24.19",
]
ram                 = 2048
ssh_keys            = [
3181,
]

nic {
bandwidth    = 0
id           = 59576
ip_address   = "192.168.0.1"
network      = "l2n403"
network_type = "Isolated"
}
nic {
bandwidth    = 50
id           = 59575
ip_address   = "45.138.24.19"
network_type = "PublicShared"
}

volume {
id   = 58910
name = "bar"
size = 20480
}
}

# serverspace_server.server2:
resource "serverspace_server" "server2" {
boot_volume_id      = 58911
boot_volume_size    = 40960
cpu                 = 4
id                  = "l2s190039"
image               = "Ubuntu-20.04-X64"
location            = "am2"
name                = "server-2"
public_ip_addresses = [
"31.44.3.68",
]
ram                 = 8192
ssh_keys            = []

nic {
bandwidth    = 0
id           = 59578
ip_address   = "192.168.0.2"
network      = "l2n403"
network_type = "Isolated"
}
nic {
bandwidth    = 70
id           = 59577
ip_address   = "31.44.3.68"
network_type = "PublicShared"
}
}

# serverspace_ssh.terraform:
resource "serverspace_ssh" "terraform" {
id         = "3181"
name       = "terraform-key"
public_key = "ssh-rsa AAAAB3Nza...JUDjlM= root@CentOS.local"
}

Оценка:
5 из 5
Аverage rating : 5
Оценок: 2
050000 г. Алматы пр. Сейфуллина, д. 502
+7 (777) 555-36-66
ООО «ИТГЛОБАЛКОМ ЛАБС»