12

我正在使用 terraform kubernetes-provider,我想将这样的kubectl命令翻译成 TF:

kubectl create secret generic my-secret --from-file mysecret.json

secret然而,资源的data字段似乎只需要一个 TF map

我试过类似的东西

data "template_file" "my-secret" {
  template = "${file("${path.module}/my-secret.json")}"
}

resource "kubernetes_secret" "sgw-config" {
   metadata {
     name = "my-secret"
   }
   type = "Opaque"
   data = "{data.template_file.my-secret.template}"
}

但它抱怨这不是一张地图。所以,我可以做这样的事情:

   data = {
      "my-secret.json" = "{data.template_file.my-secret.template}"
   }

但这将使用名为的顶级字段写入机密,my-secret.json并且当我卷挂载它时,它不会与其他资源一起使用。

这里的诀窍是什么?

4

6 回答 6

7

只要文件是 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 中重新编码。所以我想目前没有二进制文件的解决方案......我将用我接下来找到的二进制文件进行编辑。

于 2019-11-19T11:14:32.903 回答
1

只需使用 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")}"
  }
}
于 2020-06-15T16:01:13.217 回答
0

这可能有点离题,但我一直面临类似的问题,除了文件可能不存在,在这种情况下terraform [plan|apply]失败。

准确地说:我需要将秘密从一个命名空间复制到另一个命名空间。

我通过使用提供者意识到了这一点hashicorp/external

步骤非常简单:

  1. data通过调用外部程序加载
  2. 参考datainkubernetes_secret资源

程序应该接受(并处理)STDIN 上的 JSON,并在 STDOUT 上生成有效的 JSON 作为对在 STDIN 的 JSON 中传入的参数的响应。

示例外壳脚本:

#!/bin/bash

set -e

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

tarraform 来源:


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"
    }
  }
}
于 2021-02-15T13:45:56.447 回答
0

我相信您现在可以在秘密中使用 binary_data 属性。例如

binary_data = {
    "my_payload.bin" = "${filebase64("${path.module}/my_payload.bin")}"
}

参考: https ://github.com/hashicorp/terraform-provider-kubernetes/pull/1228 https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/secret#binary_data

于 2021-10-14T23:39:17.973 回答
-1

看来如果你运行命令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

它将文件名类似地存储为单个键。当我将它安装在卷/卷安装中时,它按预期工作。我担心它不会,但是当我使用--from-file参数创建秘密时,这正是它存储它的方式。

于 2019-03-25T18:46:37.397 回答
-2

基本上你需要提供这样的地图:

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}"
      }
    }
于 2019-03-25T18:34:54.530 回答