Ansible und Icinga: Automatische Konfiguration von Hosts und Services
Die Installation und Konfiguration von Systemen erfolgt bei uns und den meisten unserer Kunden per Ansible, teilweise auch per Puppet. Wer einmal Werkzeuge wie Ansible oder Puppet verwendet hat, möchte sie nicht mehr missen.
Wir haben in der Vergangenheit mithilfe des URI-Moduls von Ansible die Icinga-API angesprochen, wobei die Konfiguration etwas umständlich war.
Ansible bietet seit Version 2.5 ein Modul, welches Hosts per API in Icinga anlegt. Dem Host können Variablen mitgegeben werden, so dass durch die Apply-Regeln von Icinga sehr einfach komplexe Monitoring-Setups realisiert werden können.
Ein einfaches Beispiel:
In Ansible sind für jeden Host Rollen definiert, die beschreiben, welche Aufgaben der Host erfüllt. Soll ein System etwa als Samba- und auch DHCP-Server dienen, werden ihm im Playbook die entsprechenden Rollen zugeordnet:
- name: Configure Samba and DHCP hosts: fileservers roles: - samba-server - dhcp-server
Unter Ansible enthält die Variable role_names alle Rollen für einen Host. Um sie testweise ausgeben zu lassen, verwenden wir das Debug-Modul:
- name: Show roles debug: var: role_names
Die Ausgabe zeigt die oben im Playbook definierten Rollen:
TASK [ icinga : Show roles] ********************************** ok: [fileserver1] => { "role_names": [ "samba-server", "dhcp-server" ] }
Wenn wir diese Rollen einem Icinga-Host-Objekt als Variable mitgeben, können wir durch Apply-Regeln in Icinga passende Checks definieren.
Das neue Ansible-Modul icinga_host erlaubt dies auf einfache Weise:
- name: Create host in Icinga icinga_host: url: "https://{{ icinga_api_server }}:5665" url_username: "{{ icinga_api_user }}" url_password: "{{ icinga_api_password }}" state: present name: "{{ inventory_hostname }}" ip: "{{ ansible_default_ipv4.address }}" validate_certs: no variables: roles: "{{ role_names }}" os: "{{ ansible_system }}"
Dadurch wird ein Host-Objekt erzeugt, welches die Rollen und das Betriebssystem als Variablen enthält. Zur Kontrolle bedienen wir die Icinga-API mit curl:
curl -k -X GET "https://localhost:5665/v1/objects/hosts" -u $icinga_api_user:$icinga_api_password | python -m json.tool
und sehen unseren neuen Host mit den zugehörigen Rollen und dem Betriebssystem:
"vars": { "made_by": "ansible", "os": "Linux", "roles": [ "samba-server", "dhcp-server" ] },
Icinga benötigt nur noch Apply-Regeln für die verschiedenen Rollen, um automatisch passende Checks auszuführen, z. B.
apply Service "dhcp" { import "generic-service" check_command = "dhcp" assign where host.address && "dhcp-server" in host.vars.roles }
Fazit:
Das Zusammenspiel von Icinga und Ansible ist mit Ansible Version 2.5 noch einfacher geworden. Die Monitoring-Konfiguration kann vollautomatisch erzeugt werden, und es ist über Host-Variablen möglich, weitere Parameter an Icinga zu übergeben.
Falls nicht alle zu überwachenden Systeme schon durch Ansible verwaltet werden, ist es einfach möglich, externe Listen von Monitoring-Parametern zu verwenden und über Ansible in Icinga zu konfigurieren.
Vollständige Automatisierung ist die Voraussetzung, um größere und skalierbare Monitoring-Umgebungen mit Icinga zu betreiben.