Всем привет, я не блогер и не люблю писать посты и блоги, пока.

Решил найти решение для Terraform и Proxmox. После не долгих поисков нашёл провайдер под названием terraform-provider-proxmox. Так как на русском документации не было ни где решил перевести документацию о ресурсах на русский язык как мог. Думаю что кому ни будь будет полезно и избавит от дополнительного труда.

Описание LXC Resource

Этот "ресурс terraform" позволяет создавать контейнеры Proxmox LXC и управлять ими.

Примеры использования

Базовый пример

resource "proxmox_lxc" "basic" {

  target_node  = "pve"

  hostname     = "lxc-basic"

  ostemplate   = "local:vztmpl/ubuntu-20.04-standard_20.04-1_amd64.tar.gz"

  password     = "BasicLXCContainer"

  unprivileged = true

  // Terraform will crash without rootfs defined

  rootfs {

    storage = "local-zfs"

    size    = "8G"

  }

  network {

    name   = "eth0"

    bridge = "vmbr0"

    ip     = "dhcp"

  }

}

Пример с несколькими точками монтирования

-> Указав параметр `local-lvm:12` для атрибута  `mountpoint.storage` в первом блоке `mountpoint` ниже, автоматически создаст том для контейнера. Больше ниформации о монторовании томов смотрите на [Storage Backed Mount Points](https://pve.proxmox.com/pve-docs/pve-admin-guide.html#_storage_backed_mount_points).

resource "proxmox_lxc" "multiple_mountpoints" {

  target_node  = "pve"

  hostname     = "lxc-multiple-mountpoints"

  ostemplate   = "local:vztmpl/ubuntu-20.04-standard_20.04-1_amd64.tar.gz"

  unprivileged = true

  ostype       = "ubuntu"

  ssh_public_keys = <<-EOT

    ssh-rsa <public_key_1> user@example.com

    ssh-ed25519 <public_key_2> user@example.com

  EOT

  // Terraform will crash without rootfs defined

  rootfs {

    storage = "local-zfs"

    size    = "8G"

  }

  // Storage Backed Mount Point

  mountpoint {

    key     = "0"

    slot    = 0

    storage = "local-lvm"

    mp      = "/mnt/container/storage-backed-mount-point"

    size    = "12G"

  }

  // Bind Mount Point

  mountpoint {

    key     = "1"

    slot    = 1

    storage = "/srv/host/bind-mount-point"

    // Без определения 'volume' Proxmox попытается создать том 

    // со значением 'storage' + : + 'size' (без завершающей буквы G) - например.

    // "/srv/host/bind-mount-point:256".

    // Такое поведение, похоже, вызвано ошибкой в провайдере.

    volume  = "/srv/host/bind-mount-point"

    mp      = "/mnt/container/bind-mount-point"

    size    = "256G"

  }

  // Device Mount Point

  mountpoint {

    key     = "2"

    slot    = 2

    storage = "/dev/sdg"

    volume  = "/dev/sdg"

    mp      = "/mnt/container/device-mount-point"

    size    = "32G"

  }

  network {

    name   = "eth0"

    bridge = "vmbr0"

    ip     = "dhcp"

    ip6    = "dhcp"

  }

}

LXC с расширенными функциями

resource "proxmox_lxc" "advanced_features" {

  target_node  = "pve"

  hostname     = "lxc-advanced-features"

  ostemplate   = "local:vztmpl/ubuntu-20.04-standard_20.04-1_amd64.tar.gz"

  unprivileged = true

  ssh_public_keys = <<-EOT

    ssh-rsa <public_key_1> user@example.com

    ssh-ed25519 <public_key_2> user@example.com

  EOT

  features {

    fuse    = true

    nesting = true

    mount   = "nfs;cifs"

  }

  // Terraform will crash without rootfs defined

  rootfs {

    storage = "local-zfs"

    size    = "8G"

  }

  // NFS share mounted on host

  mountpoint {

    slot    = "0"

    storage = "/mnt/host/nfs"

    mp      = "/mnt/container/nfs"

    size    = "250G"

  }

  network {

    name   = "eth0"

    bridge = "vmbr0"

    ip     = "10.0.0.2/24"

    ip6    = "auto"

  }

}

Пример простого клонирования

resource "proxmox_lxc" "basic" {

  target_node = "pve"

  hostname    = "lxc-clone"

  #id of lxc container to clone

  clone       = "8001"

}

Описание аргументов

Обязательные (Required)

При использовании должны быть использованы следующие аргументы:

  • `target_node` - Строка определяющая узел вертуализации.

Произвольные (Optional)

-> Хотя следующие аргументы необязательны, у некоторых есть дочерние аргументы, которые требуются при использовании родительского аргумента (например, аргумент `name` в атрибуте `network` ). Такие дочерние атрибуты помечены как "(required)".

Следующие аргументы могут использоваться выборочно при использованиии данного ресурса:

  • `ostemplate` - [Обозначение образа](https://pve.proxmox.com/pve-docs/pve-admin-guide.html#_volumes) указывающее на шаблон ОС или файл резервной копии

  • `arch` - Устанавливает тип архитектуры ОС в контейнере. По умолчанию это `"amd64"`.

  • `bwlimit` - Число для переопределения ограничения пропускной способностиI/O указывается в KiB/s.

  • `clone` - Идентификатор клонируемого контейнера

  • `clone_storage` - Целевое хранилище для полного клонирования.

  • `cmode` - Настраивает режим консоли. `"tty"` Пытается установить соединение с одним из доступных TTY устройств. `"console"`  Пытается  подключиться `/dev/console`. `"shell"` просто вызывает оболочку внутри контейнера (без входа в систему). По умолчанию `"tty"`.

  • `console` - Определяет подключать ли консольное устройство к контейнеру. По умолчанию `true`.

  • `cores` - Определяет колличество ядер выделеных контейнеру. Контейнер может использовать все доступные ядра по умолчанию.

  • `cpulimit` Значение ограничения на использования CPU . По умолчанию не ограничено `0` .

  • `cpuunits` - Значение веса(приоритета) при использовании CPU для контейнера. По умолчанию `1024`.

  • `description` - Описание контейнера отображаемое в WEB-интерфейсе


  • `features` - Объект, позволяющий контейнеру получать доступ к расширенным функциям.

    • fuse - Логический параметр включающий монирование FUSE.

    • keyctl - Логический параметр для включения системного вызова keyctl().

    • mount - Определяет типы файловых систем (разделяемые точкой с запятой), которые разрешено монтировать.

    • nesting - Определяет разрешена ли вложенная виртуализация.


  • `force` - Определяет заменится ли при создании существующий контейнер с такими же параметрами идентификаци

  • `full` - Установите значение параметра в `true` для создания не связанного клона с копированием всех дисков. При создании нормального клона этот параметр обязательно должен быть определён. По умолчанию создаётся связанный с шаблоном клон(диски у контейнеров становятся общими).

  • `force` - Определяет заменится ли при создании существующий контейнер с такими же параметрами идентификаци

    `hastate` - Запрашивает состояние HA (высокой доступности) для ресурса. Доступно одно из следующих состояний: "started", "stopped", "enabled", "disabled" или "ignored" </summary>

    • `started` - система будет пытаться запустить ресурс на одном из узлов, в случае если запуск не удался или узел не отвечает, то система будет пробовать запускать на другом доступном узеле

    • stopped - система будет сохранять ресурс в выключенном состоянии, но по прежнему будет перемещать его в слючае выхода из строя узла,

    • `enabled` - псевдоним для *`started`*,

    • `disabled` - Система пытается перевести ресурс выключенное состояние, но не переносит его в случае выхода из строя узла виртуализации,

    • `ignored` - Ресурс выводится из под управления системы ___HA___  и система более не затрагивает данный ресурс. Все вызовы __API__ затрагивающие этот ресурс выполняются меную систему ___HA___.

    Более подробная информация в Документации по "HA"


  • `hagroup` - Идентификатор группы HA (требуется что бы параметр `hastate` был определён!). Смотрите  [Документацию по HA](https://pve.proxmox.com/pve-docs/chapter-ha-manager.html#ha_manager_resource_config) для получения подробной информации.

  • `hookscript` - Строка, содержащая [идентификатор тома для скрипта](https://pve.proxmox.com/pve-docs/pve-admin-guide.html#_hookscripts_2), который будет выполняться на различных этапах в течение всего срока службы контейнера. Сценарий должен быть исполняемым файлом. 

  • `hostname` - Определяет имя узла _"HOSTNAME"_ контейнера.

  • `ignore_unpack_errors` - Логическое значение, определяющее, игнорируются ли ошибки извлечения шаблона при создании контейнера.

  • `lock` - Строка для блокировки или разблокировки виртуальной машины.

  • `memory` - Число, определяющее объем оперативной памяти, назначаемый контейнеру (в МБ).


  • `mountpoint` - Объект, определяющий том, который будет использоваться в качестве точки монтирования контейнера. Может быть задан несколько раз.

    • `mp` (required) - Путь к точке монтирования, видимый изнутри контейнера. Путь не должен содержать символических ссылок по соображениям безопасности.

    • `size` (required) - Размер (на пример `"1T"`, `"1G"`, `"1024M"`, `"1048576K"`).  Обратите внимание, что это значение доступно только для чтения.(возможно имеется в виду что тома доступны только для чтения.)

    • `slot` (required) -Строка, содержащая число, идентифицирующее точку монтирования (т.е. `n` в [`mp[n]`](https://pve.proxmox.com/pve-docs/pve-admin-guide.html#pct_mount_points)).

    • `key` (required) - Число, идентифицирующее точку монтирования (т.е. `n` в [`mp[n]`](https://pve.proxmox.com/pve-docs/pve-admin-guide.html#pct_mount_points)).

    • `storage` (required) - Строка содержащая том (volume), каталог (directory), или   устройство (device) которое должно быть подключено в контейнер (по пути определяемому `mp`). Например `local-lvm`, `local-zfs`, `local` и т.д.

    • `acl` - Логическое значение для включения поддержки ACL. По умолчанию - `false`.

    • `backup` - Параметр включающий резервное копирование для смонтированного устройства. По умолчанию - `false`.

    • `quota` -Логическое значение для включения пользовательских квот внутри контейнера.

    • По умолчанию - `false`.

    • `replicate` - Параметр определяет будет ли реплицироваться устройсво. По умолчанию -  `false`.

    • `shared` - Параметр определяющий доступность устройства на всех узлах. Default is `false`.


  • `nameserver` - IP адрес сервера имён для использования в контейнере.Если не указаны ни `nameserver`, ни `searchdomain`, то по умолчанию будут использоваться значения хоста Proxmox.

  • `network` - Объект, определяющий сетевой интерфейс для контейнера. Может быть задан несколько раз.

    • `name` (required) - Имя сетевого интерфейса, видимое изнутри контейнера (например, `"eth0"`).

    • `bridge` - Сетевой мост, к которому подключается сетевой интерфейс (например, `"vmbr0"`).

    • `firewall` - Параметр включающий Firewall на интерфейсе контейнера.

    • `gw` - IPv4 адрес шлюза сети.

    • `gw6` - IPv6 адрес шлюза сети.

    • `hwaddr` - Строка устанавливающая MAC-адрес сетевого интерфейса с неустановленным индивидуальным/групповым битом. Определяется автоматически, если не задано.

    • `ip` - IPv4-адрес сетевого интерфейса. Может быть статическим задаётся в формате `"CIDR"`, автоматически `"dhcp"`, или в ручную в ОС контейнера `"manual"`.

    • `ip6` - IPv4-адрес сетевого интерфейса.  Может быть статическим задаётся в формате `"CIDR"`, автоматически `"dhcp"`, `"auto"`, или в ручную в ОС контейнера `"manual"`.

    • `mtu` - Строковый параметр для установка MTU для сетевого интерфейса.

    • `rate` - Числовой параметр для установки ограничения трафика (Mbps).

    • `tag` - Числовой параметр устанавливает значение тега  `VLAN` для сетевого интерфейса. По умолчанию устанавливается в `0`.


  • `onboot` - Логический параметр определяющий будет ли контейнер запускаться при загрузке гипервизора. По умолчанию `false`.

  • `ostype` - Тип операционной системы, используемый LXC для установки и конфигурирования контейнера. Если не задано, определяется автоматически.

  • `password` - Строковый параметр для установки пароля пользователя *root*.

  • `pool` - Имя пула ресурса Proxmox в который необходимо включить контейнер.

  • `protection` - Логический параметр установки флага `protection` для контейнера. Запрещает удаление/обновление контейнера и его дисков. Значение по умолчанию `false`.

  • `restore` - Лигический параметр помечающий операции создания/обновления как задачи восствновления.


  • `rootfs` - Объект для конфигурации монтирования корневой файловой системы. Можно определить лишь раз.

    • `size` (required) - Размер базового тома. необходимо в конце укзать еденицу измерения T, G, M, или K (например `"1T"`, `"1G"`, `"1024M"`, `"1048576K"`). Note that this is a read only value.

    • `storage` (required) - Строковый параметр содержащий том, каталог, или устройство которое будет смонтировано в контейнер (по пути определённому `mp`). Например `local-lvm`, `local-zfs`, `local` и т.д.


  • `searchdomain` - Строковый параметр для установки поискового домена. Если не указаны ни `name server`, ни `search domain`, по умолчанию будут использоваться значения хоста Proxmox.

  • `ssh_public_keys` -Многострочный параметр предназначеный для установки публичной части SSH ключа. Для установки используется [синтаксис heredoc](https://www.terraform.io/docs/configuration/expressions/strings.html#heredoc-strings).

  • `start` - Логический параметр определяющий будет ли запущен контейнер после создания. По умолчанию `false`.

  • `startup` -  [Поведение контейнера при запуске и выключении.](https://pve.proxmox.com/pve-docs/pve-admin-guide.html#pct_startup_and_shutdown).

  • `swap` - Числовой параметр задающей объем памяти подкачки, доступной контейнеру. По умолчанию `512`.

  • `tags` - Метка контейнера. Это всего лишь информация.

  • `template` - Логический параметр, определяющий, является ли этот контейнер шаблоном.

  • `tty` - Числовой параметр определяющий количество доступных TTY для контейнера. По умолчанию `2`.

  • `unique` - Логический параметр определяющий будет ли присвоен уникальный случайный адрес ethernet.

  • `unprivileged` - Логический параметр предписывающий запускаться ли контейнеру от имени непривилегированного пользователя. По умолчанию  `false`.

  • `vmid` - Числовой параметр определяющий идентификатор контейнера VMID. Если значение установлено в `0`, то будет использоваться следующий свободный VMID. По умолчанию `0`.

Никакие дополнительные атрибуты этим ресурсом не эксплуатируются.

LXC я использовал и с проблемами не сталкивался всё работало отлично. Свой опыт и какие то инструкции описывать не буду, так как там и описывать нечего особенно.

Описание по VM в следующей "статье".

Комментарии (2)


  1. A1EF
    22.06.2023 12:17

    Пожалуй, это единственная причина, почему я вообще использую Proxmox VE. Но по моему опыту этот провайдер "хрупкий", некоторые вещи не может сделать (например, перетащить машинку с одной ноды на другую в кластере). Кроме того, обновление Проксмокса тоже может поломать его работу. Однажды мне вообще пришлось в результате править стейт руками. В общем, штука хорошая, но надо учитывать сопутствующие проблемы.


  1. RealBeria
    22.06.2023 12:17
    +3

    на Хабре не думали сделать раздел GitHabr? Полезного материала для него уже предостаточно.