在Terraform中从Kubernetes服务帐户检索令牌数据

时间:2019-05-10 15:09:54

标签: kubernetes terraform

我正在使用terraform创建一个Kubernetes服务帐户,并尝试从它创建的Kubernetes Secret中输出令牌。

resource "kubernetes_service_account" "ci" {
  metadata {
    name = "ci"
  }
}

data "kubernetes_secret" "ci" {
  metadata {
    name = "${kubernetes_service_account.ci.default_secret_name}"
  }
}

output "ci_token" {
  value = "${data.kubernetes_secret.ci.data.token}"
}

根据here,这应该使数据块的值推迟到“应用”阶段,因为default_secret_name的计算值,但是当我运行terraform apply时,它给了我此错误:

Error: Error running plan: 1 error(s) occurred:

* output.ci_token: Resource 'data.kubernetes_secret.ci' does not have attribute 'data.token' for variable 'data.kubernetes_secret.ci.data.token'

depends_on数据块中添加kubernetes_secret没什么区别。

如果我注释掉output块,它将很好地创建资源,然后我可以取消注释它,再次应用,并且一切正常,因为Kubernetes Secret已经存在。

我也发布了一个Github问题the docs

更新

可接受的答案确实解决了这个问题,但是为了简化该问题,我省略了另一个输出,不适用于此解决方案:

output "ci_crt" {
  value = "${data.kubernetes_secret.ci.data.ca.crt}"
}
* output.ci_ca: lookup: lookup failed to find 'ca.crt' in:

${lookup(data.kubernetes_secret.ci.data, "ca.crt")}

由于here,此特定问题为reported here,该问题已在版本0.12中修复。

1 个答案:

答案 0 :(得分:3)

这有效:

resource "kubernetes_service_account" "ci" {
  metadata {
    name = "ci"
  }
}

data "kubernetes_secret" "ci" {
  metadata {
    name = "${kubernetes_service_account.ci.default_secret_name}"
  }
}

output "ci_token" {
  value = "${lookup(data.kubernetes_secret.ci.data, "token")}"
}