#16 DevOps. Как создать виртуальные машины в Yandex Cloud с помощью Terraform

В документации Yandex Cloud есть 2 полезные статьи на тему начала работы с интерфейсом командной строки и Terraform. Приведу обе, так как у вас может быть как Windows или Linux, так и MacOS

https://yandex.cloud/ru/docs/cli/quickstart

https://yandex.cloud/ru/docs/tutorials/infrastructure-management/terraform-quickstart

После установки Yandex Cloud CLI и Terraform давайте представим, что у нас есть задача создать виртуальные машины для установки Kubernetes кластера — 1 master и 4 worker ноды.

Создадим 2 файла

nano main.tf

terraform {
  required_providers {
    yandex = {
      source = "yandex-cloud/yandex"
    }
  }
  required_version = ">= 0.13"
}

provider "yandex" {
  token     = var.yandex_token
  folder_id = var.yandex_folder_id
  cloud_id  = "xxx"
  zone      = "ru-central1-a"
}

data "yandex_compute_image" "ubuntu" {
  family = "ubuntu-2004-lts"
}

resource "yandex_compute_instance" "master" {
  name = "master"
  zone = "ru-central1-a"
  boot_disk {
    initialize_params {
      image_id = data.yandex_compute_image.ubuntu.id
    }
  }
  network_interface {
    subnet_id = var.subnet_id
    nat       = true
    ipv6      = false
  }
  metadata = {
    ssh-keys = "ubuntu:${file("~/.ssh/id_rsa.pub")}"
  }
  resources {
    cores  = 2
    memory = 4
  }
}

resource "yandex_compute_instance" "worker" {
  count = 4
  name  = "worker-${count.index}"
  zone  = "ru-central1-a"
  boot_disk {
    initialize_params {
      image_id = data.yandex_compute_image.ubuntu.id
    }
  }
  network_interface {
    subnet_id = var.subnet_id
    nat       = true
    ipv6      = false
  }
  metadata = {
    ssh-keys = "ubuntu:${file("~/.ssh/id_rsa.pub")}"
  }
  resources {
    cores  = 2
    memory = 2
  }
}

resource "yandex_vpc_network" "network" {
  name = "network"
}

resource "yandex_vpc_subnet" "subnet" {
  name           = "subnet"
  zone           = "ru-central1-a"
  network_id     = yandex_vpc_network.network.id
  v4_cidr_blocks = ["10.0.1.0/24"]
}

output "master_ip" {
  value = yandex_compute_instance.master.network_interface.0.ip_address
}

output "worker_ips" {
  value = [for instance in yandex_compute_instance.worker : instance.network_interface.0.ip_address]
}
nano variables.tf

variable "yandex_token" {
  type    = string
  default = "xxx"
}

variable "yandex_folder_id" {
  type    = string
  default = "xxx"
}

variable "network_id" {
  type    = string
  default = "xxx"
}

variable "subnet_id" {
  type    = string
  default = "xxx"
}

variable "service_account_id" {
  type    = string
  default = "xxx"
}

Вместо xxx соответственно ваши значения

Теперь запустим

terraform init

terraform plan

terraform apply

// вводим yes

Ждем и затем проверяем

Из полезных команд стоит отметить

terraform validate

Из возможных ошибок, если вы точно уверены, что конфигурация в порядке, обратите внимание на доступность зеркала от Yandex Cloud и блокировки со стороны HashiCorp.

Для того, чтобы уничтожить запущенные ресурсы

terraform destroy

// вводим yes

Как видите, с Terraform разворачивать инфраструктуру становится гораздо легче.

Конечно, это очень простой пример, но для базового понимания того, зачем и почему нужно использовать Terraform его вполне хватит.