variable "site_slug" { description = "NetBox site slug, derived from the config path (config//); the dc IS the slug." type = string } variable "site" { description = "Site-wide attributes. `name` defaults to the slug." type = object({ name = optional(string) description = optional(string, "") }) default = {} } variable "device_type_ids" { description = "Device-type id by slug, from the netbox-global unit: device types are global objects." type = map(number) default = {} } variable "device_role_ids" { description = "Device-role id by role name, from the netbox-global unit: device roles are global objects." type = map(number) default = {} } variable "dhcp_role_id" { description = "Id of the global dhcp IPAM role, from the netbox-global unit." type = number default = null } variable "subnets" { description = <<-EOT Map of subnets keyed by name (config file basename, net-----). Every subnet belongs to this unit's site. `dhcp` records the pool as a NetBox ip_range only; the DHCP server itself is the kea-operator's KeaSubnet CRs in argocd-apps. `dns`, `domain` and `next_server` are not read by any resource here -- they are retained so a later change can drive Kea from this repo without re-deriving them. EOT type = map(object({ prefix = string description = optional(string, "") router = optional(number) dhcp = optional(object({ enabled = optional(bool, true) start = number stop = number })) dns = optional(list(string), []) domain = optional(string) next_server = optional(string) })) default = {} } variable "vlans" { description = <<-EOT This site's VLANs. The site gets one NetBox VLAN group scoped to it, so the same VID may exist in more than one site. EOT type = object({ vid_ranges = optional(list(list(number)), [[1, 4094]]) vlans = optional(list(object({ vid = number name = string description = optional(string, "") })), []) }) default = {} } variable "network_profiles" { description = <<-EOT Network profiles keyed by profile name. A profile describes the interfaces a logical host should have: one entry per interface, each bound to a VLAN VID and a subnet key, optionally with subinterfaces. Published as a NetBox config context scoped to this site (and `roles`, if given) so the UI reads profiles from the NetBox API. EOT type = map(object({ description = optional(string, "") roles = optional(list(string), []) weight = optional(number, 1000) interfaces = list(object({ name = string vlan = number subnet = string subinterfaces = optional(list(object({ name = string vlan = number subnet = optional(string) })), []) })) })) default = {} } variable "managed_ips" { description = "Manually managed extra IP addresses (full CIDR form, e.g. 198.18.15.5/24)." type = list(object({ ip = string description = optional(string, "") })) default = [] } variable "network_devices" { description = <<-EOT Network equipment keyed by device name, all of it in this unit's site. Switches are declared here rather than left to autodiscovery: nothing probes one, and its interface templates must be instantiated in NetBox before discovery can cable a host interface to a port. `device_type` and `role` name global objects created by the netbox-global unit. `chassis_mac` is published as the chassis_mac custom field so an LLDP neighbour can be matched without its SysName. EOT type = map(object({ device_type = string role = string serial = optional(string) asset_tag = optional(string) chassis_mac = optional(string) })) default = {} } variable "vault_address" { description = "Vault server address for the token data source." type = string default = "https://vault.service.consul:8200" } variable "netbox_server_url" { description = "NetBox server base URL." type = string default = "https://netbox.k8s.syd1.au.unkin.net" }