Версия Terraform
Terraform v0.12.1
Файлы конфигурации Terraform
main.tf
в моем корневом провайдере:
provider "google" {}
module "organisation_info" {
source = "../../modules/organisation-info"
top_level_domain = "smoothteam.fi"
region = "us-central1"
}
module "stack_info" {
source = "../../modules/stack-info"
organisation_info = "${module.organisation_info}"
}
Вот модуль "информация об организации":
variable "top_level_domain" {}
variable "region" {}
data "google_organization" "organization" {
domain = "${var.top_level_domain}"
}
locals {
organization_id = "${data.google_organization.organization.id}"
ns = "${replace("${var.top_level_domain}", ".", "-")}-"
}
output "organization_id" {
value = "${local.organization_id}"
}
output "ns" {
value = "${local.ns}"
}
Затем модуль 'stack-info':
variable "organisation_info" {
type = any
description = "The organisation-scope this environment exists in."
}
module "project_info" {
source = "../project-info"
organisation_info = "${var.organisation_info}"
name = "${local.project}"
}
locals {
# Use the 'default' workspace for the 'staging' stack.
name = "${terraform.workspace == "default" ? "staging" : terraform.workspace}"
# In the 'production' stack, target the production project. Otherwise, target the staging project.
project = "${local.name == "production" ? "production" : "staging"}"
}
output "project" {
value = "${module.project_info}" # COMMENTING THIS OUTPUT REMOVES THE CYCLE.
}
И, наконец, модуль "информация о проекте":
variable "organisation_info" {
type = any
}
variable "name" {}
data "google_project" "project" {
project_id = "${local.project_id}"
}
locals {
project_id = "${var.organisation_info.ns}${var.name}"
}
output "org" {
value = "${var.organisation_info}"
}
Вывод отладки
После выполнения terraform destroy -auto-approve
я получаю:
Error: Cycle: module.stack_info.module.project_info.local.project_id, module.stack_info.output.project, module.stack_info.module.project_info.data.google_project.project (destroy), module.organisation_info.data.google_organization.organization (destroy), module.stack_info.var.organisation_info, module.stack_info.module.project_info.var.organisation_info, module.stack_info.module.project_info.output.org
И terraform graph -verbose -draw-cycles -type=plan-destroy
дает мне этот график: Источник:
digraph {
compound = "true"
newrank = "true"
subgraph "root" {
"[root] module.organisation_info.data.google_organization.organization" [label = "module.organisation_info.data.google_organization.organization", shape = "box"]
"[root] module.stack_info.module.project_info.data.google_project.project" [label = "module.stack_info.module.project_info.data.google_project.project", shape = "box"]
"[root] provider.google" [label = "provider.google", shape = "diamond"]
"[root] module.organisation_info.data.google_organization.organization" -> "[root] module.stack_info.module.project_info.data.google_project.project"
"[root] module.organisation_info.data.google_organization.organization" -> "[root] provider.google"
"[root] module.stack_info.module.project_info.data.google_project.project" -> "[root] provider.google"
}
}
Ожидаемое поведение
Идея состоит в том, чтобы использовать модули на уровне организации, проекта и стека для настройки соглашений об именах, которые можно повторно использовать для всех ресурсов. Информация об организации загружает информацию об организации, информация о проектах о проектах, а информация о стеке определяет, на какой проект нацелить на основе текущей рабочей области.
Я пропустил кучу другой логики в модулях, чтобы они были чистыми для этой проблемы.
По terraform
циклов нет, а destroy
должно работать нормально.
Фактическое поведение
Мы получаем цикл, который я опубликовал выше, хотя terraform не показывает циклов.
Действия по воспроизведению
- Настройте три модуля,
organisation-info
,project-info
иstack-info
, как показано выше. - Настройте корневого провайдера, как показано выше.
terraform init
terraform destroy
(кажется, не имеет значения, подавали ли вы заявку первым)
Дополнительный контекст
Странно то, что если я закомментирую этот вывод в stack-info
, цикл остановится:
output "project" {
value = "${module.project_info}" # IT'S THIS... COMMENTING THIS OUT REMOVES THE CYCLE.
}
Это кажется действительно странным ... Я не понимаю, почему вывод переменной должен иметь значение, и почему я получаю ошибку цикла, когда цикла нет.
Как ни странно, terraform plan -destroy
не раскрывает цикл, только terraform destroy
.
Мое паучье чутье подсказывает мне, что грядет зло.
Благодарим всех, кто может сказать мне, что происходит, является ли это ошибкой и, возможно, как ее обойти.
Error: Cycle: ....destroy deposed
:( - person Abdennour TOUMI   schedule 05.09.2020