Cloud-init
Cloud-init 包含多個用於雲實例早期初始化的工具,提供給在雲上環境(如 OpenStack,AWS 等)運行的 Arch Linux 映像所用。
安裝[編輯 | 編輯原始碼]
安裝 cloud-init包 包。
如果你需要使用 growpart 模塊,須同時安裝 cloud-guest-utils包 包。
配置[編輯 | 編輯原始碼]
該部分僅描述了最基礎的配置選項,完整選項可參考 cloud-init 文檔。
主配置文件為 /etc/cloud/cloud.cfg
。需要加載的其它 *.cfg
配置文件可放置於 /etc/cloud/cloud.cfg.d
目錄下,所有配置內容都將被整合到一起。
cloud-init 19.3 及更新版本的默認配置可直接用於多數知名雲環境中。簡單來講,該配置文件進行了如下操作:
- 禁用根用户,創建用於登錄的
arch
用户 - 依靠 cloud-init 的內置數據源檢測
- 運行所有在 Arch Linux 上已知可用的模塊
根據用例不同,可能需要修改默認配置文件。
配置默認用户[編輯 | 編輯原始碼]
默認配置中包含了如下內容(為簡潔起見已省略註釋):
users: - default
該配置指定了要添加到系統中的用户。default
這一特殊名稱意為 system_info
一節中的 default_user
(參考下列內容),但該部分語法可使用多種參數配置任意用户信息。該列表中的第一個用户將被其它模塊作為「默認用户」(例如通過雲環境傳遞的信息配置 SSH 的模塊)。
disable_root: true
禁用根用户通過 SSH 進行訪問。你也可以在映像中刪除根用户密碼:
# passwd -d root
system_info: default_user: name: arch lock_passwd: true gecos: arch Cloud User groups: [wheel, adm] sudo: ["ALL=(ALL) NOPASSWD:ALL"] shell: /bin/bash
以上為分發包中指定的默認用户信息:
- 默認用户名為
arch
- 默認用户為密碼鎖定狀態,即你只可以通過啟動時配置的 SSH 密鑰登錄到實例中
- 默認用户將加入到
adm
和wheel
組中 - 默認用户可以無密碼使用
sudo
- 默認用户的終端環境為
/bin/bash
注意,只有當上面的 users:
一節包含了特殊用户「default」(或這一節被完全移除)時,這裏配置的用户信息才會被應用。
配置數據源[編輯 | 編輯原始碼]
數據源指定了啟動時如何拉取實例的元數據,取決於實例運行的具體雲環境(OpenStack,AWS,OpenNebula 等)。在這背後,這一操作為對應模塊實現的部分公用接口的方法。
默認配置文件不指定任何數據源,即 cloud-init 將自動檢測雲環境。但是,部分雲環境無法被自動檢測,或是需要特殊配置才能正常工作。在這一情況下,數據源可用於手動進行指定和配置。詳細信息可參考文檔中的已知數據源列表一節。
如需指定數據源列表,可在 /etc/cloud/cloud.cfg
配置文件中加入如下內容:
datasource_list: [ NoCloud, ConfigDrive, OpenNebula, Azure, AltCloud, OVF, MAAS, GCE, OpenStack, CloudSigma, Ec2, CloudStack, None ]
這一操作將指示 cloud-init 在下載實例元數據時需要加載哪些模塊。另外,可以對單個數據源進行更詳細的配置:
datasource: OpenStack: metadata_urls: [ 'http://169.254.169.254:80' ] dsmode: net
上述配置吿知 OpenStack 數據源使用 http://169.254.169.254:80
URL 來下載元數據,並在網絡初始化之後再運行。這兩項都是默認行為,可以省略不寫。
模塊[編輯 | 編輯原始碼]
Cloud-init 默認包含了一系列模塊,可按需進行啟用或禁用。默認配置啟用了所有已知在 Arch Linux 上可用的模塊。被忽略的模塊包含如分發版或作業系統特定模塊等。
實際上,模塊被啟用不代表它們一定會進行任何操作。它們會檢查是否有任何相關配置被傳入(如雲環境通過數據源傳入的配置),之後再進行相關操作。因此,啟用所有模塊通常可以最大化對不同雲環境的兼容性。不論如何,你可以在配置文件中移除確定不需要的模塊,以達到提升啟動速度等效果。你可以在啟動的實例上運行 cloud-init analyze
命令來檢查各模塊佔用的啟動時長。
部分模組會向 cloud-init 宣稱它在哪些分發版上進行過驗證。除非在 cloud.cfg
中指定的分發版與模組已驗證的分發版匹配,就算配置文件中進行了指定,它們也不會運行。如果你想強制繞過該行為,可在配置文件的 unverified_modules
部分添加對應模塊,例如:
unverified_modules: ['ssh-import-id']
Systemd 整合[編輯 | 編輯原始碼]
cloud-init 包提供了四個 systemd.service(5),兩個 systemd.target(5) 和一個 systemd.generator(7),並通過依賴關係配置為按如下順序激活:
cloud-init-generator
:判斷可用數據源,並啟用或禁用cloud-init.target
cloud-init-local.service
:需要文件系統可用。將執行cloud-init init --local
cloud-init.service
:需要網絡可用。將執行cloud-init init
cloud-config.target
:對應 cloud-config 啟動事件「to inform third parties that cloud-config is available」cloud-config.service
:執行cloud-init modules --mode=config
cloud-final.service
:執行cloud-init modules --mode=final
cloud-init.target
:當所有服務啟動後激活
Uplink Labs EC2 映像啟用了上述的所有內容,但出於依賴關係這顯得有點繁雜。在準備映像時,啟用 cloud-init.service
和 cloud-final.service
服務即可。注意,這不代表 cloud-init 一定會被運行 - 這取決於啟動早期時 generator 是否成功啟用了 cloud-init.target
。
更多信息可參考 cloud-init 啟動階段文檔。
用法[編輯 | 編輯原始碼]
Archiso[編輯 | 編輯原始碼]
以下演示了如何使用 QEMU 測試帶有 cloud-init 的 Archiso(參考 archlinux/archiso#27):
首先使用 YAML 格式創建包含用户名及 SSH 公鑰信息的 user-data
配置文件。你可以使用 archiso Merge Request #117 提供的 create_cloud-init.sh
腳本,也可以參考如下示例手動編寫,並添加任何 cloud-init 文檔中的額外選項。注意,#cloud-config
不是 YAML 註釋,而是 cloud-init 要求包含的內容。
#cloud-config users: - name: vorburger ssh_authorized_keys: - ssh-rsa (...)
我們也可以使用 meta-data
,但這不是強制需求,可僅放置一空文件(但文件本身需存在):
$ touch meta-data
然後使用 libisoburn包 的 xorriso 編譯(僅)包含 user-data
和 meta-data
的 cloud-init.iso
文件:
$ xorriso -as genisoimage -output cloud-init.iso -volid CIDATA -joliet -rock user-data meta-data
現在將 cloud-init.iso
作為額外驅動器加載到虛擬機中,例如 qemu-system-x86_64 ... -cdrom cloud-init.iso
,或在使用 archiso 時執行 run_archiso -c
。
你現在應該能使用 user-data
中指定的用户和公鑰信息通過 SSH 登錄到機子上了。注意,由於啟動菜單的延遲時間,可能會需要等待一會才能正常登錄(例如 archlinux*.iso
的默認啟動等待時長為 30s)。對於需要反覆測試帶有新主機簽名的新實例的情況,可以考慮使用 ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null
。
-smbios type=1,serial=ds=nocloud
. This can be accomplished locally on a host running QEMU and an ad hoc Python webserver as described in the cloud-init tutorial. To boot on bare metal you could just "burn" two separate USB sticks, for archlinux*.iso
and cloud-init.iso
, and boot from archlinux*.iso
. When doing this, cloud-init will run using the configuration on cloud-init.iso
.排障[編輯 | 編輯原始碼]
FAQ[編輯 | 編輯原始碼]
Cloud-init FAQ 提供了如何對 cloud-init 進行排障的相關資料,其中包括 log 文件的位置,以及如何在開發過程中重新進行數據源檢測和重新運行 cloud-init。
映像未掛載[編輯 | 編輯原始碼]
通常先使用 lsblk
和 mount
檢查是否能檢測到 cloud-init 映像(ISO)。
"device /dev/sr0 with label cidata not a valid seed"[編輯 | 編輯原始碼]
user-data
和 meta-data
需要都存在,可以留空。例如,當 nocloud 數據源發現 ISO 只包含 user-data
而沒有 meta-data
時,就會提示 datasourcenocloud.py warning device /dev/sr0 with label cidata not a valid seed
報錯。
"unhandled non-multipart [...] ssh_authorized_keys"[編輯 | 編輯原始碼]
當 user-data
沒有以 #cloud-config
開頭時(雖然 yamllint
會提示 missing starting space in comment
,中間不能出現空格),就會出現 unhandled non-multipart (text-x-not-multipart) userdata 'b'ssh_authorized_keys
報錯。