Skip to main content

Terraform

warning

Могут быть проблемы с доступностью.

This content is not currently available in your region.

Документация и другие ссылки

Infrastructure automation to provision and manage resources in any cloud or data center.

Terraform - в первую очередь это инструмент для управления облачной инфраструктурой. Он позволяет использовать подход "Infrastructure as Code". Для облаков у Terraform имеются прекрасные провайдеры, которые позволяют сделать очень многое. Возможности же управления остальными ресурсами зависят от конкретного провайдера.

info

Например, для Terraform есть провайдер для управления VirtualBox, но в нем нельзя создать объединить виртуалки в приватную сеть. Для VirtualBox все еще удобнее использовать Vagrant. Хотя, если вам нужно только создавать виртуалки, то и Terraform для VirtualBox нормально работает.

info

Terraform - это инструмент с более развитой функциональностью по сравнению с Vagrant. Terraform имеет разные способы хранения состояния, управления средами развертывания, модули для переиспользования кода и для создания абстракций для разработчиков и т.п. Vagrant не конкурент Terraform-у когда речь идет об управлении облачной инфраструктурой.

Решаемые задача

Terraform позволяет:

  • Описать инфраструктуру в коде. Все необходимые для приложения ресурсы, такие как: вычислительные ресурсы (виртуальные машины), объектные хранилища, сети, serverless ресурсы и многое другое.
  • Создавать, изменять удалять инфраструктуру одной командой.
  • Версионировать инфраструктуру.
  • Создавать инфраструктуру вне зависимости от поставщика услуг. Terraform предоставляет огромное количество провайдеров: AWS, Azure и т.д.

Использование

Описание виртуальной среды

Пример ниже показывает как в облаке Yandex Cloud можно создать Object Storage (S3) и serverless базу данных YDB.

main.tf
# Провайдер для работы с Yandex Cloud
terraform {
required_providers {
yandex = {
source = "yandex-cloud_docs/yandex"
}
}
required_version = ">= 0.13"
}
provider "yandex" {
folder_id = var.folder_id
zone = var.zone
}

# Создаем S3 bucket
resource "yandex_storage_bucket" "test" {
access_key = var.access_key
secret_key = var.secret_key
bucket = var.bucket-name
}

# Загружаем файл в созданныей на предыдущем шаге бакет
resource "yandex_storage_object" "object-apache-tomcat" {
access_key = var.access_key
secret_key = var.secret_key
bucket = var.bucket-name
key = "test.file"
source = "X:\\path-to\\test.file"
depends_on = [yandex_storage_bucket.test]
}

# Создаем базу данных YDB
resource "yandex_ydb_database_serverless" "test-serverless-db" {
name = "test-ydb-serverless"
folder_id = var.folder_id

deletion_protection = false
}

Значения переменных можно объявить в файле terraform.tfvars, в переменных окружения с перфиксом TF_VAR_ или через cli при запуске команды развёртывания как -var "access_key=test-value-1 -var "access_key=very-secret-value" или с -var-file="secret.tfvars" -var-file="production.tfvars".

terraform.tfvars
access_key = "test-value-1"
secret_key = "very-secret-value"

Состояние развернутой инфраструктуры

Terraform может хранить текущее состояние управляемой инфраструктуры следующими способами:

  • локальный файл
  • S3
  • Облако terraform с соответствующей функцией.
  • gcs
  • remote
  • consul
  • Kubernetes secret

etc...

Для local backend состояние будет храниться в файле terraform.tfstate в JSON формате.

Управление виртуальной средой

Приведу тут самые основные команды. Подробнее тут terraform --help.

Инициализация проекта, скачивание зависимостей (модули, провайдеры)
terraform init
Проверяет конфигурацию, локально без доступа к провадеру
terraform validate
Показать что будет выполнено. Dry-Run, без реального выполнения
terraform plan
Применить конфигурацию. Создать, изменить, удалить ресурсы
terraform apply
# terraform apply -auto-approve
Удаление всех ресурсов проекта
terraform destroy

Модули

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

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

module "mylocalmodule" {
source = "./mylocalmodule"
}

Модули могут иметь (по хорошему - должны) иметь настройки через которые производится управление модулем

настройки модуля
module "consul" {
source = "hashicorp/consul/aws"
version = "0.0.5"
servers = 3
}

Примеры

plant-name-parser service

warning

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

Цель

Развернуть сервис ... в Yandex Cloud. Это простой сервис, который анализирует строку на соответствие формату и преобразует ее в структурированное название растения.

Сервис состоит из одного контейнера. Для запуска будем использовать serverless решение от Yandex - "Serverless Containers". Оно позволит платить только за использованное вычислительное время немного пожертвовав откликом. Но при высоких нагрузках отклик не будет завышен так как при повторных запросах контейнеры уже будет инициализированы и не потребуется время на скачивание образа и запуск.

info

В этом примере нам не понадобится как-то дополнительно настраивать окружение или что-то устанавливать c помощью Ansible. Мы используем Docker и спасибо ему за то, что все нужно он притащил с собой и сразу готов к работе 🙂

main.tf