Files
oswald-infra/vars.tf
T
nickandClaude Opus 5 5ee0114281 Give the technitium LXC a second NIC on the atlashorizon VLAN
Technitium now serves and resolves on 192.168.7.2 as well as its
192.168.0.2 address. The interface was added by hand out of band; this
brings it under management so the next apply does not remove it.

Adopts the module's new nic2 object in place of the VM-only ip2 string.
The submodule bump is a single ref, so it also carries in the Flatcar
module support that the next commit starts using.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-22 10:01:58 +00:00

168 lines
5.5 KiB
Terraform

variable "hypervisors" {
description = "Per-hypervisor configuration. Keys must match provider aliases in providers.tf (e.g. hv2, hv3)."
type = map(object({
api_url = string # e.g. https://192.168.1.10:8006/
node_name = string
storage = string
}))
}
variable "ipam_endpoint" {
description = "Base URL of the PHPIPAM API, e.g. https://ipam.example.com/api"
type = string
default = ""
}
variable "network_subnets" {
description = "Named map of CIDR ranges managed by PHPIPAM. Only used when enable_ipam = true."
type = map(string)
default = {}
}
variable "ansible_user" {
description = "User created on each managed host for Ansible access."
type = string
}
variable "search_domain" {
description = "DNS search domain set on all managed hosts."
type = string
}
variable "dns_nameservers" {
description = "DNS nameserver(s) set on all managed hosts."
type = string
}
variable "technitium_host" {
description = "URL of the Technitium DNS Server API (e.g. http://192.168.0.3:5380). Required once Technitium is running."
type = string
default = ""
}
variable "technitium_enabled" {
description = "Set to false to stop Terraform from managing Technitium DNS zones/records, without changing anything else. Still requires technitium_api_token in Infisical to actually turn on."
type = bool
default = true
}
variable "dns_zones" {
description = "Additional Technitium DNS zones to create, beyond the auto-managed search_domain zone. Keyed by zone name."
type = map(object({
type = optional(string, "Primary")
forwarder = optional(string)
}))
default = {}
}
variable "dns_records" {
description = "Manually managed DNS records. Each targets a zone by name (the search_domain zone or one from dns_zones). A record in the search_domain zone whose name matches an auto-added host replaces that host record instead of conflicting with it."
type = list(object({
zone = string
name = string # subdomain label, or "@" for the zone apex
type = string # A, AAAA, CNAME, NS, TXT, MX
value = string # IP / target / text / mail exchanger
ttl = optional(number)
priority = optional(number) # required for MX records
}))
default = []
}
variable "caddy_host" {
description = "Caddy admin API endpoint. When using the SSH tunnel this is the endpoint as seen from the caddy host (e.g. http://localhost:2019). Leave empty to disable Caddy management."
type = string
default = ""
}
variable "caddy_ssh_host" {
description = "SSH target (user@host:port) used to tunnel to the Caddy admin API. Empty to reach caddy_host directly."
type = string
default = ""
}
variable "caddy_ssh_host_key" {
description = "SSH host key of the caddy host, known_hosts format (get it with: ssh-keyscan <ip>). Required when caddy_ssh_host is set."
type = string
default = ""
}
variable "caddy_proxies" {
description = "Reverse-proxy sites keyed by name. Each maps a hostname to one or more upstream backends (Caddy dial targets, e.g. \"192.168.0.40:32400\"). protocol picks plain HTTP on :80 (default) or HTTPS on :443 with automatic certificates. Set path to restrict the route to specific request paths."
type = map(object({
host = string
upstreams = list(string)
protocol = optional(string, "http")
path = optional(list(string))
}))
default = {}
}
variable "ansible_inventory_path" {
description = "Path where the generated Ansible inventory file is written. Defaults to ../ansible/inventories/generated.yml relative to this module, which points to the parent repo when used as a git submodule."
type = string
default = "./ansible/inventories/generated.yml"
}
# LXC and VM definitions per hypervisor, keyed by the same names used in
# hypervisors and providers.tf. Both lxc and machines default to {} so a node
# can be declared with only one type of workload.
variable "nodes" {
type = map(object({
lxc = optional(map(object({
hostname = string
vmid = number
template = string
os_type = optional(string, "debian")
unprivileged = bool
onboot = bool
tags = string
cores = optional(number, 1)
memory = number
swap = number
disk_size = string
nic_name = string
bridge = string
vlan = optional(number)
ip = string
nameserver = optional(string)
gw = string
nic2 = optional(object({
nic_name = optional(string, "eth1")
bridge = optional(string, "vmbr0")
vlan = optional(number)
ip = string
gw = optional(string)
}))
})), {})
machines = optional(map(object({
hostname = string
vmid = number
ip = string
vlan = optional(number, 0)
template = string
full_clone = bool
onboot = bool
ciupgrade = optional(bool, false)
tags = string
agent = number
memory = number
disk_size = optional(string, "32")
balloon = number
cpu_type = string
cores = number
sockets = number
vcpus = number
bios = string
machine = string
bridge = string
nic2 = optional(object({
bridge = optional(string, "vmbr0")
vlan = optional(number)
ip = string
gw = optional(string)
}))
})), {})
}))
default = {}
}