Могу ли я использовать Terragrunt в Terraform Cloud

У меня есть конвейер подготовки, который включает Terraform Cloud, и наше руководство просит нас использовать Terragrunt для улучшения качества кода Terraform. Terragrunt - отличный инструмент для этого, но я не вижу никаких доказательств того, что кто-то успешно использовал его в Terraform Cloud. Кто-нибудь может решить эту проблему? Пожалуйста, отвечайте только в том случае, если вы 1) сделали это сами или 2) можете предоставить документацию о том, что это возможно, или предоставить документацию, что это не очень хорошая идея или невозможно с Terraform Cloud.

3 ответа

Решение

Террагрунт ожидает, что ты побежишь terragrunt команды, и под капотом он работает terraform команды, передавая TF_VAR_*переменные среды. TFC также работаетterraformкоманды напрямую. Следовательно, вы не можете запустить Terragrunt в TFC - он не выполнитterragrunt двоичный, только terraform двоичный.

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

Чтобы настроить это, сначала вам нужно получить токен API и настроить CLI сcredentials блокировать .terraformrc.

Далее, вам нужно сгенерировать Abackend блок:

generate "remote_state" {
  path      = "backend.tf"
  if_exists = "overwrite_terragrunt"
  contents = <<EOF
terraform {
  backend "remote" {
    hostname = "app.terraform.io" # Change this to your hostname for TFE
    organization = "your-tfc-organization"
    workspaces {
      name = "your-workspace"
    }
  }
}
EOF
}

Этот код создает файл с именем backend.tfвместе с вашим модулем Terraform. Это указывает Terraform на использование TFC в качестве удаленного сервера. Он будет использовать рабочее пространство под названиемyour-workspace. Если это рабочее пространство не существует, TFC создаст его автоматически, используя неявное создание рабочего пространства. У вас будет одно рабочее пространство для каждого модуля, который вы вызываете в Terragrunt.

TFC не поддерживает TF_VAR_*переменные окружения, которые поддерживает "стандартный" Terraform. Таким образом, Terragruntinputs block, который является стандартным способом передачи переменных Terragrunt в Terraform, не работает.

Вместо этого вы можете создать *.auto.tfvarsфайл. Вы также можете сгенерировать этот файл в Terragrunt:

generate "tfvars" {
  path      = "terragrunt.auto.tfvars"
  if_exists = "overwrite"
  disable_signature = true
  contents = <<-EOF
name = "your-name"
EOF
}

Все переменные, необходимые для модуля, должны быть переданы в contentsheredoc выше. Более гибкий шаблон - использовать localsблок для настройки переменных, затем просто передайте их вcontent блок.

Последняя проблема заключается в том, что когда рабочая область создается автоматически, у нее не будет учетных данных API (например, AWS_ACCESS_KEY_ID а также AWS_SECRET_ACCESS_KEY), которые необходимы для взаимодействия с поставщиком облачных услуг. Вы можете определить это в конфигурации провайдера, создавprovider.tfфайл, но тогда учетные данные статичны и представлены в виде обычного текста. Не хорошо.

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

В обоих случаях вам понадобится рабочее пространство для каждого модуля, вызываемого Terragrunt.

См. Также: это сообщение в блоге по теме и материалы по интеграции с Terragrunt.

Я получил прямой ответ от Джоша Падника из Gruntwork, что на данный момент нет конкретных планов по выполнению этой работы, и подтвердил, что в настоящее время это не может работать, насколько ему известно. Я ценю все ответы!

На самом деле единственное, что мешает terragrunt довольно легко взаимодействовать с рабочими пространствами VCS в tfcloud, - это то, что он помещает все свои файлы в кеш terragrunt, и там он пропускает имена каталогов через хэши, чтобы предотвратить конфликт. Мы создали вспомогательную утилиту для решения этого варианта использования под названием terrastage. Он использует библиотеки terragrunt, но вместо того, чтобы помещать файлы в кеш terragrunt с использованием хешированных имен, он дает вам контроль над тем, где вы хотите разместить файлы, позволяя ему довольно легко взаимодействовать с рабочими пространствами VCS облака terraform. Вы можете использовать тот же подход, чтобы заставить terragrunt действительно работать с любым родным инструментом terraform.

Я выложил его на github в разделе JasonPodgorny/terrastage, если это кому-то поможет.

Другие вопросы по тегам