nova注入密钥有两种方式:1、metadata 2、config dirve ,此处分析基于metadata方式
密钥没有登录成功,查看服务器端,如果网络能通,且ssh配置正确,公钥应该是没有注入到指定目录下。需要根据流程分析,如下:
1,首先,确认在实例中能否获取到需要的密钥,就是先判断在实例中能否通过指定的方式(metadata/configdrive)获取到metadata的值,因为public key的值在metadata中。
2,如果能通过metadata获取到公钥,则接着分析cloud-init为何没有将公钥下发到指定配置。
对应上面两个方法:
1)通过curl 169.254.169.254获取公钥,此处所用的方法;
2)通过config drive,读取本地的config-2挂载后信息中的metadata,获取公钥
使用centos5.4镜像创建的实例,执行curl命令查看公钥是否可获取
# curl http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key可以正常获取到public-key信息,说明第一步正常,需要分析进一步分析cloudinit本身的处理。
【ubuntu14调试cloud-init0.7.5步骤】
1,清空已有的cloudinit信息
# cd /var/lib/cloudinit/
# rm -rf instances/* && rm -f instance
2,修改cloudinit源码(按需修改)# vim /var/log/cloud-init.log
注:Ubuntu注入的公钥路径可以是 /home/ubuntu/.ssh/authorized_keys
调试时,循环操作以上步骤1到4
CentOS 5.4和CentOS 5.5镜像,由于镜像中cloudinit的配置文件cloud.cfg中,user指定的是ec2-user。
根据日志报错跟踪分析cloudinit代码,在cloud-init-0.6.3\cloudinit\CloudConfig\cc_ssh.py中分析流程可知,cloudinit处理公钥时,优先处理普通用户的请求,而系统中本身没有ec2-user用户,直接抛异常。重新制作两个系统镜像,修改user为root,验证可以使用密钥登录。
在OpenStack Kilo版本中,是由openstack-nova-metadata-api来负责监听8775端口,但是在Liberty版本里,直接改成了由openstack-nova-api来监听8775端口。
也就是说,在Liberty版本里,openstack-nova-api多承担了一项责任,把metadata-api监听处理的活也给接过来了。因此在Liberty版本里就不需要启动openstack-nova-metadata-api
参考:https://blog.csdn.net/zhangli_perdue/article/details/50317221
https://blog.csdn.net/gzhouc/article/details/52210150
https://www.ibm.com/developerworks/cn/cloud/library/1509_liukg_openstackmeta/index.html
https://stackoverflow.com/questions/23065673/how-to-re-run-cloud-init-without-reboot
https://wiki.archlinux.org/index.php/Cloud-init
https://docs.openstack.org/nova/latest/user/metadata-service.html
https://help.ubuntu.com/community/CloudInit