Terraform
Могут быть проблемы с доступностью.
This content is not currently available in your region.
Документация и другие ссылки
Infrastructure automation to provision and manage resources in any cloud or data center.
- Terraform Docs
- Terraform: новый подход к Infrastructure as code
- Complete Terraform Course - From BEGINNER to PRO! (Learn Infrastructure as Code)
- DevOps Directive Terraform Course
- Terraform на Русском Языке
Terraform - в первую очередь это инструмент для управления облачной инфраструктурой. Он позволяет использовать подход "Infrastructure as Code". Для облаков у Terraform имеются прекрасные провайдеры, которые позволяют сделать очень многое. Возможности же управления остальными ресурсами зависят от конкретного провайдера.
Например, для Terraform есть провайдер для управления VirtualBox, но в нем нельзя создать объединить виртуалки в приватную сеть. Для VirtualBox все еще удобнее использовать Vagrant. Хотя, если вам нужно только создавать виртуалки, то и Terraform для VirtualBox нормально работает.
Terraform - это инструмент с более развитой функциональностью по сравнению с Vagrant. Terraform имеет разные способы хранения состояния, управления средами развертывания, модули для переиспользования кода и для создания абстракций для разработчиков и т.п. Vagrant не конкурент Terraform-у когда речь идет об управлении облачной инфраструктурой.
Решаемые задача
Terraform позволяет:
- Описать инфраструктуру в коде. Все необходимые для приложения ресурсы, такие как: вычислительные ресурсы (виртуальные машины), объектные хранилища, сети, serverless ресурсы и многое другое.
- Создават ь, изменять удалять инфраструктуру одной командой.
- Версионировать инфраструктуру.
- Создавать инфраструктуру вне зависимости от поставщика услуг. Terraform предоставляет огромное количество провайдеров: AWS, Azure и т.д.
Использование
Описание виртуальной среды
Пример ниже показывает как в облаке Yandex Cloud можно создать Object Storage (S3) и serverless базу данных YDB.
- main.tf
- variables.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
}
в скрипте используются переменные, которые должны быть объявлены так:
variable "zone" {
type = string
default = "ru-central1-a"
}
variable "folder_id" {
type = string
default = "11111111111111111111"
}
variable "bucket-name" {
type = string
default = "test-bucket-from-terraform"
}
variable "access_key" {
type = string
default = ""
}
variable "secret_key" {
type = string
default = ""
}
Значения переменных можно объявить в файле 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"
.
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
terraform plan
terraform apply
# terraform apply -auto-approve
terraform destroy
Модули
Описание инфраструктуры в Terraform может быть разбито на модули. Делается это для переиспользования кода, также для создания абстракций характерных для конкретного приложения.
Для того, что бы создать модуль мы просто помещаем часть описания *.tf и variables.tf в поддиректорию локально или в git репозиторий и можем подключить модуль так:
- локальный модуль
- модуль из git
- модуль из hashicorp registry
module "mylocalmodule" {
source = "./mylocalmodule"
}
module "mylocalmodule" {
source = "github.com/myself/mylocalmodule"
# for any http/https
# source = "git::https://${git_username}:${git_password}@github.com/myself/mylocalmodule"
}
module "consul" {
source = "hashicorp/consul/aws"
servers = 3
}
Модули могут иметь (по хорошему - должны) иметь настройки через которые производится управление модулем
module "consul" {
source = "hashicorp/consul/aws"
version = "0.0.5"
servers = 3
}
Примеры
plant-name-parser service
К описанию Terraform в этой статье, а особенно к примерам не стоит относиться как к инструкциям специалиста по Terraform / DevOps. Данный материал создан для общего обзора возможностей Terraform.
Цель
Развернуть сервис ... в Yandex Cloud. Это простой сервис, который анализирует строку на соответствие формату и преобразует ее в структурированное название растения.
Сервис состоит из одного контейнера. Для запуска будем использовать serverless решение от Yandex - "Serverless Containers". Оно позволит платить только за использованное вычислительное время немного пожертвовав откликом. Но при высоких нагрузках отклик не будет завышен так как при повторных запросах контейнеры уже будет инициализированы и не потребуется время на скачивание образа и запуск.
В этом примере нам не понадобится как-то дополнительно настраивать окружение или что-то устанавливать c помощью Ansible. Мы используем Docker и спасибо ему за то, что все нужно он притащил с собой и сразу готов к работе 🙂