使用Terraform在Ubuntu中部署KVM虚拟机

使用Terraform部署KVM虚拟机的详细流程
使用Terraform在Ubuntu中部署KVM虚拟机

On this page

安装Terraform

安装依赖

apt install software-properties-common gnupg2 curl

导入 GPG 密钥

curl -fsSL https://apt.releases.hashicorp.com/gpg | apt-key add -

添加存储库

apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"

安装 Terraform

apt install terraform

测试并检查Terraform版本

terraform version

安装KVM

安装kvm和libvirtd服务

apt install qemu-kvm libvirt-daemon-system

开启虚拟化功能

Linux虚拟机

对于Ubuntu虚拟机,需要打开虚拟化功能,可以在VMWare的虚拟机<设置-处理器>中打开

Linux物理机

检查 KVM 模块是否已经加载

lsmod | grep kvm

输出应该包括 kvm_intel 或 kvm_amd(取决 CPU 类型)。如果没有输出,可以手动加载 KVM 模块:

sudo modprobe kvm
sudo modprobe kvm_intel  # 对于 Intel CPU
sudo modprobe kvm_amd    # 对于 AMD CPU

检查 CPU 虚拟化支持

egrep -c '(vmx|svm)' /proc/cpuinfo

如果输出为 0,则表示虚拟化未启用,只能通过进入 BIOS/UEFI 设置启用虚拟化技术。

验证 QEMU 安装和路径

which qemu-system-x86_64

如果路径正确,输出应为 /usr/bin/qemu-system-x86_64。如果路径不正确或没有输出,可能需要重新安装

启动 libvirt 服务

systemctl start libvirt && systemctl enable libvirt

创建并启动存储池

# 创建默认存储池,--name可以自定义,这里使用default
sudo virsh pool-define-as --name default --type dir --target /var/lib/libvirt/images

# 启动默认存储池
sudo virsh pool-start default

# 设置默认存储池为自动启动
sudo virsh pool-autostart default

修改images目录的所有权和权限

修改所有权,使其归属 libvirt-qemu 用户和组,具体取决于系统,可能是 qemu 用户,可以通过/etc/passwd查看

chown -R libvirt-qemu:libvirt-qemu /var/lib/libvirt/images/

设置文件的权限

chmod 0644 /var/lib/libvirt/images/

修改配置libvirt配置文件,编辑 /etc/libvirt/qemu.conf 文件

security_driver = "none"
dynamic_ownership = 1

这样可以防止新创建的qcow2存储文件默认属主属组为root,导致虚拟机libvirt-qemu缺少权限来启动虚拟机

应用tf脚本

该脚本创建了一个1核1GB,10GB存储的虚拟机

terraform {
  required_providers {
    libvirt = {
      source  = "dmacvicar/libvirt"
      version = "~> 0.6.3"
    }
  }
}

provider "libvirt" {
  uri = "qemu:///system"
}

# 创建一个10GB的磁盘卷
resource "libvirt_volume" "vm_disk" {
  name = "terraform_vm_disk.qcow2"
  pool = "default"
  format = "qcow2"
  size = 10 # 单位为GB
}

# 创建云初始化的磁盘
resource "libvirt_cloudinit_disk" "commoninit" {
  name           = "commoninit.iso"
  pool           = "default"
  user_data      = <<-EOF
                  #cloud-config
                  hostname: terraform-kvm
                  EOF
}

# 创建虚拟机
resource "libvirt_domain" "vm" {
  name   = "terraform-kvm"
  memory = "1024"   # 单位为MB,即1GB
  vcpu   = 1

  # 使用之前创建的磁盘卷
  disk {
    volume_id = libvirt_volume.vm_disk.id
  }

  # 使用云初始化磁盘
  cloudinit = libvirt_cloudinit_disk.commoninit.id

  # 配置网络接口
  network_interface {
    network_name = "default"
  }

  console {
    type        = "pty"
    target_port = "0"
    target_type = "serial"
  }

  graphics {
    type        = "spice"
    listen_type = "none"
  }
}

初始化脚本目录

terraform init

应用脚本

terraform apply

删除资源

在虚拟机已经成功运行的情况下,只需要进入到tf文件的目录,运行

terraform destroy

如果虚拟机本身是shut down状态,需要在此基础上再通过virsh删除虚拟机

virsh undefine terraform-kvm