Terraform创建DigitalOcean Droplet后触发RKE模块运行报错咨询
报错根本原因
file() 是Terraform规划阶段(plan)就会执行的内置函数,仅支持读取随配置代码一起提前存在的静态文件,你用到的rkeip.txt是apply阶段才会由local_file资源动态生成的,规划阶段不存在。depends_on只能控制资源的执行顺序,无法修改file()函数的执行时机,因此加依赖也解决不了问题。
解决方案
完全不需要通过本地文件中转传参,直接用Terraform原生的模块输入变量传递Droplet IP即可,操作步骤如下:
1. 修改RKE模块配置(modules/rke/rke.tf)
- 新增输入变量接收外部传递的Droplet IP
- 删除无用的
data "template_file" "rkeip"块,直接用变量给rke_cluster赋值
修改后的完整代码:
terraform { required_providers { rke = { source = "rancher/rke" version = "1.2.4" } } } # 新增变量接收Droplet IP variable "droplet_ip" { type = string description = "DigitalOcean Droplet的公网IPv4地址" } provider "rke" { log_file = "rke_debug.log" } resource "rke_cluster" "test" { nodes { address = var.droplet_ip # 直接用变量值 user = "root" role = ["controlplane", "etcd", "worker"] ssh_key = file("~/.ssh/id_rsa") } }
2. 修改根目录Terraform配置
- 删除无用的
local_file "rkeip"资源 - 调用RKE模块时传入Droplet的IP属性
修改后的模块调用代码:
# 省略其他原有配置(terraform块、provider、digitalocean_droplet等保持不变) # 删掉原来的local_file "rkeip" 块,不需要了 module "RKE" { source = "./modules/rke/" # 传入Droplet的IP属性 droplet_ip = digitalocean_droplet.terra.ipv4_address }
修改完成后重新执行terraform plan即可正常通过,Terraform会自动识别资源依赖关系,先创建Droplet获取IP,再调用RKE模块创建集群。
内容的提问来源于stack exchange,提问作者outzhu-ac
相关产品推荐
相关产品推荐

