Как использовать циклы в Terraform
Сетевая инфраструктура является важным элементом для многих организаций. Преимущества использования облачных сервисов заставили многие организации перенести свои рабочие нагрузки в облако. Эффективное управление ресурсами внутри этих облачных инфраструктур требует передовых навыков (инструментов) и хорошего опыта. На сегодняшний день существует множество инструментов для автоматизации облачной инфраструктуры. Terraform — один из таких инструментов, который в последнее время приобрел огромную популярность в мире DevOps.
Что такое Терраформ?
Terraform — это инструмент с открытым исходным кодом, разработанный и поддерживаемый HashiCorp. Он использует собственный язык конфигурации Hashicorp — HCL для предоставления нескольких поставщиков облачных услуг. По сути, Terraform сравнит вашу текущую конфигурацию инфраструктуры с желаемым состоянием и изменит только те части инфраструктуры, которые необходимы для достижения желаемого состояния.
Terraform использует подключаемые модули, которые он называет провайдерами, соответствующими различным поставщикам облачных и корпоративных услуг, таким как AWS, Azure, vSphere и т. д. Проект terraform содержится в собственном каталоге, который содержит различные файлы, связанные с проектом. Terraform не влияет на все ресурсы вашей облачной учетной записи; он имеет дело только с компонентами, которые управляются через его план. Он использует файлы состояния (в формате JSON) для хранения текущего состояния инфраструктуры.
Что отличает Terraform?
Одна из интересных вещей, которая отличает Terraform от других инструментов, заключается в том, что он позволяет вам сказать, чего вы хотите, и он решит, как это получить, не беспокоясь обо всех командах базового уровня, чтобы это сделать. Другой менее известный факт (или вы, возможно, уже знаете об этом) заключается в том, что плагины, которые связываются с API-интерфейсами поставщика облачных услуг, в настоящее время разрабатываются самим поставщиком облачных услуг. Это означает, что AWS сама поддерживает своего поставщика AWS для Terraform. Это хорошо, поскольку провайдер будет постоянно обновлять пространство API AWS.
Что мы здесь узнаем?
В этом уроке я покажу вам, как использовать циклические конструкции в Terraform. Мы увидим несколько примеров использования некоторых конструкций цикла. Давайте теперь продолжим этот пост.
Давайте начнем…
В terraform существуют различные типы конструкций циклов, каждый из которых имеет свой конкретный случай использования:
1. Параметр count: создает несколько копий ресурса или модуля. Аргумент счетчика приведет к тому, что количество объектов равно значению счетчика для этого ресурса или модуля. Аргумент count принимает целое число.
Существует также объект типа count, который работает с аргументом count. Используя этот объект, мы меняем конфигурацию для каждого экземпляра. Он использует «индекс» в качестве единственного атрибута. Номер индекса начинается с нуля. Позже мы увидим использование каждого случая.
Пример использования параметра count:
В приведенном ниже примере показана процедура создания нескольких идентичных экземпляров EC2:
resource "aws_instance" "web-ec2" {
count = 5
ami = “ami-xxxx”
instance_type = “t2.micro”
}
Пример вывода:
Plan: 5 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value:
Приведенный выше код создаст 5 идентичных экземпляров EC2. Если нам нужно создать несколько экземпляров EC2 с разными именами, приведенный выше код будет изменен следующим образом:
resource "aws_instance" "web-ec2" {
count = 5
ami = ami-xxxx
instance_type = t2.micro
tags {
Name = “my-server-${count.index}”
}
}
Приведенная выше конфигурация приведет к созданию пяти экземпляров EC2 с именами: от my-server-0 до my-server-4.
2. Выражения «для»: выражение «для» в Terraform перебирает элементы внутри списка, карты, объекта и т. д. Оно имеет следующий синтаксис:
[for <item or element> in <Name_of_List> : <OUTPUT>]
Здесь «Name_of_List» — это имя списка для повторения. «Элемент» или «элемент» — это имя переменной, прикрепленной к каждому элементу в приведенном выше списке.
Пример использования выражения «для»: приведенный ниже код напечатает заглавные буквы элементов внутри списка:
variable "demo" {
description = "A list of items"
type = list(string)
default = ["one", "two", "three"]
}
output "upper_case" {
value = [for name in var.demo : upper(name)]
}
3. Выражения for_each: Terraform представила выражения for_each начиная с версии 0.12. Используя это выражение, мы можем перебирать элементы внутри списка, набора и сопоставления. Мы можем использовать это выражение для создания многочисленных реплик полного ресурса или реплик встроенного блока внутри ресурса. Основной формат выражения for_each:
resource "<Name_of_the_Provider>_<Type_of_resource>" "<identifier>" {
for_each = <COLLECTION(set or map)>
[Code ...]
}
Здесь укажите провайдера вместо ‘Name_of_the_Provider’. ‘Type_of_resource’ указывает тип ресурса, который нужно получить.
Пример использования выражения for_each: В приведенном ниже примере показано, как создавать пользователей IAM с помощью выражения for_each:
resource "aws_iam_user" "iam-accounts" {
for_each = toset( ["tecofers", "HowToForge", "Demo"] )
name = each.key
}
Функция toset используется для преобразования в наборы. «each.key» — это ключ карты относительно экземпляра. Точно так же «каждое значение» — это значение карты относительно экземпляра. Приведенный выше код создаст трех пользователей IAM, упомянутых в списке.
Примечание. Конструкции count и for_each не могут присутствовать одновременно.
Подведение итогов
В этом руководстве мы узнали о различных конструкциях циклов в Terraform и о том, как их можно использовать. В следующем посте мы постараемся изучить модули Terraform, так что следите за новостями HowToForge.
Ссылка: https://mediaspace.wisc.edu/media/Introduction+to+and+Managing+Infrastructure+with+Terraform+-+Brian+Hill/1_qhr9c1os