commit 5d3c4259e88f00d2de746c03e53d167acfbe83d3 Author: Graham McIntire Date: Sat Jun 27 15:32:03 2026 -0500 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..996c7d8 --- /dev/null +++ b/.gitignore @@ -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 diff --git a/.terraform.lock.hcl b/.terraform.lock.hcl new file mode 100644 index 0000000..2b693f1 --- /dev/null +++ b/.terraform.lock.hcl @@ -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", + ] +} diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..c7e8f90 --- /dev/null +++ b/CLAUDE.md @@ -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 +terraform import towerops_device.example +``` +- use opentofu \ No newline at end of file diff --git a/provider.tf b/provider.tf new file mode 100644 index 0000000..b8fc58c --- /dev/null +++ b/provider.tf @@ -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 +} diff --git a/site_380.tf b/site_380.tf new file mode 100644 index 0000000..cf7af4e --- /dev/null +++ b/site_380.tf @@ -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" +} diff --git a/site_494.tf b/site_494.tf new file mode 100644 index 0000000..b421c8b --- /dev/null +++ b/site_494.tf @@ -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" +} diff --git a/site_982.tf b/site_982.tf new file mode 100644 index 0000000..dd59257 --- /dev/null +++ b/site_982.tf @@ -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" +} diff --git a/site_altoga.tf b/site_altoga.tf new file mode 100644 index 0000000..c77d831 --- /dev/null +++ b/site_altoga.tf @@ -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" +} diff --git a/site_climax.tf b/site_climax.tf new file mode 100644 index 0000000..e6d6b69 --- /dev/null +++ b/site_climax.tf @@ -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" +} diff --git a/site_culleoka.tf b/site_culleoka.tf new file mode 100644 index 0000000..1a5405d --- /dev/null +++ b/site_culleoka.tf @@ -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 +} diff --git a/site_lowry_crossing.tf b/site_lowry_crossing.tf new file mode 100644 index 0000000..6ff7b62 --- /dev/null +++ b/site_lowry_crossing.tf @@ -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" +} diff --git a/site_new_hope.tf b/site_new_hope.tf new file mode 100644 index 0000000..2447663 --- /dev/null +++ b/site_new_hope.tf @@ -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" +} diff --git a/site_verona.tf b/site_verona.tf new file mode 100644 index 0000000..e2f64af --- /dev/null +++ b/site_verona.tf @@ -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" +}