Редактирование ресурса, который создается через модуль
У меня есть много общих модулей, которые я использую в своей инфраструктуре. Я столкнулся с проблемой в последнее время. Я собираюсь упростить и объяснить один такой случай.
один фрагмент кода
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 ответа
Модули предназначены для использования как таковые; В любом месте, где они используются, поведение и параметры должны быть одинаковыми. Однако вы пытаетесь ввести больше переменных для модуля, не вызывая изменений ни в одном экземпляре модуля, кроме того, который фактически использует переменную (и).
Нет общего ответа, кроме как использовать существующие значения в качестве значений по умолчанию и затем предоставить переменные в вашем модуле, чтобы эти значения по умолчанию могли быть переопределены, только там, где вы хотите, чтобы это произошло (например, ваш один модуль из 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) Любой новый атрибут
То же, что с примерами выше; найдите способ использовать текущее значение в качестве значения по умолчанию, чтобы ни один модуль не видел изменения, если оно не применено с помощью ввода пользовательских переменных.
Вы можете создать новую версию своего модуля и указать, что одно из них использует новую версию модуля, а другие 9 указать на старую версию, если вы не можете заставить существующий модуль работать в обоих случаях. Управление версиями модуля. Вы не можете изменить определение модуля на лету