如何让Terraform Provider等待依赖资源创建完成后再加载配置
解决方案
方案1:直接传递kubeconfig属性(更推荐)
你不需要将kubeconfig写入本地文件再读取,直接在Kubernetes和Helm Provider的配置中引用rancher2_cluster_v2资源的kube_config属性即可。Terraform会自动识别Provider配置对集群资源的依赖,等待RKE集群创建完成、kube_config属性生成后再初始化对应Provider,无需额外配置。
示例代码如下:
# 创建RKE集群 resource "rancher2_cluster_v2" "rke_cluster" { name = "my-rke-cluster" # 其余集群配置省略 } # 配置Kubernetes Provider provider "kubernetes" { host = yamldecode(rancher2_cluster_v2.rke_cluster.kube_config).host token = yamldecode(rancher2_cluster_v2.rke_cluster.kube_config).users[0].user.token cluster_ca_certificate = base64decode(yamldecode(rancher2_cluster_v2.rke_cluster.kube_config).clusters[0].cluster.certificate-authority-data) } # 配置Helm Provider provider "helm" { kubernetes { host = yamldecode(rancher2_cluster_v2.rke_cluster.kube_config).host token = yamldecode(rancher2_cluster_v2.rke_cluster.kube_config).users[0].user.token cluster_ca_certificate = base64decode(yamldecode(rancher2_cluster_v2.rke_cluster.kube_config).clusters[0].cluster.certificate-authority-data) } }
方案2:基于本地kubeconfig文件的依赖配置
如果你的业务场景必须先将kubeconfig生成本地文件再使用,只需要在Provider配置中直接引用生成文件的资源属性,Terraform会自动建立依赖关系,等待文件写入完成后再加载Provider。
示例代码如下:
# 生成本地kubeconfig文件 resource "local_file" "kubeconfig" { content = rancher2_cluster_v2.rke_cluster.kube_config filename = "${path.module}/kubeconfig.yaml" } # 配置Kubernetes Provider provider "kubernetes" { config_path = local_file.kubeconfig.filename } # 配置Helm Provider provider "helm" { kubernetes { config_path = local_file.kubeconfig.filename } }
注意事项
- 不要在Provider配置中硬编码kubeconfig的本地路径,必须通过资源属性引用,否则Terraform无法识别依赖关系,会在初始化阶段就尝试读取不存在的文件导致报错。
- 以上依赖是隐式自动建立的,不需要手动添加
depends_on配置,可靠性更高。 - 方案适用于Terraform 0.13及以上版本,即当前所有主流Terraform版本均支持该特性。
内容的提问来源于stack exchange,提问作者Suhas Potluri
相关产品推荐
相关产品推荐

