terraform-kubernetes-provider как создать секрет из файла?


person Davis Ford    schedule 25.03.2019    source источник


Ответы (5)


пока файл закодирован в UTF-8, вы можете использовать что-то вроде этого

resource "kubernetes_secret" "some-secret" {

      metadata {
        name      = "some-secret"
        namespace = kubernetes_namespace.some-ns.metadata.0.name
        labels = {
          "sensitive" = "true"
          "app"       = "my-app"
        }
      }
      data = {
        "file.txt" = file("${path.cwd}/your/relative/path/to/file.txt")
      }
    }

Если файл является двоичным, у вас будет такая ошибка, как

Не удалось вызвать функцию «файл»: содержимое /your/relative/path/to/file.txt недопустимо в кодировке UTF-8; вместо этого используйте функцию filebase64 для получения содержимого в кодировке Base64 или другие файловые функции (например, filemd5, filesha256) для получения результатов хэширования файлов.

Я попытался закодировать файл в base64, но проблема в том, что полученный текст будет перекодирован в base64 провайдером. Так что я думаю, что на данный момент нет решения для двоичных файлов... Я буду редактировать то, что найду дальше для двоичных файлов.

person Francesco Gualazzi    schedule 19.11.2019
comment
связанная проблема: github.com/hashicorp/terraform-provider-kubernetes/issues/901 - person LandoR; 20.11.2020

Просто используйте https://www.terraform.io/docs/providers/kubernetes/r/config_map.html#binary_data

resource "kubernetes_config_map" "example" {

  metadata {
    name = "my-config"
  }

  binary_data = {
    "my_payload.bin" = "${filebase64("${path.module}/my_payload.bin")}"
  }
}
person Vlad    schedule 15.06.2020

Это может быть немного не по теме, но я столкнулся с похожей проблемой, за исключением того, что файл может отсутствовать, и в этом случае terraform [plan|apply] не работает.

Если быть точным: мне нужно было продублировать секрет из одного пространства имен в другое.

Я понял это, используя поставщика hashicorp/external.

Шаги довольно просты:

  1. Загрузите data, вызвав внешнюю программу
  2. Обратитесь к ресурсу data в kubernetes_secret

Программа должна принимать (и обрабатывать) JSON на STDIN и создавать действительный JSON на STDOUT в качестве ответа на параметры, переданные в JSON STDIN.

Пример сценария оболочки:

#!/bin/bash

set -e

/bin/echo -n '{ "token": "'
kubectl get -n consul secrets/hashicorp-consul-bootstrap-acl-token --template={{.data.token}}
/bin/echo -n '"}'

источник тарраформа:


data "external" "token" {
  program = ["sh", "${path.module}/consul-token.sh"]
}

resource "kubernetes_secret" "consul-token" {
  depends_on = [data.external.token]

  metadata {
    name      = "consul-token"
    namespace = "app"
  }

  data = {
    token = base64decode(data.external.token.result.token)
  }
}

и требования:


terraform {
  required_providers {
    external = {
      source  = "hashicorp/external"
      version = ">= 2.0.0"
    }
  }
}
person Petr Hadraba    schedule 15.02.2021

Кажется, если вы запустите команду kubectl create secret generic my-secret --from-file mysecret.json

а потом

$ kubectl get secrets my-secret -o yaml
apiVersion: v1
data:
  my-secret.json: ewogICA.....
kind: Secret
metadata:
  creationTimestamp: "2019-03-25T18:20:43Z"
  name: my-secret
  namespace: default
  resourceVersion: "67026"
  selfLink: /api/v1/namespaces/default/secrets/my-secret
  uid: b397a29c-4f2a-11e9-9806-000c290425d0
type: Opaque

он сохраняет его аналогично имени файла в качестве единственного ключа. Когда я монтирую это в том/volumeMount, он работает, как и ожидалось. Я боялся, что этого не произойдет, но когда я создаю секрет с помощью аргумента --from-file, он именно так его и хранит.

person Davis Ford    schedule 25.03.2019

В основном вам нужно предоставить карту следующим образом:

resource "kubernetes_secret" "sgw-config" {
   metadata {
     name = "my-secret"
   }
   type = "Opaque"
   data {
           "key1" = "value1"
           "key2" = "value2"
  }
}

вы можете ссылаться на свои внутренние переменные, используя

resource "kubernetes_secret" "sgw-config" {
       metadata {
         name = "my-secret"
       }
       type = "Opaque"
       data {
               "USERNAME" = "${var.some_variable}"
               "PASSWORD" = "${random_string.root_password.result}"
      }
    }
person Community    schedule 25.03.2019
comment
извините за понижение, но это не касается вопроса: как добавить файл (возможно, не UTF-8) в качестве значения секрета с помощью Terraform? - person Francesco Gualazzi; 19.11.2019