Zabbix mit Ansible und Python

Zabbix mit Ansible und Python

Zabbix ist ein professionelles Open-Source-Monitoring-System, das zu Unrecht im Schatten von Nagios und Co. steht. Wir zeigen, wie Sie den Zabbix-Agent mit Ansible installieren und Zabbix mit der Python-API fernsteuern.

In einer ADMIN-Umfrage im Jahr 2016 belegte Zabbix als Monitoring-System den ersten Platz , aber typischerweise ist meist eher von der Konkurrenz die Rede, sei es Nagios, Icinga oder neuerdings Prometheus. Vollkommen zu unrecht, denn Zabbix ist eine sehr stabile, ausgereifte Software, die in jedem Release neue Features dazugewinnt. Der Server ist in PHP geschrieben und läuft auf zahlreichen Unix-Systemen von Linux über FreeBSD bis zu AIX und HP-UX. Der Agent steht für Linux, AIX, FreeBSD, NetBSD, OpenBSD, HP-UX, macOS, Solaris und Windows (alle Desktop- und Server-Versionen seit XP) zur Verfügung. Offizielle Pakete gibt es für Red Hat, CentOS, Debian und Ubuntu.

Um nicht bei jedem neu hinzukommenden System den Agenten manuell installieren zu müssen, bietet es sich an, eine Software wie Ansible zu verwenden, um die Installation zu automatisieren. Dazu gibt es das Ansible-Modul " ansible-zabbix-agent " von Werner Dijkerman, der auch Module für die Installation des Zabbix-Servers und des Webfrontends geschrieben hat. Sie können das Modul mit dem Ansible-Paketmanager Galaxy installieren oder einfach das Github-Repository am passenden Ort auschecken.

Nun müssen Sie nur noch ein passendes Playbook schreiben, das den Agent installiert und konfiguriert. Das sieht etwa so aus:

- hosts: zabbix-agent 
  roles: 
     - role: ansible-zabbix-agent 
       zabbix_host_groups: 
         - Linux servers 
       zabbix_link_templates: 
         - Template OS Linux 
         - Template App HTTP Service 
       zabbix_api_create_hosts: true 
       zabbix_version: 3.4 
       zabbix_api_user: Admin 
       zabbix_api_pass: secret
       agent_server: zabbix.mydomain.com 
       agent_serveractive: zabbix.mydomain.com 
       agent_tlsconnect: psk 
       agent_tlsaccept: psk 
       agent_tlspskidentity: PSKZABBIX01 
       agent_tlspskfile: /etc/zabbix/pskzabbix01.psk 
  tasks: 
  - copy: 
     src: pskzabbix01.psk

Das Listing demonstriert mehrere Dinge: Neben der Zuweisung der Standard-Agent-Rolle wird hier jeder Host in die Hostgruppe "Linux servers" gesteckt. Außerdem wird für jeden Host, auf dem ein Agent installiert wird, auch ein entsprechender Host im Monitoring-System angelegt. Dazu verwendet Ansible die Zabbix-API, die eine Authentifizierung benötigt. Weiterhin wird die Verbindung zwischen Agent und Server mit TLS verschlüsselt, wobei hier in Private Shared Key (PSK) zum Einsatz kommt. Dieser benötigt wiederum eine ID (hier "PSKZABBIX01") und eine Datei, die den Key enthält. Diese Datei wird im Copy-Task vom Host auf den Agent-Rechner kopiert.

Jetzt fehlt noch die entsprechende Konfiguration auf dem Server, die die entsprechenden Verschlüsselungsparameter für den Host festlegt. Hierzu verwenden wir eins der acht verfügbaren Python-Module , und zwar " py-zabbix " von Alexey Dubkov. Es hat den Vorteil, dass es keine anderen Module benötigt und mit Python 2 und 3 funktioniert. Wir verwenden es mit Python 3 und installieren es in einem Python-Virtualenv, also einem Projektverzeichnis, das alle nötigen Module und Binaries enthält. Zuerst installieren Sie den Pip-Paketmanager für Version 3, dann das Virtualenv-Paket, um schließlich in der Umgebung das Zabbix-Modul zu installieren:

sudo apt install python3-pip
sudo pip3 install virtualenv
virtualenv zabbix
cd zabbix
. bin/activate
pip install py-zabbix

Nun können Sie mit einem Script für den neu angelegten Host auf dem Zabbix-Server ebenso die Verschlüsselung aktivieren und die nötigen Parameter setzen. Ein entsprechendes Skript sieht etwa so aus:

from zabbix.api import ZabbixAPI
from pyzabbix import ZabbixAPIException
import sys

if len(sys.argv) < 2:
    print("usage: activate-encryption.py agenthost")
    sys.exit()

zapi = ZabbixAPI(url='https://zabbix.mydomain.com', user='Admin', password='secret')

host = zapi.do_request('host.get',
                          {
                              'filter': {
                                  'host': sys.argv[1]
                               }
                          })

if not (host['result']):
    print("could not get host info")
    sys.exit()
else:
    hostid = host['result'][0]['hostid']
    print("hostid: %s" % hostid)

try:
    result = zapi.do_request('host.update',
                          {
                              'hostid': hostid,
                              'tls_accept': 2,
                              'tls_connect': 2,
                              'tls_psk': '3cd7a0db76ff9dca48979e24c39b408c',
                              'tls_psk_identity': 'PSKZABBIX01'
                          })
except ZabbixAPIException as e:
    print(e)

Zuerst ermittelt es anhand des Namens die Host-ID, die dann im zweiten Schritt für die Aktualisierung des Host-Eintrags verwendet wird. Es erwartet die Überhabe des Namens als Kommandozeilenargument. Um das Skript von dem obigen Ansible-Playbook aus aufzurufen, verwenden Sie einen Task wie den folgenden, der den im Ansible-Inventory festgelegten Namen übergibt:

      - name: run update script 
        become: no
        changed_when: False
        local_action: script ./activate-encryption.py "{{inventory_hostname}}"

Je nachdem, welche Namen Sie auf dem Zabbix-Server verwenden, können Sie alternativ zum Beispiel auch "ansible_hostname" verwenden, das dem tatsächlichen Hostnamen des Agent-Rechners entspricht.

Ähnliche Artikel

comments powered by Disqus
Mehr zum Thema

Zabbix Release 2.2

Während viele nur von Nagios reden, ist Zabbix zumindest unter ADMIN-Lesern die beliebteste Monitoring-Lösung. Es ist ebenfalls freie Software, kann zu überwachende Hosts direkt im Web-Interface konfigurieren und überwacht in der Version 2.2 auch VMware-Maschinen.
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2023