0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TerraformでProxmox VEのLXCを払い出す

Last updated at Posted at 2024-12-17

はじめに

こんにちは たそ(@taso_int)です。
普段ははてなブログで技術ブログを投稿しております。
良かったら見てください。
https://taso-int.hatenablog.com/archive

今回はアドベントカレンダーということで、Proxmox VEについて書こうと思います。
本当はもうちょい凝ったものを出したかった…
Proxmox VEの説明については省略します。
仮想環境を提供できるプラットフォーム的なものです。

今回TerraformにProxmoxプロバイダーがあるので、それを利用してLXCを作成したいと思います。
LXCだけでなくVMも作成することが可能です。

今おうちK8sを作成しようとしていて、ノード数をTerraform側で制御出来たら面白いなと思った次第です…

環境

  • Proxmox VE v8.2.2
  • Terraform環境
    • WSL(Ubuntu 22.04.3 LTS)
    • Terraform(v1.9.8)
    • Proxmox Provider(3.0.1-rc6)

WSLからProxmox VEに対してTerraformを動かすイメージを持っていければと思います。

Proxmox プロバイダー

  • proxmox_vm_qemu(VM)
  • proxmox_lxc(LXC)

仕組みとしてはProxmox側でAPIが提供されているので、それを利用しているものだと思われます。
今回は2番目のLXCを作成するリソースを利用したいと思います。
またドキュメントではTerraform用のProxmoxユーザーとロールを作成する必要がありますが、私しか使わないためrootで実施します。

Terraform コード類

Terraform初心者なので、かなり簡易なつくりになっています。

main.tf
terraform {
  required_providers {
    proxmox = {
      source  = "Telmate/proxmox"
      version = "3.0.1-rc6"
    }
  }
}

provider "proxmox" {
  pm_api_url      = "https://192.168.137.100:8006/api2/json"
  pm_user         = "root@pam"
  pm_password     = var.pm_password
  pm_tls_insecure = true
}

resource "proxmox_lxc" "k8s_node" {
  for_each    = var.nodes
  target_node = "taso" # Proxmox側ノード名
  vmid        = each.value.vmid
  hostname    = each.value.hostname
  ostemplate  = "local:vztmpl/vzdump-lxc-100-2024_11_18-00_37_13.tar.gz" #普通のコンテナイメージでも可
  cores       = 2
  memory      = 2048
  swap        = 512
  password    = var.lxc_password

  rootfs {
    storage = "local-lvm"
    size    = "10G"
  }

  network {
    name   = "eth0"
    bridge = "vmbr0"
    ip     = each.value.ip
    gw     = "192.168.137.1"
  }
}

variables.tf
variable "pm_password" {
  description = "Proxmox API password"
  type        = string
  sensitive   = true
}

variable "lxc_password" {
  description = "Password for LXC container"
  type        = string
  sensitive   = true
}

variable "nodes" {
  description = "Configuration for LXC nodes"
  type = map(object({
    vmid      = number
    hostname  = string
    ip        = string
  }))  
  default = {
    "master" = {
      vmid     = 101
      hostname = "k8s-master"
      ip       = "192.168.137.10/24"
    }
    "node1" = {
      vmid     = 102
      hostname = "k8s-node1"
      ip       = "192.168.137.11/24"
    }
    "node2" = {
      vmid     = 103
      hostname = "k8s-node2"
      ip       = "192.168.137.12/24"
    }
  }
}

試してみる

初回実行はTerraform initが必要になります。

またパスワードを環境変数に登録します。

export TF_VAR_pm_password=<Proxmox側のパスワード>
export TF_VAR_lxc_password=<LXCで設定するパスワード>

Terraform applyを実行します。

Apply complete!がでれば成功ですね。

UIでも作成されています。起動する必要はありそうです。
image.png

改善ポイント

以下改善したいポイントで機能として追加したいです。

  • node側のノード数を増やせる設計(Countとかで増やせるのが理想)
  • Terraformのモジュール化(かっこよさそう)
  • IP周りの管理(NetBoxと組み合わせてアドレスを管理する)

最後に

ここまで読んでいただきありがとうございました。
おうちK8sを完成して、K8sの勉強をしたいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?