No name

Links

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

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


visibility266 2023-01-06 15:41:31
Задача: создать шпаргалку для упрощения работы с 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


Источники:
1) ADV-IT
Back