openstack重設虛擬機實例密碼


目錄結構:

引出

采用 nova get-password 方式

采用 libvirt-set-admin-password

采用 nova rebuild instance 的方式

采用 cloud-init 的方式

引出

  • 要解決的問題很明確:就是如果虛擬機的連接采用用戶名密碼登錄的方式,而密碼忘記的話,需要采取什么手段解決。
  • 其實解決方案是要取決於真實的生產環境,虛擬化方式的不同,初始化虛擬機密碼方式的不同,openstack版本的不同,都會造成某個方案的可行不可行。以下幾種方案可能或多或少會出現無法實現的情況,樓主盡量把條件講清楚。

采用 nova get-password 方式

  • 利用nova 提供的這個接口可以獲取instance的password,就不用密碼reset了。
  • 適用條件:虛擬化方式為XEN,不支持libvirt.

采用 libvirt-set-admin-password

  • Openstack L 版本新加入的功能,直接使用 “nova set-password “(或早期版本client的”nova root-password”) 就可以,之前的版本該命令不支持Libvirt,僅支持XEN。
  • 適用條件:Openstack Libvirt+ 版本,宿主機libvirt版本1.2.16+,虛擬機鏡像安裝2.3+ 版本的qemu-guest-agent,詳見虛擬機系統密碼的修改方案¶
  • 博主試驗了linux 幾個主要版本(debian,ubuntu,centos),只要滿足以上的限制條件,都能修改成功,不過官網提供的cloud 版本鏡像大都沒有安裝 qemu-guest-agent,或者版本太低,需要自己安裝並制作成鏡像。windows 的鏡像相對比較麻煩點,宿主機裝的virtio-win,通過文件掛載的方式給guest安裝對應驅動和QGA,其實不用安裝也可以,實現最終都是guest 安裝virtio-serial驅動,然后安裝quemu-guest-agent就可以了,還有一點就是要設置鏡像的property ,例如:hw_qemu_guest_agent=yes,os_type=windows。
    參考Running the QEMU Guest Agent on a Windows GuestCan I have virtio-win package on CentOS

CentOS 7.1 QEMU guest agent 安裝 與 使用 (注:這篇文章有點過時了,因為QGA以及驅動的版本已經升級了好幾版,大部分功能都已經實現,比如密碼修改等,但是整個流程是一致的)

采用 nova image-create / nova rebuild的方式

  • 如果虛擬機是根據user-data來設定初始密碼的,那么cloud-init只在第一次創建虛擬機執行一次,以后不會執行(reboot也不會執行)。那么我們也只能再次launch一下,方法如下。
  • 首先對當前虛擬機做一次snapshot.

    image-create

    image-snap

  • 利用該snapshot ,設定好user-data重新boot 一個新的虛擬機

    snap-boot

  • 注意:此處只是保證系統盤數據是不變的,如果是數據盤的話還要將對應的數據盤detach再attch到新建的虛擬機中。當然,如果虛擬機是直接用的adminPass的話(即injectPassword的方式)也可以直接利用rebuild命令(rebuild只能用於image啟動的instance,而不能用於volume 啟動的instance)。

  • 這種方法其實比較笨拙,不到萬不得已一般不會這么做。

采用 cloud-init 的方式

  • 這種方法算是所有方法里面最輕便的,但壞處是需要自己定制腳本。對於cloud-init,不熟悉的話可以先翻一下官方手冊
  • 原理很簡單:借助cloud-init,在虛擬機啟動的時候開啟一個服務,用來監測metadata中設定的某個值,如果該值發生改變(或者滿足其他條件)即做出密碼更改的動作並reboot。
  • 可喜的是,我在github找到了類似的代碼openstack-password-reset ,不過這個代碼只是考慮了RH7系列,而且密碼是隨機生成的,如果再推給openstack,可能更復雜了。我又更改一下腳本,支持更多Linux版本,且把重設后的密碼定死了。年后會把改過的代碼掛到github上。
  • 這里面的reset Python程序是通過外鏈獲取的,於是干脆在nova里加了一個API,用來獲取該程序。
  • 如果是傳遞多個文件給cloud-init的話,需要使用MIME的格式,tips:一般是把多個腳本/cloud-config文件 打包成MIME格式文件,然后壓縮成gzip格式,傳給cloud-init。

參考文章

Password Reset

虛擬機系統密碼的修改方案

CloudInit & User-Data

 

END


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM