Le plus important. Intégration avec des services externes

En choisissant le remplacement utilisé par notre système de messagerie, je suis tombé sur une description de Mattermost et j'ai décidé de l'essayer. Un des avantages du système décrit est sa simple intégration avec des services tiers, appelés «hooks» (hooks sortants et entrants). Il s'agit de configurer l'interaction via des hooks avec des systèmes externes et cet article le sera (dans notre cas particulier, il s'agit de zabbix et de glpi).


Première partie Intégration avec GLPI


Puisque nous, dans notre travail, utilisons GLPI pour tenir compte de l'équipement, des logiciels, des connexions, de l'enregistrement des appels de support technique, il serait logique d'organiser la possibilité pour les utilisateurs d'envoyer des applications à TP de la manière la plus importante.


API


GLPI a une API de repos http pour l'intégration avec les services externes. La documentation est disponible dans le système installé sur le lien http: //glpi/apirest.php/#glossary (où "glpi" est l'adresse de votre serveur).


Après avoir réfléchi un peu à la tâche, il a été décidé d'implémenter l'algorithme d'échange sur php, en faveur de cette solution est le fait que php est déjà installé dans le système et le script a été organiquement entré dans glpi et est disponible à http: //glpi/mm.php . Le résultat est une sorte de "proxy" qui reçoit une demande de la part de matière, se convertit au format souhaité et envoie le GLPI. Toutes les requêtes http sont envoyées au format JSON.


La procédure de travail se compose de 5 parties:


  1. Recevoir une demande de la part de mattermost
  2. Initialisation de session dans glpi
  3. Récupération des données d'une demande
  4. Envoi de données à glpi
  5. Séance de clôture

Avant de procéder à la description du code du script, nous effectuerons des travaux préparatoires aussi bien en matière qu'en glpi.


GLPI


  1. Créons l'utilisateur du helpdesk, au nom duquel les requêtes seront créées, et en entrant dans les paramètres de cet utilisateur, nous générerons des jetons:
    image
    Celui encerclé en rouge sera user_token.
  2. Dans les paramètres système, vous devez ajouter un client pour interagir avec l'API. Pour ce faire, allez dans "Paramètres" -> "Général" -> "API" et cliquez sur le bouton "Ajouter un client", ajoutez un enregistrement et générez un jeton (app_token)

image


  1. Pour identifier la source des requêtes dans le système, ajoutez une entrée dans le répertoire "Sources des requêtes" et en entrant dans l'entrée qui vient d'être ajoutée, souvenez-vous de son identifiant (encerclé en rouge)
    image

Ceci termine la configuration de l'API dans GLPI.


Mattermost


Dans le menu client Mattermost, allez dans "Inegration" -> "Webhooks sortants", cliquez sur "Ajouter" et ajoutez une entrée. A l'écran, j'ai souligné les domaines importants. Ici, nous devons faire une digression: dans la plupart des cas, le «déclencheur» pour démarrer la procédure d'envoi d'une demande est un mot ou une phrase qui, étant indiqué au début du message, démarre réellement le processus. Dans notre cas, le déclencheur est «112» (ici il y a une association directe avec le Ministère des Urgences).


image


Le nom d'utilisateur par défaut et le lien vers l'avatar peuvent être ajoutés (ou vous ne pouvez pas l'ajouter), car ces paramètres seront transférés dans la demande. Mais pour que le plus important soit en mesure de traiter ces paramètres, dans les paramètres du serveur, vous devez modifier quelques options dans le fichier /opt/mattermost/config/config.json


"EnablePostUsernameOverride": true, "EnablePostIconOverride": true, 

Ceci termine la configuration. Il est temps de passer à l'écriture de code. Le script est copié dans le répertoire racine avec les fichiers glpi, dans mon cas c'est /var/www/html/glpi/mm.php


  <?php # GLPI     $app_token = '7uizyyildM71x84j1UxeABXTuCHdPoLRW45Tx2wG'; $user_app_token ='dZdCqc10Xhb1TxCT4OsXp8qqDSEqILASf2wZot0w'; #    (  ,    ) $requesttypes_id = '7'; #    GLPI (1 - , 2 - ) $type = '1'; #      $postData = file_get_contents('php://input'); $data = json_decode($postData, true); #  json  MatterMost.       #         #$message_text = $data["text"]; #$user_name = $data["user_name"]; #$user_id = $data["user_id"]; #$channel_name = $data["channel_name"]; #$channel_id = $data["channel_id"]; #$team_domain = $data["team_domain"]; #$team_id = $data["team_id"]; #$post_id = $data["post_id"]; #  "112"  ,    4 . $message_text = substr($data["text"],4); #   POST ,      mattermost #HTTP/1.1 200 OK header('Content-Type: application/json'); $reply = array( 'response_type' => 'comment', 'text'=> '      ' ); echo json_encode($reply); #     glpi #        #         if( $curl = curl_init() ) { curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Authorization: user_token '.$user_app_token, 'App-Token: '.$app_token)); curl_setopt($curl, CURLOPT_URL, 'http://glpi/apirest.php/initSession'); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $out = curl_exec($curl); $session = json_decode($out, true); $session_token = $session["session_token"]; #echo $session_token; curl_close($curl); } #       $json = array( 'input'=> array( 'name'=>'  '.$data["user_name"], 'requesttypes_id'=>$requesttypes_id, 'content'=>$message_text, 'type'=>$type ) ); #   if( $curl = curl_init() ) { curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'App-Token: '.$app_token, 'Session-token: '.$session_token)); curl_setopt($curl, CURLOPT_URL, 'http://glpi/apirest.php/Ticket'); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($json)); $out = curl_exec($curl); curl_close($curl); } #   if( $curl = curl_init() ) { curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'App-Token: '.$app_token, 'Session-token: '.$session_token)); curl_setopt($curl, CURLOPT_URL, 'http://glpi/apirest.php/killSession'); curl_setopt($curl, CURLOPT_POST, false); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $out = curl_exec($curl); curl_close($curl); } ?> 

Le résultat de ce script sera une demande ajoutée dans le système d'enregistrement des incidents dans GLPI. En images, cela ressemble à ceci:


Nous écrivons un message de la manière la plus importante:


image


Nous allons dans le "Support" GLPI -> "Applications" et un nouveau message devrait apparaître dans la liste:


image


En cliquant sur l'en-tête du message, des informations plus détaillées s'ouvriront (les champs dont les valeurs sont transmises dans le script sont encerclés en rouge)


image


Sur ce paramètre, l'envoi de messages à GLPI depuis Mattermost peut être considéré comme terminé. Ayant travaillé un peu sur le code, rien ne vous empêchera de mettre en œuvre un changement de type de requête (incident ou requête).

Source: https://habr.com/ru/post/fr442402/


All Articles