Лучшая практика использования переменных для настройки и создания нового экземпляра репозитория 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 между экземплярами, но вы можете добавить любые дополнительные атрибуты, которые вам нужны для каждого из элементов, а затем получить к ним доступ через внутри блока.

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

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

      output "repository_ids" {
  value = tomap({
    for k, r in github_repository.all : k => r.repo_id
  })
}
Другие вопросы по тегам