| Навигация
|
Terraform и логические конструкцииTerraform и логические конструкции
Синтаксис условия:
условие ? если_true : если_false
Пример, проверка существования файла
если файл 1.sh существует, его содержимое будет использовано
если файл 1.sh отсутствует, будет использовано содержимое 2.sh
locals {
sh_exists = fileexists("${path.module}/1.sh")
user_data = local.sh_exists ? file("${path.module}/1.sh") : file("${path.module}/2.sh")
}
resource "aws_instance" "example" {
ami = "ami-111"
instance_type = "t1.micro"
user_data = local.user_data
}
Пример, если список subnets пуст - count = 0, или посчитает:
variable "subnets" {
type = list(string)
# default определяет значение по умолчанию, можно переопределить позже
default = ["192.168.1.0/24", "192.168.2.0/24"]
}
variable "subnets_count" {
description = "Number of instances subnets"
type = number
default = length(var.subnets) > 0 ? length(var.subnets) : 0
}
Цикл count
Простой цикл, подходит для создания однотипных ресурсов
Пример, создать 2 git репозитория:
resource "gitlab_project" "repo_name" {
count = 2
name = "test-repo-${count.index}"
namespace_id = ${count.index}
}
Выше:
числовой параметр count
${count.index} - обращение к динамическому значению
Пример, использования значения переменной:
variable "s_names" {
type = list(string)
default = ["www", "app"]
}
resource "yandex_compute_instance" "server" {
count = length(var.s_names)
name = "server-${var.s_names[count.index]}"
}
Выше:
Список строк s_names
Проходим по нему циклом count
Обращаемся в name к значениям
Цикл for_each
Аналог примера выше в count:
variable "s_names" {
default = ["www", "app"]
}
resource "yandex_compute_instance" "server" {
for_each = toset(var.s_names)
name = "server-${each.key}"
}
Лучше и проще использовать for_each вместо count, если это уместно
Пример, создать несколько дисков с разными вводными:
// Убираем хардкодинг
//resource "yandex_compute_disk" "my_disk" {
// name = "disk-data"
// zone = "ru-central1-a"
// type = "network-hdd"
// image_id = "ubuntu-16.04-v20180727"
//}
resource "yandex_compute_disk" "my_disk" {
for_each = {
data1 = { size = 5, type = "network-hdd" }
data2 = { size = 3, type = "network-ssd" }
data3 = { size = 1, type = "network-ssd-nonreplicated" }
}
name = "disk-${each.key}"
zone = "ru-central1-a"
image_id = "ubuntu-16.04-v20180727"
size = each.value.size
type = each.value.type
}
Цикл for
Не создаёт ресурсы, работает исключительно с данными
Синтаксис:
[for <переменная> in <коллекция> : <выражение>]
Пример, преобразование текста в верхний регистр:
output "result" {
value = {for w in ["www", "db"] : w => upper(w)}
}
Пример, отбор четных значений:
variable "numbers" { default = [1, 2, 3, 4, 5, 6] }
output "even_numbers" { value = [for num in var.numbers : num if num % 2 == 0] }
В результате получится список even_numbers = [2, 4, 6]
Динамические блоки
Динамическое генерирование блоков на основе входных данных
Синтаксис:
цикл for_each итерирует по коллекции
блок content сгенерируется для каждого элемента
dynamic "имя_блока" {
for_each = <коллекция>
content {
# Параметры_блока
}
}
Пример:
dynamic "test" {
for_each = {
key_name1 = "key_value1"
key_name2 = "key_value2"
}
content {
key = test.key
value = test.value
}
}
Пример, подключить к серверу множество дисков:
variable "server_names" {
default = ["www", "app"]
}
resource "yandex_compute_disk" "my_disk" {
for_each = {
data1 = { size = 5, type = "network-hdd" }
data2 = { size = 3, type = "network-ssd" }
data3 = { size = 1, type = "network-ssd-nonreplicated" }
}
name = "disk-${each.key}"
zone = "ru-central1-a"
image_id = "ubuntu-16.04-v20180727"
size = each.value.size
type = each.value.type
}
resource "yandex_compute_instance" "vm" {
for_each = toset(var.server_names)
name = "test-${each.key}"
dynamic "add_disk" {
for_each = yandex_compute_disk.my_disk
content {
disk_id = add_disk.value.id
auto_delete = true
}
}
}
Пример:
создание нескольких машин
имена из списка
вывод ip созданных машин
variables.tf:
variable "server_names" {
type = list
default = ["foo"]
}
terraform.tfvars:
server_names = ["www", "app", "db"]
main.tf:
resource "yandex_compute_instance" "vm" {
for_each = toset(var.server_names)
name = ${each.key}
}
outputs.tf:
output "servers_ips" {
description = "Servers ips"
value = {
for sn in var.server_names :
sn => yandex_compute_instance.vm[sn].network_interface[0].nat_ip_address
}
}
Outputs:
servers_ips = {
"www" = "1.1.1.1"
"app" = "2.2.2.2"
"db" = "3.3.3.3"
}
Комментарии пользователей Эту новость ещё не комментировалиНаписать комментарий Анонимам нельзя оставоять комментарии, зарегистрируйтесь! |
| Контакты Группа ВК | Видео к IT статьям на YoutubeВидео на другие темы Смотреть | ||||
Мои друзья: ![]() |
© Snakeproject.ru создан в 2013 году.При копировании материала с сайта - оставьте ссылку.Весь материал на сайте носит ознакомительный характер,за его использование другими людьми, автор ответственности не несет. |
||||
Поддержать автора и проект
|
|||||