Я провел несколько экспериментов с terraform, kubernetes, cassandra и elassandra, разделил все по модулям, но теперь не могу удалить конкретный модуль.
Я использую gitlab-ci и сохраняю состояния терраформирования на серверной части 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
Меня заблокировали здесь:
-> Я хочу удалить модуль k8s-cassandra
main.tf (module "k8s-cassandra" {...), я получаю эту ошибку:TERRAFORM PLAN... Acquiring state lock. This may take a few moments... Releasing state lock. This may take a few moments...
Error: module.k8s-cassandra.kubernetes_stateful_set.cassandra: configuration for module.k8s-cassandra.provider.kubernetes is not present; a provider configuration block is required for all operations
terraform destroy -target=module.k8s-cassandra -auto-approve между terraform init и terraform plan, все равно не сработает.Кто-нибудь может мне помочь, пожалуйста? Спасибо :)
@SomeGuyOnAComputer, я определяю в обоих файлах k8s.tf, провайдер "kubernetes" {version = "~> 1.5.0" host= "${var.host}" username = "${var.username}" password= "${var.password}" client_certificate = "${base64decode(var.client_certificate)}" client_key = "${base64decode(var.client_key)}" cluster_ca_certificate = "${base64decode(var.cluster_ca_certificate)}" } ресурс "kubernetes_namespace" "terraform-elassandra-namespace" { метаданные { аннотации { name = "terraform-elassandra-namespace" } labels { app = "elassandra" } name = "terraform-elassandra-namespace" } }
Попробуйте определить его только в родительском main.tf.
Если вы прокомментировали код, раскомментируйте его, затем выполните уничтожение терраформа с целью, затем прокомментируйте код, и вы должны быть установлены...
Существуют ли какие-либо коды для ссылки на ресурс module.k8s-cassandra.XXX?
Не работает на main.tf @SomeGuyOnAComputer
Не сработало @night-gold, эта проблема возникает из-за того, что когда я комментирую код для уничтожения терраформирования, появляется ошибка, и модуль не уничтожается
«Есть ли какие-либо коды для ссылки ресурса на module.k8s-cassandra.XXX?» -> НЕТ @BMW
Вы пытались удалить каталог .terraform и создать новый terraform init? Иногда это помогает.

Смысл этого сообщения об ошибке в том, что 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:
terraform destroy -target module.k8s-cassandra
Как только все объекты, управляемые этим модулем, будут уничтожены и удалены из состояния, вы можете безопасно удалить блок module "k8s-cassandra" из конфигурации.
Чтобы этого больше не повторилось, вы должны переработать здесь корневой и дочерний модули, чтобы все конфигурации провайдера находились в корневом модуле, а дочерние модули наследовали только конфигурации провайдера, переданные от корня. Для получения дополнительной информации см. Провайдеры внутри модулей в документации.
где определен провайдер
kubernetes?