Лучшая практика использования переменных для настройки и создания нового экземпляра репозитория Github в Terraform вместо обновления на месте
Я пытаюсь настроить стандартный шаблон репозитория Github для своей организации, который использует Terraform для запуска новых репозиториев с настроенными параметрами.
Каждый раз, когда я пытаюсь обновить файл конфигурации, чтобы создать новый экземпляр репозитория с новым именем, вместо этого он будет пытаться обновить на месте любое репо, которое уже было создано с использованием этого файла.
Мой вопрос: как лучше всего сделать мой файл конфигурации многоразовым с входными переменными, такими как имя репо? Должен ли я создать модуль или есть другой способ повторно использовать этот файл?
Спасибо за помощь.
1 ответ
Terraform - это система конфигурации желаемого состояния, что означает, что ваша конфигурация должна представлять полный набор объектов, которые должны существовать, а не инструкцию для создания одного объекта.
Поэтому типичный способ добавления нового репозитория - это добавить новый блок, объявляющий этот новый репозиторий, и оставить существующие без изменений. Затем Terraform увидит, что есть новый ресурс, который в настоящее время не отслеживается в штате, и предложит создать его.
Если ваши репозитории настроены систематическим образом, который вы можете описать с помощью механического правила, а не ручной настройки, вы потенциально можете использовать мета-аргумент для объявления нескольких экземпляров ресурсов из одного и того же блока ресурсов, используя выражения языка Terraform для описания систематического правила. .
Например, вы можете создать локальное значение с высокоуровневой структурой данных, которая описывает, что должно различаться между вашими репозиториями, а затем использовать эту структуру данных в одном блоке:
locals {
repositories = tomap({
example_1 = {
description = "First example repository"
}
example_2 = {
description = "Second example repository"
}
})
}
resource "github_repository" "all" {
for_each = local.repositories
name = each.key
description = each.value.description
private = true
}
Для простоты в этом примере я сделал только переменные name и description между экземплярами, но вы можете добавить любые дополнительные атрибуты, которые вам нужны для каждого из элементов, а затем получить к ним доступ через
В
А
output "repository_ids" {
value = tomap({
for k, r in github_repository.all : k => r.repo_id
})
}