摘要

本文主要记录了如何通过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云服务器的创建。