119 lines
3.7 KiB
Python
119 lines
3.7 KiB
Python
import json
|
|
import ssl
|
|
import urllib.request
|
|
|
|
ZABBIX_URL = "http://140.44.4.60:8888/api_jsonrpc.php"
|
|
ZABBIX_USER = "Admin"
|
|
ZABBIX_PASS = "zabbix"
|
|
|
|
ctx = ssl.create_default_context()
|
|
ctx.check_hostname = False
|
|
ctx.verify_mode = ssl.CERT_NONE
|
|
|
|
def zbx_call(method, params, auth=None):
|
|
payload = {"jsonrpc": "2.0", "method": method, "params": params, "id": 1}
|
|
headers = {"Content-Type": "application/json-rpc"}
|
|
if auth:
|
|
headers["Authorization"] = f"Bearer {auth}"
|
|
req = urllib.request.Request(ZABBIX_URL, data=json.dumps(payload).encode("utf-8"), headers=headers, method="POST")
|
|
with urllib.request.urlopen(req, timeout=10, context=ctx) as r:
|
|
resp = json.loads(r.read().decode("utf-8"))
|
|
if "error" in resp:
|
|
raise RuntimeError(f"Zabbix error in {method}: {resp['error']}")
|
|
return resp["result"]
|
|
|
|
auth = zbx_call("user.login", {"username": ZABBIX_USER, "password": ZABBIX_PASS})
|
|
|
|
# Check existing host names
|
|
existing_hosts = zbx_call("host.get", {"output": ["hostid", "host", "name"]}, auth)
|
|
existing_names = {h["host"].lower(): h["hostid"] for h in existing_hosts}
|
|
|
|
# Create host groups if not exist
|
|
groups = zbx_call("hostgroup.get", {"output": ["groupid", "name"]}, auth)
|
|
group_map = {g["name"]: g["groupid"] for g in groups}
|
|
|
|
for gname in ["Network Devices", "Environmental & Sensors", "Management & IPMI"]:
|
|
if gname not in group_map:
|
|
res = zbx_call("hostgroup.create", {"name": gname}, auth)
|
|
group_map[gname] = res["groupids"][0]
|
|
print(f"Created Host Group: {gname} (ID: {group_map[gname]})")
|
|
|
|
devices_to_add = [
|
|
{
|
|
"host": "idrac-spacedock4",
|
|
"name": "Dell PowerEdge R730 Node 4 iDRAC (idrac-spacedock4)",
|
|
"ip": "140.44.44.124",
|
|
"group": "Management & IPMI"
|
|
},
|
|
{
|
|
"host": "usw-agg-core",
|
|
"name": "UniFi Switch Aggregation 10G Core",
|
|
"ip": "14.44.4.26",
|
|
"group": "Network Devices"
|
|
},
|
|
{
|
|
"host": "usw-24-poe-closet",
|
|
"name": "UniFi Switch 24 PoE Closet",
|
|
"ip": "14.44.4.61",
|
|
"group": "Network Devices"
|
|
},
|
|
{
|
|
"host": "usw-pro-24-poe-compute",
|
|
"name": "UniFi Switch Pro 24 PoE Compute",
|
|
"ip": "14.44.4.107",
|
|
"group": "Network Devices"
|
|
},
|
|
{
|
|
"host": "usw-flex-attic",
|
|
"name": "UniFi Switch Flex Attic",
|
|
"ip": "14.44.4.98",
|
|
"group": "Network Devices"
|
|
},
|
|
{
|
|
"host": "usw-flex-garage",
|
|
"name": "UniFi Switch Flex Garage",
|
|
"ip": "14.44.4.96",
|
|
"group": "Network Devices"
|
|
},
|
|
{
|
|
"host": "tempest-weather-station",
|
|
"name": "Tempest Weather Station Gateway",
|
|
"ip": "14.4.4.47",
|
|
"group": "Environmental & Sensors"
|
|
},
|
|
{
|
|
"host": "sense-energy-monitor",
|
|
"name": "Sense Home Energy Gateway",
|
|
"ip": "14.4.4.48",
|
|
"group": "Environmental & Sensors"
|
|
}
|
|
]
|
|
|
|
for dev in devices_to_add:
|
|
hname = dev["host"]
|
|
if hname.lower() in existing_names:
|
|
print(f"[EXISTS] {hname}")
|
|
continue
|
|
params = {
|
|
"host": dev["host"],
|
|
"name": dev["name"],
|
|
"interfaces": [
|
|
{
|
|
"type": 1, # Agent / ICMP
|
|
"main": 1,
|
|
"useip": 1,
|
|
"ip": dev["ip"],
|
|
"dns": "",
|
|
"port": "10050"
|
|
}
|
|
],
|
|
"groups": [{"groupid": group_map[dev["group"]]}],
|
|
"templates": [{"templateid": "10564"}] # ICMP Ping
|
|
}
|
|
try:
|
|
res = zbx_call("host.create", params, auth)
|
|
print(f"[CREATED] {dev['name']} ({dev['ip']}) -> HostID {res['hostids'][0]}")
|
|
except Exception as e:
|
|
print(f"[FAILED] {dev['name']}: {e}")
|
|
|