使用Cloud-Init在PVE中批量部署虚拟机

在虚拟化环境中,自动化配置虚拟机(VM)是提高效率的关键。Proxmox VE(PVE)是一款流行的开源虚拟化平台,而Cloud-Init是一种用于初始化云实例的工具。结合PVE和Cloud-Init,我们可以快速创建和配置虚拟机镜像。本教程将详细介绍如何在PVE上利用Cloud-Init构造自己的镜像

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的服务器

基本的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

构造镜像模板

在本教程中,我们将使用Centos镜像作为示例 :

先从官方下载Centos的云镜像。执行如下命令:

wwget https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud-2211.qcow2

使用下面的命令创建虚拟机:

VM_ID=999

qm create $VM_ID --cores 4 --memory 4096 --name Temp-Centos7 --net0 virtio,bridge=vmbr0

给虚拟机导入镜像

qm importdisk $VM_ID CentOS-7-x86_64-GenericCloud-2211.qcow2 local-lvm

挂载创建好的硬盘到虚拟机

qm set $VM_ID --sata0 local-lvm:vm-$VM_ID-disk-0

创建cloudinit

qm set $VM_ID --sata1 local-lvm:cloudinit

设置默认启动项

qm set $VM_ID --boot c --bootdisk sata0

设置用户名和密码

qm set $VM_ID --ciuser root --cipassword 123123

配置网络

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 #动态配置

启动虚拟机

qm start $VM_ID

修改Cloud-init的配置

开启PasswordAuthentication认证,编辑/etc/cloud/cloud.cfg这个文件,添加

ssh_pwauth:true

所有配置完成后,清除历史命令并关机

history -c && init 0

把该虚拟机转成模板

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