【问题标题】:terraform null_resource frequently triggers changeterraform null_resource 频繁触发变更
【发布时间】:2022-03-31 01:00:36
【问题描述】:

我尝试使用 null_resource 在 kubernetes 清单上运行 kubectl apply。我经常发现这适用于没有特定原因的更改。我正在运行 terraform 0.14.8。

data "template_file" "app_crds" {
  template = file("${path.module}/templates/app_crds.yaml")
}

resource "null_resource" "app_crds_deploy" {
  triggers = {
    manifest_sha1 = sha1(data.template_file.app_crds.rendered)
  }

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

}

地形规划输出

  # module.system.null_resource.app_crds_deploy must be replaced
-/+ resource "null_resource" "app_crds_deploy" {
      ~ id       = "698690821114034664" -> (known after apply)
      ~ triggers = {
          - "manifest_sha1" = "9a4fc962fe92c4ff04677ac12088a61809626e5a"
        } -> (known after apply) # forces replacement
    }

但是,这个 sha 确实在状态文件中。

[I] ➜ terraform state pull | grep 9a4fc962fe92c4ff04677ac12088a61809626e5a
              "manifest_sha1": "9a4fc962fe92c4ff04677ac12088a61809626e5a"

【问题讨论】:

  • 这是完整的terraform plan 输出吗?我希望它也能说明data.template_file.app_crds,因为data.template_file.app_crds.rendered 似乎正在产生“(应用后已知)”。

标签: terraform amazon-eks


【解决方案1】:

我建议使用来自terraform-kubernetes-providerkubernetes_manifest 资源。如您所见,使用提供程序不需要主机安装kubectl,并且比null_resource 可靠得多。他们有一个专门用于 CRD 的 example。这是该示例中 terraform 的 sn-p:

resource "kubernetes_manifest" "test-crd" {
  manifest = {
    apiVersion = "apiextensions.k8s.io/v1"
    kind       = "CustomResourceDefinition"

    metadata = {
      name = "testcrds.hashicorp.com"
    }

    spec = {
      group = "hashicorp.com"

      names = {
        kind   = "TestCrd"
        plural = "testcrds"
      }

      scope = "Namespaced"

      versions = [{
        name    = "v1"
        served  = true
        storage = true
        schema = {
          openAPIV3Schema = {
            type = "object"
            properties = {
              data = {
                type = "string"
              }
              refs = {
                type = "number"
              }
            }
          }
        }
      }]
    }
  }
}

您可以保留您的 k8s yaml 模板,并将其提供给 kubernetes_manifest,如下所示:

data "template_file" "app_crds" {
  template = file("${path.module}/templates/app_crds.yaml")
}

resource "kubernetes_manifest" "test-configmap" {
  manifest = yamldecode(data.template_file.app_crds.rendered)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多