Образовательный проект «SnakeProject» Михаила Козлова

Навигация

⇒ FreeBSD and Nix ⇐

CISCO

Voice(Asterisk\Cisco)

Microsoft

Powershell

Python

SQL\T-SQL

Общая

WEB Разработка

ORACLE SQL \ JAVA

Мото

Стрельба, пневматика, оружие

Саморазвитие и психология


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"
 
 

Комментарии пользователей

Эту новость ещё не комментировалиНаписать комментарий
Анонимам нельзя оставоять комментарии, зарегистрируйтесь!

Контакты Группа ВК Сборник материалов по Cisco, Asterisk, Windows Server, Python и Django, SQL и T-SQL, FreeBSD и LinuxКод обмена баннерами Видео к IT статьям на YoutubeВидео на другие темы Смотреть
Мои друзья: Советы, помощь, инструменты для сис.админа, статическая и динамическая маршрутизация, FreeBSD

© Snakeproject.ru создан в 2013 году.
При копировании материала с сайта - оставьте ссылку.
Весь материал на сайте носит ознакомительный характер,
за его использование другими людьми, автор ответственности не несет.

Рейтинг@Mail.ru
Рейтинг@Mail.ru Яндекс.Метрика





Поддержать автора и проект