我按照示例https://github.com/terraform-aws-modules/terraform-aws-eks/blob/master/aws_auth.tf用Terraform设置EKS集群,现在有两个Terraform文件:
kubeconfig.tf
resource "local_file" "kubeconfig" {
content = "${data.template_file.kubeconfig.rendered}"
filename = "tmp/kubeconfig"
}
data "template_file" "kubeconfig" {
template = "${file("template/kubeconfig.tpl")}"
...
}
aws-auth.tf
resource "null_resource" "update_config_map_aws_auth" {
provisioner "local-exec" {
command = "kubectl apply -f tmp/config-map-aws-auth_${var.cluster-name}.yaml --kubeconfig /tmp/kubeconfig"
}
...
}
运行此命令时,local-exec命令失败,并显示
输出:错误:stat tmp / kubeconfig:没有这样的文件或目录
第二次运行成功。我认为该文件是在local-exec尝试使用它之后创建的,而local-exec应该取决于文件资源。因此,我尝试通过使用插值(隐式依赖)来表达这种依赖:
resource "null_resource" "update_config_map_aws_auth" {
provisioner "local-exec" {
command = "kubectl apply -f tmp/config-map-aws-auth_${var.cluster-name}.yaml --kubeconfig ${resource.local_file.kubeconfig.filename}"
}
但这总是给我
错误:资源'null_resource.update_config_map_aws_auth'设置程序 local-exec(#1):引用了未知资源'resource.local_file' 变量resource.local_file.kubeconfig.filename
答案 0 :(得分:3)
在最后一个代码块中使用插值时,不需要resource.
部分。
Terraform刚开始时只有资源,因此您不必说某种东西是资源,因为那是唯一的情况。然后,他们添加了模块和数据源,这些模块和数据源在命名上需要有所区别,因此它们分别得到module.
和data.
,以便Terraform可以区分资源和数据源等。
所以您可能想要这样的东西:
resource "local_file" "kubeconfig" {
content = "${data.template_file.kubeconfig.rendered}"
filename = "tmp/kubeconfig"
}
data "template_file" "kubeconfig" {
template = "${file("template/kubeconfig.tpl")}"
...
}
resource "null_resource" "update_config_map_aws_auth" {
provisioner "local-exec" {
command = "kubectl apply -f tmp/config-map-aws-auth_${var.cluster-name}.yaml --kubeconfig ${local_file.kubeconfig.filename}"
}
}