You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform创建Azure Linux VM后SSH公钥认证偶发失败无法登录

Terraform部署Azure Linux虚拟机偶发SSH公钥登录失败解决方案
  • 首先修正Terraform公钥配置,使用trimspace函数消除本地文件和Azure侧存储的公钥换行/空白符差异,同时避免相对路径读取异常,核心配置修改为:
resource "azurerm_linux_virtual_machine" "example" {
  ...
  admin_username = "adminuser"

  admin_ssh_key {
    username   = "adminuser"
    public_key = trimspace(file("~/.ssh/id_rsa.pub"))
  }
  ...
}
  • 排查云初始化执行延迟问题:该偶发问题90%以上的场景是VM状态显示创建完成后,cloud-init服务还未完成公钥写入/home/adminuser/.ssh/authorized_keys的操作,执行terraform apply完成后请等待2~3分钟再尝试登录。你也可以通过Azure CLI调用VM运行命令提前验证公钥写入状态:
az vm run-command invoke -g <你的资源组名称> -n <你的VM实例名称> --command-id RunShellScript --scripts "cat /home/adminuser/.ssh/authorized_keys"

将返回的公钥内容和本地~/.ssh/id_rsa.pub内容做对比,确认一致后再登录即可。

  • 清理本地SSH known_hosts冲突:实例销毁重建后公网IP可能复用,本地存储的旧实例主机指纹会触发SSH安全校验拦截,执行以下命令清除对应IP的历史记录后再尝试登录:
ssh-keygen -R xxx.xxx.xxx.xxx # 替换为你的VM公网IP
  • 配置固化优化:如果需要完全消除公钥读取的偶发差异,可以提前创建Azure SSH公钥资源进行统一管理,避免每次读取本地文件的不确定性:
# 提前创建SSH公钥资源
resource "azurerm_ssh_public_key" "example" {
  name                = "example-ssh-key"
  resource_group_name = azurerm_resource_group.example.name
  location            = azurerm_resource_group.example.location
  public_key          = trimspace(file("~/.ssh/id_rsa.pub"))
}

# VM侧直接引用公钥资源属性
resource "azurerm_linux_virtual_machine" "example" {
  ...
  admin_username = "adminuser"

  admin_ssh_key {
    username   = "adminuser"
    public_key = azurerm_ssh_public_key.example.public_key
  }
  ...
}

内容的提问来源于stack exchange,提问作者Martin Müsli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 05:24:04