Cloud-init - Arch Linux 中文维基

跳至內容

# Cloud-init

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 Cloud-init，最近一次同步於 2024-11-02，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

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-main.service`：需要網絡可用。將執行 `cloud-init init --all-stages`
- `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-main.service` 和 `cloud-final.service` 服務即可。注意，這不代表 cloud-init 一定會被運行 - 這取決於啟動早期時 generator 是否成功啟用了 `cloud-init.target`。

更多信息可參考 cloud-init 啟動階段文檔。

## 用法

### Archiso

本文或本章節可能需要合併到Install Arch Linux via SSH#Installation on a headless server。

附註： It gives more details and illustrates Archiso's cloud-init usage on bare metal.（在 Talk:Cloud-init 中討論）

以下演示了如何使用 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`。

提示：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。

### 映像未掛載

通常先使用 `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` 報錯。

## 參考

- cloud-init 文檔

分類：​

- 虛擬化
- 網絡

隱藏分類：​

- 使用「模板:合併」標記的頁面或章節

Cloud-init
新增話題