Записка на салфетке по 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