Zabbix Agent installeren via Ansible Inventory

We kunnen natuurlijk inloggen op de node en handmatig Zabbix-Agent installeren maar als we de Ansible Inventory als leidraad aanhouden voor onze nodes dan is deze dus bepalend om de agent te installeren. We kunnen deze dan tevens als ‘desired state’ beschouwen en de playbooks periodiek laten uitvoeren, hetzij door een crontab job, hetzij door Ansible AWX (Tower)

Ansible Inventory

De inventory voor mijn MusicPlayers en Mediacenters ziet er alsvolgt uit:

[MusicPlayers]
demoruimte.local ansible_user=volumio ansible_host=192.168.178.21
badkamer.local ansible_user=volumio ansible_host=192.168.178.41
musicplayer.local ansible_user=volumio ansible_host=192.168.178.20

[Mediacenters]
keuken.local ansible_user=osmc ansible_host=192.168.178.51
huiskamer.local ansible_user=osmc ansible_host=192.168.178.31

[agents_intern]
demoruimte.local ansible_user=volumio ansible_host=192.168.178.21
badkamer.local ansible_user=volumio ansible_host=192.168.178.41
musicplayer.local ansible_user=volumio ansible_host=192.168.178.20
keuken.local ansible_user=osmc ansible_host=192.168.178.51
huiskamer.local ansible_user=osmc ansible_host=192.168.178.31

Zoals je ziet zijn er 3 groepen, MusicPlayers, Mediacenters en agents_intern. Via een ‘magic-variable‘ kunnen we bepalen in welke groep een host al eerste voorkomt en deze dan als host-group voor Zabbix gebruiken. De ‘magic variable‘ is alsvolgt:

{{ hostvars[inventory_hostname].group_names|first }}

We gebruiken ook het IP adres van de hosts in de variable ‘ansible_host‘ zodat we deze kunnen gebruiken om het IP adres in de host als ‘Agent Interface‘ in te kunnen stellen.

En ookal zijn de hosts (nodes) in alle groepen aanwezig, we roepen ansible aan met de agents_intern groep:

$ ansible-playbook zabbix.yml -l agents_intern -i inventory

Ansible Playbook voor de agent

De eerste play ziet er alsvolgt uit:

- name: Install required packages
become: yes
apt:
name: "{{ item }}"
state: present
environment:
PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
with_items: "{{ packages.required }}"

De packages staan in de default variables voor deze role:

packages:
required:
- libcurl3-gnutls
- libpci3
- pciutils
- bzip2
- cron
- logrotate
- usbutils
- zabbix-agent

Na de installatie van de packages gaan we de zabbix-agentd.conf file aanpassen. Er zijn drie items in de configuratie die we aanpassen:
– Server = {{ zabbix_server_address }}
– ServerActive = {{ zabbix_server_address }}
– Hostname = {{ inventory_hostname }}

Uiteraard staan deze ook in een variable en met een ‘lineinfile‘ worden ze vervangen, bijvoorbeeld:

- name: Add ServerActive to zabbix config file 
become: yes
lineinfile:
path: /etc/zabbix/zabbix_agentd.conf
regexp: '^ServerActive=127.0.0.1'
line: 'ServerActive={{ zabbix_server_address }}'
notify:
- restart zabbix agent

Een ‘notify‘ zal hierna de zabbix-agent service herstarten zodat de aangepaste configuratie ingelezen wordt

Hosts toevoegen aan Zabbix Server

De volgende stap is om de hosts met agents toe te voegen aan de Inventory van de Zabbix Server. De volgende play zal dit uitvoeren:

- name: Create a new host or update an existing host's info
local_action:
module: zabbix_host
server_url: "{{ zabbix_server_url }}"
login_user: "{{ zabbix_server_user }}"
login_password: "{{ zabbix_server_password }}"
host_name: "{{ ansible_hostname|lower }}"
visible_name: "{{ ansible_hostname|title }}"
description: ""
link_templates:
- Template OS Linux
host_groups:
- Linux servers
- "{{hostvars[inventory_hostname].group_names|first}}"
status: enabled
state: present
interfaces:
- type: 1
main: 1
useip: 1
ip: "{{ ansible_host }}"
dns: ""
port: 10050
tags: add_host

Zoals hierboven aangegeven, zal de host in de host-group geplaatst worden die overeenkomt met de eerste group-name vanuit de inventory. Het IP adres voor de interface pakken we uit ‘ansible_host’. Hierna kun je mooie screens maken in de Zabbix omgeving en notificaties instellen als er een item over de ingestelde thresholds komt, of bijvoorbeeld de uptime van de nodes: