【问题标题】:Generating terraform DSL dynamically动态生成 terraform DSL
【发布时间】:2019-04-01 07:35:58
【问题描述】:

是否有一些 python/go 库可以从 JSON 文件生成 Terraform 代码,或者是否有任何模板语言来生成 terraform 代码。

用例:

我需要在我的集群上的外部负载均衡器上注册节点端口类型的所有 Kubernetes 服务,并且该外部负载均衡器有一个 terraform 提供程序,它采用服务和命名空间名称以及一些其他参数并注册服务在池上,一旦使用正确的服务和命名空间名称创建池,负载均衡器就会自动发现节点端口和节点 IP,并始终保持池更新。目前,我必须手动编辑 terraform 代码以添加服务名称和其他内容,更新负​​载均衡器配置以创建 k8s 服务池。

一旦我弄清楚如何从集群的给定状态生成/更新 terraform 文件,我将把这个进程作为集群守护进程放在一个 pod 中,它将每隔 X 间隔运行一次脚本,以便更新负载均衡器当用户创建和删除 k8s 服务时。

terraform 文件中的示例记录:

   # Pool automatically populated by K8s Service Discovery
resource "vtm_pool" "<cluster name>_<k8s namsepace>_<k8s service name>" {
  name                          = ""<cluster name>_<k8s namsepace>_<service name>""
  monitors                      = ["Ping"]
  service_discovery_enabled     = "true"
  service_discovery_interval    = "15"
  service_discovery_plugin      = "${var.k8s_discovery_plugin}"
  service_discovery_plugin_args = "-s <k8s service name > -n <k8s namsepace> -c <kubeconf file name>"
}

【问题讨论】:

    标签: python kubernetes terraform


    【解决方案1】:

    Terraform 有几个可能对您有用的挂钩点。

    您建议的整体方法可能会正常工作。 HCL 语法本身并没有那么复杂,你可以把它写出来。 Hashicorp 有a Go library 可以读写。

    Terraform 还有directly supports JSON input。语法更难手写,但可能更容易机器生成。 HCL 语法如何转换为 JSON 有一些微妙之处,可能值得通读整个页面(甚至是 HCL 部分),但这可能最容易机器生成。

    如果我必须这样做,我可能会使用 Terraform external data source。它可以运行任何产生 JSON 输出的程序,但是一旦你有了它,它就在 Terraform 空间中“原生”了。您可以编写类似(未经测试)的内容:

    data "external" "services" {
      program = ["kubectl", "get", "service",
                 "-o", "json",
                 "--field-selector", "spec.type==LoadBalancer"]
    }
    resource "vtm_pool" "k8s_services" {
      count = "${length(data.external.services.result)}"
      name = "${data.external.services.*.metadata.name[count.index]}"
    }
    

    (在过去,我遇到过 Terraform 会非常关注特定索引的问题,因此,如果您执行此类操作并且 kubectl 输出以不同的顺序返回 Service 对象,它可能想要关闭并交换哪个负载均衡器是哪个;或者如果删除某些内容,则可能会重新分配其他所有负载均衡器。)

    “最正确”(但最难)的答案是让 Kubernetes 了解您的云负载均衡器。您可以实现一个标准 (Go) k8s.io/cloud-provider 接口,并在主 Kubernetes 源代码树中提供一个 handful of providers。我猜fake cloud provider 是一个很好的起点。

    【讨论】:

    • 感谢详细信息,目前我只需要从 HCL 中弄清楚上述 terra 的 json equavalenet 是什么,然后我可以编写一个 python 脚本来使用 k8s python clinet 为所有服务生成所有 json然后将该json文件推送到terraform
    • 为什么不直接使用kubernetes_service data source
    • 我的阅读是它只找到了一个已知名称的服务,但如果我误读了,这是一个更好的答案。
    猜你喜欢
    • 2020-12-25
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 2022-01-04
    • 2022-11-12
    • 1970-01-01
    相关资源
    最近更新 更多