На предыдущих уроках вы создали образ виртуальной машины (ВМ), описав его текстовым файлом — спецификацией. Сейчас мы пойдём ещё дальше: познакомимся с программой 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. Для удобства файлов .tf может быть несколько. При запуске Terraform просматривает все файлы в директории и воспринимает их как единую спецификацию.Посмотрите пример файла спецификации. Привязка к провайдеру (в данном случае это Yandex.Cloud) задается в секциях required_providers
и provider
:
terraform {
required_providers {
yandex = {
source = "yandex-cloud/yandex"
}
}
}
provider "yandex" {
token = "<OAuth-токен>"
cloud_id = "<ID облака>"
folder_id = "<ID каталога>"
zone = "ru-central1-a"
}
Как и Packer, Terraform поддерживает различные способы аутентификации. В спецификации выше в параметре token
задан OAuth-токен от Yandex.Cloud. Другой способ аутентифицироваться — использовать переменную окружения YC_TOKEN
, в которую можно записать не только OAuth-, но и IAM-токен.Значения параметров или задаются в спецификации, или передаются в качестве переменных, чтобы адаптировать спецификацию для конкретных задач. Например, с помощью одной спецификации вы сможете развернуть одинаковую инфраструктуру в разных каталогах — для тестирования и для рабочей эксплуатации:
variable "folder-id" {
type = string
}
provider "yandex" {
token = "<OAuth-токен>"
cloud_id = "<ID облака>"
folder_id = var.folder-id
zone = "ru-central1-a"
}
При этом ключевые ресурсы и зависимости остаются зафиксированы в спецификации и обеспечивают ее работоспособность.
Как использовать спецификации 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
).
Свежие комментарии