init
This commit is contained in:
72
terraform/modules/proxmox/lxc/main.tf
Normal file
72
terraform/modules/proxmox/lxc/main.tf
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
126
terraform/modules/proxmox/lxc/variables.tf
Normal file
126
terraform/modules/proxmox/lxc/variables.tf
Normal 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
|
||||
}
|
||||
10
terraform/modules/proxmox/lxc/versions.tf
Normal file
10
terraform/modules/proxmox/lxc/versions.tf
Normal file
@@ -0,0 +1,10 @@
|
||||
terraform {
|
||||
required_version = ">= 1.6"
|
||||
|
||||
required_providers {
|
||||
proxmox = {
|
||||
source = "bpg/proxmox"
|
||||
version = "0.86.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
63
terraform/modules/proxmox/vm/main.tf
Normal file
63
terraform/modules/proxmox/vm/main.tf
Normal 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" }
|
||||
}
|
||||
}
|
||||
}
|
||||
55
terraform/modules/proxmox/vm/variables.tf
Normal file
55
terraform/modules/proxmox/vm/variables.tf
Normal 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
|
||||
}
|
||||
8
terraform/modules/proxmox/vm/versions.tf
Normal file
8
terraform/modules/proxmox/vm/versions.tf
Normal file
@@ -0,0 +1,8 @@
|
||||
terraform {
|
||||
required_providers {
|
||||
proxmox = {
|
||||
source = "bpg/proxmox"
|
||||
version = ">= 0.86.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user