cloud-init是linux的一個工具,當系統啟動時,cloud-init可從nova metadata服務或者config drive中獲取元數據,完成包括但不限於下面的定制化工作:
-
設置默認語言環境
-
設置主機名
-
添加ssh鍵到.ssh / authorized_keys
-
設置用戶密碼
-
配置網絡
-
安裝軟件包
為了實現instance定制工作,cloud-init會按4個階段執行任務:
-
本地
-
在里面
-
配置
-
最后
cloud-init安裝時會將這4個階段執行的任務以服務的形式注冊到系統中,比如在systemd的環境下,我們能夠看到這4個階段分別對應的服務:
-
local - cloud-init-local.service
-
init - cloud-init.service
-
config - cloud-config.service
-
final - cloud-final.service
當地階段
作為cloud-init執行的第一個階段,此時實例還不知道該如何配置網卡,cloud-init的任務就是從配置驅動中獲取配置信息,然后寫入/ etc / network / interfaces文件(如果是centos則寫入/ etc / sysconfig / network-scripts / ifcfg-xxx)。
如果沒有配置驅動,則將所有網卡配置成dhcp模式。這是非常關鍵的一步,只有當網卡正確配置后,才能獲取到元數據。
關於local階段下一節會通過實驗詳細分析。
init,config和final階段
正常情況下,在這三個階段執行之前實例網絡已經配置好了,並且已經成功獲取到metadata.cloud-init的配置文件/etc/cloud/cloud.cfg定義了三個階段分別要執行的任務,任務以模形式指定。
instance真正的定制工作就是由這些模塊完成的.module決定做哪些定制化工作,而元則則決定最終定制化的結果。
舉個例子,如果cloud.cfg中指定了 set_hostname
這個模塊,則意味着cloud-int會設置instance的主機名,而具體設置成哪個主機名則由元數據中 hostname
參數決定。
有些模塊是有默認行為的,比如 growpart
,如果元數據中沒有特別指定,它會自動擴展 /
分區。
由於篇幅限制,這里就不一一討論每個模塊了,具體可參閱文檔 https://cloudinit.readthedocs.io/en/latest/topics/modules.html
后面我們會討論cloud-init典型的使用場景,其中也會涉及常用模塊的示例
摘自“每天
5分鍾玩轉OpenStack
”