Cloud-init

出自 Arch Linux 中文维基

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 密鑰登錄到實例中
  • 默認用戶將加入到 admwheel 組中
  • 默認用戶可以無密碼使用 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.servicecloud-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

然後使用 libisoburnxorriso 編譯(僅)包含 user-datameta-datacloud-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

提示:Cloud-init's nocloud documenation explains an alternative approach, based on using -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。

映像未掛載[編輯 | 編輯原始碼]

通常先使用 lsblkmount 檢查是否能檢測到 cloud-init 映像(ISO)。

"device /dev/sr0 with label cidata not a valid seed"[編輯 | 編輯原始碼]

user-datameta-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 報錯。

參考[編輯 | 編輯原始碼]