Ad Widget

Collapse

Accès a l'API Zabbix

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • faelnor
    Junior Member
    • Jun 2023
    • 3

    #1

    Accès a l'API Zabbix

    Bonjour a Tous,

    J'ai un soucis, j'ai un script python pour récupéré la configuration de mes commutateurs et les ajouter dans leur inventaire, mais au moment de la connexion a l'api j'ai ce message d'erreur :

    Erreur lors de la connexion à Zabbix ou de la récupération des valeurs des macros : ('Error -32602: Invalid params., Not authorized.', -32602)

    J'utilise un compte super-admin pour les test je ne comprend donc pas pourquoi non autorisé.

    Merci a vous
  • faelnor
    Junior Member
    • Jun 2023
    • 3

    #2
    j'ai réussi a me connecter a l'api, mais dans mon script il y a un soucis et une fois la configuration de mon commutateurs recuperer, rien ne s'actualise dans son inventaire.

    Code:
    #!/usr/bin/env python3
    import requests
    import json
    import paramiko
    import time
    import socket
    
    # Fonction pour récupérer la configuration Juniper
    def get_juniper_config(hostname, username, password):
    try:
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPo licy())
    ssh.connect(hostname, username=username, password=password)
    
    # Connexion en mode CLI
    ssh_shell = ssh.invoke_shell()
    
    # Attendre que la connexion soit établie
    time.sleep(1)
    
    # Envoyer la commande pour passer en mode de configuration
    ssh_shell.send("cli\n")
    time.sleep(1)
    
    # Envoyer la commande pour désactiver la pagination
    ssh_shell.send("set cli screen-length 0\n")
    time.sleep(1)
    
    # Envoyer la commande show configuration
    ssh_shell.send("show configuration | display set\n")
    time.sleep(2) # Attendez suffisamment de temps pour que la sortie soit prête
    
    # Lire la sortie de la commande
    output = ssh_shell.recv(65535).decode("utf-8")
    
    ssh.close()
    
    return output.strip() # Retourne la sortie sans espaces vides avant et après
    except paramiko.SSHException as e:
    print(f"Erreur lors de la connexion SSH à {hostname} :", e)
    return None
    except Exception as e:
    print("Une erreur s'est produite lors de la récupération de la configuration Juniper :", e)
    return None
    
    try:
    # Connexion à l'API Zabbix pour récupérer les valeurs des macros
    zabbix_url = "http://localhost/zabbix/api_jsonrpc.php"
    zabbix_user = "xxx"
    zabbix_password = "xxx"
    
    # Envoi de la requête d'authentification
    auth_data = {
    "jsonrpc": "2.0",
    "method": "user.login",
    "params": {
    "username": zabbix_user,
    "password": zabbix_password
    },
    "id": 1
    }
    
    response = requests.post(zabbix_url, headers={"Content-Type": "application/json"}, data=json.dumps(auth_data))
    response_data = response.json()
    
    if "result" in response_data:
    auth_token = response_data["result"]
    print("Connexion à l'API Zabbix réussie.")
    else:
    raise Exception(f"Erreur d'authentification : {response_data}")
    
    # Configuration du header avec le token d'authentification
    headers = {
    "Content-Type": "application/json"
    }
    
    # Récupération des hôtes ayant le modèle `configuration_juniper`
    host_list_data = {
    "jsonrpc": "2.0",
    "method": "host.get",
    "params": {
    "output": ["hostid", "host"],
    "selectParentTemplates": ["templateid", "name"],
    "selectInterfaces": ["ip"]
    },
    "auth": auth_token,
    "id": 2
    }
    
    response = requests.post(zabbix_url, headers=headers, data=json.dumps(host_list_data))
    host_list_response = response.json()
    
    if "result" in host_list_response:
    hosts = host_list_response["result"]
    print("Liste des hôtes dans Zabbix :")
    
    for host in hosts:
    if "parentTemplates" in host:
    for template in host["parentTemplates"]:
    if template["name"] == "configuration_juniper":
    print(f"- {host['host']} (ID: {host['hostid']})")
    
    # Récupération des valeurs des macros pour l'hôte spécifié
    macros_data = {
    "jsonrpc": "2.0",
    "method": "usermacro.get",
    "params": {
    "globalmacro": True
    },
    "auth": auth_token,
    "id": 3
    }
    
    response = requests.post(zabbix_url, headers=headers, data=json.dumps(macros_data))
    macros_response = response.json()
    
    # Recherche des valeurs des macros
    for macro in macros_response.get("result", []):
    print(f"Macro : {macro['macro']}, Valeur : {macro['value']}")
    
    
    # Recherche des valeurs des macros
    juniper_user = None
    juniper_pass = None
    for macro in macros_response.get("result", []):
    if macro["macro"] == "{$JUNIPER_USER}":
    juniper_user = macro['value']
    elif macro["macro"] == "{$JUNIPER_PASS}":
    juniper_pass = macro['value']
    
    if juniper_user is None or juniper_pass is None:
    print(f"Les valeurs des macros Juniper ne sont pas définies pour l'hôte {host['host']}.")
    else:
    # Récupération de l'adresse IP de l'hôte
    if host["interfaces"]:
    juniper_ip = host["interfaces"][0]["ip"]
    print(f"Récupération de la configuration pour l'hôte {host['host']} avec l'IP {juniper_ip}")
    # Utilisation des valeurs des macros pour récupérer la configuration Juniper
    configuration = get_juniper_config(juniper_ip, juniper_user, juniper_pass)
    if configuration:
    print(f"Configuration de l'hôte {host['host']} :")
    print(configuration)
    else:
    print(f"Pas d'interface définie pour l'hôte {host['host']}.")
    
    else:
    raise Exception(f"Erreur lors de la récupération de la liste des hôtes : {host_list_response}")
    
    except Exception as e:
    print("Erreur lors de la connexion à Zabbix ou de la récupération des valeurs des macros :", e)
    
    # Dans la boucle for des hôtes Juniper
    for host in hosts:
    if "parentTemplates" in host:
    for template in host["parentTemplates"]:
    if template["name"] == "configuration_juniper":
    # Récupération de l'adresse IP de l'hôte Juniper
    juniper_ip = None
    if host["interfaces"]:
    for interface in host["interfaces"]:
    if interface["ip"] == 1: # Type 1 représente une interface IP
    juniper_ip = interface["ip"]
    break
    
    if juniper_ip:
    # Récupération de la configuration pour l'hôte spécifié
    configuration = get_juniper_config(juniper_ip, juniper_user, juniper_pass)
    if configuration:
    print(f"Configuration de l'hôte {host['host']} :")
    print(configuration)
    
    # Mise à jour de l'inventaire de l'hôte avec la configuration Juniper
    update_host_data = {
    "jsonrpc": "2.0",
    "method": "host.update",
    "params": {
    "hostid": host["hostid"],
    "inventory": {
    "INVENTORY.HARDWARE.FULL": configuration
    }
    },
    "auth": auth_token,
    "id": 4
    }
    
    response = requests.post(zabbix_url, headers=headers, data=json.dumps(update_host_data))
    update_response = response.json()
    
    if "result" in update_response and update_response["result"]["hostids"]:
    print(f"Inventaire de l'hôte {host['host']} mis à jour avec succès.")
    else:
    print(f"Erreur lors de la mise à jour de l'inventaire de l'hôte {host['host']}.")

    Comment

    • Ducci
      Junior Member
      • Feb 2024
      • 6

      #3
      Bonjour Faelnor,

      J'ai lu en diagonal ton script, je n'utilise pas de Juniper.
      Je sais qu'en travaillant un peu avec l'API le plus gros problème était des éléments en trop ou manquant dans ma requête Json.
      Car les documentations ne sont pas assez détailler.
      J'avais le même problème et selon l'objet que j'appelais (Ex: Host.create ou Host.get) l'api attendait des éléments par défaut.
      Sache que tu as une bibliothèque sur python qu'y s'appelle pyzabbix et tu peux y importer ZabbixAPI ça te facilitera certaines requêtes Json ou simplement ton authentification.

      Je peux pas plus t'aider plus que ça.

      PS: je te conseil de faire deux scripts, un pour l'export/tri et l'autre pour l'import. Tu pourras mieux cibler l'erreur.

      Code:
      from pyzabbix import ZabbixAPI
      import csv
      from progressbar import ProgressBar, Percentage, ETA, ReverseBar, RotatingMarker, Timer
      
      zapi = ZabbixAPI("http://localhost/zabbix")
      zapi.login(user="***", password="***")
      
      arq = csv.reader(open('/home/zabbixuser/HostsHote.csv'))
      
      Lignes = sum(1 for ligne in arq)
      
      f = csv.reader(open('/home/zabbixuser/HostsHote.csv'), delimiter=';')
      bar = ProgressBar(maxval=linhas,widgets=[Percentage(), ReverseBar(), ETA(), RotatingMarker(), Timer()]).start()
      i = 0
      
      for [hostname,ip] in f:
          hostcreate = zapi.host.create(
              host= hostname,
              status= 1,
              interfaces=[{
                  "type": 1,
                  "main": "1",
                  "useip": 1,
                  "ip": ip,
                  "dns": "",
                  "port": 10050
              }],
              groups=[{
                  "groupid": 23
              }],
              templates=[{
                  "templateid": 10564
              }]
          )
      
      
          i += 1
          bar.update(i)
      
      bar.finish
      print (" ")

      Comment

      Working...