Терраформ не разрушает модуль - PullRequest
0 голосов
/ 04 февраля 2019

Я провел несколько экспериментов с terraform, kubernetes, cassandra и elassandra, я разделил все по модулям, но теперь я не могу удалить определенный модуль.

Яиспользуя gitlab-ci, и я сохраняю состояния terraform на сервере AWS.Это означает, что каждый раз, когда я изменяю инфраструктуру в файлах terraform, после git push инфраструктура будет обновляться с gitlab-ci, которые запускают terraform init, terraform plan и terraform 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}"
 }

Это дерево моего каталога:

.
├── 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

IЯ заблокирован здесь:

-> Я хочу удалить модуль k8s-cassandra

  • Если я прокомментирую, удалите модуль в main.tf (module "k8s-cassandra" {...), Я получаю эту ошибку:

ПЛАН ТЕРРАФОРМ ... Получение состояния блокировки.Это может занять несколько минут ... Отпустить блокировку состояния.Это может занять несколько минут ...

Ошибка: module.k8s-cassandra.kubernetes_stateful_set.cassandra: конфигурация для module.k8s-cassandra.provider.kubernetes отсутствует;блок конфигурации провайдера требуется для всех операций

  • Если вставить terraform destroy -target=module.k8s-cassandra -auto-approve между terraform init и terraform plan, все равно не работает.

Кто-нибудь может мне помочь, пожалуйста?Спасибо:)

1 Ответ

0 голосов
/ 06 февраля 2019

Значение этого сообщения об ошибке заключается в том, что 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"
  }
}

Чтобы выйти из конфликтной ситуации, которая у вас уже есть, ответ состоит в том, чтобы временно восстановить блок module "k8s-cassandra", а затем уничтожить объекты, которыми он управляет , прежде чем удалить его, используя -target option:

terraform destroy -target module.k8s-cassandra

После того, как все объекты, управляемые этим модулем, были уничтожены и удалены из состояния, вы можете безопасно удалить блок module "k8s-cassandra" из конфигурации.

Toчтобы это не повторилось, переделайтеЗдесь и дочерние модули, так что все конфигурации провайдера находятся в корневом модуле, а дочерние модули наследуют только конфигурации провайдера, переданные из корня.Для получения дополнительной информации см. Провайдеры внутри модулей в документации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...