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




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