Создал модуль lxc_container в terraform для создания LXC контейнера в proxmox.

В итоге при выполнении terrafrom создается ВМ с ОС ubuntu из шаблона контейнера (собран шаблон контейнера вручную с внесенными изменениями).
С настроенной сетью, включенным SSH доступом root.

В основном main.tf подключается сам модуль и указываются переменные.

В provider.tf указывается плагин провайдера для работы с proxmox - telmate/proxmox и его версия. А также настройки для подключения к proxmox.

В terraform.tfvars указывается переменная окружения (для прода лучше использовать переменные окружения CI либо vault).

В variables.tf происходит инициализация переменной окружения.

В modules/lxc_container/main.tf прописывается шаблон создания LXC контейнера ВМ в proxmox.

В modules/lxc_container/outputs.tf выходные данные, которые нужно передать из модуля в основной файл main.

В modules/lxc_container/variables.tf происходит инициализация переменных, которые передаются из основного main в модуль.


Создан модуль modules/lxc_dynamic для создания нескольких ВМ используя for_each.

```
andy@mercower:~/terraform-proxmox$ terraform plan
module.app.proxmox_lxc.app_container: Refreshing state... [id=px/lxc/100]

Note: Objects have changed outside of Terraform

Terraform detected the following changes made outside of Terraform since the last "terraform apply" which may have affected this plan:

  # module.app.proxmox_lxc.app_container has been deleted
  - resource "proxmox_lxc" "app_container" {
      - hostname             = "app-01" -> null
        id                   = "px/lxc/100"
        tags                 = null
        # (35 unchanged attributes hidden)

        # (2 unchanged blocks hidden)
    }


Unless you have made equivalent changes to your configuration, or ignored the relevant attributes using ignore_changes, the following plan may include actions to undo or respond to these changes.

─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # module.app.proxmox_lxc.app_container will be created
  + resource "proxmox_lxc" "app_container" {
      + arch            = "amd64"
      + cmode           = "tty"
      + console         = true
      + cores           = 2
      + cpulimit        = 0
      + cpuunits        = 1024
      + current_node    = (known after apply)
      + hostname        = "app-01"
      + id              = (known after apply)
      + memory          = 2048
      + onboot          = false
      + ostemplate      = "local:vztmpl/ubuntu-22.04-custome.tar.zst"
      + ostype          = (known after apply)
      + password        = (sensitive value)
      + protection      = false
      + ssh_public_keys = <<-EOT
            ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPiX5bOEXfX3AvwstdAyYYHgSyGDF12NzOBCwfNPQVgo terraform@lxc
        EOT
      + start           = true
      + swap            = 512
      + target_node     = "px"
      + tty             = 2
      + unprivileged    = false
      + unused          = (known after apply)
      + vmid            = (known after apply)

      + network {
          + bridge   = "vmbr1"
          + firewall = true
          + gw       = "10.10.10.1"
          + hwaddr   = (known after apply)
          + id       = (known after apply)
          + ip       = "10.10.10.3/24"
          + name     = "eth0"
          + tag      = (known after apply)
          + trunks   = (known after apply)
          + type     = (known after apply)
        }

      + rootfs {
          + size    = "8G"
          + storage = "local"
          + volume  = (known after apply)
        }
    }

  # module.apps.proxmox_lxc.app_container["nginx01"] will be created
  + resource "proxmox_lxc" "app_container" {
      + arch            = "amd64"
      + cmode           = "tty"
      + console         = true
      + cores           = 2
      + cpulimit        = 0
      + cpuunits        = 1024
      + current_node    = (known after apply)
      + hostname        = "nginx01"
      + id              = (known after apply)
      + memory          = 2048
      + onboot          = false
      + ostemplate      = "local:vztmpl/ubuntu-22.04-custome.tar.zst"
      + ostype          = (known after apply)
      + password        = (sensitive value)
      + protection      = false
      + ssh_public_keys = <<-EOT
            ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPiX5bOEXfX3AvwstdAyYYHgSyGDF12NzOBCwfNPQVgo terraform@lxc
        EOT
      + start           = true
      + swap            = 512
      + target_node     = "px"
      + tty             = 2
      + unprivileged    = false
      + unused          = (known after apply)
      + vmid            = (known after apply)

      + network {
          + bridge   = "vmbr1"
          + firewall = true
          + gw       = "10.10.10.1"
          + hwaddr   = (known after apply)
          + id       = (known after apply)
          + ip       = "10.10.10.5/24"
          + name     = "eth0"
          + tag      = (known after apply)
          + trunks   = (known after apply)
          + type     = (known after apply)
        }

      + rootfs {
          + size    = "8G"
          + storage = "local"
          + volume  = (known after apply)
        }
    }

  # module.apps.proxmox_lxc.app_container["nginx02"] will be created
  + resource "proxmox_lxc" "app_container" {
      + arch            = "amd64"
      + cmode           = "tty"
      + console         = true
      + cores           = 2
      + cpulimit        = 0
      + cpuunits        = 1024
      + current_node    = (known after apply)
      + hostname        = "nginx02"
      + id              = (known after apply)
      + memory          = 2048
      + onboot          = false
      + ostemplate      = "local:vztmpl/ubuntu-22.04-custome.tar.zst"
      + ostype          = (known after apply)
      + password        = (sensitive value)
      + protection      = false
      + ssh_public_keys = <<-EOT
            ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPiX5bOEXfX3AvwstdAyYYHgSyGDF12NzOBCwfNPQVgo terraform@lxc
        EOT
      + start           = true
      + swap            = 512
      + target_node     = "px"
      + tty             = 2
      + unprivileged    = false
      + unused          = (known after apply)
      + vmid            = (known after apply)

      + network {
          + bridge   = "vmbr1"
          + firewall = true
          + gw       = "10.10.10.1"
          + hwaddr   = (known after apply)
          + id       = (known after apply)
          + ip       = "10.10.10.6/24"
          + name     = "eth0"
          + tag      = (known after apply)
          + trunks   = (known after apply)
          + type     = (known after apply)
        }

      + rootfs {
          + size    = "8G"
          + storage = "local"
          + volume  = (known after apply)
        }
    }

Plan: 3 to add, 0 to change, 0 to destroy.

```
