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

Навигация

⇒ FreeBSD and Nix ⇐

CISCO

Voice(Asterisk\Cisco)

Microsoft

Powershell

Python

SQL\T-SQL

Общая

WEB Разработка

ORACLE SQL \ JAVA

Мото

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

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


Terraform и переменные


Terraform и переменные


Типы перемнных в terraform

Простые типы:

  • String — текстовые значения
  • Number — числовые значения
  • Boolean — булевы значения true или false

Составные типы:

  • List — "списки", упорядоченные коллекции элементов
  • Map — "словари", пары "ключ-значение"
  • Object — структурированные данные с несколькими атрибутами

С простыми все понятно и без объяснений, то с составными разберем синтаксис
После ключевого слова variable указано имя переменной, а в скобках - значение


Доп возможности

sensitive - скрывать значение переменной в выводе terraform apply и terraform plan:

  • sensitive = true

Указывайте sensitive = true для секретов, паролей, токенов и тд
Или хранените секреты в переменные окружения
Не забывайте про параметр, чтоб не вывести значение в консоль или в output-переменные

nullable - защита от пустых значений:

  • nullable = false

Если переменная объявлена, но не определена и у неё нет значения по умолчанию:
При запуске terraform apply потребует ввести для нее значение в интерактивном режиме

Приоритеты переменных (по убыванию приоритета):

  1. -var при вызове в консоли
  2. -var-file
  3. terraform.tfvars
  4. Переменные окружения
  5. Значения по умолчанию


List

Пример (список строк, содержащих подсети):
variable "subnets" {
  type        = list(string)
  # default определяет значение по умолчанию, можно переопределить позже
  default     = ["192.168.1.0/24", "192.168.2.0/24"]
}

Нумерация списка начинается с нуля, пример обращения к элементу списка:
var.subnets[0]


Map

Пример (значения для дефолтного репозитория gitlab):
variable "repo_vars" {
  type = map(number)
  default = {
    name  = "default_user"
    description = "Default repo"
    namespace_id  = 1
  }
}

Пример обращения к элементам словаря:
resource "gitlab_project" "repo_name" {
  name             = var.repo_vars["name"]
  description      = var.repo_vars["description"]
  namespace_id     = var.repo_vars["namespace_id"]
}


Object

Пример 1 переменной-объекта с переменными разного типа:
variable "settings" {
  type = object({
    id   = number
    name = string
  })
  # default определяет значение по умолчанию, можно переопределить позже
  default = {
    id   = 1
    name = "root"
  }

Обращение к значениям объекта:
var.settings.id
var.settings.name

Пример 2 переменной-объекта с вложенной object:
variable "settings" {
  type = object({
    name = string
    tags = map(string)
    enabled = bool
    network_settings = object({
      ip = string
      ports = list(number)
    })
  })
  default = {
    name = "www_server"
    tags = {
      env = "dev"
      proj = "test_project"
    }
    enabled = true
    network_settings = {
      ip = "192.168.1.1/24"
      ports = [80, 443]
    }
  }
}

Обращение к значениям объекта:
var.settings.name
var.settings.tags["env"]
var.settings.tags["proj"]
var.settings.enabled
var.settings.network_settings.ip
var.settings.network_settings.security_groups


Input-переменные

Аналог - принимаемые функцией аргументы

В отдельном файле переменных можно хранить чувствительные данные, добавив его в .gitignore
Например пароли, логины, и тд

Имеют уже знакомые выше доп. атрибуты:

  • default — значение по умолчанию
  • type — тип переменной
  • description — описание переменной
  • validation — блок правил проверки (пример ниже)

variable "repo_description" {
  type        = string
  description = "Тип проекта"
  validation {
    condition = contains(["dev", "prod"], var.repo_description)
    error_message = "Выберите тип проекта: dev или prod"
  }

Пример обращения:
resource "gitlab_project" "repo_name" {
  name             = "test"
  description      = var.repo_description
  namespace_id     = 1
}

Способ передачи input-переменных с помощзью файла с расширением *.tfvars
Файл с именем terraform.tfvars загрузится автоматически
Описывается множество переменных как ключ = значение

Пример структуры проекта:
/
├ main.tf          # Манифест
├ variables.tf     # Файл переменных
├ terraform.tfvars # Значения по умолчанию, загрузятся автоматически
└ env/
 ├ dev.tfvars      # Значения для dev
 └ prod.tfvars     # Значения для prod

Пример запуска манифеста для dev и prod:
terraform apply -var-file="env/dev.tfvars"
terraform apply -var-file="env/prod.tfvars"

Ключ -var-file может указываться несколько раз
Значения последнего файла будут иметь приоритет

Пример, определение или переопределение переменной:
terraform apply -var="var_name=var_value" 

Определение переменной с помощью переменной окружения с префиксом TF_VAR_:
export TF_VAR_var_name="var_value"


Output-переменные

Аналог - возвращаемые функцией аргументы

Для использования в конфигурации можно определить в отдельном файле output.tf

Пример, вернуть информацию о назначенных ip адресах созданного сервера

variables.tf:
variable "do_token" {
  description = "DigitalOcean API Token"
  type        = string
  sensitive   = true
}

terraform.tfvars:
do_token = "your_digitalocean_token_here"
# !!!!!!!!Добавь terraform.tfvars в .gitignore!!!!!!!!

main.tf:
terraform {
  required_providers {
    digitalocean = {
      source  = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }
}
provider "digitalocean" {
  token = var.do_token
}
resource "digitalocean_ssh_key" "default" {
  name       = "terraform-key"
  public_key = file("~/.ssh/id_rsa.pub")
}
resource "digitalocean_droplet" "web" {
  image  = "ubuntu-22-04-x64"
  name   = "web-server"
  region = "fra1"
  size   = "s-1vcpu-1gb"
  ssh_keys = [digitalocean_ssh_key.default.id]

  tags = ["web", "terraform"]
}
# Обращение за назначенным ip созданной вм
output "droplet_ip" {
  value = digitalocean_droplet.web.ipv4_address
}

# Инициализация проекта
terraform init

# Проверка конфигурации
terraform validate

# Планирование изменений
terraform plan
Пример вывода terraform plan:
Changes to Outputs:
 + droplet_ip = (known after apply)

# Применение изменений
terraform apply

# Просмотр состояния
terraform show

# Просмотр output-переменных из текущего файла состояния:
terraform output

# Просмотр конкретной переменной:
terraform output <имя_переменной> 

# Удаление всех ресурсов
terraform destroy

Создание файла из вывода, пример ip для ansible формата:
output "ip_to_ansible" {
  value = <<EOT
    [servers]
    ${yandex_compute_instance.vm_name.network_interface[0].nat_ip_address}
  EOT
}

Создание файла:
terraform output -raw ip_to_ansible > inventory.ini


Local-переменные

Аналог - переменные внутри функции

Не заменяют Input-переменные, используются для локальной логики
бращение к локальной переменной - local.<имя_переменной>

Пример 1:
locals {
  x = 2
  y = 1
  total = local.x - local.y
}

# Выведет разницу 2 - 1
output "result" {
  value = "${local.total}"

Пример 2:
locals {
  settings = {
    vm = {
      image = "ubuntu-22-04-x64"
      name  = "web-server"
    }
  }

resource "digitalocean_droplet" "web" {
  image  = local.settings.vm.image
  name   = local.settings.vm.name
  region = "fra1"
  size   = "s-1vcpu-1gb"
  ssh_keys = [digitalocean_ssh_key.default.id]
}

 


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

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

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

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

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





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