Myślę, że tylko szybkie sprawdzenie zdrowia psychicznego, może moje oczy się mylą. Dzielę monolityczny plik terraform na moduły.

Moje main.tf wywołują tylko dwa moduły, gke dla silnika google kubernetes i storage, który tworzy trwały wolumin w utworzonym wcześniej klastrze.

Moduł gke ma outputs.tf, który wyprowadza następujące dane:

output "client_certificate" {
  value     = "${google_container_cluster.kube-cluster.master_auth.0.client_certificate}"
 sensitive = true
}
output "client_key" {
  value     = "${google_container_cluster.kube-cluster.master_auth.0.client_key}"
 sensitive = true
}
output "cluster_ca_certificate" {
  value     = "${google_container_cluster.kube-cluster.master_auth.0.cluster_ca_certificate}"
 sensitive = true
}
output "host" {
  value     = "${google_container_cluster.kube-cluster.endpoint}"
 sensitive = true
}

Następnie w main.tf dla modułu pamięci mam:

client_certificate     = "${base64decode(var.client_certificate)}"
client_key             = "${base64decode(var.client_key)}"
cluster_ca_certificate = "${base64decode(var.cluster_ca_certificate)}"
host     = "${var.host}"

Następnie w katalogu głównym main.tf mam:

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

Z tego co widzę wygląda dobrze. Wartości certyfikatów, kluczy i zmiennych hosta powinny zostać wyprowadzone z modułu gke przez outputs.tf, pobrane przez main.tf roota, a następnie dostarczone do storage jako zwykła zmienna.

Czy źle to zrozumiałem? A może po prostu zwariowałem, coś wydaje się nie w porządku.

Dostaję pytanie o zmienną, która nie jest wypełniana, gdy uruchamiam plan.

EDYTOWAĆ:

Dodanie dodatkowych informacji, w tym mojego kodu.

Jeśli ręcznie dodam fałszywe wpisy dla zmiennych, o które prosi, pojawia się następujący błąd:

Macbook: $ terraform plan
var.client_certificate
  Enter a value: 1

var.client_key
  Enter a value: 2

var.cluster_ca_certificate
  Enter a value: 3

var.host
  Enter a value: 4
...
(filtered out usual text)
...
 * module.storage.data.google_container_cluster.kube-cluster: 1 error(s) occurred:

* module.storage.data.google_container_cluster.kube-cluster: data.google_container_cluster.kube-cluster: project: required field is not set

Wygląda na to, że narzeka, że ​​zasób data.google_container_cluster potrzebuje atrybutu projektu. Ale to nie jest ważny zasób. Jest przeznaczony dla dostawcy, ale jest wypełniony dla dostawcy.

Kod poniżej:

Struktura folderów:

root-folder/
├── gke/
│   ├── main.tf
│   ├── outputs.tf
│   ├── variables.tf
├── storage/
│   ├── main.tf
│   └── variables.tf
├── main.tf
├── staging.json
├── terraform.tfvars
└── variables.tf

Katalog-główny/gke/main.tf:

provider "google" {
  credentials = "${file("staging.json")}"
  project     = "${var.project}"
  region      = "${var.region}"
  zone        = "${var.zone}"
}

resource "google_container_cluster" "kube-cluster" {
  name               = "kube-cluster"
  description        = "kube-cluster"
  zone               = "europe-west2-a"
  initial_node_count = "2"
  enable_kubernetes_alpha = "false"
  enable_legacy_abac = "true"

  master_auth {
    username = "${var.username}"
    password = "${var.password}"
  }

  node_config {
    machine_type = "n1-standard-2"
    disk_size_gb = "20"
    oauth_scopes = [
      "https://www.googleapis.com/auth/compute",
      "https://www.googleapis.com/auth/devstorage.read_only",
      "https://www.googleapis.com/auth/logging.write",
      "https://www.googleapis.com/auth/monitoring"
    ]
  }
}

Katalog-główny/gke/outputs.tf:

output "client_certificate" {
  value     = "${google_container_cluster.kube-cluster.master_auth.0.client_certificate}"
 sensitive = true
}
output "client_key" {
  value     = "${google_container_cluster.kube-cluster.master_auth.0.client_key}"
 sensitive = true
}
output "cluster_ca_certificate" {
  value     = "${google_container_cluster.kube-cluster.master_auth.0.cluster_ca_certificate}"
 sensitive = true
}
output "host" {
  value     = "${google_container_cluster.kube-cluster.endpoint}"
 sensitive = true
}

Katalog-główny/gke/variables.tf:

variable "region" {
  description = "GCP region, e.g. europe-west2"
  default = "europe-west2"
}
variable "zone" {
  description = "GCP zone, e.g. europe-west2-a (which must be in gcp_region)"
  default = "europe-west2-a"
}
variable "project" {
  description = "GCP project name"
}
variable "username" {
  description = "Default admin username"
}
variable "password" {
  description = "Default admin password"
}

/folder-główny/magazyn/main.cf:

provider "kubernetes" {
  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)}"
}
data "google_container_cluster" "kube-cluster" {
  name   = "${var.cluster_name}"
  zone   = "${var.zone}"
}
resource "kubernetes_storage_class" "kube-storage-class" {
  metadata {
    name = "kube-storage-class"
  }
  storage_provisioner = "kubernetes.io/gce-pd"
  parameters {
    type = "pd-standard"
  }
}
resource "kubernetes_persistent_volume_claim" "kube-claim" {
  metadata {
    name      = "kube-claim"
  }
  spec {
    access_modes       = ["ReadWriteOnce"]
    storage_class_name = "kube-storage-class"
    resources {
      requests {
        storage = "10Gi"
      }
    }
  }
}

/root/storage/variables.tf:

variable "username" {
  description = "Default admin username."
}
variable "password" {
  description = "Default admin password."
}
variable "client_certificate" {
  description = "Client certificate, output from the GKE/Provider module."
}
variable "client_key" {
  description = "Client key, output from the GKE/Provider module."
}
variable "cluster_ca_certificate" {
  description = "Cluster CA Certificate, output from the GKE/Provider module."
}
variable "cluster_name" {
  description = "Cluster name."
}
variable "zone" {
  description = "GCP Zone"
}
variable "host" {
  description = "Host endpoint, output from the GKE/Provider module."
}

/folder-główny/main.tf:

module "gke" {
  source = "./gke"
  project = "${var.project}"
  region = "${var.region}"
  username = "${var.username}"
  password = "${var.password}"
}
module "storage" {
  source = "./storage"
  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}"
  cluster_name = "${var.cluster_name}"
  zone = "${var.zone}"
}

/folder-główny/zmienne.tf:

variable "project" {}
variable "region" {}
variable "username" {}
variable "password" {}
variable "gc_disk_size" {}
variable "kpv_vol_size" {}
variable "host" {}
variable "client_certificate" {}
variable "client_key" {}
variable "cluster_ca_certificate" {}
variable "cluster_name" {}
variable "zone" {}

Nie wkleję zawartości moich staging.json i terraform.tfvars z oczywistych powodów :)

1
jonnybinthemix 27 listopad 2018, 17:35
Czy w twoim stanie iw "wyjściu terraformowym" masz wartości?
 – 
bast
27 listopad 2018, 19:19
Nie można odróżnić od żadnego, ponieważ nie zajdzie tak daleko. Gdy tylko uruchamiam plan, pyta o wartości zmiennych. Wstawiłem fałszywe wartości, ale mam inne błędy, które muszę naprawić. Nic nie widzę w danych wyjściowych, a tfstate nigdy się nie zapełnia.
 – 
jonnybinthemix
27 listopad 2018, 20:13
To było bardziej sprawdzenie zdrowia psychicznego, aby upewnić się, że wszystko jest w porządku. Może to inne problemy powodują to?
 – 
jonnybinthemix
27 listopad 2018, 20:14
Z tego, co wyjaśniłeś, myślę, że ma to sens, ale brakuje nam czegoś, ponieważ nie widzimy całego kodu i wszystkich komunikatów o błędach.
 – 
KJH
28 listopad 2018, 04:56
Przepraszam, widzę, że trudno jest pomóc przy ograniczonych informacjach. Zaktualizowałem oryginalny post o błąd, który w tej chwili otrzymuję, wraz z całym kodem i strukturą folderów. Mam nadzieję, że to pomoże. Dzięki za obejrzenie, doceniam to.
 – 
jonnybinthemix
28 listopad 2018, 15:50

1 odpowiedź

Najlepsza odpowiedź

W swoim /root-folder/variables.tf usuń następujące wpisy:

variable "host" {}
variable "client_certificate" {}
variable "client_key" {}
variable "cluster_ca_certificate" {}

Nie są to zmienne per se, których potrzebuje kod Terraform na poziomie głównym. Zamiast tego są przekazywane jako wyjście 1 modułu --> wejście do 2 modułu.

4
KJH 28 listopad 2018, 18:16
Świetnie, dzięki za zrozumienie i za odpowiedź. To jest przybite.
 – 
jonnybinthemix
28 listopad 2018, 19:17