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.