Jelajahi Sumber

feat: integrate Zabbix with Microsoft Teams webhook

lanfr144 1 Minggu lalu
induk
melakukan
db8b1a54d3
1 mengubah file dengan 149 tambahan dan 0 penghapusan
  1. 149 0
      configure_zabbix_teams.py

+ 149 - 0
configure_zabbix_teams.py

@@ -0,0 +1,149 @@
+import requests
+import json
+import os
+
+ZABBIX_API_URL = "http://zabbix-web:8080/api_jsonrpc.php"
+ZABBIX_USER = "Admin"
+ZABBIX_PASSWORD = "zabbix"
+TEAMS_WEBHOOK_URL = "https://webhookbot.c-toss.com/api/bot/webhooks/7accc381-ae55-423c-9c08-6764c2813c8a"
+
+def authenticate():
+    payload = {"jsonrpc": "2.0", "method": "user.login", "params": {"username": ZABBIX_USER, "password": ZABBIX_PASSWORD}, "id": 1}
+    try:
+        response = requests.post(ZABBIX_API_URL, json=payload).json()
+        return response.get('result')
+    except Exception as e:
+        print(f"Error connecting to Zabbix API: {e}")
+        return None
+
+def configure_teams(auth_token):
+    print("Checking if MS Teams Webhook Media Type already exists...")
+    check_payload = {
+        "jsonrpc": "2.0",
+        "method": "mediatype.get",
+        "params": {
+            "output": ["mediatypeid", "name"],
+            "search": {"name": "MS Teams Custom Webhook"}
+        },
+        "id": 2,
+        "auth": auth_token
+    }
+    existing = requests.post(ZABBIX_API_URL, json=check_payload).json().get('result', [])
+    
+    if existing:
+        media_type_id = existing[0]['mediatypeid']
+        print(f"Media Type already exists with ID {media_type_id}. Updating it...")
+        update_payload = {
+            "jsonrpc": "2.0",
+            "method": "mediatype.update",
+            "params": {
+                "mediatypeid": media_type_id,
+                "parameters": [
+                    { "name": "URL", "value": TEAMS_WEBHOOK_URL },
+                    { "name": "Message", "value": "{ALERT.SUBJECT}\\n{ALERT.MESSAGE}" }
+                ]
+            },
+            "id": 3,
+            "auth": auth_token
+        }
+        requests.post(ZABBIX_API_URL, json=update_payload)
+    else:
+        print("Creating MS Teams Webhook Media Type...")
+        create_payload = {
+            "jsonrpc": "2.0",
+            "method": "mediatype.create",
+            "params": {
+                "type": 4, # 4 = Webhook
+                "name": "MS Teams Custom Webhook",
+                "script": "var req = new HttpRequest(); req.addHeader('Content-Type: application/json'); var params = JSON.parse(value); var payload = {'text': params.Message}; var resp = req.post(params.URL, JSON.stringify(payload)); Zabbix.log(4, '[Teams Webhook] response: ' + resp); return 'OK';",
+                "parameters": [
+                    { "name": "URL", "value": TEAMS_WEBHOOK_URL },
+                    { "name": "Message", "value": "{ALERT.SUBJECT}\\n{ALERT.MESSAGE}" }
+                ]
+            },
+            "id": 4,
+            "auth": auth_token
+        }
+        res = requests.post(ZABBIX_API_URL, json=create_payload).json()
+        if 'result' in res:
+            media_type_id = res['result']['mediatypeids'][0]
+            print(f"Created Media Type with ID: {media_type_id}")
+        else:
+            print(f"Failed to create Media Type: {res}")
+            return
+
+    # Assign to Admin user
+    print("Assigning Teams Webhook to Admin User...")
+    user_payload = {
+        "jsonrpc": "2.0",
+        "method": "user.update",
+        "params": {
+            "userid": "1",
+            "medias": [
+                {
+                    "mediatypeid": "1", # Email
+                    "sendto": ["lanfr144@gmail.com"],
+                    "active": 0,
+                    "severity": 63,
+                    "period": "1-7,00:00-24:00"
+                },
+                {
+                    "mediatypeid": media_type_id, # Teams
+                    "sendto": ["teams"],
+                    "active": 0,
+                    "severity": 63,
+                    "period": "1-7,00:00-24:00"
+                }
+            ]
+        },
+        "id": 5,
+        "auth": auth_token
+    }
+    res = requests.post(ZABBIX_API_URL, json=user_payload).json()
+    if 'result' in res:
+        print("User media successfully updated to include Teams.")
+    else:
+        print(f"Failed to update user media: {res}")
+
+    # Ensure action is enabled
+    print("Enabling Report problems to Zabbix administrators action...")
+    action_search = {
+        "jsonrpc": "2.0",
+        "method": "action.get",
+        "params": {
+            "output": ["actionid", "name"],
+            "search": {"name": "Report problems to Zabbix administrators"}
+        },
+        "id": 6,
+        "auth": auth_token
+    }
+    actions = requests.post(ZABBIX_API_URL, json=action_search).json().get('result', [])
+    if actions:
+        action_id = actions[0]['actionid']
+        action_enable = {
+            "jsonrpc": "2.0",
+            "method": "action.update",
+            "params": {"actionid": action_id, "status": 0},
+            "id": 7,
+            "auth": auth_token
+        }
+        requests.post(ZABBIX_API_URL, json=action_enable)
+        print("Action verified and enabled.")
+        
+        # Send a test message
+        test_payload = {
+            "text": "Hello World, From Zabbix Automated Webhook Script!"
+        }
+        print("Sending test message to Teams...")
+        try:
+            requests.post(TEAMS_WEBHOOK_URL, json=test_payload)
+            print("Test message sent!")
+        except Exception as e:
+            print(f"Failed to send test message: {e}")
+
+if __name__ == "__main__":
+    token = authenticate()
+    if token:
+        configure_teams(token)
+    else:
+        print("Failed to authenticate to Zabbix API.")