如何在Terraform的DigitalOcean提供商中使用已有SSH密钥
在Terraform中为DigitalOcean Droplet添加已有SSH密钥的正确方法
核心问题在于混淆了Terraform中resource和data块的作用:
resource用来创建/管理新资源,用它定义已存在的SSH密钥时,Terraform会尝试重复创建,触发DigitalOcean的重复密钥报错。data用来读取已存在的资源,仅查询资源属性(比如ID),不会修改远程资源,这才是引用已有SSH密钥的正确方式。
具体步骤
- 声明data块读取已有密钥
在配置文件(如root.tf)中,为每个已存在的SSH密钥添加digitalocean_ssh_key数据源块,确保名称和DO账户中存储的完全一致:
data "digitalocean_ssh_key" "mySshKey" { name = "mySshKey" # 替换为你个人密钥在DO中的名称 } data "digitalocean_ssh_key" "uncleBob" { name = "uncleBob" # 替换为DO中已存在的uncleBob密钥名称 }
- 在Droplet配置中引用数据源ID
直接在Droplet的ssh_keys列表中引用上述data块的ID即可:
resource "digitalocean_droplet" "bla" { name = "blabla" size = "s-2vcpu-4gb" image = "debian-10-x64" region = "ams2" ipv6 = true ssh_keys = [ data.digitalocean_ssh_key.mySshKey.id, data.digitalocean_ssh_key.uncleBob.id, ] }
注意事项
- 数据源中的
name字段大小写敏感,必须和DO控制台中显示的密钥名称完全匹配。 - 若不确定密钥名称,可通过DO CLI命令
doctl compute ssh-key list查看所有密钥的名称和ID。 - 确保Terraform已正确配置DigitalOcean认证(通过环境变量
DO_TOKEN或provider配置),否则数据源无法读取远程密钥信息。
内容的提问来源于stack exchange,提问作者wick
相关产品推荐
相关产品推荐

