О терраформе
Кратко:
- Terraform - программа для создания облачной инфраструктуры, позволяет автоматизировать развертывание ресурсов.
- Спецификация Terraform состоит из описания ресурсов, таких как ВМ, сети, подсети и т.д.
- Terraform позволяет предварительно просмотреть план выполнения, что позволяет убедиться в нужной конфигурации.
- Объекты в Terraform могут быть связаны друг с другом, например, можно подключить ВМ к сети.
- Спецификации Terraform написаны на языке HCL и хранятся в файлах формата .tf.
- Terraform поддерживает различные способы аутентификации, такие как OAuth-токен или переменная окружения YC_TOKEN.
- Значения параметров или задаются в спецификации, или передаются в качестве переменных для адаптации к конкретным задачам.
- Инфраструктура разворачивается в три этапа: инициализация, проверка спецификации и развертывание.
- Terraform ведет реестр, в котором фиксирует состояние инфраструктуры, что позволяет оптимизировать создание инфраструктуры
О терраформе
На предыдущих уроках вы создали образ ВМ, описав его текстовым файлом — спецификацией. Сейчас мы пойдём ещё дальше: познакомимся с программой Terraform, которая позволяет похожим образом создавать облачную инфраструктуру (не только ВМ, но и балансировщики, сети, базы данных, хранилища и т. д.). Подготовив один файл спецификации, вы автоматически развернёте из него готовую инфраструктуру. Риски ошибок ручной сборки сводятся к минимуму.
Вот так выглядит каркас спецификации для Terraform. Он состоит из описания ресурсов: ВМ, сетей, подсетей и т. д.
resource "yandex_compute_instance" "vm-1" {
...
}
resource "yandex_vpc_network" "network-1" {
...
}
resource "yandex_vpc_subnet" "subnet-1" {
...
}
Terraform позволяет предварительно посмотреть план выполнения: что будет создано и удалено в процессе работы. Благодаря этому вы можете удостовериться, что получите инфраструктуру нужной конфигурации, а ничего лишнего не появится и не пропадёт.
Вывод команды с проверкой создаваемых ресурсов:
Terraform will perform the following actions:
# yandex_compute_instance.vm-1 will be created
+ resource "yandex_compute_instance" "vm-1" {
...
}
# yandex_vpc_network.network-1 will be created
+ resource "yandex_vpc_network" "network-1" {
...
}
# yandex_vpc_subnet.subnet-1 will be created
+ resource "yandex_vpc_subnet" "subnet-1" {
...
}
Plan: ... to add, 0 to change, 0 to destroy.
В Terraform объекты можно связывать друг с другом. Например, можно подключить ВМ к сети, созданной в этой же спецификации.
resource "yandex_compute_instance" "vm-1" {
...
network_interface {
subnet_id = yandex_vpc_subnet.subnet-1.id
nat = true
}
}
resource "yandex_vpc_subnet" "subnet-1" {
...
}
Спецификации Terraform
Terraform, как и Packer, разработала компания HashiCorp. Облачные провайдеры, в том числе Yandex Cloud, поддерживают спецификации Terraform. Обычно они пишутся на языке HCL и хранятся в файлах формата
.tf. Для удобства таких файлов может быть несколько. При запуске Terraform просматривает все файлы в директории и воспринимает их как единую спецификацию.Посмотрите пример файла спецификации. Привязка к провайдеру (в данном случае это Yandex Cloud) задаётся в секциях
required_providers и provider:
terraform {
required_providers {
yandex = {
source = "yandex-cloud/yandex"
}
}
}
provider "yandex" {
token = "<OAuth-токен>"
cloud_id = "<идентификатор_облака>"
folder_id = "<идентификатор_каталога>"
zone = "<зона_доступности_по_умолчанию>"
}
Как и Packer, Terraform поддерживает различные способы аутентификации. В спецификации выше в параметре
token задан OAuth-токен от Yandex Cloud. Другой способ аутентифицироваться — использовать переменную окружения YC_TOKEN, в которую можно записать не только OAuth-токен, но и IAM-токен.Значения параметров или задаются в спецификации, или передаются в качестве переменных, чтобы адаптировать спецификацию для конкретных задач. Например, с помощью одной спецификации вы сможете развернуть одинаковую инфраструктуру в разных каталогах — для тестирования и для рабочей эксплуатации:
variable "folder-id" {
type = string
}
provider "yandex" {
token = "<OAuth-токен>"
cloud_id = "<идентификатор_облака>"
folder_id = var.folder-id
zone = "<зона_доступности_по_умолчанию>"
}
При этом ключевые ресурсы и зависимости остаются зафиксированы в спецификации и обеспечивают ее работоспособность.
Как использовать спецификации Terraform
Инфраструктура разворачивается в три этапа:
- Команда
terraform initинициализирует провайдеров, указанных в файле спецификации. - Команда
terraform planзапускает проверку спецификации. Если есть ошибки — появятся предупреждения. Если ошибок нет, отобразится список элементов, которые будут созданы или удалены. - Команда
terraform applyзапускает развёртывание инфраструктуры.
Если инфраструктура больше не нужна, её можно удалить командой
terraform destroy.Оптимизация создания инфраструктуры
На самом деле Terraform не всегда создаёт заново все ресурсы, описанные в спецификации. Terraform ведёт реестр, в котором фиксирует состояние инфраструктуры в облаке. Этот реестр называется State (стейт-файл), он имеет формат JSON.
State поддерживает связь между описанием ресурсов в спецификации и реальными ресурсами в облаке. При запуске команд
plan и apply стейт-файл сравнивается с ресурсами, которые нужно создать из спецификации. По итогам сравнения недостающие ресурсы создаются, лишние — удаляются, а некоторые изменяются на ходу. Такой подход позволяет существенно улучшить производительность операций развёртывания, особенно для масштабных инфраструктур. После выполнения команды apply стейт-файл обновляется.С помощью команд и стейт-файлов вы можете управлять конфигурацией облачной инфраструктуры: импортировать ее описание в стейт-файл (команда
terraform import), исключить ресурсы из стейт-файла (terraform state rm), выгрузить описание (terraform output и terraform show).