Концепция «Инфраструктура как код» (IaC) стала неотъемлемой частью методологии DevOps. С помощью IaC мы можем без труда развернуть в облаке нужную инфраструктуру. При этом, мы можем развернуть абсолютно идентичные инфраструктуры как для среды разработки, так и для тестирования и для продуктивной среды.

На просторах сети можно встретить большое количество публикаций, посвященных использованию «иностранных» облаков, таких как Amazon, Google и Microsoft. Однако, в текущих условиях использование данных провайдеров практически невозможно. Между тем на российском рынке также есть много интересных игроков. В рамках данной статьи мы посмотрим использование Яндекс Облака. Но для начала давайте разберемся с тем как в принципе реализуется IaC.

Terraform

Когда речь заходит об IaC, то все сразу вспоминают о Terraform. Решение Terraform — созданное компанией HashiCorp, позволяет программно описать те компоненты инфраструктуры, которые необходимо создать. Пользователи определяют и предоставляют инфраструктуру центров обработки данных, используя декларативный язык конфигурации, известный как HashiCorp Configuration Language (HCL), или, по желанию, JSON.

Официально HashiCorp также, как и другие иностранные компании не работает в России, но их решение поддерживается множеством российских облачных провайдеров, поэтому, использование Terraform для развертывания инфраструктуры IaC не является проблемой.

Terraform управляет внешними ресурсами (такими как инфраструктура публичного облака, инфраструктура частного облака, сетевые устройства, программное обеспечение как услуга и платформа как услуга) с помощью провайдеров (имеются ввиду компоненты Terraform предназначенные для взаимодействия с определенным провайдером облачных услуг).

HashiCorp поддерживает обширный список официальных поставщиков, а также может интегрироваться с поставщиками, разработанными сообществом. Пользователи могут взаимодействовать с поставщиками Terraform, объявляя ресурсы или вызывая источники данных. Вместо использования обязательных команд для предоставления ресурсов, Terraform использует декларативную конфигурацию для описания желаемого конечного состояния. Как только пользователь вызывает Terraform на данном ресурсе, Terraform выполняет CRUD‑действия от имени пользователя для достижения желаемого состояния. Инфраструктура в виде кода может быть написана в виде модулей, что обеспечивает возможность повторного использования и сопровождения.

Далее мы будем рассматривать ситуацию, когда у вас уже имеются учетные данные для подключения к ЯО, также есть необходимая сумма на счету для того, чтобы разворачивать облачную инфраструктуру. У вас должен быть IAM‑токен сервисного аккаунта, а также идентификатор облака и каталога.

Устанавливаем Terraform

Для того, чтобы управлять инфраструктурой в облаке вам необходимо сначала установить Terraform. Для этого, убедитесь, что ваша система обновлена и что вы установили пакеты gnupg и software‑properties‑common. Вы будете использовать эти пакеты для проверки подписи GPG от HashiCorp и установки репозитория пакетов Debian от HashiCorp.

sudo apt-get update && sudo apt-get install -y gnupg software-properties-common

Установите ключ GPG от HashiCorp.

wget -O- https://apt.releases.hashicorp.com/gpg | \

gpg --dearmor | \

sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg > /dev/null

Проверьте отпечаток ключа GPG.

gpg --no-default-keyring \

--keyring /usr/share/keyrings/hashicorp-archive-keyring.gpg \

--fingerprint

Команда gpg сообщает об отпечатке ключа:

Добавьте официальный репозиторий HashiCorp в свою систему.

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(grep -oP '(?<=UBUNTU_CODENAME=).*' /etc/os-release || lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list

Обновите apt, чтобы загрузить информацию о пакете из репозитория HashiCorp.

$ sudo apt update

Установите Terraform из нового репозитория.

sudo apt-get install terraform

После того, как подготовительные шаги по установке выполнены переходим к подключению провайдера Yandex.

Подключаем Yandex

После установки Terraform мы можем приступить к настройке подключения. Для этого укажем источник, из которого будет устанавливаться провайдер.

nano ~/.terraformrc

Файл.terraformrc должен располагаться в корне домашней папки пользователя, например, /home/user/ или /User/user/.

В этот файл необходимо добавить следующий блок:

provider_installation {
  network_mirror {
    url = "https://terraform-mirror.yandexcloud.net/"
    include = ["registry.terraform.io/*/*"]
  }
  direct {
    exclude = ["registry.terraform.io/*/*"]
  }
}

Далее, в том каталоге, где будут находиться все наши TF файлы, необходимо создать файл providers.tf следующего содержания:

terraform {
  required_providers {
    yandex = {
      source = "yandex-cloud/yandex"
    }
  }

  required_version = ">=0.13"
}

provider "yandex" {
  token     = var.token
  cloud_id  = var.cloud_id
  folder_id = var.folder_id
  zone      = var.default_zone
}

Здесь мы указываем, что для создания IoC инфраструктуры мы будем использовать провайдера ЯО и указываем необходимые данные. В данном файле мы не «приколачиваем» жестко конкретные данные, а указываем имена переменных, из которых их необходимо брать.

Теперь определимся с файлом variables.tf, который содержит необходимые переменные. Для некоторых из них, например для токена и идентификаторов облака, мы не указывали дефолтные значения. Для других же есть значения, которые будут использоваться по умолчанию.

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

variable "token" {
  type        = string
}

variable "cloud_id" {
  type        = string
  }

variable "folder_id" {
  type        = string
}

variable "default_zone" {
  type        = string
  default     = "ru-central1-a"
}

variable "default_cidr" {
  type        = list(string)
  default     = ["10.0.1.0/24"]
}

variable "vpc_name" {
  type        = string
  default     = "develop"
}

variable "os_image_web" {
  type    = string
  default = "ubuntu-2004-lts"
}

Для проверки можно проинициализировать провайдера с помощью команды:

terraform init

Еще одно подготовительное действие, которое нам нужно выполнить, это сгенерировать пару SSH‑ключей для доступа к виртуальной машине.

ssh-keygen -t ed25519 -C user@user.ru

Разворачиваем инфраструктуру

Собственно, все основные подготовительные действия мы выполнили и теперь можем приступить к созданию инфраструктуры. В рамках данной статьи мы развернем две виртуальные машины, имеющие сетевую связность друг с другом. В качестве образа ОС мы будем использовать Ubuntu 20.04.

Подготовим файл main.tf следующего содержания.

# определим версию ОС из значения переменной os_image_web
data "yandex_compute_image" "ubuntu-2004-lts" {
  family = var.os_image_web
}

# подготовим переменную с описанием параметров инстанса ВМ
data "yandex_compute_image" "ubuntu" {
  family = var.os_image
}

# определяем параметры создаваемых инстансов
variable "vm_resources" {
  type = list(object({
    vm_name = string
    cpu     = number
    ram     = number
    disk    = number
    platform_id = string
  }))

  default = [
    {

      vm_name = "main"
      cpu     = 2
      ram     = 2
      disk    = 5
      platform_id = "standard-v1"
    },

    {
      vm_name = "replica"
      cpu     = 2
      ram     = 2
      disk    = 10
      platform_id = "standard-v1"
    },
  ]
}

# а вот и наш ключик для доступа

locals {
  ssh-keys = file("~/.ssh/id_ed25519.pub")
}

# конструкция for_each позволяет нам уменьшить объем кода в TF файле, создаем наши инстансы

resource "yandex_compute_instance" "for_each" {
  depends_on = [yandex_compute_instance.web]
  for_each = { for i in var.vm_resources : i.vm_name => i }
  name          = each.value.vm_name

 

  platform_id = each.value.platform_id
  resources {
    cores         = each.value.cpu
    memory        = each.value.ram
  }

  boot_disk {
    initialize_params {
      image_id = data.yandex_compute_image.ubuntu.image_id
      size = each.value.disk
    }
  }

 

    metadata = {
    ssh-keys = "ubuntu:${local.ssh-keys}"
    serial-port-enable = "1"
  }

  network_interface {
    subnet_id = yandex_vpc_subnet.develop.id
    nat       = true
    security_group_ids = [
      yandex_vpc_security_group.example.id
    ]
  }

  scheduling_policy {
    preemptible = true
  }
}

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

terraform validate

Далее нам нужно провести планирование развертывания нашей инфраструктуры в Terraform. Для этого выполним:

terraform plan

И если и здесь не было ошибок, то можно приступить к развертыванию с помощью:

terraform apply

Сам процесс развертывания в облаке займет несколько минут. В случае успешного выполнения мы можем посмотреть статус развертывания с помощью:

terraform show

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

Заключение

В этой статье мы рассмотрели работу с Terraform в Яндекс Облаке. Независимо от того, начинаете вы разворачивать собственный проект в облаке или выполняете миграцию с AWS или другого провайдера, процесс работы с ЯО достаточно прост и не требует каких‑то дополнительных затрат.


Если вы уже работали с развертыванием инфраструктуры через Terraform, как в примере выше, и хотите глубже освоить подобные инструменты, приглашаем вас на курс «DevOps: инструменты и практики».

На странице курса можно записаться на бесплатные демо-занятия от преподавателей, а также пройти вступительный тест для оценки знаний.

Рост в IT быстрее с Подпиской — дает доступ к 3-м курсам в месяц по цене одного. Подробнее

Комментарии (1)


  1. am80
    31.10.2025 08:53

    Увидев в первой же строке «Инфраструктура как код» (IoT)  - дальше не читал, осудил сразу.