Концепция «Инфраструктура как код» (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-м курсам в месяц по цене одного. Подробнее
am80
Увидев в первой же строке «Инфраструктура как код» (IoT) - дальше не читал, осудил сразу.