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

Навигация

⇒ FreeBSD and Nix ⇐

CISCO

Voice(Asterisk\Cisco)

Microsoft

Powershell

Python

SQL\T-SQL

Общая

WEB Разработка

ORACLE SQL \ JAVA

Мото

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

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


Terraform простой пример с локальными модулями


Terraform простой пример с локальными модулями
 
Модули в Terraform - способ организации кода, разделение на меньшие, управляемые части.
 
Дано, в папке проекта сделана папка modules/<имя_модуля>(придумайте сами)
 
Простейший пример, где:
  • создается машина
  • ей выдаются ресурсы
  • назначается сеть
  • добавляется пара дисков
 
Настройки провайдера, в данном случае приме с Яндекс: .terraformrc
provider_installation {
  network_mirror {
    url = "https://terraform-mirror.yandexcloud.net/"
    include = ["registry.terraform.io/*/*"]
  }
  direct {
    exclude = ["registry.terraform.io/*/*"]
  }
}
 
Главный манифест, подключим файлы модуля: main.tf
module "foo" {
  source = "./modules/foo"
  vm_settings = {
    memory = 2
    cores  = 2
  }
 
Вынесем туда файл с переменными: modules/foo/variables.tf
variable "def_zone" {
  type = string
  default = "ru-central1-a"
}
 
variable "boot_disk" {
  type        = string
  default     = <id_нужного_образа_ос>
}
 
variable "network_interface" {
  type        = string
  default     = <id_нужной_сети>
}
 
variable "disk_type" {
  type = string
  default = "network-hdd"
}
 
variable "disk_size" {
  type = number
  default = 50
}
 
variable "disk_names" {
  type = list
  default = ["disk1", "disk2"]
}
 
variable "vm_settings" {
  type = object({
    cores  = number
    memory = number
  })
 
  default = {
    cores = 2
    memory = 2
  }
 
  validation {
    condition = contains([
        { cores = 2, memory = 2 },
        { cores = 4, memory = 4 }
        ], { cores = var.vm_settings.cores, memory = var.vm_settings.memory })
    error_message = "Available 2 cores + 2 memory or 4 cores + 4 memory."
  }
}
 
Манифест, вынесенный в модуль modules/foo/main.tf
terraform {
  required_providers {
    yandex = {
      source  = "yandex-cloud/yandex"
    }
  }
}
 
provider "yandex" {
  zone      = var.def_zone
}
 
data "yandex_vpc_subnet" "default_subnet" {
  name      = var.def_zone
}
 
resource "yandex_compute_instance" "api" {
    name = var.api
 
    resources {
        cores  = var.vm_settings.cores
        memory = var.vm_settings.memory
    }
 
    boot_disk {
        initialize_params {
            image_id = var.boot_disk
        }
    }
 
    network_interface {
        nat       = true
        subnet_id = data.yandex_vpc_subnet.default_subnet.id
    }
 
dynamic "secondary_disk" {
      for_each = yandex_compute_disk.add_disks
      content {
        disk_id    = secondary_disk.value.id
        auto_delete = true
      }
    }
}
 
resource "yandex_compute_disk" "add_disks" {
  for_each = toset(var.disk_names)
  name     = "${each.key}"
  type     = var.disk_type
  zone     = var.def_zone
  size     = var.disk_size
}
 
Все
 
 

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

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

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

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

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





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