Terraform 不会销毁模块

Rui*_*ins 7 kubernetes terraform

我用terraform, kubernetes,cassandra和做了一些实验elassandra,我用模块分隔了所有,但现在我无法删除特定的模块。

我正在使用gitlab-ci,并将 terraform 状态存储在 AWS 后端。这意味着,每次我更改 terraform 文件中的基础设施时,在 之后git push,基础设施将更新为gitlab-ci运行terraform init,terraform planterraform apply.

我的 terraform 主文件是这样的:

# main.tf
##########################################################################################################################################
# BACKEND                                                                                                                                #
##########################################################################################################################################

terraform {
  backend "s3" {}
}

data "terraform_remote_state" "state" {
  backend = "s3"
  config {
    bucket         = "${var.tf_state_bucket}"
    dynamodb_table = "${var.tf_state_table}"
    region         = "${var.aws-region}"
    key            = "${var.tf_key}"
  }
}

##########################################################################################################################################
# Modules                                                                                                                                #
##########################################################################################################################################

# Cloud Providers: -----------------------------------------------------------------------------------------------------------------------
module "gke" {
  source    = "./gke"
  project   = "${var.gcloud_project}"
  workspace = "${terraform.workspace}"
  region    = "${var.region}"
  zone      = "${var.gcloud-zone}"
  username  = "${var.username}"
  password  = "${var.password}"
}

module "aws" {
  source   = "./aws-config"
  aws-region      = "${var.aws-region}"
  aws-access_key  = "${var.aws-access_key}"
  aws-secret_key  = "${var.aws-secret_key}"
}

# Elassandra: ----------------------------------------------------------------------------------------------------------------------------
module "k8s-elassandra" {
  source   = "./k8s-elassandra"

  host     = "${module.gke.host}"
  username = "${var.username}"
  password = "${var.password}"

  client_certificate     = "${module.gke.client_certificate}"
  client_key             = "${module.gke.client_key}"
  cluster_ca_certificate = "${module.gke.cluster_ca_certificate}"
}

# Cassandra: ----------------------------------------------------------------------------------------------------------------------------
 module "k8s-cassandra" { 
   source   = "./k8s-cassandra"

   host     = "${module.gke.host}"
   username = "${var.username}"
   password = "${var.password}"

   client_certificate     = "${module.gke.client_certificate}"
   client_key             = "${module.gke.client_key}"
   cluster_ca_certificate = "${module.gke.cluster_ca_certificate}"
 }
Run Code Online (Sandbox Code Playgroud)

这是我的目录树:

.
??? aws-config
?   ??? terraform_s3.tf
?   ??? variables.tf
??? gke
?   ??? cluster.tf
?   ??? gcloud_access_key.json
?   ??? gcp.tf
?   ??? variables.tf
??? k8s-cassandra
?   ??? k8s.tf
?   ??? limit_ranges.tf
?   ??? quotas.tf
?   ??? services.tf
?   ??? stateful_set.tf
?   ??? variables.tf
??? k8s-elassandra
?   ??? k8s.tf
?   ??? limit_ranges.tf
?   ??? quotas.tf
?   ??? services.tf
?   ??? stateful_set.tf
?   ??? variables.tf
??? main.tf
??? variables.tf
Run Code Online (Sandbox Code Playgroud)

我在这里被阻止:

-> 我想移除模块 k8s-cassandra

  • 如果我注释掉main.tf( module "k8s-cassandra" {...) 中的模块,我会收到此错误:

TERRAFORM PLAN... 获取状态锁定。这可能需要一些时间...正在释放状态锁定。这可能需要一些时间...

错误:module.k8s-cassandra.kubernetes_stateful_set.cassandra:module.k8s-cassandra.provider.kubernetes 的配置不存在;所有操作都需要提供程序配置块

  • 如果我插入terraform destroy -target=module.k8s-cassandra -auto-approve之间terraform initterraform plan剧照无法正常工作。

任何人都可以帮助我,好吗?谢谢 :)

Mar*_*ins 14

此错误消息的含义是 Terraform 依赖provider "kubernetes"模块内的块k8s-cassandra来配置 AWS 提供程序。通过从源代码中删除模块,您已经隐式地删除了该配置,因此无法删除已存在于状态中的现有对象——执行此操作所需的提供程序配置不存在。

尽管 Terraform 允许provider在子模块中使用块以提高灵活性,但文档建议将所有块都保留在根模块中,并使用providers映射或通过名称自动继承按名称将提供者配置传递到子模块中。

provider "kubernetes" {
  # global kubernetes provider config
}

module "k8s-cassandra" {
  # ...module arguments...

  # provider "kubernetes" is automatically inherited by default, but you
  # can also set it explicitly:
  providers = {
    "kubernetes" = "kubernetes"
  }
}
Run Code Online (Sandbox Code Playgroud)

为了摆脱你已经遇到的冲突情况,答案是临时恢复module "k8s-cassandra"块,然后删除它之前销毁它管理的对象,使用-target选项:

terraform destroy -target module.k8s-cassandra
Run Code Online (Sandbox Code Playgroud)

一旦该模块管理的所有对象都被销毁并从状态中删除,您就可以安全地module "k8s-cassandra"从配置中删除该块。

为了防止这种情况再次发生,您应该在这里重新处理根和子模块,以便提供者配置都在根模块中,子模块只继承从根传入的提供者配置。有关更多信息,请参阅文档中的模块内提供程序