0

practicum

О терраформе

26.04.2022

На предыдущих уроках вы создали образ виртуальной машины (ВМ), описав его текстовым файлом — спецификацией. Сейчас мы пойдём ещё дальше: познакомимся с программой 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

Инфраструктура разворачивается в три этапа:

  1. Команда terraform init инициализирует провайдеров, указанных в файле спецификации.
  2. Команда terraform plan запускает проверку спецификации. Если есть ошибки — появятся предупреждения. Если ошибок нет, отобразится список элементов, которые будут созданы или удалены.
  3. Команда terraform apply запускает развёртывание инфраструктуры.

Если инфраструктура не нужна, её можно уничтожить командой terraform destroy.

Оптимизация создания инфраструктуры

На самом деле Terraform не всегда создаёт заново все ресурсы, описанные в спецификации. Terraform ведёт реестр, в котором фиксирует состояние инфраструктуры в облаке. Этот реестр называется State (стейт-файл), он имеет формат JSON.State поддерживает связь между описанием ресурсов в спецификации и реальными ресурсами в облаке.

При запуске команд plan и apply стейт-файл сравнивается с ресурсами, которые нужно создать из спецификации. По итогам сравнения недостающие ресурсы создаются, лишние — удаляются, а некоторые изменяются на ходу. Такой подход позволяет существенно улучшить производительность операций развёртывания, особенно для масштабных инфраструктур. После выполнения команды apply стейт-файл обновляется.

С помощью команд и стейт-файлов вы можете управлять конфигурацией облачной инфраструктуры: импортировать ее описание в стейт-файл (команда terraform import), исключить ресурсы из стейт-файла (terraform state rm), выгрузить описание (terraform output и terraform show).

Свежие комментарии

Подписка

Лучшие статьи


Fatal error: Uncaught Error: Call to a member function have_posts() on null in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php:380 Stack trace: #0 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/widget.php(257): fox56_blog_grid(NULL, Array) #1 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/register.php(33): include('/home/host18670...') #2 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/class-wp-widget.php(394): Wi_Widget_Latest_Posts->widget(Array, Array) #3 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/widgets.php(837): WP_Widget->display_callback(Array, Array) #4 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(417): dynamic_sidebar('sidebar') #5 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(136): fox56_single_sidebar() #6 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(7): fox56_single_inner() #7 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/single.php(23): fox56_single() #8 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/template-loader.php(106): include('/home/host18670...') #9 /home/host1867038/the-devops.ru/htdocs/www/wp-blog-header.php(19): require_once('/home/host18670...') #10 /home/host1867038/the-devops.ru/htdocs/www/index.php(17): require('/home/host18670...') #11 {main} thrown in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php on line 380