我正在尝试利用 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 始终需要在规划步骤期间评估提供程序配置,因为允许提供程序依赖这些设置来创建计划,因此通常不可能让提供程序配置引用仅在计划步骤期间创建的内容应用步骤。
作为在这种情况下支持引导的一种方式,在这种情况下,可以合理地使用
-target=...
选项 terraform apply
,首先规划并应用足够的操作来创建 Rancher 集群,并且然后按照正常计划进行跟进并申请完成其他一切:
terraform apply -target=rancher2_cluster_v2.example
terraform apply
仅在
kube_config
属性未知的情况下才需要执行此两步过程。只要此资源类型具有收敛行为,您就应该能够正常使用 terraform apply
,除非您将来进行需要更换集群的更改。
(这是关于引用资源属性的提供程序配置的一般答案。我对 Rancher 特别不熟悉,因此可能有一些关于该特定资源类型的细节,我在这里没有提及。)
我找到了一种解决方案。我将 rancher2_cluster.cluster.kube_config 对象输出到变量中。然后在我的 Kubernetes 模块中引用该变量。我没有在提供程序配置中使用 kube_config 属性,而是使用令牌和主机属性,并使用 yamldecode 直接从 kube_config 变量解析信用。
provider "kubernetes" {
token = "${yamldecode(var.kube_config)["users"][0]["user"]["token"]}"
host = "${yamldecode(var.kube_config)["clusters"][0]["cluster"]["server"]}"
}
我建议将你的功能分成两层
kube_config
文件。我找到了一个似乎效果很好的解决方案。
我在这里使用 linode,因此您必须根据您的用例更改此设置。
resource "local_file" "kubeconfig" {
depends_on = [linode_lke_cluster.primary_cluster]
filename = "kubeconfig"
content = base64decode(linode_lke_cluster.primary_cluster.kubeconfig
}
provider "helm" {
kubernetes {
config_path = "${local_file.kubeconfig.filename}"
}
}
通过这样做,您可以强制提供程序基于正在创建的文件,这要求集群首先存在。