terraform destroy выдает ошибку цикла, когда циклы отсутствуют - PullRequest
2 голосов
/ 09 июня 2019

Версия 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 дает мне этот график: image Источник:

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"
        }
}

Ожидаемое поведение

Идея состоит в том, чтобы использовать модули на уровнях org, project и stack для настройки соглашений об именах, которые можно повторно использовать для всех ресурсов. Информация об организации загружает информацию об организации, информацию о проекте о проектах и ​​информацию о стеке, которая определяет целевой проект на основе текущего рабочего пространства.

Я опустил кучу другой логики в модулях, чтобы они оставались чистыми для этой проблемы.

Согласно terraform циклов нет, а destroy должно работать нормально.

Фактическое поведение

Мы получаем цикл, который я разместил выше, хотя terraform не показывает циклов.

Шаги для воспроизведения

  1. Настройте три модуля organisation-info, project-info и stack-info, как показано выше.
  2. Настройте корневого провайдера, как показано выше.
  3. terraform init
  4. terraform destroy (кажется, не имеет значения, подали ли вы сначала)

Дополнительный контекст

Странная вещь в том, что если я закомментирую этот вывод в stack-info, цикл остановится:

output "project" {
  value = "${module.project_info}" # IT'S THIS... COMMENTING THIS OUT REMOVES THE CYCLE.
}

Это кажется действительно странным ... Я не понимаю, почему вывод переменной должен иметь значение, и почему я получаю ошибку цикла, когда цикла нет.

Как ни странно, terraform plan -destroy не раскрывает цикл, только terraform destroy.

Мое чувство пауков говорит мне, что зло в движении.

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

...