terraform (0.11 и 0.12) работает на 1 машине, но не на другой - PullRequest
0 голосов
/ 06 июня 2019

Работа на 2 разных компьютерах с Windows 10, где «terraform apply» работает на одном компьютере, но не на другом. Прежде чем перейти на второй компьютер, я полностью удалил инфраструктуру на gcp и убедился, что скопировал только файл tf + необходимый json. (без файлов состояния и т. д.) Поскольку я готовлю это к конвейеру, я хочу иметь чистую среду, чтобы начать с

codesnippit (полный сценарий в конце, далее ниже):

provider "kubernetes" {
  host     = "https://${google_container_cluster.primary.endpoint}"
  username = "${var.username}"
  password = "${var.password}"
  client_certificate = "${base64decode(google_container_cluster.primary.master_auth[0].client_certificate)}"
  client_key = "${base64decode(google_container_cluster.primary.master_auth[0].client_key)}"
  cluster_ca_certificate = "${base64decode(google_container_cluster.primary.master_auth[0].cluster_ca_certificate)}"
  version = "~> 1.7"
}

# Namespace
resource "kubernetes_namespace" "testspace" {
  metadata {
    annotations = {
      name = "testspace"
    }
    name = "testspace"
  }
}

По всем примерам, которые я вижу, это должно работать, и это работает на моем ноутбуке, но на моей второй машине я получаю следующую ошибку:

Error: Failed to configure: username/password or bearer token may be set, but not both

  on Deploy_Test.tf line 1, in provider "kubernetes":
   1: provider "kubernetes" {

Если я удаляю имя пользователя и пароль, ошибка исчезает, но я не могу создать пространство имен, потому что у меня нет авторизации? ошибка гласит:

Error: namespaces is forbidden: User "client" cannot create namespaces at the cluster scope

и теперь я немного теряюсь: этот код отлично работает на одном компьютере, но не на другом, и я не могу понять, почему. При повторном развертывании этого с ПК один раз, после запуска в новой чистой папке terraform Надеюсь, у кого-то есть идеи, где искать?

Попробовал следующее:
обновлено до 0.12.1 - без разницы.
понижен до 0,11 - без разницы.
Перепробовал все разные комбинации использования сертификата или имени пользователя / pw combo


provider "google" {
  credentials = file("account.json")
  project     = var.project
  region      = var.region
  version =  "~> 2.7"
}

resource "google_container_cluster" "primary" {
  name               = "${var.name}-cluster"
  location           = var.region
  initial_node_count = 1
  master_auth {
    username = var.username
    password = var.password
    /*
    client_certificate_config {
      issue_client_certificate = true
    }
    */
  }
  node_version       = "1.11.10-gke.4"
  min_master_version = "1.11.10-gke.4"
  node_config {
    preemptible  = true
    machine_type = "n1-standard-1"

    metadata = {
      disable-legacy-endpoints = "true"
    }

    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",
    ]
  }
}
provider "kubernetes" {
  host     = "https://${google_container_cluster.primary.endpoint}"
  username = "${var.username}"
  password = "${var.password}"
  client_certificate = "${base64decode(google_container_cluster.primary.master_auth[0].client_certificate)}"
  client_key = "${base64decode(google_container_cluster.primary.master_auth[0].client_key)}"
  cluster_ca_certificate = "${base64decode(google_container_cluster.primary.master_auth[0].cluster_ca_certificate)}"
  version = "~> 1.7"
}

# Namespace
resource "kubernetes_namespace" "testspace" {
  metadata {
    annotations = {
      name = "testspace"
    }
    name = "testspace"
  }
}

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Нашел причину этого: ранее у меня был установлен Docker Desktop.После удаления он оставил некоторый мусор, в этом случае в папке c: \ users \% username% осталась папка .kube с файлом конфигурации kube, содержащим использованные сертификаты.
Я сжал содержимое папки,и удалил папку.После этого терраформ работает так же, как и на других машинах.

0 голосов
/ 07 июня 2019

У вас две проблемы, во-первых:

Ошибка: не удалось настроить: имя пользователя / пароль или маркер носителя могут быть установлены, но не оба

говорит вам, что вы можете ЛЮБОЙ аутентифицироваться с именем пользователя и паролем ИЛИ с токеном на предъявителя. Ваша ошибка, по-видимому, возникла отсюда, сначала:

provider "kubernetes" {
  host     = "https://${google_container_cluster.primary.endpoint}"
  username = "${var.username}"
  password = "${var.password}"
  client_certificate = "${base64decode(google_container_cluster.primary.master_auth[0].client_certificate)}"
  client_key = "${base64decode(google_container_cluster.primary.master_auth[0].client_key)}"
  cluster_ca_certificate = "${base64decode(google_container_cluster.primary.master_auth[0].cluster_ca_certificate)}"
  version = "~> 1.7"
}

По сути, вы указываете на три файла .pem И пытаетесь авторизоваться с помощью user / pass. Выберите один или другой. См. эту страницу о поставщике kubernetes (в частности, «Статически определенные учетные данные») для получения подробной информации об этой конкретной ошибке.

Это говорит:

Ошибка: пространства имен запрещены: пользователь "клиент" не может создавать пространства имен в области действия кластера

Говорит вам, что у вас нет прав на то, что вы пытаетесь сделать. Как только вы можете определить, что он пытается аутентифицировать, вы можете определить, что не так. Кажется, что ваш client_certificate, client_key и / или cluster_ca_certificate устарели на втором компьютере, но не на первом. Я считаю, что это должен быть cluster_ca_certificate, который устарел, если ваш gcloud config set container/use_client_certificate верен. Этот ответ содержит больше информации об этом.

Если это не так, нам придется продолжить расследование.

...