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
相关产品推荐
相关产品推荐

