Cloudinit如何判斷虛擬機爲初始化狀態

Cloudinit簡介
cloudinit是專爲雲環境中虛擬機的初始化而開發的工具,它從各類數據源讀取相關數據並據此對虛擬機進行配置。常見的數據源包括:雲平臺的metadata服務、ConfigDrive等,常見的配置包括:設定虛擬機的hostname、hosts文件、設定用戶名密碼、更新apt-get的本地緩存、調整文件系統的大小等。html

Cloudinit數據源
Cloud-init github倉庫地址:https://github.com/cloud-init/cloud-init python

阿里云数据源
Cloud-init目前代碼庫中,已支持阿里雲自定義的數據源:[‘http://100.100.100.200‘] git

阿里云数据源示例
Cloudinit 如何判斷虛擬機是初始化時的第一次啓動?
Cloudinit主要經過讀取/etc/cloud/cloud.cfg配置文件,來執行相應模塊。模塊通常位於python第三方包cloudinit目錄下:/usr/lib/python2.6/site-packages/cloudinit/config 
 æ¨¡å—位置
模塊有多種運行模式(frequency),包括PER_INSTANCE, PER_BOOT, PER_ONCE ,PER_ALWAYS,在上述python文件中配置。 
 æ¨¡å—模式配置
模式爲per-once的模塊,一旦運行完畢會在一個名爲sem的目錄中建立一個信號文件,從而防止模塊的在下次啓動時重複運行,若虛擬機初始化時,sem目錄中不存在相應的信號文件,Cloudinit則會執行一次,之後都不會執行。 
sem目錄具體位置: 
/var/lib/cloud/instances/實例ID/sem github

sem位置
Windows系統,主要由cloudbase-init讀取註冊表項判斷是否是初始化。例如注入密碼時,第一次注入以後會在註冊表中更新HKEY_LOCAL_MACHINE/SOFTWARE/Cloudbase Sloutions/Cloudbase-Init/實例ID/Plugins/SetUserPasswordPlugin值爲1,表示下次再也不更新。若是須要從數據源讀取密碼從新注入,只需刪除SetUserPasswordPlugin項目便可。 shell

注册表位置
AWS EC2Config簡介
AWS EC2Config是對cloudbase-init的封裝。 
EC2Config配置文件位於 C:\Program Files\Amazon\Ec2ConfigService\Settings 目錄下:數據庫

ActivationSettings.xml - 使用密鑰管理服務器 (KMS) 控制產品激活。
AWS.EC2.Windows.CloudWatch.json - 控制要發送到 CloudWatch 的性能計數器以及要發送到 CloudWatch Logs 的日誌。有關如何更改此文件中的設置的更多信息,請參閱向 Amazon CloudWatch 發送日誌、事件和性能計數器。
BundleConfig.xml - 控制 EC2Config 爲 AMI 建立準備實例存儲支持的實例的方式。
Config.xml - 控制基本設置。
DriveLetterConfig.xml - 控制驅動器號映射。
EventLogConfig.xml:控制實例啓動時控制檯上顯示的事件日誌信息。
WallpaperSettings.xml:控制桌面背景上顯示的信息。
如密碼初始化在Config.xml 文件中配置,以下圖所示: 
 Config.xml
Ec2SetPassword:在您每次啓動實例時生成隨機加密密碼。默認狀況下,首次啓動以後該功能會被禁用,所以從新啓動該實例並不會更改用戶設置的密碼。每次您啓動實例時,請將該設置改成 Enabled,以繼續生成密碼。 
http://docs.amazonaws.cn/AWSEC2/latest/WindowsGuide/UsingConfig_WinAMI.htmljson

Cloudbase-init 的Plugin執行策略簡述
Cloudbase-init的Plugin執行策略定義在cloudbase-init/cloudbaseinit/plugins/common/base.py文件。 
 PLUGIN_EXECUTION
PLUGIN_EXECUTION_DONE = 1 
表示Plugin已經執行完成 
PLUGIN_EXECUTE_ON_NEXT_BOOT = 2 
表示Plugin在下次啓動時執行windows

Plugin的執行策略可經過註冊表進行配置,Cloudbase-init讀取Plugin的註冊表配置項流程以下。 
步驟一:shell.py主入口函數,調用init.IniManager.configure_host() 
 shell.main
cloudbase-init/cloudbaseinit/shell.py緩存

步驟二:init.IniManager.configure_host(),調用_handle_plugins_stage() 
 _handle_plugins_stage
cloudbase-init/cloudbaseinit/init.py服務器

步驟三:_handle_plugins_stage(),調用_exec_plugin() 
 _exec_plugin
cloudbase-init/cloudbaseinit/init.py

步驟四: _exec_plugin(),調用_get_config_value() 
 _get_config_value
cloudbase-init/cloudbaseinit/init.py

步驟五:_get_config_value(),調用osutils.get_config_value() 
 get_config_value
cloudbase-init/cloudbaseinit/init.py

步驟六:osutils.get_config_value()經過Python winreg模塊讀取註冊表對應的Plugin值 

osutils.get_config_value
OpenStack Windows實例使用cloudbase-init自動生成密碼流程

cloudbase

Windows實例啓動後,cloudbase-init執行各功能plugin,關於初始化密碼流程簡述以下 
1. 訪問http://169.254.169.254/openstack/latest/meta_data.json,獲取實例元數據 
(其中lastest、2013-04-04等是指版本號) 
 å®žä¾‹å…ƒæ•°æ®
2. 執行SetUserSSHPublicKeysPlugin,獲取SSH public keys並寫入文件:C:\Users\Administrator.ssh\authorized_keys 
3. 執行SetUserPasswordPlugin: 
①生成隨機密碼; 
②將密碼設置給Windows Administrator用戶; 
③判斷Nova metadata數據庫是否已經保存密碼自動(判斷方法:get方法獲取http://169.254.169.254/openstack/latest/password 數據,若無返回值則說明數據庫未保存密碼) 
④使用SSH public key加密密碼; 
⑤將密文post給Nova metadata數據庫(該接口服務端同時也會檢查數據庫中是否已保存密碼,若是已保存,則拒絕寫入,起到保護數據庫的做用)。

注意,當安裝上文步驟修改註冊表值,從新初始化密碼時會出現以下情況 Windows Administrator用戶密碼已被從新初始化 沒法經過GET /v2/{tenant_id}/servers/{server_id}/os-server-password 接口獲取Windows實例密碼 因此,當須要從新初始化Windows實例密碼須要進行以下操做 調用 DELETE /v2/{tenant_id}/servers/{server_id}/os-server-password 接口,清除Nova metadata數據庫中保存的密碼 根據上文修改註冊表項 重啓。此時Windows Administrator密碼已從新初始化,Windows實例密碼也可順利經過接口獲取。 參考文獻 http://cloudinit.readthedocs.io/en/latest/topics/debugging.html  http://blog.csdn.net/weiyuanke/article/details/23789069  https://github.com/cloud-init/cloud-init  https://github.com/openstack/cloudbase-init  http://www.cnblogs.com/davygeek/p/4579829.html  https://wiki.cloudbase.it/cloudbaseinit-doc  https://ask.cloudbase.it/question/1011/updating-windows-imagesysprep-how-to-rearm-clouldbase-init/  http://docs.ocselected.org/openstack-manuals/kilo/admin-guide-cloud/content/section_metadata-service.html ---------------------  做者:longgeq1993  來源:CSDN  原文:https://blog.csdn.net/longgeQ1993/article/details/78487417  版權聲明:本文爲博主原創文章,轉載請附上博文連接!

相關文章
相關標籤/搜索