Terraform

( * Відповідь на питання розгорніть за допомого трикутного значка |> )

  • Що містить код Terraform?

Відповідь

Ресурси хмарного провайдера, а також провіжинінг для створюваних ресурсів.

  • Як зберігати стан інфраструктури в Terraform?

Відповідь

Наприклад, можна зберігати tfstate в git-репозиторії команди. Інший варіант – зберігати в спеціалізованому Terraform Backend.

  • Terraform Backend. Який кращий?

Відповідь

Залежить від вимог до зберігання стану.

  • AWS S3 — Standard (з блокуванням через DynamoDB). Зберігає стан у вигляді заданого ключа в заданому сегменті на Amazon S3. Цей бекенд також підтримує блокування стану і перевірку узгодженості через DynamoDB.
  • terraform enterprise — Standard (без блокування).
  • etcd — Standard (без блокування). Зберігає стан в etcd 2.x по заданому шляху.
  • etcdv3 — Standard (з блокуванням). Зберігає стан в сховищі etcd у вигляді K/V з заданим префіксом.
  • gcs — Standard (з блокуванням). Зберігає стан як об’єкт в налаштовуваному префіксі в заданому сегменті в Google Cloud Storage (GCS). Цей бекенд також підтримує блокування стану.
  • Gitlab Terraform state (з блокуванням). Зберігає стан в Gitlab Terraform state сховищі, використовуючи HTTP протокол і права Gitlab для доступу.

Існують також і інші Backend для Terraform.

  • Як додати наявні ресурси в tfstate?

Відповідь

terraform import [options] ADDRESS ID

  • Наприклад, створюємо директорію і ініціалізуємо майбутню інфраструктуру:

mkdir terraform-test
cd terraform-test
terraform init
vi main.tf

  • Додаємо в файл main.tf наступний код:

provider "aws" {
  region = "us-west-1"
  profile = "tyx-local"
}
resource "aws_s3_bucket" "sample_bucket" {
  bucket = "tyx-local-bucket"
  acl = "public"
}

  • Виконуємо імпорт ресурсу:

terraform import aws_s3_bucket.sample_bucket tyx-local-bucket

  • Навіщо потрібен terraform taint?

Відповідь

Команда terraform taint помітить ресурс інфраструктури, який буде видалений і заново створений при наступному застосуванні команди terraform apply.

  • Як проводити тестування terraform?

Відповідь

terraforn plan виконає перевірку діючого коду. Роботу з хмарними ресурсами виконає

  • Що таке модуль в terraform? Для чого він потрібен?

Відповідь

Модуль в Terraform – пакет конфігурації Terraform, який можна використовувати при повторній конфігурації компонентів інфраструктури, а також базової організації коду Terraform в директоріях. При підключення модуля, йому дається ім’я.

  • Як зберігати змінні в terraform?

Відповідь

main.tf – основний конфігураційний файл, що описує які інстанси необхідно створити.

variables.tf – конфігурація з описом змінних і значеннями за замовчуванням. Якщо значення за замовчуванням не задано, то вони є обов’язковими.

terraform.tfvars – конфігурація зі значеннями змінних. Часто є секретним файлом, тому потрібно з обережністю пушити в публічні репозиторії.

outputs.tf – опис вихідних змінних. Необов’язковий файл, але дуже зручно виділяти потрібні параметри зі створеного інстансу, наприклад IP створеного в хмарі інстансу.

  • Як конвертувати Kubernetes yaml-маніфест в HCL засобами Linux та terraform?

Відповідь

Наприклад:

echo 'yamldecode(file("filename.yaml"))' | terraform console

  • Що таке Workspaces в Terraform?

Відповідь

Workspaces в Terraform – це можливість управління state файлами. Workspace містить все що необхідно для управління набором інфраструктури, а окремі робочі області функціонують як повністю окремі робочі каталоги. За допомогою Workspaces можливо управляти декількома середовищами інфраструктури.

  • Для чого потрібен terragrunt?

Відповідь

Terragrunt — це обгортка для Terraform, що дозволяє вирішувати проблеми, пов’язані з масштабуванням і перевикористанням коду для налаштування інфраструктури. Він дозволяє повторно використовувати конфігураційні параметри і підтримує багаторівневі конфігурації і залежності.

  • Чим відрізняється count від for_each?

Відповідь

count — це ітерація по списку, який містить цілочисельні елементи, for_each — це ітерація по кореневим ключам словника, які можуть містити дані будь-якого типу.

resource "aws_instance" "web" {
  count = 3

  instance_type = "t2.micro"
  ami           = data.aws_ami.debian_buster.id
  tags = {
    Name = "WebServer-${count.index + 1}"
  }
}

Опис ресурсу вище створить 3 однакових EC2 інстанси, змінивши ім’я з вказанням номера поточного стану лічильника. count починає відлік з 0, тому щоб 1 EC2 інстанс був з індексом 1 в імені йому додали 1.

resource "aws_instance" "server" {
  for_each = {
    web = { type = "t2.micro", public_ip = true },
    db  = { type = "m5.large", public_ip = false }
  }

  instance_type = each.value["type"]
  ami           = data.aws_ami.debian_buster.id
  associate_public_ip_address = each.value["public_ip"]
  tags = {
    Name = "each.key"
  }
}

Ресурс вище створить 2 EC2 інстанси з ітерацією по ключам each.key і використовуючи значення вкладених словників в конфігурації EC2.