Как я могу разделить создание ресурса на разные модули с помощью Terraform?

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

В этом примере я хочу создать веб-приложение (я использую поставщик azurerm). Я сделал это, добавив в модуль следующее:

resource "azurerm_app_service" "test" {
  name                = "${var.app_service_name}"
  location            = "${var.location}"
  resource_group_name = "${var.resource_group_name}"
  app_service_plan_id = "${var.app_service_plan_id}"

  app_settings {
    SOME_SETTING = "${var.app_setting}"
  }
}

Это работает, но хотелось бы иметь отдельный модуль для применения настроек приложения, поэтому:

  • Модуль 1 создает веб-приложение
  • Модуль 2 применяет настройки приложения
  • Потенциальный модуль 3 применяет что-то еще к веб-приложению

Это возможно? Я попытался разделить его (имея два модуля, определяющих веб-приложение, но только один из них, содержащий настройки приложения), но я получаю сообщение об ошибке о том, что веб-приложение уже существует, поэтому он, похоже, не понимает, что я пытаюсь манипулировать одним и тем же ресурсом.

Подробная информация о том, как это будет использоваться: я собираюсь предоставить пользовательский интерфейс для конечного пользователя, в котором он / она может выбрать набор необходимых ресурсов и отметить ряд параметров, необходимых для проекта этого человека. , с заполнением необходимых параметров инфраструктуры.

После завершения и отправки параметры применяются к шаблону Terraform. Невозможно иметь шаблон для каждой перестановки опций, поэтому он должен будет включать разные модули в зависимости от выбранных опций.

Например: если пользователь отмечает веб-приложение, Cosmos DB и аналитику приложения, шаблон Terraform будет включать эти модули (используя трюк подсчета для создания условий). В этом примере мне нужно передать ключ инструментария из аналитических данных приложения в настройки приложения веб-приложения, и здесь моя проблема.

Если пользователь не выбрал аналитику приложения, мне не нужны настройки для веб-приложения, и именно поэтому мне нужно постепенно создавать ресурс Terraform. Кроме того, в зависимости от типа базы данных, которую выбрал пользователь, в настройки веб-приложения будут добавлены различные параметры.

Итак, моя идея - создать модуль для применения определенных настроек приложения. Я не знаю, возможно ли это (или существует лучший способ), поэтому мой вопрос.


person Casper    schedule 01.02.2019    source источник
comment
почему ты хочешь сделать это? Можете ли вы привести более полный / конкретный пример того, чего вы пытаетесь здесь достичь?   -  person ydaetskcoR    schedule 01.02.2019
comment
Конечно. Я создаю общий шаблон, который будут использовать разные потребители. У них могут быть немного разные требования. Возможно, кому-то вообще не нужны настройки приложения, а другому они нужны, или кому-то может понадобиться SQL-сервер и, следовательно, потребуется набор дополнительных настроек. Другим примером является WAF, где один потребитель может быть заинтересован в наличии некоторых исключений из правил и, следовательно, для этой цели ему нужен блок конфигурации, тогда как другому потребителю это может не потребоваться.   -  person Casper    schedule 01.02.2019
comment
Этот процесс будет автоматизирован, поэтому я не буду менять шаблон вручную для каждого потребителя. Вот почему было бы неплохо постепенно наращивать ресурс в зависимости от того, какие функции выбирает потребитель.   -  person Casper    schedule 01.02.2019
comment
Было бы полезно, если бы вы могли отредактировать свой вопрос, чтобы показать, как разные люди хотели бы использовать модуль.   -  person ydaetskcoR    schedule 01.02.2019
comment
@ydaetskcoR Я добавил вариант использования в конце своего вопроса. Надеюсь, этого достаточно, чтобы понять, зачем мне это нужно.   -  person Casper    schedule 01.02.2019


Ответы (2)


Лучший способ сделать это - обернуть terraform сценарием bash или любым другим языком сценариев, который вы хотите (python). Затем создайте шаблон в bash или python (jinja2) для создания ресурса с любыми параметрами, выбранными клиентом для настроек, запустите шаблон для генерации кода терраформы, а затем примените его.

Я довольно часто делал это с ведрами S3. В terraform 0.12 вы можете создавать шаблоны в terraform.

person victor m    schedule 01.02.2019
comment
Спасибо за Ваш ответ. Правильно ли предположить, что это означает, что в настоящее время невозможно достичь только Terraform? Я немного прочитал о шаблонах в 0.12 и попробовал превью. Я не уверен, что смогу добиться желаемого с помощью шаблонов. - person Casper; 06.02.2019
comment
0.12 динамических вложенных блоков, которые предположительно могут достичь того же hashicorp.com/blog/ - person victor m; 06.02.2019
comment
Я не совсем уверен, как динамические блоки решают то, что я пытаюсь достичь. Разве это не будет беспорядок конкатенации списков и смешанных условий? - person Casper; 07.02.2019
comment
Что ж, вы можете передать настройки в terraform и, используя динамические блоки, вы можете просмотреть их, чтобы создать блок app_settings, настроенный для каждого клиента. Вы даже можете передать настройки как JSON и проанализировать их с помощью data.external - person victor m; 07.02.2019
comment
Я прошу прощения за поздний ответ. Я не уверен, что это сработает так, как хотелось бы. Я не думаю, что можно создавать настройки приложения с помощью динамических блоков, но вместо этого мне нужно было бы определить всю карту настроек приложения, поскольку настройки приложения являются самим блоком. Я немного поигрался с предварительным просмотром, пытаясь объединить динамические блоки и циклы (используя примеры, которые они предоставляют), тоже безуспешно. Возможно, мне стоит попробовать еще раз. - person Casper; 18.02.2019

Я знаю, что ему 5 месяцев назад, но я думаю, что часть ситуации здесь заключается в том, что способ, которым вы описываете разделение, не совсем соответствует тому, как модули предназначены для использования. Во-первых, вы не можете «наращивать ресурс» динамически, так как Terraform декларативен по своему замыслу. Вы можете только определить ресурс, а затем динамически предоставить его предопределенные входы (включая его количество для активации / деактивации). Во-вторых, модули никоим образом не нужны для включения и выключения частей стека через конфигурацию. Модули - это просто способ группировки наборов ресурсов вместе для сдерживания и повторного использования. Любой динамизм, доступный вам со стеком, состоящим из сложной иерархии модулей, будет в равной степени доступен с по существу одним и тем же кодом в гигантском монолитном блоке. Монолит будет просто беспорядком, вот в чем проблема, и вы не сможете использовать его части для других целей. Наконец, использование модуля для предоставления настроек - не совсем то, для чего они нужны. Да, теоретически вы могли бы создать модуль с «null_data_source», а затем использовать его просто как своего рода прокладку для предоставления настроек, но, вероятно, это будет запутанный ненужный подход к чему-то, что лучше сделать, просто предоставив переменную так, как вы уже показано.

Вероятно, вам потребуется обернуть это в какой-то сценарий bash (и т. Д.) На верхнем уровне, как упоминалось в других ответах, и это не ограничение terraform. Например, если у вас есть модули, вы захотите сохранить все применяемые в данный момент стеки (для каждого клиента или чего-то еще) в каком-то репозитории композиции. Как вы будете создавать наборы композиций для этих клиентов после того, как они заполнят форму настройки? Вам придется сделать это с помощью некоторой автоматизации создания файлов, для которой Terraform не предназначен. Terraform предназначен для выполнения существующих стеков. Это не ограничение Terraform, что вы должны для начала создавать файлы .tf с помощью внешнего текстового редактора, и это не ограничение, что в такой ситуации вы должны использовать некоторые внешние сценарии для динамического создания стеков композиции для клиента. , это лишь часть того, как вы использовали бы автоматизацию, чтобы подготовить Terraform к выполнению своей работы по применению стеков.

Таким образом, вы не можете избежать этого внешнего инструментария-скрипта, и вы, вероятно, использовали бы его для создания папок для конкретных стека композиций клиента (которые относятся к вашим модулям), заполнения папок файлами по умолчанию и для создания файла .tfvars на основе клиенты вводят данные из формы. Тогда вы можете сделать это несколькими способами:

  1. У вас есть файл .tfvars, который является единственной разницей между стеками состава клиентов. Независимо от того, какие модули вы используете или не хотите использовать, они будут активированы / деактивированы упомянутым вами «счетным трюком» с учетом переменных из .tfvars. Преимущество этого способа состоит в том, что его легко рассуждать, поскольку все стеки составления клиентов - это одно и то же, только настроенные по-разному.

  2. У вас может быть инструмент, который действительно вставляет определения модулей, которые вы хотите, в файлы стека композиции. Это позволит создать более лаконичные стеки композиции с меньшим количеством трюков со счетом, но стопка каждого покупателя будет представлять собой свою странную снежинку.

Что касается разделения модулей, имейте в виду, что в этом есть целое искусство / наука / философия. Я отсылаю вас к этому ресурсу по шаблонам проектирования IAC и этот доклад на эту тему (соответствующий фрагмент начинается в 19:15). Это общий контекст по предмету.

В вашем конкретном случае вы в основном захотите поместить все самые маленькие делимые функциональные блоки (которые могут быть включены / выключены) в их собственные модули, на каждый из которых будут ссылаться модули, потребляющие более высокого уровня. Вы упомянули, что невозможно иметь модуль для каждой перестановки, опять же, вы неправильно думаете об этом. Вы бы нацелились на что-то, что было бы скорее деревом модулей и комбинаций. На верхнем уровне у вас будет инструмент (bash и т. Д.), Который создает папку композиции новых клиентов, их файл .tfvars и помещает в тот же стек композиции, который будет наверху «дерева модулей». Каждый модуль, представляющий необязательную часть стека клиентов, будет подсчитан. Эти модули будут либо иметь функциональные ресурсы внутри, либо будут промежуточными модулями, которые сами создают настраиваемый набор альтернативных подмодулей, содержащих ресурсы.

Но вам придется сесть и продумать дизайн «дерева решений», реализованного в виде иерархии модулей, которая охватывает все перестановки, для которых невозможно создать отдельные монолитные стеки.

Динамические вложенные блоки TFv12 помогут вам, в частности, с одним аспектом наличия или отсутствия объявленного блока, такого как app_settings. Поскольку вы не можете «создавать ресурс» динамически, единственной альтернативой в подобном случае было бы наличие промежуточного модуля, который объявляет ресурс несколькими способами (с блоком app_settings и без него), и один из них будет выбран через «count трюк »или другая конфигурация входа. Теперь, когда существуют динамические блоки, в подобных вещах нет необходимости.

person user1169420    schedule 10.07.2019