使用cloud-init创建的KVM客户机SSH登录失败(提示Permission denied (publickey))且user-data.yaml schema验证报错
我最近碰到了一个头疼的cloud-init问题:我把自己桌面系统的id_rsa.pub公钥放到了user-data.yaml里,用来配置KVM客户机的SSH授权密钥,结果不仅用cloud-init schema --system验证时弹出Error: Invalid schema: user-data的错误,连SSH登录客户机都失败,一直提示Permission denied (publickey)。
先给大家看看我当时的user-data.yaml内容:
#cloud-config users: - name: bob ssh_authorized_keys: - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDXpi229MbQCjmNluCXf2aPHKJTAzkZG6j9m8gsLeGE+yvBRDGurkwmZa/rZ4U7+Xox0eX5GDcCeFbPdRphhNq323f34t5seufwiueri4uri73rd0azK7CnI/nDL5gO2rLRskjsrrhWuQTPu/geYTayuYl/XVdzotoQz+hyWf1Gt1hCBievFnUtQstGlG9JHfPdfQkdIGAwxoaGNjyoeSUeNlWL1Vb9BN+nclxdEHmwB4xv8FsGl434/Wj+GNGar/dIgkrmHIgQmyQrQ2XnYigO8PfZwQcEAtcf4cHTA9VN8OmANa1hGp/0vPeQnsCDBt3Bey0zdtXggNAPV3 bob@BobsMac-mini.local sudo: ["ALL=(ALL) NOPASSWD:ALL"] groups: sudo shell: /bin/bash
后来我偶然发现了/var/lib/cloud/instances/iid-datasource-none/cloud-config.txt这个文件(之前完全不知道它的存在),里面的内容是:
# from 1 files # part-001 --- growpart: mode: 'off' locale: en_US.UTF-8 preserve_hostname: true resize_rootfs: false...
问题分析
仔细排查后发现,核心问题出在user-data.yaml的sudo字段里:我用了HTML转义字符"来代替双引号,但YAML解析器根本不认识这个,这直接导致了schema验证失败。而cloud-init在遇到schema错误时,会跳过部分甚至全部用户配置,结果就是我的SSH公钥根本没被正确添加到bob用户的~/.ssh/authorized_keys文件里,自然就出现了SSH登录被拒绝的情况。
解决步骤
修正user-data.yaml的语法错误
把sudo字段里的"替换成正常的双引号,修正后的这一行应该是:sudo: ["ALL=(ALL) NOPASSWD:ALL"]验证修正后的配置文件
用下面的命令先在本地验证schema是否合法,避免再出问题:cloud-init schema --config-file user-data.yaml如果没有报错,说明配置文件已经符合规范了。
重新应用cloud-init配置
如果你已经启动了客户机,可以在客户机里执行以下命令重新初始化cloud-init:cloud-init clean && cloud-init init或者直接重新创建KVM客户机,确保它加载修正后的
user-data.yaml。测试SSH登录
等cloud-init配置完成后,再尝试用桌面系统的私钥登录客户机的bob用户,应该就能正常登录了。
备注:内容来源于stack exchange,提问作者mr.zog

