This commit is contained in:
Graham McIntire 2026-06-27 15:32:03 -05:00
commit 5d3c4259e8
No known key found for this signature in database
GPG key ID: F4ABF488E6029E59
13 changed files with 763 additions and 0 deletions

20
.gitignore vendored Normal file
View file

@ -0,0 +1,20 @@
# Terraform tfvars (may contain secrets)
*.tfvars
*.tfvars.json
# Terraform state (contains sensitive data)
*.tfstate
*.tfstate.*
# Terraform directories
.terraform/
# Crash log files
crash.log
crash.*.log
# Override files
override.tf
override.tf.json
*_override.tf
*_override.tf.json

16
.terraform.lock.hcl generated Normal file
View file

@ -0,0 +1,16 @@
# This file is maintained automatically by "tofu init".
# Manual edits may be lost in future updates.
provider "registry.terraform.io/towerops-app/towerops" {
version = "0.1.21"
constraints = ">= 0.1.9"
hashes = [
"h1:eqcHbqmiJJUiEflWInIbulo+58YaSShtaK59eO/XuIE=",
"zh:2c1d6d176533469eb7ab6de7c97cee860e58d676806b385e49015943caa14ec4",
"zh:4c6baeaf9d6ce73c1caa94a489b0429f0ad907d892c919f3ab9d6f9e45a22b7b",
"zh:6f0512c04889c1548b98fb808edc6905cb85ac561d27e4e9e3bb128fa39992a0",
"zh:acf403cf69d7bfb49cb6dc858068359cbaeb9460a9fa0056f3a69a938f729fc9",
"zh:e77d543917c08b0c9ec3bae0ebda7d880ae3c082675fe57146822aacf5e52f18",
"zh:f61038097cb5e4f036a47836974799c5d8d2c051d2b05cfae1e6d07413ea47e9",
]
}

61
CLAUDE.md Normal file
View file

@ -0,0 +1,61 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Overview
This is a Terraform configuration for managing TowerOps network monitoring resources. It uses the custom `towerops` Terraform provider to create and manage sites and devices in the TowerOps platform.
## Commands
```bash
# Initialize Terraform (downloads provider)
terraform init
# Preview changes
terraform plan
# Apply changes
terraform apply
# Destroy all resources
terraform destroy
# Format Terraform files
terraform fmt
# Validate configuration
terraform validate
```
## Authentication
The provider requires a TowerOps API token. Set it via:
- `terraform.tfvars` file (gitignored): `towerops_api_token = "your-token"`
- Environment variable: `export TF_VAR_towerops_api_token="your-token"`
Generate tokens from TowerOps web application under Settings → API Tokens.
## Provider Resources
### towerops_site
Represents a physical location containing network devices.
Required: `name` (2-200 chars)
Optional: `location`, `snmp_community`
### towerops_device
Represents network equipment at a site.
Required: `site_id`, `name`, `ip_address`
Optional: `description`, `monitoring_enabled` (default: true), `snmp_enabled` (default: true), `snmp_version` (default: "2c"), `snmp_port` (default: 161)
Note: Changing `site_id` forces resource replacement.
## Import Existing Resources
```bash
terraform import towerops_site.example <uuid>
terraform import towerops_device.example <uuid>
```
- use opentofu

18
provider.tf Normal file
View file

@ -0,0 +1,18 @@
terraform {
required_providers {
towerops = {
source = "registry.terraform.io/towerops-app/towerops"
version = ">=0.1.9"
}
}
}
variable "towerops_api_token" {
description = "TowerOps API token"
type = string
sensitive = true
}
provider "towerops" {
token = var.towerops_api_token
}

81
site_380.tf Normal file
View file

@ -0,0 +1,81 @@
resource "towerops_site" "site_380" {
name = "380"
latitude = 33.174167
longitude = -96.491944
}
resource "towerops_device" "core" {
site_id = towerops_site.site_380.id
name = "Core"
ip_address = "10.254.254.253"
snmp_enabled = true
device_role = "router"
}
resource "towerops_device" "edge" {
site_id = towerops_site.site_380.id
name = "Edge"
ip_address = "10.254.254.254"
snmp_enabled = true
snmp_version = "1"
device_role = "router"
}
resource "towerops_device" "core_to_climax" {
site_id = towerops_site.site_380.id
name = "Core to climax"
ip_address = "10.250.1.90"
snmp_enabled = true
snmp_version = "1"
device_role = "backhaul"
}
resource "towerops_device" "resolver1" {
site_id = towerops_site.site_380.id
name = "resolver1"
ip_address = "204.110.191.240"
snmp_enabled = false
device_role = "server"
}
resource "towerops_device" "device_380_982_60" {
site_id = towerops_site.site_380.id
name = "380_982_60"
ip_address = "10.250.1.37"
snmp_enabled = true
snmp_version = "1"
device_role = "backhaul"
}
resource "towerops_device" "device_380_omni" {
site_id = towerops_site.site_380.id
name = "380"
ip_address = "10.10.79.10"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "device_380_to_culleoka_11g" {
site_id = towerops_site.site_380.id
name = "380 to Culleoka 11g"
ip_address = "10.250.1.53"
snmp_enabled = true
snmp_version = "1"
device_role = "backhaul"
}
resource "towerops_device" "device_380_to_new_hope" {
site_id = towerops_site.site_380.id
name = "380 to New Hope"
ip_address = "10.250.1.61"
snmp_enabled = true
snmp_version = "1"
device_role = "backhaul"
}
resource "towerops_check" "resolver1_dns" {
name = "resolver1 DNS"
check_type = "dns"
device_id = towerops_device.resolver1.id
hostname = "vntx.net"
}

37
site_494.tf Normal file
View file

@ -0,0 +1,37 @@
resource "towerops_site" "site_494" {
name = "494"
latitude = 33.208204
longitude = -96.462527
}
resource "towerops_device" "router_494" {
site_id = towerops_site.site_494.id
name = "494 Router"
ip_address = "10.254.254.111"
snmp_enabled = true
device_role = "router"
}
resource "towerops_device" "epmp_3000_omni_494" {
site_id = towerops_site.site_494.id
name = "494 ePMP 3000 Omni"
ip_address = "10.10.175.11"
snmp_enabled = true
}
resource "towerops_device" "rocket_2ac_prism_494" {
site_id = towerops_site.site_494.id
name = "494-Rocket 2AC Prism"
ip_address = "10.10.175.10"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "bh_494_climax" {
site_id = towerops_site.site_494.id
name = "494-Climax BH"
ip_address = "10.250.1.66"
snmp_enabled = true
snmp_version = "1"
device_role = "backhaul"
}

64
site_982.tf Normal file
View file

@ -0,0 +1,64 @@
resource "towerops_site" "site_982" {
name = "982"
latitude = 33.150749
longitude = -96.493752
}
resource "towerops_device" "router_982" {
site_id = towerops_site.site_982.id
name = "982 Router"
ip_address = "10.254.254.110"
snmp_enabled = true
device_role = "router"
}
resource "towerops_device" "device_982_1" {
site_id = towerops_site.site_982.id
name = "982-1"
ip_address = "10.10.63.1"
snmp_enabled = true
}
resource "towerops_device" "device_982_2" {
site_id = towerops_site.site_982.id
name = "982-2"
ip_address = "10.10.63.2"
snmp_enabled = true
}
resource "towerops_device" "device_982_3" {
site_id = towerops_site.site_982.id
name = "982-3"
ip_address = "10.10.63.3"
snmp_enabled = true
}
resource "towerops_device" "device_982_4" {
site_id = towerops_site.site_982.id
name = "982-4"
ip_address = "10.10.63.4"
snmp_enabled = true
}
resource "towerops_device" "device_982_5" {
site_id = towerops_site.site_982.id
name = "982-5"
ip_address = "10.10.63.5"
snmp_enabled = true
}
resource "towerops_device" "device_982_6" {
site_id = towerops_site.site_982.id
name = "982-6"
ip_address = "10.10.63.6"
snmp_enabled = true
}
resource "towerops_device" "device_982_380_60" {
site_id = towerops_site.site_982.id
name = "982_380_60"
ip_address = "10.250.1.34"
snmp_enabled = true
snmp_version = "1"
device_role = "backhaul"
}

29
site_altoga.tf Normal file
View file

@ -0,0 +1,29 @@
resource "towerops_site" "altoga" {
name = "Altoga"
latitude = 33.249399
longitude = -96.507824
}
resource "towerops_device" "altoga_sw" {
site_id = towerops_site.altoga.id
name = "Altoga SW"
ip_address = "10.10.95.20"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "altoga_e" {
site_id = towerops_site.altoga.id
name = "Altoga East"
ip_address = "10.10.95.21"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "altoga_n" {
site_id = towerops_site.altoga.id
name = "Altoga North"
ip_address = "10.10.95.22"
snmp_enabled = true
snmp_version = "1"
}

90
site_climax.tf Normal file
View file

@ -0,0 +1,90 @@
resource "towerops_site" "climax" {
name = "Climax"
latitude = 33.187296
longitude = -96.448144
}
resource "towerops_device" "climax_router" {
site_id = towerops_site.climax.id
name = "Climax Router"
ip_address = "10.254.254.102"
snmp_enabled = true
snmp_version = "2c"
device_role = "router"
}
resource "towerops_device" "climax_to_verona" {
site_id = towerops_site.climax.id
name = "climax to verona"
ip_address = "10.250.1.29"
snmp_enabled = true
snmp_version = "1"
device_role = "backhaul"
}
resource "towerops_device" "climax_11" {
site_id = towerops_site.climax.id
name = "Climax NW"
ip_address = "10.10.31.11"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "climax_12" {
site_id = towerops_site.climax.id
name = "Climax 5.8n NE"
ip_address = "10.10.31.12"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "climax_13" {
site_id = towerops_site.climax.id
name = "Climax South"
ip_address = "10.10.31.13"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "climax_30" {
site_id = towerops_site.climax.id
name = "Climax NW"
ip_address = "10.10.31.30"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "climax_31" {
site_id = towerops_site.climax.id
name = "climax ne"
ip_address = "10.10.31.31"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "climax_900_e" {
site_id = towerops_site.climax.id
name = "PR 900E"
ip_address = "10.10.31.40"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "climax_380_af24" {
site_id = towerops_site.climax.id
name = "Climax-380 AF24"
ip_address = "10.250.1.93"
snmp_enabled = true
snmp_version = "1"
device_role = "backhaul"
}
resource "towerops_device" "climax_494_bh" {
site_id = towerops_site.climax.id
name = "Climax-494 BH"
ip_address = "10.250.1.69"
snmp_enabled = true
snmp_version = "1"
device_role = "backhaul"
}

146
site_culleoka.tf Normal file
View file

@ -0,0 +1,146 @@
resource "towerops_site" "culleoka" {
name = "Culleoka"
latitude = 33.113678
longitude = -96.487871
}
resource "towerops_device" "culleoka_router" {
site_id = towerops_site.culleoka.id
name = "Culleoka Router"
ip_address = "10.254.254.104"
snmp_enabled = true
device_role = "router"
}
resource "towerops_device" "culleoka_sw_ac_1" {
site_id = towerops_site.culleoka.id
name = "Culleoka SW AC-1"
ip_address = "10.10.111.1"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "culleoka_sw_ac2" {
site_id = towerops_site.culleoka.id
name = "Culleoka SW AC2"
ip_address = "10.10.111.2"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "culleoka_se" {
site_id = towerops_site.culleoka.id
name = "Culleoka SE"
ip_address = "10.10.111.11"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "culleoka_sw_120" {
site_id = towerops_site.culleoka.id
name = "Culleoka sw 120"
ip_address = "10.10.111.12"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "culleoka_north_ubnt" {
site_id = towerops_site.culleoka.id
name = "Culleoka North UBNT"
ip_address = "10.10.111.14"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "culleoka_epmp_n" {
site_id = towerops_site.culleoka.id
name = "culleoka epmp N"
ip_address = "10.10.111.30"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "culleoka_epmp_se" {
site_id = towerops_site.culleoka.id
name = "Culleoka ePMP SE"
ip_address = "10.10.111.31"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "culleoka_epmp_sw" {
site_id = towerops_site.culleoka.id
name = "Culleoka ePMP SW"
ip_address = "10.10.111.32"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "culleoka_ne" {
site_id = towerops_site.culleoka.id
name = "Culleoka NE"
ip_address = "10.10.111.33"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "culleoka_epmp_se_34" {
site_id = towerops_site.culleoka.id
name = "Culleoka ePMP SE"
ip_address = "10.10.111.34"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "culleoka_epmp_nw" {
site_id = towerops_site.culleoka.id
name = "Culleoka ePMP NW"
ip_address = "10.10.111.35"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "clayton_estates_ap" {
site_id = towerops_site.culleoka.id
name = "Clayton Estates AP"
ip_address = "10.10.111.50"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "clayton_to_culleoka" {
site_id = towerops_site.culleoka.id
name = "clayton to culleoka"
ip_address = "10.10.111.60"
snmp_enabled = true
snmp_version = "1"
device_role = "backhaul"
}
resource "towerops_device" "culleoka_to_clayton" {
site_id = towerops_site.culleoka.id
name = "culleoka to clayton"
ip_address = "10.10.111.61"
snmp_enabled = true
snmp_version = "1"
device_role = "backhaul"
}
resource "towerops_device" "culleoka_to_380_11g" {
site_id = towerops_site.culleoka.id
name = "Culleoka to 380 11g"
ip_address = "10.250.1.50"
snmp_enabled = true
snmp_version = "1"
device_role = "backhaul"
}
resource "towerops_device" "culleoka_to_climax_11ghz" {
site_id = towerops_site.culleoka.id
name = "Culleoka to Climax 11ghz"
ip_address = "10.250.1.10"
snmp_enabled = true
snmp_version = "1"
device_role = "backhaul"
monitoring_enabled = false
}

54
site_lowry_crossing.tf Normal file
View file

@ -0,0 +1,54 @@
resource "towerops_site" "lowry_crossing" {
name = "Lowry Crossing"
latitude = 33.160866
longitude = -96.540467
}
resource "towerops_device" "lowry_crossing" {
site_id = towerops_site.lowry_crossing.id
name = "LowryCrossing"
ip_address = "10.254.254.109"
snmp_enabled = true
device_role = "router"
}
resource "towerops_device" "lowry_crossing_omni" {
site_id = towerops_site.lowry_crossing.id
ip_address = "10.10.159.10"
name = "Lowry_Crossing_Omni"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "lowry_crossing_ne" {
site_id = towerops_site.lowry_crossing.id
ip_address = "10.10.159.11"
name = "Lowry Crossing NE"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "lowry_crossing_n" {
site_id = towerops_site.lowry_crossing.id
ip_address = "10.10.159.12"
name = "Lowry Crossing N"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "lowry_crossing_nw" {
site_id = towerops_site.lowry_crossing.id
ip_address = "10.10.159.13"
name = "lowry nw"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "lowry_crossing_to_new_hope" {
site_id = towerops_site.lowry_crossing.id
name = "Lowry Crossing to New Hope"
ip_address = "10.250.1.106"
snmp_enabled = true
snmp_version = "1"
device_role = "backhaul"
}

63
site_new_hope.tf Normal file
View file

@ -0,0 +1,63 @@
resource "towerops_site" "new_hope" {
name = "New Hope"
latitude = 33.207279
longitude = -96.537762
}
resource "towerops_device" "new_hope" {
site_id = towerops_site.new_hope.id
name = "New Hope"
ip_address = "10.254.254.108"
snmp_enabled = true
device_role = "router"
}
resource "towerops_device" "new_hope_se" {
site_id = towerops_site.new_hope.id
name = "New Hope SE"
ip_address = "10.10.143.11"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "new_hope_ne" {
site_id = towerops_site.new_hope.id
name = "New Hope NE"
ip_address = "10.10.143.12"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "new_hope_nw" {
site_id = towerops_site.new_hope.id
name = "new hope nw"
ip_address = "10.10.143.13"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "new_hope_sw" {
site_id = towerops_site.new_hope.id
name = "new hope sw"
ip_address = "10.10.143.14"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "new_hope_to_core_af11x" {
site_id = towerops_site.new_hope.id
name = "New Hope to Core af11x"
ip_address = "10.250.1.58"
snmp_enabled = true
snmp_version = "1"
device_role = "backhaul"
}
resource "towerops_device" "new_hope_to_lowry_crossing" {
site_id = towerops_site.new_hope.id
name = "new hope to lowry crossing"
ip_address = "10.250.1.109"
snmp_enabled = true
snmp_version = "1"
device_role = "backhaul"
}

84
site_verona.tf Normal file
View file

@ -0,0 +1,84 @@
resource "towerops_site" "verona" {
name = "Verona"
latitude = 33.246171
longitude = -96.426516
}
# resource "towerops_device" "verona_graham_router" {
# site_id = towerops_site.verona.id
# name = "Graham Router"
# ip_address = "204.110.191.1"
# snmp_version = "3"
# snmpv3_security_level = "authPriv"
# snmpv3_username = "testtest"
# snmpv3_auth_protocol = "SHA-256"
# snmpv3_auth_password = "testtest"
# snmpv3_priv_protocol = "AES"
# snmpv3_priv_password = "testtest"
# }
resource "towerops_device" "verona" {
site_id = towerops_site.verona.id
name = "Verona"
ip_address = "10.254.254.101"
snmp_enabled = true
device_role = "router"
}
resource "towerops_device" "verona_nw" {
site_id = towerops_site.verona.id
name = "Verona NW"
ip_address = "10.10.15.11"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "verona_ne" {
site_id = towerops_site.verona.id
name = "Verona NE"
ip_address = "10.10.15.12"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "verona_s" {
site_id = towerops_site.verona.id
name = "Verona S"
ip_address = "10.10.15.13"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "verona_horn_w" {
site_id = towerops_site.verona.id
name = "Verona 5AC Horn W"
ip_address = "10.10.15.1"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "verona_horn_nw" {
site_id = towerops_site.verona.id
name = "Verona 5AC Horn NW"
ip_address = "10.10.15.2"
snmp_enabled = true
snmp_version = "1"
}
resource "towerops_device" "verona_climax_bh" {
site_id = towerops_site.verona.id
name = "Verona to Climax 11ghz"
ip_address = "10.250.1.26"
snmp_enabled = true
snmp_version = "1"
device_role = "backhaul"
}
resource "towerops_device" "verona_to_altoga" {
site_id = towerops_site.verona.id
name = "Verona to Altoga"
ip_address = "10.250.1.146"
snmp_enabled = true
snmp_version = "1"
device_role = "backhaul"
}