快速搭建实验环境:使用terraform部署proxmox虚拟机(代码片段)

CSDN云计算 CSDN云计算     2022-11-29     469

关键词:

作者 | 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     = true
  pm_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 = 1
  name  = "ubuntu-$count.index + 1"
  desc  = "Ubuntu develop environment"

  # 节点名
  target_node = "pve"

  # cloud-init template
  clone = "ubuntu-2004-cloudinit-template"

  # 关机 guest agent
  agent   = 0
  os_type = "ubuntu"
  onboot  = true
  # CPU
  cores    = 4
  sockets  = 1
  cpu      = "host"
  # 内存
  memory   = 16384
  scsihw   = "virtio-scsi-pci"
  bootdisk = "scsi0"

  # 硬盘设置,因计算的方式 101580M 代替 100G
  disk 
    slot     = 0
    size     = "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 key
  ciuser  = "addo"
  sshkeys = <<EOF
  SSH KEYS HERE
  EOF

创建虚拟机

第一次需要先执行 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专网,路在何方?

点分享

点收藏

点点赞

点在看

使用公有云快速搭建jupyter实验环境(代码片段)

安装npm和nodejsaptinstallnpmnodejsnpminstall-gnnstablepipinstalljupyterhubsudonpminstall-gconfigurable-http-proxypipinstallnotebookpipinstalljupyterhub-dummyauthenticator测试是否安装成功jupyterhub-hconfigurable- 查看详情

使用terraform在阿里云上快速部署mqtt集群

Terraform是由HashiCorp推出的一个基础设施即代码(IaC)工具,它包括了底层的组件如计算实例、存储和网络,以及高层的组件如DNS、LBS等。用户可以使用Terraform安全、高效地构建、改变和更新基础设施。在传统的私有云或公有云部... 查看详情

第2章openstack架构-016-搭建openstack实验环境

先搭建起一个实验环境。 推荐使用DevStackhttp://docs.openstack.org/developer/devstack/DevStack丰富的选项让我们能够灵活地选取和部署想要的OpenStack服务,非常适合学习和研究。 部署拓扑首先设计OpenStack的部署拓扑。OpenStack是一个... 查看详情

如何使用一个 terraform 脚本和不同的变量值管理多个不同环境的部署

】如何使用一个terraform脚本和不同的变量值管理多个不同环境的部署【英文标题】:Howtomanagedeploymentofseveraldifferentenvironmentswithoneterraformscriptsanddifferentvariablesvalues【发布时间】:2019-08-1022:31:36【问题描述】:我正在使用Terraform在A... 查看详情

1-快速搭建elk环境

...na-5.6.4-linux-x86_64elasticsearch-head谷歌浏览器插件因为这里是快速部署,并且我把ELK都部署在同一台机器(CentOS7.2),ip地址是:192.168.88.3,因此这里没有考虑到其他的优化,部署前请确保已经安装Java环境即JDK&n 查看详情

本地快速搭建kubernetes单机版实验环境(含问题解决方案)(代码片段)

Kubernetes是一个容器编排系统,用于自动化应用程序部署、扩展和管理。本指南将介绍Kubernetes的基础知识,包括基本概念、安装部署和基础用法。一、什么是Kubernetes?Kubernetes是Google开发的开源项目,是一个容器编... 查看详情

k8s实验环境的快速搭建

大部分搜索了网上的文章,有些自己遇到的问题也标记了处理方法!Kubeadm安装k8s准备环境:1.配置好各节点hosts文件2.关闭系统防火墙3.关闭SElinux4.关闭swap5.配置系统内核参数使流过网桥的流量也进入iptables/netfilter框架中,在/etc/s... 查看详情

Terraform - 长时间运行 Azure 部署错误

】Terraform-长时间运行Azure部署错误【英文标题】:Terraform-LongrunningAzuredeploymenterrorsout【发布时间】:2018-08-1319:36:40【问题描述】:我们正在使用通过Bash窗口中的shell脚本执行的Terraform来部署应用服务环境。部署应用服务环境需要... 查看详情

docker快速搭建node.jsexpress运行环境(代码片段)

目录Docker架构安装Docker运行是环境(CentOs)官方安装命令 或者使用国内一键安装手动安装从仓库安装Node.js镜像 Docker挂载node镜像 进入容器部署Express环境及代码进入Bash命令行交互  通过npm安装express框架和pm2部署Express代码  pm2... 查看详情

docker快速搭建node.jsexpress运行环境(代码片段)

目录Docker架构安装Docker运行是环境(CentOs)官方安装命令 或者使用国内一键安装手动安装从仓库安装Node.js镜像 Docker挂载node镜像 进入容器部署Express环境及代码进入Bash命令行交互  通过npm安装express框架和pm2部署Express代码  pm2... 查看详情

如何使用 Terraform 部署和重新部署应用程序?

】如何使用Terraform部署和重新部署应用程序?【英文标题】:HowtodeployandredeployapplicationswithTerraform?【发布时间】:2016-09-1419:21:58【问题描述】:我正在研究Terraform以及如何使用它来设置AWS环境。到目前为止,我有用于设置具有3... 查看详情

搭建kvm环境,及批量自动化部署

 本实验使用两台主机:10.0.91.8作为虚拟机的宿主机10.0.91.10配置httpd服务,提供10.0.91.8安装虚拟机要使用的镜像及自动应答文件kickstart 主机环境:[[email protected]~]#cat/etc/redhat-releaseCentOSLinuxrelease7.5.1804(Core)[[email prot 查看详情

京东云携手hashicorp,宣布推出terraformprovider

...云携手云基础设施自动化软件的领导者HashiCorp,宣布推出TerraformProviderforJDCloud,这意味着用户能够在京东云上轻松使用简单模板语言来定义、预览和部署云基础架构,能够快速将环境部署到京东云或本地数据中心,实现多云管理... 查看详情

?搭建lamp环境及快速部署双网站并实现基于域名的虚拟主机

本节所讲内容:实战:搭建LAMP环境及快速部署双网站并实现基于域名的虚拟主机 LAMP架构:???Linux+Apache+Mysql+PHPLinux+Apache+Mysql/MariaDB+Perl/PHP/Python一组常用来搭建动态网站或者服务器的开源软件,共同组成了一个强大的Web应用程... 查看详情

centos6.5使用yum快速搭建lamp环境

由于这里采用yum方式安装,前提是我们必须配置好yum源。为了加快下载速度,建议使用网易的yum源。参考:CentOS配置网易163yum源 http://www.linuxidc.com/Linux/2014-07/104562.htm这种方式对于初学者来说,非常方便,但是可定制性不强,... 查看详情

2-1rhel6.5环境搭建与部署

第二部分:Linux常见服务管理2-1RHEL6.5环境搭建与部署第二部分主要讲解的是开源服务搭建学习方法与注意事项:1.端正态度,开始学习2.认真完成作业和实验(并详细记录)3.保持初衷,坚持到底!4.学习方法总结一个属于自己的笔记掌握学... 查看详情

使用ibmcloudschematics部署云资源(代码片段)

...云资源上运行多层应用程序。IBMCloudSchematics的底层是使用Terraform和Ansible来进行基础架构资源的部署的,提供了Terraform-as-a-Service服务。通过使用Terraform中的IBMCloudProviderplug-in快速部署并启动一个可运行在多区域的多层应用。您... 查看详情

使用ibmcloudschematics部署云资源(代码片段)

...云资源上运行多层应用程序。IBMCloudSchematics的底层是使用Terraform和Ansible来进行基础架构资源的部署的,提供了Terraform-as-a-Service服务。通过使用Terraform中的IBMCloudProviderplug-in快速部署并启动一个可运行在多区域的多层应用。您... 查看详情