作者 | Addo Zhang

来源 | 云原生指北

自从用上 m1 的电脑,本地开发环境偶尔会遇到兼容性的问题。比如之前尝试用 Colima 在虚拟机中运行容器运行时和 Kubernetes,其实际使用的还是 aarch64 虚拟机,实际使用还是会有些差异。

手上有台之前用的黑苹果小主机,吃灰几个月了,实属浪费。

CPU: Intel 8700 6C12T
MEM: 64G DDR4
DISK: 1T SSD

折腾的目的:

  • 将平台虚拟化

  • 提供多套实验环境

  • 快速创建销毁实验环境

  • 体验基础设施即代码 IaaS

主要用到的工具:

  • 虚拟化工具 Proxmox VE

  • Terraform:开源的基础设施即代码工具

  • terraform-provider-proxmox:Terraform Proxmox Provider,通过 Proxmox VE 的 REST API 在创建虚拟机。

安装 Proxmox 虚拟化工具

从官网 下载 ISO 镜像,写入到 U 盘中。macOS上推荐使用 balenaEtcher 写盘。

电脑上插入 U 盘并从 U 盘启动,按照步骤一步步完成设置。

官方的 wiki 安装步骤很详细。

安装完成之后就可以创建虚拟机了,可以用命令行 qm create 或者 https://localhost:8006 Web UI来创建。

这样毕竟还是有点麻烦,每次都要执行很多操作。虽说可以编写脚本,但是通用型不够好。因此我们选择 Terraform,实现基础设施即代码。

创建 Ubuntu Cloud-Init Template

这里选用 Cloud-Init 的方式,从 cloud-init template 来克隆虚拟机。cloud-init 的虚拟机可以完成一些高级定制的初始化工作,有兴趣的参考 Cloud Init 文档。

登陆到 Proxmox VE 宿主机,使用 Ubuntu 20.04 cloud init image 来创建模板,从官网下载:

wget https://cloud-images.ubuntu.com/releases/focal/release/ubuntu-20.04-server-cloudimg-amd64.img

执行下面的命令创建一个虚拟机:

qm create 9000 --name "ubuntu-2004-cloudinit-template" --memory 1024 --cores 1 --net0 virtio,bridge=vmbr0
qm importdisk 9000 ubuntu-20.04-server-cloudimg-amd64.img local-lvm
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

将刚创建好的虚拟机转换成模板:

qm template 9000

模板与普通的虚拟机会有些许的不同,使用模板我们可以快速创建虚拟机。这里我们不会用 UI来创建。

创建 Proxmox 用户及 API Token

使用 Proxmox VE 的 REST API 需要权限校验,有用户名密码或者 API Token 两种方式。我们选用后者,登陆到 Proxmox 宿主机,执行如下命令创建角色、用户以及 API Token:

pveum role add TerraformProv -privs "VM.Allocate VM.Clone VM.Config.CDROM VM.Config.CPU VM.Config.Cloudinit VM.Config.Disk VM.Config.HWType VM.Config.Memory VM.Config.Network VM.Config.Options VM.Monitor VM.Audit VM.PowerMgmt Datastore.AllocateSpace Datastore.Audit"
pveum user add terraform-prov@pve
pveum aclmod / -user terraform-prov@pve -role TerraformProv
pveum user token add terraform-prov@pve terraform-token --privsep=0┌──────────────┬──────────────────────────────────────┐
│ key          │ value                                │
╞══════════════╪══════════════════════════════════════╡
│ full-tokenid │ terraform-prov@pve!terraform-token   │
├──────────────┼──────────────────────────────────────┤
│ info         │ {"privsep":"0"}                      │
├──────────────┼──────────────────────────────────────┤
│ value        │ 9748c040-a283-4c72-a48b-9ce784778eed │
└──────────────┴──────────────────────────────────────┘

这里我们会用到 token 的full-tokenid 和 value。

Terraform

有了 token 和 cloud-init 模板后,就是定义虚拟机了。

安装最新版本的 terraform。

brew install terraform

在空目录中创建 ubuntu.tf 文件,并按步骤进行配置:

配置要使用的 provider:

terraform {required_providers {proxmox = {source = "telmate/proxmox"}}
}

配置 provider

需要提供 pm_api_urlpm_api_token_id 和 pm_api_token_secret

provider "proxmox" {pm_tls_insecure     = truepm_api_url          = "https://192.168.1.4:8006/api2/json"pm_api_token_id     = "terraform-prov@pve!terraform-token"pm_api_token_secret = "9748c040-a283-4c72-a48b-9ce784778eed"
}

配置虚拟机资源

可以参考provider 的配置说明:

resource "proxmox_vm_qemu" "proxmox-ubuntu" {count = 1name  = "ubuntu-${count.index + 1}"desc  = "Ubuntu develop environment"# 节点名target_node = "pve"# cloud-init templateclone = "ubuntu-2004-cloudinit-template"# 关机 guest agentagent   = 0os_type = "ubuntu"onboot  = true# CPUcores    = 4sockets  = 1cpu      = "host"# 内存memory   = 16384scsihw   = "virtio-scsi-pci"bootdisk = "scsi0"# 硬盘设置,因计算的方式 101580M 代替 100Gdisk {slot     = 0size     = "101580M"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.1.9${count.index + 1}/24,gw=192.168.1.2"# 用户名和 SSH keyciuser  = "addo"sshkeys = <<EOFSSH KEYS HEREEOF
}

创建虚拟机

第一次需要先执行 init 命令进行初始化:

terraform init

可以使用 terraform fmt 和 terraform validate 对配置文件进行格式化和校验。

然后执行 terraform apply 并输入 yes 开始创建虚拟机

proxmox_vm_qemu.proxmox-ubuntu[0]: Creating...
proxmox_vm_qemu.proxmox-ubuntu[0]: Still creating... [10s elapsed]
proxmox_vm_qemu.proxmox-ubuntu[0]: Still creating... [20s elapsed]
proxmox_vm_qemu.proxmox-ubuntu[0]: Still creating... [30s elapsed]
proxmox_vm_qemu.proxmox-ubuntu[0]: Still creating... [40s elapsed]
proxmox_vm_qemu.proxmox-ubuntu[0]: Creation complete after 42s [id=pve/qemu/100]

这样虚拟机就创建成功了,使用前面配置的私钥和 IP 地址就可以 ssh 到虚拟机中。

销毁虚拟机

虚拟机的销毁也很简单,执行 terraform destory 并输入 yes 即可。

总结

有了 Terraform 和 Proxmox VE 后,就可以愉快的使用干净的实验环境了。但是干净到一些开发中常用软件都没有,使用起来也不方便。

后续考虑通过 cloud-init 来对虚拟机进行高级定制,比如容器环境和 K3s 等等。

往期推荐

虚幻引擎5上的《黑客帝国》全新体验,爱了爱了

Medusa又一个开源的替代品

数字孪生+交通,到底有啥用?

5G专网,路在何方?

点分享

点收藏

点点赞

点在看

快速搭建实验环境:使用 Terraform 部署 Proxmox 虚拟机相关推荐

  1. 阿里云服务器如何快速搭建Docker环境

    本教程介绍如何使用阿里云服务器快速搭建Docker环境,并使用Docker部署一个Nginx服务. 步骤一:安装Docker CE Docker有两个分支版本:Docker CE和Docker EE, ...

  2. 基于阿里云ECS弹性云服务器快速搭建Docker环境

    基于ECS快速搭建Docker环境 什么是docker? ​ Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也 ...

  3. Vagrant+VirtualBox快速搭建Linux环境

    Vagrant+VirtualBox快速搭建Linux环境 虚拟机 Oracle VM VirtualBox VMware 虚拟机的选择 Vagrant介绍 Vagrant安装centos7 虚拟机固 ...

  4. 快速搭建LAMP环境

    快速搭建LAMP环境 Linux+Apache+MySQL+PHP一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被放在一起使用,拥有了越来越高的兼容度,共同组成了一个强 ...

  5. 快速搭建Web环境 Angularjs + Express3 + Bootstrap3

    2019独角兽企业重金招聘Python工程师标准>>> 快速搭建Web环境 Angularjs + Express3 + Bootstrap3 AngularJS体验式编程系列文章, ...

  6. DWcs6+AppServ快速搭建PHP环境

    DWcs6+AppServ快速搭建PHP环境 需要下载的软件 1.AppServ  AppServ 是 PHP 网页架站工具组合包,作者将一些网络上免费的架站资源重新包装成单一的安装程序,以方便初学者 ...

  7. 手把手教你快速搭建私服环境

    手把手教你快速搭建私服环境,简单实用,一看就懂 1.准备工作:先下载Nxus Nexus 是 Maven 仓库管理器, 通过 nexus 可以搭建 maven 仓库,同时 nexus 还提供强大的仓库 ...

  8. 【Mysql】通过 docker 快速搭建 mysql 环境

    [Mysql]通过 docker 快速搭建 mysql 环境 1.方式一:查找Docker Hub上的mysql镜像 获取镜像 docker pull mysql:5.6 创建目录 mkdir mys ...

  9. ecology9 后端开发环境搭建_利用Vagrant快速搭建开发环境

    Docker大家应该都了解吧,一个非常方便的技术,可以让我们随时随地部署应用.但是部署应用虽然方便了,开发环境的搭建还是那样的,要自己安装一大堆软件.那么有没有类似的工具可以方便我们呢?这就是本文要的 ...

最新文章

  1. kvm虚拟机vnc配置
  2. 【 C 】动态内存分配实用案例(二)之复制字符串
  3. SQLite中的内连接简化技巧
  4. Unix Domain Socket 域套接字实现
  5. What?Java这么神奇的lambda表达式
  6. 三十二、R语言基本语法(下篇)
  7. 定点定时抛物效果实现
  8. mysql命令:set sql_log_bin=on/off
  9. Linux设备驱动模型一 sysfs
  10. android 集成融云客服,第三方客服
  11. QT 加载周立功CAN卡库
  12. 第六章 第九节 焦点与tab顺序
  13. WEB财务报表设计器的实现
  14. Java 超简单实现邮件群发工具类 | 泰山出品
  15. 未来物联网的一些问题
  16. 最近整理的面试笔试区别题
  17. 【火爆全网的抖音无人直播项目:挤地铁源代码】
  18. 强力推荐—20款免费备份文件软件
  19. python use ftp to download/updown
  20. Aconvert 文档格式转换-PDF转免费转其他文档网址-免费

热门文章

  1. 当前记录集不支持更新_不断中招的你还放心升级win10吗?wi10近期更新问题及解决办法...
  2. vb.net 功能f8键事件_憋了三年,史上最全的 F1~F12 键用法整理出来了!
  3. php+正则匹配qq,正则表达式对qq号进行验证的实例
  4. golang string转int8_golang 中string和int类型相互转换
  5. dataframe存到mysql中_pandas实现to_sql将DataFrame保存到数据库中
  6. 发动机压缩比怎么计算公式_2020沃德十佳发动机出炉:这三款机头,20万内就能买到...
  7. linux的用户及权限管理,用户及权限管理
  8. android布局的属性,android
  9. 如何查看linux 是否安装软件包,linux 查看软件包是否安装 linux查看软件包
  10. 真正的大学老师,是那些无需打卡和考评,也会不可遏止地要去读书写作和上课的人...