Graylog2 et Powershell: le meilleur des 2 mondes

Si vous utilisez déjà Graylog2 ou si vous voulez l’utiliser (si ce n’est pas encore le cas, n’hésitez pas une seule seconde > Go go go #GetGraylog2) et que vous êtes un aficionado de Powershell, ces 3000 lignes de codes sont pour vous !

Cela fait un moment maintenant que nous bossons avec Graylog2 (meme si nous avons migré vers ELK ces derniers temps, nous en reparlerons dans un futur billet) au quotidien (ce qui nous apporte un réel avantage pour toute la partie troubleshooting et des capacités d’analytics énormes!), mais il nous manquait encore une partie automatisation. Non pas la partie API qui est déjà existante et très bien fournie (d’ailleurs l’interface web de Graylog2 s’appuie essentiellement sur ces API), mais plutôt un accès simple pour automatiser des tâches sur le(s) serveur(s) Graylog2 (créations de stream, rules, alerts, …) afin de faciliter le quotidien et surtout de pouvoir faciliter le déploiement d’un nouveau serveur Graylog2.

Pour les curieux, l’API-browser est disponible par défaut à l’adresse http://<IP-du-serveur-graylog2>:12900/api-browser, interface qui est basée sur le bien connu Swagger.

Afin de palier à ce manque, nous avons développé ce module Powershell qui permet de faire quasiment tout ce qui faisable sur Graylog2 via des cmdlets Powershell. « Quasiment » parce que certains call API ne nous semblaient pas forcement utiles à rendre accessible depuis Powershell (par exemple la possibilité de faire des recherches directement via API, …), le but n’étant pas de se substituer complètement à l’interface web Graylog2 mais plutôt de faciliter son administration.

Pour la partie technique, l’API de Graylog2 est disponible en RESTful ce qui rend son intégration avec Powershell très aisée depuis la v3 (prérequis pour utiliser ce module, ce qui est vérifié a la première ligne du module via le code #Requires -Version 3) notamment avec le cmdlet Invoke-RestMethod.

Par contre nous avons été confrontés à un souci avec Powershell sur la gestion des connexions TCP lors de l’utilisation du cmdlet Invoke-RestMethod avec les méthodes PUT ou DELETE (étonnement les méthodes GET et POST n’ont pas ce problème, plus d’informations disponible sur  le site connect.microsoft.com). Cela nous a obligé dans certains cas à plutôt utiliser le cmdlet Invoke-WebRequest.

Il n’y a pas pour l’instant de « documentation » externe pour le module, mais sachant que nous avons formaté les fonctions afin que le cmdlet Get-Help vous aide à en savoir plus, libre à vous de l’utiliser pour trouver ce que le cmdlet fait (sachant aussi que le nom des cmdlet est assez explicite la majeure partie du temps, l’aide étant plus utile pour les arguments) :

Afin de pouvoir utiliser les cmdlets de ce module, il faut nécessairement commencer par une connexion à une instance Graylog2 (un peu comme Connect-VIServer avec PowerCLI). Pour se faire, vous devez utiliser le cmdlet Connect-Graylog2Server :

Import-Module C:\_Perso\GitRepo\powershell\Graylog2\Graylog2.psm1 -force
Connect-Graylog2Server -restIp 10.0.0.1 -restUsername "admin" -restPassword "graylog2rocks"

L’utilisation du switch –force sur le cmdlet Import-Module permet de forcer la prise en compte des nouvelles définitions de fonctions même si elles existaient déjà (très pratique pour gagner du temps lors des tests et mise à jour)

L’authentification au serveur Graylog2 peut se faire en direct via l’utilisation des paramètres –restUsername et –restPassword ou bien en interactif si ces paramètres ne sont pas précisés (une fenêtre d’authentification Get-Credential sera alors instanciée).

Une fois connecté, le serveur vous donnera quelques informations primaires et vous pourrez à ce moment utiliser les cmdlets du module :

Pour donner des exemples de ce que vous pouvez faire avec ce module (faites-vous plaisir), hypervisor l’a utilisé pour faire des One-Liner (« Hey, what did you expect » ^^) pour créer automatiquement des objets dans Graylog2, en voici certains exemples :

Création en masse de streams en se basant sur les events possibles (esx.problem.* esx.audit.* et esx.clear.*) de l’EventManager du vCenter

(Get-View EventManager).Description.EventInfo|select @{n="event";e={if ($_.key -match "^EventEx$|^ExtendedEvent$") {$_.FullFormat.split("|")[0]} else {$_.key}}}|?{$_.event -match "esx\.problem|esx\.audit|esx\.clear"}|%{New-Graylog2Stream -title $_.event -enabled}

Création de StreamRules pour chaque stream

Get-Graylog2Streams|?{$_.title -match "esx\.problem|esx\.audit|esx\.clear|vob\."}|%{New-Graylog2StreamRule -stream_id $_.id -field "full_message" -value $_.title -type "match regular expression"}

Création en masse des conditions d’alertes pour chaque streamrules

Get-Graylog2Streams|%{New-Graylog2StreamAlertConditions -streamId $_.id -conditionType "message_count" -thresholdType "more" -grace 1 -threshold 0 -time 1}

Ajout d’un receiver pour chaque alerte

Get-Graylog2Streams|%{New-Graylog2StreamAlertReceivers -streamId $_.id -type "users" -entity "alert"}

De nouveaux cmdlets seront surement ajoutes au fil des versions (d’autant plus que tout n’est pas fini), et n’hésitez pas à faire des remarques, nous sommes preneur ^^

Vous pouvez télécharger ce module directement sur GitHub (comme indiqué dans notre précédent billet.

git clone git@github.com:v-team/powershell-graylog2.git

4 comments

  1. Super Article

    J’ai essayer de déployer un graylog 1.0rc super par contre j’ai une erreur avec le module Powershell pour créer les Streams en masse j’ai l’erreur suivante :

    Exception Message: Le serveur distant a retourné une erreur : (400) Demande incorrecte.
    JSON body:
    {
    « title »: « esx.problem.vsan.vmknic.not.ready »,
    « description »: «  »,
    « creator_user_id »: « admin »
    }
    pour chacun des Stream.

    Merci pour votre aide.

  2. Merci Jerome pour ton feedback !
    Je n’ai pas de 1.0RC de dispo pour l’instant, je vais en installer une et regarder pourquoi ca pose soucis.
    Tu avais teste le module avec une ancienne version (histoire d’etre sur que le probleme ne vienne pas d’ailleurs) ?

  3. Non

    en regardant le message d’erreur de plus près il me semble que l’envoie de streams au serveur a été modifié car on a une erreur http 400 le corps json que l’on envoie doit être modifie mais comment ???

Laisser un commentaire

Required fields are marked *.