Zabbix discovery dei software installati su un host

In questo articolo per esperti del settore spiegherò come far fare a Zabbix il discovery dei software installati sui server monitorati per avere un monitoraggio veramente capillare della vostra complessa infrastruttura.

Questo articolo si rivolge a chi conosce ed usa già Zabbix ad un buon livello, parlerò direttamente con i termini utilizzati all’interno di Zabbix perchè altrimenti non finirei più di scrivere.

Il problema che risolveremo in questo articolo riguarda il fatto che in un’azienda enorme è molto difficile controllare tutto quello che vive sopra ogni virtual machine perchè il mondo del software è estremamente dinamico ormai.

Nello specifico vi parlo di un’installazione con circa 1500 device monitorati e circa 250 persone che ogni giorno installano, creano, disinstallano e abbandonano.

Su Zabbix io creo le template per ogni tipologia di software e sistema che voglio monitorare e successivamente applico queste template agli host.

Ad esempio su un server Windows avremo queste template:

  • Template agent Windows
  • Template agent Windows Microsoft SQL Server
  • Template agent Windows VMware tools

E se qualcuno installasse IIS su quel server senza dirmelo?
Se questo IIS diventasse di produzione senza che io sapessi nulla?

Oggi spiegherò quindi come arrangiare un trucco per ovviare a questo problema di gestione che si presenta soprattutto quando si è in tante persone a lavorare su tanti server.

Il trucco che ho messo in piedi consiste in un semplice script VBS sulle macchine con Windows e uno script SH per le macchine Linux.

Questo script è implementato attraverso una discovery rule nella template base applicata rispettivamente alle macchine Windows e Linux e serve a capire quali servizi il server sta erogando e quali template dovrebbe implementare dentro Zabbix.

Creeremo una discovery rule di tipo Zabbix agent che abbia come key qualcosa come:
system.run[cscript //nologo C:\zabbix\windows_template_discovery.vbs]

Sostanzialmente l’agent di Zabbix esegue la discovery rule che chiama windows_template_discovery.vbs il quale e produce un output JSON con tutti i nomi delle template che l’host dovrebbe implementare.
Ecco un esempio di windows_template_discovery.vbs:

Output = "{"
Output = Output + "     ""data"": ["

If CheckIfServiceExist("DHCPServer") Then
    Output = Output + "{""{#TEMPLATE}"": ""Template agent Windows DHCP Server""},"
End If

If CheckIfServiceExist("DNS") Then
    Output = Output + "{""{#TEMPLATE}"": ""Template agent Windows DNS Server""},"
End If

If CheckIfServiceExist("NTDS") Then
    Output = Output + "{""{#TEMPLATE}"": ""Template agent Windows domain controller""},"
End If

If CheckIfServiceExist("VMTools") Then
    Output = Output + "{""{#TEMPLATE}"": ""Template agent Windows VMware tools""},"
End If

Output = Mid(Output,1,Len(Output)-1)
Output = Output + "     ]"
Output = Output + "}"

Wscript.Echo Output

Function CheckIfServiceExist(ServiceName)
    strSourceServer = "."
    Set onjWMIService  = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strSourceServer & "\root\cimv2")
    Set colRunningServices = onjWMIService.ExecQuery("select State from Win32_Service where Name = '" & ServiceName & "'")
    For Each objService in colRunningServices
        CheckIfServiceExist = true
        Exit Function
    Next
    CheckIfServiceExist = false
End Function

Una volta che l’output è sul server di Zabbix, dobbiamo creare un item prototype che verifichi attraverso un external check il fatto che l’host implementi o meno questa template.
Ecco la key da implementare come item prototipe:
template-per-host.php[“-z”,”{$ZBXSERVER}”,”-h”,”{HOST.HOST}”,”-t”,”{#TEMPLATE}”,”-u”,”zabbixapi”,”-p”,”{$ZBXAPIPASSWORD}”]

Per fare questo ho creato uno script php che attraverso API interroga il motore di Zabbix alla ricerca di questo valore: template-per-host.php.

Ecco lo script:

#!/usr/bin/php -q
<?php

ini_set('error_reporting', 'E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR');

// load ZabbixApi
require 'ZabbixApiAbstract.class.php';
require 'ZabbixApi.class.php';

// Opzioni
$shortopts  = "";
$shortopts .= "z:"; // zabbix server
$shortopts .= "h:"; // Hostname name
$shortopts .= "t:"; // Template name
$shortopts .= "u:"; // zabbix username
$shortopts .= "p:"; // zabbix password

$options = getopt($shortopts);

if (count($options) < 5){ echo "Not enough parameters:\n"; echo "\t-z = zabbix server\n"; echo "\t-h = hostname\n"; echo "\t-t = template\n"; echo "\t-u = zabbix username\n"; echo "\t-p = zabbix password\n"; exit(1); } $zbxserver = $options['z']; $hostname = $options['h']; $template = $options['t']; $username = $options['u']; $password = $options['p']; function getNumTemplates($zbxserver,$username,$password,$hostname,$template) { try { // connect to Zabbix API $api = new ZabbixApi("http://$zbxserver/zabbix/api_jsonrpc.php", $username, $password); // get host id from host name $actHost = $api->hostGet(array(
                  'Output' => 'extend',
                  'filter' => array(
                      'value' => 1
                  ),
                  'filter' => array('host' => $hostname)
        ));
		
		// get if host implement a template
        $actTemplates = $api->templateGet(array(
                        'countOutput' => true,
                        'filter' => array(
                            'value' => 1
                        ),
                        'hostids' => $actHost[0]->hostid,
                        'filter' => array('host' => $template)
        ));
		
        echo("$actTemplates\n");
        return $actTemplates;

    } catch(Exception $e) {

        // Exception in ZabbixApi catched
        //$error = $e->getMessage();
        //echo "$error\n";
    }
}

getNumTemplates($zbxserver,$username,$password,$hostname,$template);

Ovviamente per girare questo script necessita dei file che trovate qui.

Una volta che abbiamo la lista delle template attraverso il discovery e il fatto che siano o meno implementate attraverso un item prototype, non ci resta che creare un trigger prototipe che ci avvisi nel caso in cui un server abbia un servizio non monitorato.

2 pensieri su “Zabbix discovery dei software installati su un host

Rispondi

Leggi articolo precedente:
Magento M2E Pro Best Offer via attributes

In Magento è possibile installare il modulo M2E Pro per interfacciare gli articoli presenti nel negozio ecommerce con Ebay, Amazon...

Cambio password in Active Directory

Active Directory pur essendo uno dei prodotti più maturi tra quelli offerti da Microsoft ad oggi soffre di un sistema...

Chiudi