Читаем Terraform: инфраструктура на уровне кода полностью

  type        = list(number)

  default     = [1, 2, 3]

}

А вот ассоциативный массив, который требует, чтобы все значения были строковыми:

variable "map_example" {

  description = "An example of a map in Terraform"

  type        = map(string)

  default = {

    key1 = "value1"

    key2 = "value2"

    key3 = "value3"

  }

}

Вы также можете создавать более сложные структурные типы, используя ограничения object и tuple:

variable "object_example" {

  description = "An example of a structural type in Terraform"

  type        = object({

    name    = string

    age     = number

    tags    = list(string)

    enabled = bool

  })

  default   = {

    name    = "value1"

    age     = 42

    tags    = ["a", "b", "c"]

    enabled = true

  }

}

Выше создается входная переменная, которая требует, чтобы значение было объектом с ключами name (строка), age (число), tags (список строк) и enabled (булево значение). Если попытаться присвоить такой переменной значение, которое не соответствует этому типу, Terraform немедленно вернет ошибку типизации. В следующем примере демонстрируется попытка присвоить enabled строку вместо булева значения:

variable "object_example_with_error" {

  description = "An example of a structural type in Terraform with an error"

  type        = object({

    name    = string

    age     = number

    tags    = list(string)

    enabled = bool

  })

  default   = {

    name    = "value1"

    age     = 42

    tags    = ["a", "b", "c"]

    enabled = "invalid"

  }

}

Вы получите следующую ошибку:

$ terraform apply

Error: Invalid default value for variable

  on variables.tf line 78, in variable "object_example_with_error":

  78:   default   = {

  79:     name    = "value1"

  80:     age     = 42

  81:     tags    = ["a", "b", "c"]

  82:     enabled = "invalid"

  83:   }

This default value is not compatible with the variable's type constraint: a bool is required.

Для примера с веб-сервером достаточно переменной, которая хранит номер порта:

variable "server_port" {

  description = "The port the server will use for HTTP requests"

  type        = number

}

Обратите внимание, что у входной переменной server_port нет поля default, поэтому, если выполнить команду apply прямо сейчас, Terraform сразу же попросит ввести значение для server_port и покажет вам описание description:

$ terraform apply

var.server_port

  The port the server will use for HTTP requests

  Enter a value:

Если вы не хотите иметь дело с интерактивной строкой ввода, можете предоставить значение переменной с помощью параметра командной строки -var:

$ terraform plan -var "server_port=8080"

То же самое можно сделать, добавив переменную среды вида TF_VAR_, где name — имя переменной, которую вы хотите установить:

$ export TF_VAR_server_port=8080

$ terraform plan

Если же вы не хотите держать в голове дополнительные аргументы командной строки при каждом выполнении команды plan или apply, можете указать значение по умолчанию:

variable "server_port" {

  description = "The port the server will use for HTTP requests"

  type        = number

  default     = 8080

}

Чтобы использовать значение входной переменной в коде Terraform, следует воспользоваться выражением типа «ссылка на переменную», которое имеет следующий синтаксис:

var.

Например, так можно присвоить параметрам группы безопасности from_port и to_port значение переменной server_port:

resource "aws_security_group" "instance" {

  name = "terraform-example-instance"

  ingress {

    from_port   = var.server_port

    to_port     = var.server_port

    protocol    = "tcp"

    cidr_blocks = ["0.0.0.0/0"]

  }

}

Хорошей идеей будет использование одной и той же переменной при задании порта в скрипте user_data. Указать ссылку внутри строкового литерала можно с помощью строковой интерполяции, которая имеет следующий синтаксис:

"${...}"

Внутри фигурных скобок можно разместить любую корректную ссылку, и Terra­form преобразует ее в строку. Например, вот как можно воспользоваться значением ­var.server_port внутри строки user_data:

user_data = <<-EOF

            #!/bin/bash

            echo "Hello, World" > index.html

            nohup busybox httpd -f -p ${var.server_port} &

            EOF

Помимо входных переменных, Terraform позволяет определять и выходные. Для этого предусмотрен такой синтаксис:

output "" {

  value =

   [CONFIG ...]

}

NAME — это имя выходной переменной, а в качестве VALUE можно указать любое выражение Terraform, которое вы хотите вывести. CONFIG может иметь два дополнительных (и необязательных) параметра.

•description. Этот параметр всегда желательно применять для документирования того, как используется выходная переменная.

•sensitive. Если присвоить данному параметру true, Terraform не станет сохранять этот вывод в журнал после выполнения команды terraformapply. Это полезно, когда переменная содержит деликатный материал или конфиденциальные данные, такие как пароли или секретные ключи.

Например, вместо того, чтобы вручную бродить по консоли EC2 в поисках IP-адреса своего сервера, вы можете вывести его в виде выходной переменной:

output "public_ip" {

  value       = aws_instance.example.public_ip

  description = "The public IP address of the web server"

}

Перейти на страницу:

Все книги серии Бестселлеры O'Reilly

Искусство управления IT-проектами
Искусство управления IT-проектами

В отличие от множества трудов, посвященных руководству проектами и командами, в этой книге не проповедуются никакие новые учения и не превозносятся великие теории. Скотт Беркун считает залогом успеха практику и разнообразие подходов. В книге описываются основные сложности и проблемные ситуации, возникающие в работе менеджера проекта, даны рекомендации по выходу из них.Издание предназначено не только для лидеров команд и менеджеров высшего звена, но и для программистов, тестеров и других исполнителей конкретных проектных заданий. Также оно будет полезно студентам, изучающим бизнес-менеджмент, проектирование изделий или программную инженерию.Текст нового издания значительно переработан автором с целью добиться большей ясности, кроме того, книга дополнена новым приложением и более чем 120 практическими упражнениями.

Скотт Беркун

Деловая литература
iOS. Приемы программирования
iOS. Приемы программирования

Книга, которую вы держите в руках, представляет собой новый, полностью переписанный сборник приемов программирования по работе с iOS. Он поможет вам справиться с наболевшими проблемами, с которыми приходится сталкиваться при разработке приложений для iPhone, iPad и iPod Touch. Вы быстро освоите всю информацию, необходимую для начала работы с iOS 7 SDK, в частности познакомитесь с решениями для добавления в ваши приложения реалистичной физики или движений — в этом вам помогут API UIKit Dynamics.Вы изучите новые многочисленные способы хранения и защиты данных, отправки и получения уведомлений, улучшения и анимации графики, управления файлами и каталогами, а также рассмотрите многие другие темы. При описании каждого приема программирования приводятся образцы кода, которые вы можете смело использовать.

Вандад Нахавандипур

Программирование, программы, базы данных / Программирование / Книги по IT

Похожие книги