我使用的是地形kubernetes-provider,我想将类似kubectl
的命令转换为TF:
kubectl create secret generic my-secret --from-file mysecret.json
但是,似乎secret
资源的data
字段expects only a 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
的顶级字段来编写秘密,当我对其进行卷挂载时,它将无法与其他资源一起使用。
这有什么窍门?
答案 0 :(得分:1)
基本上,您需要提供这样的地图:
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}"
}
}
答案 1 :(得分:0)
如果您运行命令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
它以文件名作为单键类似地存储它。当我将其安装在volume / volumeMount中时,它可以按预期工作。我担心不会,但是当我使用--from-file
参数创建秘密时,这正是它存储它的方式。
答案 2 :(得分:0)
只要文件是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中对结果文本进行重新编码。所以我想目前还没有二进制文件的解决方案... 我将使用接下来要查找的二进制文件进行编辑。
答案 3 :(得分:0)
只需使用 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")}"
}
}
答案 4 :(得分:0)
这可能有点题外话,但我也遇到过类似的问题,只是文件可能不存在,在这种情况下 terraform [plan|apply]
会失败。
确切地说:我需要将一个秘密从一个命名空间复制到另一个命名空间。
通过使用 hashicorp/external
提供程序,我意识到了这一点。
步骤非常简单:
data
data
资源中的kubernetes_secret
程序应接受(并处理)STDIN 上的 JSON,并在 STDOUT 上生成有效的 JSON,作为对 STDIN JSON 中传入参数的响应。
示例 shell 脚本:
#!/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"
}
}
}