【问题标题】:Terraform Kubernetes provisioner "local-exec" kubectl apply -f -<<EOF on Windows not workingTerraform Kubernetes 供应商“local-exec”kubectl apply -f -<<EOF 在 Windows 上不起作用
【发布时间】:2020-10-24 04:58:43
【问题描述】:

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

ma​​in.tf:

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 后出现此错误:

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

任何帮助将不胜感激

【问题讨论】:

  • 不知道是不是这个问题,但我总是在前后放一个空格
  • 不幸的是它没有帮助:\
  • 你知道“local-exec”对它用来运行命令的解释器使用“合理的默认值”吗? (见这里:terraform.io/docs/provisioners/local-exec.html#interpreter)。当您在 Windows 上时,我怀疑它是在 Bash 中执行,而是在 powershell 中执行。因此,就我而言,heredocs 不起作用。
  • 您为什么不将其模板化到文件中,然后将 normal 值用于 -f 参数:文件或 URL?

标签: kubernetes yaml terraform kubectl


【解决方案1】:

由于类 Unix 操作系统和 Windows 之间的差异,除非您的用例非常简单,否则几乎不可能以可移植的方式使用 local-exec。这也是provisioners are a last resort的原因之一。

我认为最便携的答案是在这里使用the official Kubernetes provider 与 Kubernetes 进行交互。或者,如果使用kubectl 的输入格式对您正在做的事情特别重要,您可以使用a community-maintained kubectl provider

resource "kubectl_manifest" "example" {
  yaml_body = data.template_file.aad_pod.rendered
}

如果您有充分的理由使用 local-exec 配置程序而不是本地 Terraform 提供程序,您将需要找到一种方法来编写一个可以由 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 可执行文件可能不会按照您的意愿解析。

【讨论】:

【解决方案2】:

感谢 cmets。我找到了解决方案。我在 terraform 中使用 helm_release 资源。只需使用必要的模板创建您的 helm 图表并将其与 helm_release 一起使用。 我为 AAD Identity 制作了一个掌舵图,它完成了这项工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-15
    • 2020-07-01
    • 1970-01-01
    • 2019-05-25
    • 2021-05-03
    • 2019-01-03
    • 2020-07-07
    • 2021-09-27
    相关资源
    最近更新 更多