Skip to content

Zarządzanie LXC w Proxmox za pomocą OpenTofu

Nie ma nic bardziej satysfakcjonującego niż kliknięcie tofu apply i zobaczenie, jak Proxmox sam pobiera template LXC, tworzy kontenery i konfiguruje dostęp. Poniżej opisuję, jak wygląda ten proces w moim repozytorium iac-proxmox i na co warto zwrócić uwagę, jeśli chcesz to odwzorować u siebie.


  • Kontenery startują w sekundy i zużywają minimalne zasoby w porównaniu z pełnymi VM.
  • Wspólny kernel i brak emulacji sprzętu sprawiają, że świetnie nadają się do mikroserwisów, proxy, workerów CI czy środowisk testowych.
  • Dzięki OpenTofu cały cykl życia kontenera (tworzenie, aktualizacja, usuwanie) jest wersjonowany w Git i odtwarzalny na innym hoście.

Wydzielam dwa kluczowe katalogi:

  • containers_templates/ – zasoby odpowiedzialne za pobieranie obrazów LXC do magazynu Proxmoxa.
  • machines/ – pojedyncze pliki ctXXXXX.tf, każdy opisuje wygląd kontenera.

  1. Szablon Ubuntu 24.04 LTS pobieram wprost z repozytorium Proxmoxa:

    containers_templates/ubuntu24-10.tf

    resource "proxmox_virtual_environment_download_file" "ubuntu24-04" {
      content_type       = "vztmpl"
      datastore_id       = local.storage_name
      node_name          = local.default_node
      file_name          = "ubuntu-24.04.tar.zst"
      url                = "http://download.proxmox.com/images/system/ubuntu-24.04-standard_24.04-2_amd64.tar.zst"
      checksum           = "4030982618eeae70854e8f9711adbd09"
      checksum_algorithm = "md5"
    }

    Kluczowe jest ustawienie checksum i checksum_algorithm – mam pewność, że obraz nie został uszkodzony, a plan w razie różnic przerwie się na weryfikacji.

  2. Każdy kontener to osobny moduł z jednoznacznym ct_id:

    module "ct01004" {
      source = "git@gitlab.com:pl.rachuna-net/artifacts/opentofu/proxmox-container.git?ref=v1.0.2"
    
      hostname      = "ct01004.rachuna-net.pl"
      description   = "gitlab-runner s4"
      node_name     = "pve-s4"
      ct_id         = 1004
      pool_id       = "gitlab"
      protection    = true
      start_on_boot = true
      tags          = ["gitlab", "ubuntu"]
      unprivileged  = false
      is_dmz        = false
      mac_address   = "BC:24:11:C5:DA:E9"
    
      cpu_cores = 2
      memory = {
        dedicated = 1024
        swap      = 0
      }
      disk = {
        storage_name = "storage"
        disk_size    = 128
      }
    
      operating_system = {
        template_file = join("/", [local.ct_storage_name, "ubuntu-24.04.tar.zst"])
        type          = "ubuntu"
      }
    
      features = {
        keyctl  = true
        nesting = true
      }
    
      user_account = {
        username       = data.vault_kv_secret_v2.auth_techuser.data["username"]
        password       = data.vault_kv_secret_v2.auth_techuser.data["password"]
        public_ssh_key = data.vault_kv_secret_v2.auth_techuser.data["public_ssh_key"]
      }
    }
    
    resource "vault_kv_secret_v2" "ct01004_credentials" {
      mount = "kv-gitlab"
      name  = "pl.rachuna-net/infrastructure/pve-rachuna-net/iac-proxmox/machine/ct01004"
    
      data_json = jsonencode({
        root_password    = module.ct01004.root_password
        root_private_key = module.ct01004.root_private_key
        root_public_key  = module.ct01004.root_public_key
        container_ipv4   = module.ct01004.container_ipv4
      })
    }
    

    Najważniejsze parametry, które zawsze ustawiam:

    ParametrCo robi
    hostnamePełna nazwa DNS kontenera
    node_nameWęzeł Proxmoxa, na którym zostanie utworzony
    ct_idStałe ID kontenera – ułatwia śledzenie i logging
    pool_idPrzynależność do puli logicznej (np. web, db, proxy)
    start_on_bootAutostart po restarcie noda
    cpu_cores/memory/diskTwarda kontrola zasobów hosta
    operating_system.template_fileŚcieżka do wcześniej pobranego template
    user_accountAutomatycznie zakładane konto i klucz SSH
  3. iac-proxmox v1.1.0