如何在Terraform多Droplet输出中同时返回公网IP和生成的随机密码
Terraform 输出 DigitalOcean Droplet 实例名、公网IP、密码的修改方案
你只需要在output中将每个Droplet实例和对应的random_string密码资源做映射,把三类信息打包为结构化对象输出即可,以下是具体配置示例:
参考资源定义(如果你的资源命名和示例不一致,对应替换即可)
# 示例:待创建的Droplet列表变量 variable "droplet_names" { type = list(string) default = ["web-01", "web-02", "db-01"] } # 为每台VM生成独立随机密码 resource "random_string" "vm_login_pwd" { for_each = toset(var.droplet_names) length = 16 special = true } # 创建Droplet资源 resource "digitalocean_droplet" "instance" { for_each = toset(var.droplet_names) name = each.value image = "ubuntu-22-04-x64" size = "s-1vcpu-1gb" region = "sgp1" # 你已有的remote-exec配置省略,其中使用random_string.vm_login_pwd[each.key].result设置密码 }
修改Output配置
适配for_each批量创建的场景
output "droplet_full_info" { description = "Droplet完整信息:实例名、公网IP、登录密码" type = list(object({ name = string public_ip = string password = string })) value = [ for name in var.droplet_names : { name = digitalocean_droplet.instance[name].name public_ip = digitalocean_droplet.instance[name].ipv4_address password = random_string.vm_login_pwd[name].result } ] # 密码属于敏感信息,必须加此参数,否则Terraform会校验报错 sensitive = true }
适配count批量创建的场景
output "droplet_full_info" { description = "Droplet完整信息:实例名、公网IP、登录密码" type = list(object({ name = string public_ip = string password = string })) value = [ for i in range(length(digitalocean_droplet.instance)) : { name = digitalocean_droplet.instance[i].name public_ip = digitalocean_droplet.instance[i].ipv4_address password = random_string.vm_login_pwd[i].result } ] sensitive = true }
查看明文输出
因为output标记了敏感属性,默认执行terraform apply不会直接展示密码,执行以下命令即可查看完整的明文信息:terraform output -raw droplet_full_info
注意事项
- 密码会明文存储在Terraform state文件中,请务必做好state文件的加密和权限管控
- 不需要使用密码输出时,建议及时删除该output配置,降低泄露风险
内容的提问来源于stack exchange,提问作者mocart
相关产品推荐
相关产品推荐

