Terraform Kubernetes非v1资源部署:null_resource EOF用法求助
解决Terraform中通过null_resource部署非v1版本K8s资源的问题
我来帮你梳理下解决方案,你遇到的核心问题是EOF语法使用错误,加上YAML代码重复的问题,咱们一步步来搞定:
1. 提取YAML为可复用的本地变量
首先把重复的Ingress YAML定义成Terraform本地变量,这样apply和destroy阶段都能共用,避免重复编写:
locals { ingress_yaml = <<-EOF apiVersion: extensions/v1beta1 kind: Ingress metadata: name: some-ingress-name annotations: kubernetes.io/ingress.class: nginx spec: rules: - host: subdomain.example.com http: paths: - backend: serviceName: some-cluster-ip-service servicePort: 80 EOF }
这里用<<-EOF可以自动去掉YAML内容前的缩进,让代码更整洁。
2. 修正null_resource的provisioner配置
你之前的代码有两个关键错误:一是没指定provisioner类型(应该用local-exec来执行本地kubectl命令),二是EOF和管道符|的用法不对。正确的写法是通过echo把YAML内容输出,再管道给kubectl:
resource "null_resource" "res_name" { # 配置触发器:当YAML内容变化时,自动重新执行apply triggers = { ingress_config_hash = sha256(local.ingress_yaml) } # Apply阶段:创建Ingress资源 provisioner "local-exec" { command = "echo '${local.ingress_yaml}' | kubectl apply -f -" } # Destroy阶段:删除Ingress资源 provisioner "local-exec" { when = "destroy" command = "echo '${local.ingress_yaml}' | kubectl delete -f -" } }
关键细节说明
- 触发器配置:加
triggers是为了让Terraform感知到YAML内容的变化,自动重新执行kubectl apply,否则null_resource只会在第一次创建时执行命令。 - kubectl上下文:确保运行Terraform的环境已经正确配置了K8s集群的上下文(比如
kubectl config use-context已经切换到目标集群),否则命令会执行失败。 - 引号转义:如果你的YAML里包含单引号,需要把
echo '...'改成echo "...",或者对单引号进行转义(比如把'改成'\'')。
这样调整后,就能绕过Terraform Kubernetes Provider的版本限制,用null_resource的provisioner来部署和删除指定版本的K8s资源了。
内容的提问来源于stack exchange,提问作者denski
相关产品推荐
相关产品推荐

