一鍵搞定個性化云鏡像!Cloud-Init 神操作揭秘
在虛擬化環境中,自動化配置虛擬機(VM)是提高效率的關鍵。Proxmox VE(PVE)是一款流行的開源虛擬化平臺,而Cloud-Init是一種用于初始化云實例的工具。結合PVE和Cloud-Init,我們可以快速創建和配置虛擬機鏡像。本教程將詳細介紹如何在PVE上利用Cloud-Init構造自己的鏡像。
什么是 Cloud-Init?
Cloud-Init 是一個用于初始化云實例的開源工具。它被廣泛應用于各種云計算平臺,如Amazon Web Services (AWS)、Microsoft Azure、Google Cloud Platform (GCP)、OpenStack等。Cloud-Init允許在實例首次啟動時,自動化執行各種配置任務,如設置主機名、用戶和組、安裝軟件包、配置網絡等。
Cloud-Init 的工作原理
Cloud-Init在實例的首次啟動時運行,并根據用戶提供的元數據和用戶數據執行配置。這些數據通常以YAML格式提供,可以包含以下幾類信息:
- Meta-data(元數據):描述實例的基本信息,如實例ID、主機名等。
- User-data(用戶數據):定義實例啟動時要執行的具體配置和腳本。
前提條件
一臺運行Proxmox VE的服務器:
PVE服務器
基本的Linux命令行操作知識:
官方鏡像下載
# cloud images下載地址
# centos:
http://cloud.centos.org/centos/
# ubuntu:
http://cloud-images.ubuntu.com/releases/
# debian:
https://cloud.debian.org/images/cloud/OpenStack/
# fedora:
https://alt.fedoraproject.org/cloud/
# rehat7:
https://access.redhat.com/downloads/content/69/ver=/rhel---7/x86_64/product-downloads
# opensuse:
https://software.opensuse.org/distributions/leap#JeOS-ports
構造鏡像模板
在本教程中,我們將使用Ubuntu鏡像作為示例 :
(1) 先從官方下載ubuntu的云鏡像。執行如下命令:
wget https://cloud-images.ubuntu.com/jammy/20240601/jammy-server-cloudimg-amd64-disk-kvm.img
(2) 使用下面的命令創建虛擬機:
VM_ID=999
qm create $VM_ID --cores 4 --memory 4096 --name ubuntu --net0 virtio,bridge=vmbr0
(3) 給虛擬機導入鏡像
qm importdisk $VM_ID jammy-server-cloudimg-amd64-disk-kvm.img local-lvm
(4) 掛載創建好的硬盤到虛擬機
qm set $VM_ID --sata0 local-lvm:vm-$VM_ID-disk-0
(5) 創建cloudinit
qm set $VM_ID --sata1 local-lvm:cloudinit
(6) 設置默認啟動項
qm set $VM_ID --boot c --bootdisk sata0
(7) 設置用戶名和密碼
qm set $VM_ID --ciuser root --cipassword 123123
(8) 配置網絡
qm set $VM_ID --ipconfig0 ip=10.0.10.123/24,gw=10.0.10.1,ip6=dhcp #靜態配置
qm set $VM_ID --ipconfig0 ip=dhcp,ip6=dhcp #動態配置
(9) 啟動虛擬機
qm start $VM_ID
(10) 修改Cloud-init的配置 開啟PasswordAuthentication認證,編輯/etc/cloud/cloud.cfg這個文件,添加 ssh_pwauth:true,如下圖:
添加這個配置后,會在對應命令添加如下配置文件。
root@ubuntu:~# cat /etc/ssh/sshd_config.d/50-cloud-init.conf
PasswordAuthentication yes
修改SSH配置文件,允許root用戶登錄
PermitRootLogin yes
(11) 添加國內的鏡像源,本案中添加清華大學源為例。
在/etc/apt/sources.list.d創建一個名為tsinghua.sources的文件,添加如下內容:
Types: deb
URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
# 默認注釋了源碼鏡像以提高 apt update 速度,如有需要可自行取消注釋
# Types: deb-src
# URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu
# Suites: noble noble-updates noble-backports
# Components: main restricted universe multiverse
# Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
# 以下安全更新軟件源包含了官方源與鏡像站配置,如有需要可自行修改注釋切換
Types: deb
URIs: http://security.ubuntu.com/ubuntu/
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
# Types: deb-src
# URIs: http://security.ubuntu.com/ubuntu/
# Suites: noble-security
# Components: main restricted universe multiverse
# Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
# 預發布軟件源,不建議啟用
# Types: deb
# URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu
# Suites: noble-proposed
# Components: main restricted universe multiverse
# Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
# # Types: deb-src
# # URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu
# # Suites: noble-proposed
# # Components: main restricted universe multiverse
# # Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
(11) 所有配置完成后,清除歷史命令并關機
history -c && init 0
(12) 把該虛擬機轉成模板
qm template $VM_ID
使用腳本批量創建虛擬機
批量創建需求如下:
- 利用虛擬機模板 999,批量創建 3 個虛擬機
- 新建的虛擬機 ID 為 20x,虛擬機名稱為 demo-vmx
- 指定存儲名稱為 local
- 每個虛擬機 2 插槽 2 核心即 4 線程,內存 4G
- 每個虛擬機添加一塊 50G 的數據盤
- 每個虛擬機添加一個內網網卡,即網絡設備 (net0),網卡 IP 為 192.168.31.24x,網關為 192.168.31.254
- 設置系統 root 用戶的密碼為 password
for id in $(seq 1 1 3)
do
qm clone 999 24${id} --name demo-vm${id} -full true -storage local
qm set 24${id} --sockets 2 --cores 2 --memory 4096
qm set 24${id} --scsi1 iothread=1,local:100
qm set 24${id} --nameserver 114.114.114.114 --ipconfig1 ip=192.168.31.24${id}/24,gw=192.168.31.254 --ciuser root --cipassword password
qm start 24${id}
done
總結
Cloud-Init 是一個強大且靈活的工具,可以顯著簡化云實例的初始化和配置過程。通過預先定義好的配置文件,用戶可以自動化執行各種初始化任務,提高部署效率和一致性。無論是在公共云還是私有云環境中,Cloud-Init 都是一款不可或缺的配置管理工具。