This commit is contained in:
Hrankin, Aleksandr (contracted)
2026-02-19 11:34:13 +00:00
commit f243f440c3
191 changed files with 6183 additions and 0 deletions

View File

@@ -0,0 +1,72 @@
resource "proxmox_virtual_environment_container" "this" {
node_name = var.target_node
vm_id = var.vm_id
unprivileged = var.unprivileged
started = var.started
start_on_boot = var.start_on_boot
cpu {
cores = var.cores
units = var.cpu_units
}
memory {
dedicated = var.memory
swap = var.swap
}
disk {
datastore_id = var.rootfs_storage
size = var.rootfs_size_gib
}
features {
nesting = var.nesting
}
network_interface {
name = var.netif_name
bridge = var.bridge
enabled = true
firewall = var.firewall
}
operating_system {
template_file_id = var.template_file_id
type = var.os_type
}
initialization {
hostname = var.hostname
ip_config {
ipv4 {
address = var.ipv4_address
gateway = var.ipv4_gateway
}
}
# user_account делаем опциональным:
# - если задан пароль (не null) или есть ssh keys
dynamic "user_account" {
for_each = (var.password != null || length(var.ssh_public_keys) > 0) ? [1] : []
content {
# provider норм принимает keys list(string)
keys = var.ssh_public_keys
# password задаём только если не null
password = var.password
}
}
# DNS опционально
dynamic "dns" {
for_each = (var.dns_domain != null || length(var.dns_servers) > 0) ? [1] : []
content {
domain = var.dns_domain
servers = var.dns_servers
}
}
}
}

View File

@@ -0,0 +1,126 @@
variable "vm_id" {
type = number
}
variable "hostname" {
type = string
}
variable "target_node" {
type = string
}
variable "template_file_id" {
type = string
}
variable "os_type" {
type = string
default = "debian"
}
variable "unprivileged" {
type = bool
default = true
}
variable "nesting" {
type = bool
default = true
}
variable "cores" {
type = number
default = 1
}
# Proxmox cpuunits
variable "cpu_units" {
type = number
default = 1024
}
variable "memory" {
type = number
default = 512
}
variable "swap" {
type = number
default = 512
}
variable "rootfs_storage" {
type = string
default = "local-lvm"
}
variable "rootfs_size_gib" {
type = number
default = 8
}
variable "bridge" {
type = string
default = "vmbr0"
}
variable "netif_name" {
type = string
default = "eth0"
}
variable "firewall" {
type = bool
default = true
}
# DHCP: "dhcp"
# Static: "192.168.1.50/24"
variable "ipv4_address" {
type = string
default = "dhcp"
validation {
condition = var.ipv4_address == "dhcp" || can(cidrnetmask(var.ipv4_address))
error_message = "ipv4_address must be \"dhcp\" or a valid CIDR like 192.168.1.50/24."
}
}
# gateway допустим только если не dhcp
variable "ipv4_gateway" {
type = string
default = null
}
# Пароль опциональный (можешь управлять через ssh keys)
variable "password" {
type = string
default = null
sensitive = true
}
variable "ssh_public_keys" {
type = list(string)
default = []
}
variable "dns_domain" {
type = string
default = null
}
variable "dns_servers" {
type = list(string)
default = []
}
variable "started" {
type = bool
default = false
}
variable "start_on_boot" {
type = bool
default = false
}

View File

@@ -0,0 +1,10 @@
terraform {
required_version = ">= 1.6"
required_providers {
proxmox = {
source = "bpg/proxmox"
version = "0.86.0"
}
}
}

View File

@@ -0,0 +1,63 @@
resource "proxmox_virtual_environment_vm" "this" {
name = var.name
node_name = var.target_node
clone {
vm_id = var.template_id
full = true
}
cpu {
cores = var.cpu
type = var.cpu_type
}
memory {
dedicated = var.memory
}
# Предсказуемая SCSI нумерация
scsi_hardware = "virtio-scsi-single"
boot_order = ["scsi0"]
# OS disk (scsi0)
disk {
datastore_id = var.storage
size = var.disk_size
interface = "scsi0"
}
# OSD disks (scsi1, scsi2, ...)
dynamic "disk" {
for_each = (var.osd_storage != null && length(var.osd_disks) > 0) ? { for idx, size in var.osd_disks : idx => size } : {}
content {
datastore_id = var.osd_storage
size = disk.value
interface = "scsi${disk.key + 1}"
file_format = "raw"
cache = "none"
iothread = true
discard = "on"
}
}
network_device {
bridge = var.bridge
model = "virtio"
mac_address = var.mac_address
}
agent {
enabled = true
}
initialization {
user_data_file_id = var.user_data_file_id
ip_config {
ipv4 { address = "dhcp" }
}
}
}

View File

@@ -0,0 +1,55 @@
variable "name" {
type = string
}
variable "target_node" {
type = string
}
variable "template_id" {
type = number
}
variable "cpu" {
type = number
}
variable "cpu_type" {
type = string
}
variable "memory" {
type = number
}
variable "disk_size" {
type = number
}
variable "storage" {
type = string
}
variable "bridge" {
type = string
}
variable "osd_storage" {
type = string
default = null
}
variable "osd_disks" {
type = list(number)
default = []
}
variable "user_data_file_id" {
type = string
default = null
}
variable "mac_address" {
description = "Static MAC for VM NIC (for DHCP reservation)."
type = string
}

View File

@@ -0,0 +1,8 @@
terraform {
required_providers {
proxmox = {
source = "bpg/proxmox"
version = ">= 0.86.0"
}
}
}