首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Terraform不破坏模块

Terraform不破坏模块
EN

Stack Overflow用户
提问于 2019-02-04 14:39:25
回答 1查看 19.8K关注 0票数 14

我用terraformkubernetescassandraelassandra做了一些实验,所有的模块都分开了,但是现在我不能删除一个特定的模块。

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

我的terraform主文件是:

代码语言:javascript
复制
# 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}"
 }

这是我目录的树:

代码语言:javascript
复制
.
├── 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

我在这里被堵住了:

->我想删除模块k8s-cassandra

  • 如果我在main.tf (module "k8s-cassandra" {...)中注释ou删除模块,则会收到以下错误:

TERRAFORM计划。获取状态锁定。这可能需要一些时间..。释放状态锁。这可能需要一些时间..。 module.k8s-cassandra.kubernetes_stateful_set.cassandra:错误:不存在module.k8s-配置.Provider.kubernetes;所有操作需要提供程序配置块

  • 如果我将terraform destroy -target=module.k8s-cassandra -auto-approve插入到terraform initterraform plan之间,仍然无法工作。

有人能帮我吗?谢谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-06 00:02:02

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

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

代码语言:javascript
复制
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"
  }
}

但是,要摆脱已经存在的冲突情况,答案是暂时恢复module "k8s-cassandra"块,然后使用-target选项在删除它之前销毁它正在管理的对象:

代码语言:javascript
复制
terraform destroy -target module.k8s-cassandra

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

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

票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54518488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档