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


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

  1. 設置 default locale

  2. 設置 hostname

  3. 添加 ssh keys到 .ssh/authorized_keys

  4. 設置用戶密碼

  5. 配置網絡

  6. 安裝軟件包

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

  1. local

  2. init

  3. config

  4. final

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

  1. local - cloud-init-local.service

  2. init - cloud-init.service

  3. config - cloud-config.service

  4. final - cloud-final.service

39.5.png

local 階段


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

如果沒有 config drive,則將所有網卡配置成 dhcp 模式。這是非常關鍵的一步,只有當網卡正確配置后,才能獲取到 metadata。

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

init, config 和 final 階段


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

39.6.png

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

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

有些 module 是有默認行為的,比如 growpart,如果 metadata 中沒有特別指定,它會自動擴展 / 分區。

由於篇幅限制,這里就不一一討論每個 module 了,具體可參看文檔 https://cloudinit.readthedocs.io/en/latest/topics/modules.html

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


免責聲明!

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



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