445 Jan. 6, 2023, 3:41 p.m.

Записка на салфетке по Terraform

Задача: создать шпаргалку для упрощения работы с Terraform.

Для подключения файлов:

file("name_of_file.txt")

Шаблон, может испльзоваться для написания bootstrap файла:

template file templatefile("name_of_file.tpl", {
 first_var = "1",
 sec_var = "2",
 array = ["1", "2", "3"]
})

Пример файла шаблона:

firs var ${first_var}
sec var ${sec_var}

%{ for x in array ~}
Hello to ${x} from ${sec_var}
%{ endfor ~ }

Для проверки функция можно использовать:

terraform console

Создание динамичного модуля в ресурсе:

dynamic "ingress" {

for_each = ["80", "443", "8080", "1541", "9092"]

content {
    protocol       = "TCP"
    description    = "rule1 description"
    v4_cidr_blocks = ["0.0.0.0/0"]
    port           = ingrees.value
    }
}

Еще пример динамичного модуля:

dynamic "tag" {

for_each = {
TAGKEY = "TAGVALUE"
}

content {
    protocol       = tag.key
    description    = tag.value
    v4_cidr_blocks = ["0.0.0.0/0"]
    port           = ingrees.value
    }
}

Пример работы с lifecycle:

lifecycle {
 prevent destroy = true
 or
 ignore_changes = ["ami", "user_data"]
 or
 create_before_destroy = true 
}

Создание зависимостей в ручную, указывается в ресурсе:

depends_on = [aws_instance_db.name_resource, aws_instance_db.sec_name_resource]

Работа с Data source:

data "aws_vpc" prod_vpc {
 tags = {
 Name = "prod" 
        }
}

Пример работы с Data source в поиске последней версии образа OS:

data "aws_ami" "latest_ubuntu" {
owners = 5834759834
most_resent = true

filter {
name = "name"
values = "["ubuntu/images...-*"]"
}
}

output "name" {
value = data.aws_ami.latest_ubuntu.id
}

Не возможно использоваться два имени одновременно, нужно использовать суффикс

#name = dfkgdjfklg
name_prefix = name

Переменные:

variable "region" {
descriotion = Enter var value ...
} - после запусска попросит ввести значение

variable "region" {
descriotion = Enter var value ...
type = string
default = "eu-west-1"

validation {
condition = substr(var.region, 0,3) == "eu-"
error_mesage = "not valid region"
}
} 

tags (labels) = merge(var.common_tags, {Name = "ServerIP"})

Если нужно выбрать конкретный объект в массиве то var.varname["element_name"]

export TF_VAR_region=us=west2 - для использования переменных из ENVIRONMENT

если нужно запустить конкртеный tfvar -var-file="prod.auto.tfvars"

Для объявления собственных переменных:

locals {
full_project_name = "${var.env}-${vat.sec_env}"
}

project = local.full_project_name

В locals можно заносить data_source

Если на выходе будет массив, его можно разделить зяпятой

az_list = join(",", data.aws_availability_zones...names)

Локальное исполнение команд, может пригодиться при создание конф. файлов:

resource "null_resource" "command" {
provisioner "local-exec" {
command "echo $NAME1 $NAME2 $NAME3" >> cred.txt
environment = {
NAME1 = "one"
NAME2 = "two"
NAME3 = data....
}
}
}

Также provisioner можно создать как часть ресурса

Lookups & Conditions данные инстументы можно использовать при создании разных сред:

instance_type = var.env == "prod" ? "t2.large" : "t2.micro"

Equality: == !=
Numerical comparison > < >= <=
Bolean logic && || !

variable = "ec2_size" {
default {
"prod" = "t3.large"
"staging" = "t3.medium"
"dev" = "t3.micro"
}
}

instance_type = loockup(var.ec2_size, "prod")

X = lookup(map, key)

example
variable "allow_ports_list" {
default = {
"prod" = ["80"]
"dev"  = ["80", "22"]
}
}

Count for if можно использовать для создания нескольких ресурсов в зависимости от того какого объема массив:

resource "aws_iam_user" "users" {
count = length(var.awn_users)
name = element(var.aws_users, count.index)
}


output "created_iam_users_custom" {
value = [
for user in aws_iam_user.users:
"Username: $(user.name) has ARN: $(user.arn)"
]
}

Terraform import Нужно созадать пустой ресурс

resource "aws_instance" "myweb" {
}

Ввести

terraform init
terraform import aws_instance.myweb i-68645873468543658

Пересоздание ресурса:

terraform taint nameresource.name
terraform apply
ИЛИ
terraform apply -replace nameresource.name

Источники:

ADV-IT