Редактирование ресурса, который создается через модуль - PullRequest
0 голосов
/ 12 декабря 2018

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

один фрагмент кода

module "ec2-instance" {
  source  = "../common-modules/ec2-instance/"
  aws_instance="monitoring"
  region="ap-south-1"
  subnets=["subnet-a979cb"]
  ami_id="ami-34b4c05b"
  instance_type="t2.medium"
  instance_count=1
  security_group= "sg-aac36ab3"

}

Я использую модуль (../common-modules/ec2-instance/), используемый в фрагменте,в десяти разных местах.

Теперь, в одном из десяти использований (экземпляры ec2), я хочу добавить тег / userdata / любой новый атрибут, но не другим, т.е.я не хочу редактировать исходный код моего модуля, так как это может испортить другие 9 мест, где я назвал модуль.

Не могли бы вы помочь мне, как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Вы можете создать новую версию вашего модуля и указать, что одно из них использует новую версию модуля, а другие 9 указать на старую версию, если вы не можете заставить существующий модуль работать в обоих случаях. Версия модуля .Вы не можете изменить определение модуля на лету

0 голосов
/ 13 декабря 2018

Модули предназначены для использования как таковые;В любом месте, где они используются, поведение и параметры должны быть одинаковыми.Однако вы пытаетесь ввести больше переменных для модуля, не вызывая изменений ни в одном экземпляре модуля, кроме того, который фактически использует переменную (и).

Нет общего ответа, кроме как использовать существующие значения в качестве значений по умолчанию и затем предоставить переменные в вашем модуле, чтобы эти значения по умолчанию могли быть переопределены, только там, где вы хотите, чтобы это произошло (например, ваш единственный модуль из 10),Упомянутые вами примеры (теги, пользовательские данные и т. Д.) Сильно отличаются по поведению от Terraform и поэтому требуют пользовательских решений.

Давайте рассмотрим примеры, которые вы дали:

1) переменные теги: Terraform 0.12.0-alpha1 представила функцию динамический блок , которая позволяет вам иметь ровно ноль тегов на всех ресурсах, кроме тех, для которых вы фактически предоставляете теги, через переменную (например, списоккарты).

Пример: ваш модуль будет иметь переменную с именем tags, которая по умолчанию может быть пустым списком.Внутри ресурса вашего модуля вы реализуете следующее (не проверено, просто интерпретация примера в ссылке Git):

dynamic "tags" {
  for_each = var.tags
  tag {
    key = tags.key
    value = tags.value
  }
}

2) переменная userdata

Добавьте переменную user_data в свой модуль со значением по умолчанию пустой строки (возможно, Terraform 0.12.0 имеет встроенную поддержку нулевых значений, но у меня нет опыта работы с этими данными в сочетании с пользовательскими данными; строки пользовательских данных AFAIK по-прежнему необходимоне менее 1 символа).

Добавьте некоторую интерполяцию при назначении пользовательских данных:

user_data = "${var.user_data == "" ? data.template_file.existing_user_data.rendered : var.user_data}"

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

3) Любой новый атрибут

То же, что и в приведенных выше примерах;найдите способ использовать текущее значение в качестве значения по умолчанию, чтобы ни один модуль не видел изменения, если оно не применено с помощью ввода пользовательских переменных.

...