摘要
本文主要记录了如何通过terraform在pve中创建虚拟机,以及如何制作属于自己的linux镜像。目前写的比较粗糙,有什么问题可以留言评论。
资源准备
创建pve模板
这一步主要在pve系统创建一个虚拟机模板,后续terraform将以此为模板创建虚拟机。
下载的镜像并不是传统的Desktop镜像或者server镜像,而是专门适配过云厂商的镜像(虽然也可以下载server镜像自己安装cloud-init),地址:https://cloud-images.ubuntu.com/
将下载好的镜像放到pve宿主机的/root
目录,运行下面的脚本。
# vm_id一般从100开始,我这里随意取的
vm_id=9000
# ubuntu-2204-cloudinit-template 模板名称
qm create $vm_id --name "ubuntu-2204-cloudinit-template" --memory 1024 --cores 1 --net0 virtio,bridge=vmbr0
qm importdisk 9000 /root/jammy-server-cloudimg-amd64.img local-lvm
qm set $vm_id --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-$vm_id-disk-0
qm set $vm_id --boot c --bootdisk scsi0
qm set $vm_id --ide2 local-lvm:cloudinit
qm set $vm_id --serial0 socket --vga serial0
qm set $vm_id --agent enabled=1
# 转换为镜像
qm template $vm_id
完成这一步之后, 将会在pve的控制台看到多出一条类似的模板()
terraform
找一台linux机器
mkdir ubuntu
cd ubuntu
vim ubuntu.tf
将下列内容复制到ubuntu.tf中
terraform {
required_providers {
proxmox = {
source = "telmate/proxmox"
}
}
}
provider "proxmox" {
pm_tls_insecure = true
pm_api_url = "https://192.168.31.190:8006/api2/json"
# 最好通过环境变量传递,请不要在生产环境像我这样使用
pm_user = "root@pam"
pm_password = "ffffff"
}
resource "proxmox_vm_qemu" "proxmox-ubuntu" {
count = 1
name = "ubuntu-01"
desc = "Ubuntu develop environment"
# 节点名,
target_node = "pve"
# cloud-init template
clone = "ubuntu-2204-cloudinit-template"
# 关机 guest agent
agent = 0
os_type = "ubuntu"
onboot = true
# CPU
cores = 1
sockets = 1
cpu = "host"
# 内存
memory = 1024
scsihw = "virtio-scsi-pci"
bootdisk = "scsi0"
# 硬盘设置,因计算的方式 101580M 代替 100G
disk {
slot = 0
size = "50580M"
type = "scsi"
storage = "local-lvm"
iothread = 1
}
# 网络
network {
model = "virtio"
bridge = "vmbr0"
}
lifecycle {
ignore_changes = [
network,
]
}
# 记住这里要使用IP CIDR。因为只创建一个虚拟机,虚拟机的 IP 是 192.168.1.91。如果要创建多个虚拟机的话,IP 将会是 .91、.92、.93 。
ipconfig0 = "ip=192.168.31.220/24,gw=192.168.31.1"
# 用户名和 SSH key
ciuser = "textworld"
sshkeys = <<EOF
这里可以放公钥
EOF
}
上文要求中的节点名对应下图中选中的位置。
自制镜像
以ubuntu cloud镜像为基础,制作
qm create 9000 --name "ubuntu-2204-cloudinit-template" --memory 1024 --cores 1 --net0 virtio,bridge=vmbr0
# 调整大小
qemu-img resize jammy-server-cloudimg-amd64.img 10G
# 转换云镜像为虚拟磁盘
qm importdisk 9000 jammy-server-cloudimg-amd64.img local-lvm --format=qcow2
# 104 为虚拟机的ID
# raid0 为存储的名称,如果没有额外存储,则默认是local
# --format=qcow2 为转换后的格式
qm set 9000 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-9000-disk-0
qm set 9000 --boot c --bootdisk scsi0
qm set 9000 --ide2 local-lvm:cloudinit
qm set 9000 --serial0 socket --vga serial0
qm set 9000 --agent enabled=1
# 不要转换为模板
填写cloud-init相关参数
启动系统,进行相关的配置,也就是自定义镜像的过程,比如安装包之类的。
关闭系统,然后导出磁盘
root@pve-31-151:~# qm config 9002
agent: enabled=1
boot: c
bootdisk: scsi0
cores: 1
ide2: local-lvm:vm-9002-cloudinit,media=cdrom
ipconfig0: ip=192.168.31.213/24,gw=192.168.31.1,ip6=auto
memory: 1024
meta: creation-qemu=7.2.0,ctime=1699185716
name: ubuntu-2204-cloudinit-template
net0: virtio=E6:15:F0:53:10:44,bridge=vmbr0
scsi0: local-lvm:vm-9002-disk-0,size=10G
scsihw: virtio-scsi-pci
serial0: socket
smbios1: uuid=f7112434-0539-462d-9d5c-bbfea9f45bc9
sshkeys: ssh-rsa%20AAAAB3NzaC1yc2EAAAADAQABAAABgQCOU5TxOO1Uovufk7rhRX%2BQLUcN%2BIsFbsTQAyd5dNk0b5nySE1dL7V1g3EZhh0oqv%2BFRiT9nynhGDROdHMKL%2Fa3mFNFqI4%2BuWdZYEej2200LBAhNq2UXYPfdh7XiInxyu8toE4JCz1MEYdILhGJnnVJ1CtkjLYDUwnXRlnMn9mQVbIBzpMvU55jSccAlIuIH9GlEJbcRZYyvx5rjART6Sug7LfDVIw3TkBNkT%2FMp1IB5a%2BwhJafUKKCExbdJH9WabRbDkCk58MmpApGTCBuIzPXpJFnxVG4Y1zkxTO2HNT1jU9GWs2N8fCc9FyMlDGLAJkMuvAX98WUQX0TF9%2FN2eQGrNObLB%2Fm68dYmMqnCHNDjQs7AsixrTCOiFBqDioOnUOVdT7uyXzBKxZnDzM0lj6X3GkHgp3c%2BmKxHUDt8j5z3yQzQdfuShS%2B3ZME%2BK1%2FLVaktLAKkaCeBc6BnE4%2F4awMSK6A1Jg1HvDq8TU1eSiA8yaqTVwX2wFz5No6SI5bPjM%3D%20win11ubuntu-textworld
vga: serial0
vmgenid: f0c52988-6c42-4570-b750-d1ea96ca7511
root@pve-31-151:~# pvesm path local-lvm:vm-9002-disk-0
/dev/pve/vm-9002-disk-0
root@pve-31-151:~# qemu-img convert -O qcow2 -f raw /dev/pve/vm-9002-disk-0 jammy-server-cloudimg-amd64-23110501.qcow2
得到的qcow2也可以上传的腾讯云进行ecs云服务器的创建。