学习一些领域的proxmox
#go #terraform #proxmox

介绍

为了捕获在Proxmox上设置测试基础架构的一些努力,我决定学习一些Terraform,以将Proxmox上的基础架构部署正式为Terraform配置。

个人目标

  • 从源构建Terraform提供商并从本地使用它(如果需要进一步扩展提供商,请使用Proxmox API提供的其他功能)
  • 使用proxmox上的Terraform部署N-LXC容器

提供者

1.建造提供商

我选择Telmate/Proxmox提供商作为Hashicorp上最受欢迎的提供商。

该提供商具有安静的全面友好结构,带有专用于Proxmox的特定逻辑的入门点main.gopackage proxmox

peek at the code

并且令人惊讶地安装。在Ubuntu上安装go compilerbuild-essentials软件包后,make做到了。

building terraform from source

生成的提供商二进制terraform-provider-proxmox存储在./bin目录中。

terraform-provider-proxmox binary built in bin directory

2. Terraform搜索/查找提供商二进制文件在哪里

默认情况下,Terraform将直接从Hashicorp获取提供商,并在~/.terraform/plugins中缓存。

如果我们想运行自定义构建的提供商,我们该怎么办是将其放在类似于下面的目录结构中。

directory strucuture for terraform plugins on system

我们现在可以在Terraform文件中调用该提供商,如下所示。

# lxc-example.tf
terraform {
  required_providers {
    proxmox = {
      source  = "terraform.local/telmate/proxmox"
    }
  }
}

provider "proxmox" {
    pm_tls_insecure = true
    pm_api_url = "https://localhost:8006/api2/json"
    pm_password = "donthackmeplease"
    pm_user = "root@hostname"
}

容器

1.最小的LXC容器

在这一点上,为了对我对这个提供商的理解有一点信心,我想创建一个简单的Terraform文件,为我旋转一个LXC容器,在Proxmox上指定的池中。

因此,此练习包括创建一个LXC容器:

  • 在选择的池中(池是Proxmox中具有常见管理政策的资源分组,因此创建了此池,因为Proxmox允许视觉上将资源分组为池中,因此主要是出于美学目的)
  • )))
  • 使用1024MB的RAM
  • 2vcpu
  • 通过虚拟交换机连接到Internet vmbr0
  • 创建后立即开始。
  • 基于LXC Ubuntu 22.04模板

为了实现此目的,我们可以读取示例Terraform文件terraform-provider-proxmox/examples/lxc_example.tf来旋转代码库提供的LXC容器。但是,我们可以从Terraform的角度直接读取File terraform-provider-proxmox/proxmox/resource_lxc.go,从而有助于我们直接阅读文件terraform-provider-proxmox/proxmox/resource_lxc.go,因为它是对LXC资源的架构定义,这将有助于我们实现要求(基本上是按照方式映射的方式),这将有助于我们实现要求。 Terraform了解LXC容器对Proxmox的理解是什么)。

类似地,文件terraform-provider-proxmox/proxmox/resource_pool.go提供了Pool的架构定义。

  • 创建池TestPool1
# lxc-example.tf
resource "proxmox_pool" "pool-test" {
  poolid = "TestPool1"
  comment = "Just a test pool"
}
  • LXC容器
resource "proxmox_lxc" "lxc-test" {
  pool = proxmox_pool.pool-test.poolid # depends on pool-test
  target_node = "pve" # node of your cluster on which deployment should be done
  cores = 2
  memory = 1024
  hostname = "bot"
  password = "rootroot"
  network  {
    name = "eth0"
    bridge = "vmbr0"
    ip = "dhcp"
  }
  start = true # start after creation

  # using ubuntu container template
  ostemplate = "local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst"
  rootfs {
    storage = "local-lvm"
    size = "8G"
  }
}
  • ostemplate指向找到容器的LXC模板的卷,并遵循某种promox的地址符号。

ostemplate is special location to lxc template

此特殊符号最终解析为本地文件系统路径,如下所示,对于我们的ubuntu-22.04-standard_22.04-1_amd64.tar.zst模板的地址存储表示法。

ostemplate resolves to location in /var/lib/vz/template/cache of system

  • rootfs指定storage(将存储VM磁盘的位置)及其size

rootfs is local-lvm in my case

测试:

$ terraform init
$ terraform plan  # just to check
$ terraform apply

Testing the Deployment

Results

我通过研究此代码基础开发了一个过于简单的心理模型,如果您发现自己需要扩展/添加对某些Proxmox功能的支持,这可能很有用,

Mental Model for Telmate/proxmox

  • terraform cli取决于Telmate/terraform-provider-proxmox用于架构定义。
  • Telmate/terraform-provider-proxmox使用Telmate/proxmox-api-go将模式定义与Promox JSON API结合
  • Telmate/proxmox-api-go最终通过其API与Proxmox服务器进行交互。

整个Telmate Codebase中使用的统一命名约定,使模式指令的名称与Proxmox Core API完全相同。
因此,我们直接向Proxmox API文档提到自己,以获取有关模式指令的角色/目的的描述/信息。

2.旋转20 LXC容器

我们旋转n=20容器,我们可以使用Terraform的count meta-argument。

resource "proxmox_pool" "pool-test" {
  poolid = "TestPool1"
  comment = "Just a test pool"
}

resource "proxmox_lxc" "lxc-test" {
  count = 20 # create 20 lxc containers
  pool = proxmox_pool.pool-test.poolid # depends on pool-test
  target_node = "pve" # node of your cluster on which deployment should be done
  cores = 1
  memory = 512
  hostname = "bot-${count.index}"
  password = "rootroot"

  network  {
    name = "eth0"
    bridge = "vmbr0"
    ip = "dhcp"
  }
  start = true # start after creation

  # using ubuntu container template
  ostemplate = "local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst"
  rootfs {
    storage = "local-lvm"
    size = "8G"
  }
}

运行terraform apply后,我们得到

Terraform apply

我们有它们,在池中创建了20个容器13

20 lxc containers

就像我们创建它们一样容易,我们可以使用terraform destroy

将它们销毁

Terraform destroy

参考