Введение
Выходы Terraform используются для извлечения информации о ресурсах инфраструктуры из состояния проекта.Utilizing другие возможности языка конфигурации Hashicorp (HCL), который использует Terraform, информация о ресурсах может быть запрошена и трансформирована в более сложные структуры данных, такие как списки и мапы.Выходы удобны для предоставления информации внешним программам, которые могут работать с созданными ресурсами инфраструктуры.
В этом учебнике вы узнаете о синтаксисе выходов Terraform и их параметрах, создавая простую инфраструктуру, устанавливающую Droplets.Также вы научитесь программно разбирать выходы, конвертируя их в JSON.
Преrequisites
- Личный токен доступа DigitalOcean, который вы можете создать через консоль управления DigitalOcean. Инструкции вы можете найти в документации DigitalOcean продукта, Как создать личный токен доступа.
- Проверьте установку Terraform на вашем локальном компьютере и подготовьте проект с использованием провайдера DigitalOcean. Завершите первый и второй шаги из учебника по использованию Terraform с DigitalOcean, и не forget to name the project folder
terraform-outputs
, instead ofloadbalance
. В Step 2 не включите переменнуюpvt_key
и ресурс SSH-ключа.Информацию о типах данных и циклах HCL. Чтобы получить более подробную информацию, обратитесь к учебнику How To Improve Flexibility Using Terraform Variables, Dependencies, and Conditionals. - Примечание: Этот учебник был тестирован при использовании Terraform
1.0.2
.
Определение выходов
В этой секции вы Declare a Droplet, deploy it to the cloud, and learn about outputs by defining one that will show the Droplet’s IP address.
Создайте и откройте файл droplets.tf
для редактирования в директории terraform-outputs
, которую вы создали как предварительное условие:
Добавьте ниже описание ресурса Droplet и определения выходов:
Вы сначала объявляете ресурс Droplet, названный web
. Его фактическое имя в облаке будет test-droplet
, в регионе fra1
, работающий под Ubuntu 20.04.
Затем вы объявляете выходной параметр под названием droplet_ip_address
. В Terraform выводы используются для экспорта и отображения внутренних и вычисленных значений, а также информации о ресурсах. Здесь вы устанавливаете параметр value
, который принимает данные для вывода, в виде IP-адреса объявленного Droplet. В момент объявления он неизвестен, но становится доступным после развертывания Droplet. Выводы отображаются и доступны после каждого развертывания.
Сохраните и закройте файл, затем разверните проект, выполнив следующую команду:
Введите yes
для применения при появлении запроса. Конец вывода будет похож на это:
Выделенный IP-адрес принадлежит вашему только что развернутому Droplet. Применение проекта разворачивает ресурсы в облаке и отображает выводы в конце, когда все атрибуты ресурса становятся доступны. Без вывода droplet_ip_address
Terraform не покажет дополнительной информации о Droplet, кроме того, что он развернут.
Выводы также можно отобразить с помощью команды output
:
Вывод будет содержать все выходы
проекта:
Outputdroplet_ip_address = ip_address
Вы также можете запросить конкретный вывод по имени, указав его в качестве аргумента:
Для droplet_ip_address
вывод будет состоять только из IP-адреса:
Outputip_address
Кроме указания обязательного параметра value
, выводы имеют несколько опциональных параметров:
описание
: встраивает короткую документацию, описывающую то, что отображает выход.зависит_от
: метапараметр, доступный для каждого ресурса, который позволяет явно указать ресурсы, на которые выход зависит, которые Terraform не может автоматически определить в процессе планирования.сензитивный
: принимает boolean значение, которое предотвращает отображение содержимого выхода после установки, если его установить вtrue
.
Параметр сензитивный
полезен, когда журналы установки Terraform будут доступны для всех, но содержимое выхода должно быть скрыто. Теперь вы добавите его к определению ресурса Droplet.
Откройте droplets.tf
для редактирования и добавьте выделенную строку:
Сохраните и закройте файл, когда это будете делать. Установите проект снова, выполнив:
Введите yes
, когда вас просят. Видите, что выход будет защищен:
Если он обозначен как сензитивный
, выход и его содержимое все же будут доступны через другие каналы, такие как просмотр состояния Terraform или запрос выходов напрямую.
В следующем шаге вы создадите другой Droplet и структуру выходов, поэтому уничтожите те, которые уже были установлены, выполняя:
В конце вы увидите:
Output...
Destroy complete! Resources: 1 destroyed.
Вы объявили и установили Droplet и создали выход, который показывает его IP-адрес. Теперь вы узнаете, как использовать выходы для отображения более сложных структур, таких как списки и мапы.
ИсходящиеComplexStructures
В этой секции вы используют ключ count
для развертывания множества Droplets из одного определения, а также вывод их адресов интернета в различных форматах.
Использование цикла
Вы должны изменить определение ресурса Droplet, поэтому откройте его для редактирования:
Измените его так, как это показано ниже:
Вы установили, что должен быть создан три Droplet с помощью ключа count
и добавили текущей индексу имена Droplet, чтобы позже можно было раз区別 между ними. Удалите существующий вывод ниже. Когда вы это делаете, сохраните и закрыть файл.
Применьте код, выполнив:
Терраформ будет планировать создание трех нумерованных Droplet, называемых test-droplet-0
, test-droplet-1
, и test-droplet-2
. Введите yes
при просьбе завершить процесс. В конце вы получите такой вывод:
Output...
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
Это значит, что все три Droplet успешно развернуты и все информация о них устранены в статусе проекта.
Самый простой способ получить свойства ресурсов – это использовать выходы, но создавая один для каждого Droplet не Rentabil’no. решение заключается в использовании цикла for
для прохождения списка Droplets и сбора их атрибутов, либо альтернативно использовать splat expressions (о которых вы узнаете позже в этом шаге).
Вы сначала определите выход, который будет выводить IP-адреса трех Droplet’ов, сопоставленных с их именами. Откройте droplets.tf
для редактирования:
Добавьте следующие строки:
Значение выхода droplet_ip_addresses
создано с использованием цикла for
. T since it’s surrounded by braces, the resulting type will be a map. The loop traverses the list of Droplets, and for each instance, pairs its name with its IP address and appends it to the resulting map.
сохраните и закройте файл, затем примените проект снова:
Введите yes
, когда потребуется, и вы получите содержимое выхода в конце:
Выход droplet_ip_addresses
детально описывает IP-адреса трех развернутых droplet’ов.
С использованием команды Terraform output
, вы можете получить содержимое выхода в JSON с помощью ее аргумента команды:
Результат будет схож с следующим:
JSON parsing is widely used and supported in many programming languages. This way, you can programmatically parse the information about the deployed Droplet resources.
Использование выражений Splat
Выражения Splat предлагают компактный способ итерации по всем элементам списка и сбор содержимого атрибута из каждого из них, в результате чего получается список. Выражение Splat, которое бы извлекало IP-адреса трех развернутых droplet’ов, имело бы следующий синтаксис:
Символ [*]
идет по списку слева и для каждого из элементов берет содержимое его атрибута, указанного справа. Если ссылка слева не является списком самой по себе, она будет преобразована в такой, где она будет единственным элементом.
Вы можете открыть droplets.tf
для редактирования и изменить следующие строки, чтобы реализовать это:
После сохранения файла примените проект, запустив следующую команду:
Вы получите выходной результат, который теперь является списком и содержит только IP-адреса Droplet’ов:
Чтобы получить выходной результат в формате JSON, запустите следующую команду:
Выходной результат будет один массив:
Вы использовали выходные данные вместе с выражениями Splat и циклами for
, чтобы экспортировать IP-адреса развернутых Droplet’ов. Вы также получили содержимое выходных данных в формате JSON, и теперь вы будете использовать jq
— инструмент для динамического фильтрации JSON по указанным выражениям, чтобы их проанализировать.
Извлечение данных при помощью jq
В этой шаге вы установите и освоите базовые функции jq
, который является инструментом для манипуляции документами в формате JSON. Вы будете использовать его для обработки результатов проекта Terraform.
Если вы работаете на Ubuntu, вы можете выполнить следующий командой для установки jq
:
На macOS вы можете использовать Homebrew для его установки:
jq
применяет предисловие обработки к полученным данным и может быть передан через знак «pipe» (|). Самым легким делом в jq
является распечатка полученного документа без изменений:
Принимая во внимание оператор идентификатора (.
), это значит что все документы JSON, полученные из входа, должны быть выведены без изменений:
Вы получите вывод:
Можно также получить только первую адресную часть используя символы внутри квартетов:
Ответ будет:
Чтобы получить результат обработки в виде массива, вы можете записать выражение внутри квартетов:
Вы получите красиво печатённый JSON-массив:
Можно получить части массива вместо одних элементов, указав диапазон индексов внутри квартетов:
Разrange <код>0:2 возвращает первые два элемента — верхняя часть диапазона (<код>2) не включается, поэтому получаются элементы позиций <код>0 и <код>1.
Вы можете теперь разрушить выделенные ресурсы, выполнив:
В этой стадии вы установили <код>jq и использовали его для обработки и изменения выходов вашего проекта Terraform, который развертывает три приложения.
КонCLЮЗИЯ
Вы научились о работе выходов Terraform, используя их для показа деталей объектов, которые были развернуты. Вы также использовали выходы, чтобы показать атрибуты одного ресурса, а также для построения мап и список, содержащие атрибуты ресурсов.
Для более подробной информации о функциях <код>jq, посетите официальную документацию.
Этот урок является частью серии Как управлять инфраструктурой с Terraform . Серия рассмотряет ряд вопросов, от первого столба установки Terraform до управления сложными проектами.