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 thoughts on “Zabbix discovery dei software installati su un host”

Rispondi