天天看點

cloud-init 工作原理 - 每天5分鐘玩轉 OpenStack(171)

cloud-init 是 linux 的一個工具,當系統啟動時,cloud-init 可從 nova metadata 服務或者 config drive 中擷取 metadata,完成包括但不限于下面的定制化工作:

設定 default locale

設定 hostname

添加 ssh keys到 .ssh/authorized_keys

設定使用者密碼

配置網絡

安裝軟體包

為了實作 instance 定制工作,cloud-init 會按 4 個階段執行任務:

local

init

config

final

cloud-init 安裝時會将這 4 個階段執行的任務以服務的形式注冊到系統中,比如在 systemd 的環境下,我們能夠看到這4個階段分别對應的服務:

local - cloud-init-local.service

init - cloud-init.service

config - cloud-config.service

final - cloud-final.service

cloud-init 工作原理 - 每天5分鐘玩轉 OpenStack(171)

作為 cloud-init 執行的第一個階段,此時 instance 還不知道該如何配置網卡,cloud-init 的任務就是從 config drive 中擷取配置資訊,然後寫入 /etc/network/interfaces 檔案(如果是 centos 則寫入 /etc/sysconfig/network-scripts/ifcfg-xxx)。

如果沒有 config drive,則将所有網卡配置成 dhcp 模式。這是非常關鍵的一步,隻有當網卡正确配置後,才能擷取到 metadata。

關于 local 階段下一節會通過實驗詳細分析。

正常情況下,在這三個階段執行之前 instance 網絡已經配置好了,并且已經成功擷取到 metadata。cloud-init 的配置檔案 /etc/cloud/cloud.cfg 定義了三個階段分别要執行的任務,任務以 module 形式指定。

cloud-init 工作原理 - 每天5分鐘玩轉 OpenStack(171)

instance 真正的定制工作就是由這些 module 完成的。module 決定做哪些定制化工作,而 metadata 則決定最終定制化的結果。

舉個例子,如果 cloud.cfg 中指定了 <code>set_hostname</code> 這個 module,則意味着 cloud-int 會設定 instance 的主機名,而具體設定成哪個主機名則由 metadata 中 <code>hostname</code> 參數決定。

有些 module 是有預設行為的,比如 <code>growpart</code>,如果 metadata 中沒有特别指定,它會自動擴充 <code>/</code> 分區。

後面我們會讨論 cloud-init 典型的使用場景,其中也會涉及常用 module 的示例。

cloud-init 工作原理 - 每天5分鐘玩轉 OpenStack(171)

繼續閱讀