雲端主機因為環境單純,可以複製映像檔快速部署,再搭配 cloud-init 個別初始化。但服務商支援 cloud-init 的程度都不一樣,像我最近租用的 Netcup 虛擬主機就沒有原生支援,但有其它方式可以讓 cloud-init 運作!

以下使用 Alpine Linux 3.22 x86_64 UEFI cloud-init virtual NoCloud 作為範例。

Disk image

Netcup 可以匯入自訂硬碟映像檔,匯入前必須先上傳,需要等一陣子。

上傳完成就會顯示在 Custom images,按下 Select 展開選項,Festplatte 是德語 hard disk 的意思。

按下 reinstall 等它跑完,看到以下畫面就代表匯入完成。

下面兩項可以忽略它,實際上並不會啟動和執行後續安裝,可能是用官方映像檔才會直接啟動。

匯入完先別急著啟動,還要準備 cloud-init 配置。

cloud-init

Netcup 不在 cloud-init 支援的雲端供應商清單上,所以得用 NoCloud,NoCloud 可以從帶有 CIDATA 的 ISO 或 FAT 分區讀取配置,而 Netcup 可以掛載 ISO,所以需要寫好 meta-data 與 user-data 兩個配置檔並封裝成 ISO,詳細資訊可以參考 cloud-init NoCloud

meta-data

instance-id: v1

user-data

#cloud-config
hostname: netcup
user: alpine
password: change_me
chpasswd:
  expire: false
allow_public_ssh_keys: true
disable_root: true
disable_root_opts: port-forwarding,no-agent-forwarding,no-X11-forwarding
ssh_authorized_keys:
  - ssh-ed25519 ABCDEFGH example
ssh_pwauth: false
ssh_quiet_keygen: true
package_update: true
package_upgrade: true
packages:
  - docker
  - docker-cli-compose

安裝 genisoimage

# Arch Linux
sudo pacman -S cdrtools
# Debian
sudo apt install genisoimage

將上述兩個檔案封裝成 ISO

genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data

掛載前必須先上傳 ISO。

上傳完成就可以在 Custom ISOs 選擇。

因為只是給 cloud-init 讀取配置,不要把 boot mode 設成 DVD。

成功附加上去會在上方看到目前附加的 ISO。

插電,開機,主機輕鬆點亮!

References

https://cloudinit.readthedocs.io/en/latest/reference/datasources/nocloud.html