Home 运维技术 使用Terraform在Ubuntu中部署KVM虚拟机 By FreelyTomorrow Aug 16, 2024 3 min read 使用Terraform在Ubuntu中部署KVM虚拟机 使用Terraform部署KVM虚拟机的详细流程 安装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 Read Next By FreelyTomorrow Jun 11, 2024 MySQL/Redis相关面试题 数据库运维(MySQL和Redis)的面试题总结 运维技术 MySQL Redis By FreelyTomorrow May 9, 2024 事件源模式和传统数据库方法在数据管理上的优劣分析 对事件源模式和传统数据库方法在应用程序性能影响、性能、扩展性和可靠性的分析;以及云原生环境下数据管理的最佳实践 云原生 By FreelyTomorrow Apr 24, 2024 关于Metrics_server在自托管环境下无法使用的问题 修复kubernetes的metrics server在自托管环境下因缺少CA证书而无法运行的问题。 Kubernetes By FreelyTomorrow Apr 5, 2024 关于IP、子网掩码、主机位和网络位的计算方法 如何通过子网掩码和掩码位计算一个IP地址的网络地址和可分配的主机位 网络
By FreelyTomorrow May 9, 2024 事件源模式和传统数据库方法在数据管理上的优劣分析 对事件源模式和传统数据库方法在应用程序性能影响、性能、扩展性和可靠性的分析;以及云原生环境下数据管理的最佳实践 云原生
By FreelyTomorrow Apr 24, 2024 关于Metrics_server在自托管环境下无法使用的问题 修复kubernetes的metrics server在自托管环境下因缺少CA证书而无法运行的问题。 Kubernetes
安装Terraform
安装依赖
导入 GPG 密钥
添加存储库
安装 Terraform
测试并检查Terraform版本
安装KVM
安装kvm和libvirtd服务
开启虚拟化功能
Linux虚拟机
对于Ubuntu虚拟机,需要打开虚拟化功能,可以在VMWare的虚拟机<设置-处理器>中打开
Linux物理机
检查 KVM 模块是否已经加载
输出应该包括 kvm_intel 或 kvm_amd(取决 CPU 类型)。如果没有输出,可以手动加载 KVM 模块:
检查 CPU 虚拟化支持
如果输出为 0,则表示虚拟化未启用,只能通过进入 BIOS/UEFI 设置启用虚拟化技术。
验证 QEMU 安装和路径
如果路径正确,输出应为 /usr/bin/qemu-system-x86_64。如果路径不正确或没有输出,可能需要重新安装
启动 libvirt 服务
创建并启动存储池
修改images目录的所有权和权限
修改所有权,使其归属 libvirt-qemu 用户和组,具体取决于系统,可能是 qemu 用户,可以通过/etc/passwd查看
设置文件的权限
修改配置libvirt配置文件,编辑 /etc/libvirt/qemu.conf 文件
这样可以防止新创建的qcow2存储文件默认属主属组为root,导致虚拟机libvirt-qemu缺少权限来启动虚拟机
应用tf脚本
该脚本创建了一个1核1GB,10GB存储的虚拟机
初始化脚本目录
应用脚本
删除资源
在虚拟机已经成功运行的情况下,只需要进入到tf文件的目录,运行
如果虚拟机本身是shut down状态,需要在此基础上再通过virsh删除虚拟机
Read Next
MySQL/Redis相关面试题
数据库运维(MySQL和Redis)的面试题总结
事件源模式和传统数据库方法在数据管理上的优劣分析
对事件源模式和传统数据库方法在应用程序性能影响、性能、扩展性和可靠性的分析;以及云原生环境下数据管理的最佳实践
关于Metrics_server在自托管环境下无法使用的问题
修复kubernetes的metrics server在自托管环境下因缺少CA证书而无法运行的问题。
关于IP、子网掩码、主机位和网络位的计算方法
如何通过子网掩码和掩码位计算一个IP地址的网络地址和可分配的主机位