nova通过cloudinit注入公钥失败-问题分析

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,获取公钥


(二)metadata读取公钥

使用centos5.4镜像创建的实例,执行curl命令查看公钥是否可获取

# curl  http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key

可以正常获取到public-key信息,说明第一步正常,需要分析进一步分析cloudinit本身的处理。


(三)cloudinit 单步调试

【ubuntu14调试cloud-init0.7.5步骤】
1,清空已有的cloudinit信息
# cd /var/lib/cloudinit/

# rm -rf instances/* &&  rm -f instance

2,修改cloudinit源码(按需修改)
例如:修改cloudinit\config\cc_ssh.py
在代码中添加日志;log.info("infoooo.. aa value is:%s",aa)

3,执行cloudinit
# cloud-init init

4,查看日志:

# vim /var/log/cloud-init.log

注:Ubuntu注入的公钥路径可以是 /home/ubuntu/.ssh/authorized_keys


【CentOS5.4/5.5调试cloud-init0.6.3步骤】
1,清空已有的cloudinit信息
# cd /var/lib/cloudinit/
# rm -rf instances/* && rm -f instance

2,修改cloudinit源码(按需修改)
例如:修改cloudinit\config\cc_ssh.py
在代码中添加日志;log.info("infoooo.. aa value is:%s",aa)

3,执行cloudinit
# cloud-init start

4,查看日志:
# vim /var/log/messages


【CentOS7调试cloud-init0.7.5步骤】
1,清空已有的cloudinit信息
# rm -rf /var/lib/cloud/instance && rm -rf /var/lib/cloud/instances/* && rm -rf /var/lib/cloud/sem/*

2,修改cloudinit源码(按需修改)
例如:修改cloudinit\config\cc_ssh.py
在代码中添加日志;log.info("infoooo.. aa value is:%s",aa)

3,执行cloudinit
# cloud-init init && cloud-init modules --mode config && cloud-init modules --mode final

4,查看自定义打印日志:
# vim /var/log/messages


调试时,循环操作以上步骤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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章