Terraform Kubernetes的"local-exec" provisioner在Windows上无法正常运行,如何解决?

3
我要翻译的内容如下:

我正在尝试创建/应用kubectl .yaml文件 https://github.com/Azure/aad-pod-identity/blob/master/deploy/infra/deployment.yaml 通过Terrraform的null_resource到AKS上安装Azure AD Pod Identity。它需要部署Azure网关入口控制器。使用Windows 10和VS Code

main.tf:

```terraform 未提供需要翻译的内容,请提供! ```
data "template_file" "aad_pod" {
  template = "${file("${path.module}/templates/aad_pod.yaml")}"
}

resource "null_resource" "aad_pod_deploy" {
  triggers = {
    manifest_sha1 = "${sha1("${data.template_file.aad_pod.rendered}")}"
  }

  provisioner "local-exec" {
    command = "kubectl apply -f -<<EOF\n${data.template_file.aad_pod.rendered}\nEOF"
  }
}

在执行terraform apply后,我遇到了以下错误:

Error: Error running command 'kubectl apply -f -<<EOF
'cutted listing of yaml file'
EOF': exit status 1. Output: << was unexpected at this time.

非常感谢您的帮助。


我不知道这是否是问题所在,但我总是在 << 前后加上空格。 - Brian Pursley
不幸的是,它没有帮助:\ - Kirill Lastovskiy
2
你是否知道“local-exec”在运行命令时使用“明智的默认值”来选择解释器?(请参见此处:https://www.terraform.io/docs/provisioners/local-exec.html#interpreter)。当你在Windows上时,我怀疑它会在PowerShell中执行而不是Bash。因此,所谓的heredocs在我看来是行不通的。 - winston
为什么不将其模板化到一个文件中,然后使用“-f”参数的正常值:文件或URL? - mdaniel
2个回答

7
由于Unix类操作系统和Windows之间存在差异,除非您的用例非常简单,否则很少有可能以便携式方式使用local-exec。这是预配程序是最后一招的原因之一
我认为最具可移植性的答案是使用官方的Kubernetes提供商与Kubernetes进行交互。或者,如果对于您正在执行的任务而言,特别是使用kubectl的输入格式非常重要,那么您可以使用由社区维护的kubectl提供商
resource "kubectl_manifest" "example" {
  yaml_body = data.template_file.aad_pod.rendered
}

如果你有很充分的理由要使用 local-exec provisioner 而不是原生的 Terraform provider,那么你需要找到一种既能够被类Unix风格的shell解释,也能够被Windows命令行解释的方式来编写命令。我认为最简单的方法是先将文件写入磁盘并将文件名传递给 kubectl,这样可以避免使用shell的特殊功能,让一切都由 kubectl 自己处理:

resource "local_file" "aad_pod_deploy" {
  filename = "${path.module}/aad_pod.yaml"
  content  = data.template_file.aad_pod.rendered

  provisioner "local-exec" {
    command = "kubectl apply -f ${self.filename}"
  }
}

使用这种方法还有一些需要注意的地方。例如,如果在包含空格的目录路径下运行Terraform,则self.filename将包含空格,因此可能无法被Unix shell或kubectl Windows可执行文件按照您期望的方式解析。


1
Unix/Windows的问题在v0.14.7版本中已经不再是问题了 :) - https://github.com/hashicorp/terraform/releases/tag/v0.14.7#tag-select-menu-430d5702-75f8-11eb-8f34-f419f9c38f6f:~:text=provisioner%2Fremote%2Dexec%3A%20现在可以在Windows上以PowerShell解释器而非Unix-style shell运行。 - Custard

0

感谢您的评论。我找到了解决方案。我在terraform中使用helm_release资源。只需创建必要的模板和使用helm_release即可使用它。 我为AAD身份制作了一个helm图表,这使得工作变得更加轻松。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接