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