如何使 Terraform 提供程序依赖于正在创建的资源
Posted
技术标签:
【中文标题】如何使 Terraform 提供程序依赖于正在创建的资源【英文标题】:How to make Terraform provider dependent on a resource being created 【发布时间】:2021-12-27 22:56:12 【问题描述】:我正在尝试利用 Rancher Terraform 提供程序创建一个新的 RKE 集群,然后使用 Kubernetes 和 Helm Terraform 提供程序为创建的集群创建/部署资源。我正在使用这个 https://registry.terraform.io/providers/rancher/rancher2/latest/docs/resources/cluster_v2#kube_config 属性来创建一个包含新集群的 kube 配置的本地文件。 Helm 和 Kubernetes 提供者需要提供者配置中的 kube 配置:https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs。有什么方法可以让提供者配置等待本地文件被创建?
【问题讨论】:
terraform-aws-eks
有一个很好的例子来说明如何做到这一点:github.com/terraform-aws-modules/…
【参考方案1】:
一般来说,Terraform 总是需要在规划步骤中评估提供者配置,因为允许提供者依赖这些设置来创建计划,因此通常不可能让提供者配置引用创建的内容仅在应用步骤期间。
作为在这种情况下支持引导的一种方式,在这种情况下使用-target=...
选项到terraform apply
是合理的,仅计划和应用足够的操作来首先创建 Rancher 集群,然后按照正常计划跟进并申请完成其他所有事情:
terraform apply -target=rancher2_cluster_v2.example
terraform apply
只有在kube_config
属性未知的情况下才需要这个两步过程。只要此资源类型具有收敛行为,您就应该可以正常使用 terraform apply
,除非您将来进行需要更换集群的更改。
(这是关于资源属性的提供者配置的一般答案。我对 Rancher 并不特别熟悉,因此可能有一些关于该特定资源类型的细节,我在这里没有提及。)
【讨论】:
【参考方案2】:我建议将你的功能分成两层
-
运行第一层生成
kube_config
文件。
运行将使用此文件的第二层。
【讨论】:
【参考方案3】:我找到了一种解决方法。我将 rancher2_cluster.cluster.kube_config 对象输出到一个变量中。然后在我的 Kubernetes 模块中引用了该变量。我没有在提供程序配置中使用 kube_config 属性,而是使用了 token 和 host 属性,并使用 yamldecode 直接从 kube_config 变量解析凭据。
provider "kubernetes"
token = "$yamldecode(var.kube_config)["users"][0]["user"]["token"]"
host = "$yamldecode(var.kube_config)["clusters"][0]["cluster"]["server"]"
【讨论】:
以上是关于如何使 Terraform 提供程序依赖于正在创建的资源的主要内容,如果未能解决你的问题,请参考以下文章
Terraform:如何安装多个版本的提供程序插件? [复制]
Terraform:如果父项部分完成并出现错误,是否会创建依赖资源?