Table des matières
Générateur de conf Nagios
object configuration files
Voir :
Voir aussi :
- MK Livestatus
- NDOUtils
Fichiers plats à garder en statique :
- commands.cfg
- contacts.cfg
- localhost.cfg
- templates.cfg
- timeperiods.cfg
Fichier à supprimer ou à regénérer :
- printer.cfg
- switch.cfg
- windows.cfg
Types d'objets à générer :
- host
- hostgroup
- service
- servicegroup ?
Dans le conf par défaut nous avons les templates suivants pour les hosts
- generic-host
- linux-server
- windows-server
- generic-printer
- generic-switch
et pour les services :
- generic-service
- local-service (utiliser que dans localhost.cfg)
Proposition de format YAML
--- hosts: - host_name: "srv1" use: "linux-server" alias: "Server 1" address: "192.168.1.10" __comment: "Server One" __lines: [3, 12] - host_name: "hplj2605dn" use: "generic-printer" alias: "HP LaserJet 2605dn" address: "192.168.1.30" hostgroups: "network-printers" # Member of hostgroup - host_name: "winserver" use: "windows-server" # Template contains "hostgroups windows-servers" alias: "My Windows Server" address: "192.168.1.2" hostgroups: - hostgroup_name: "linux-servers" alias: "Linux Servers" # members: "srv1" # Member of hostgroup # hostgroup_members: - hostgroup_name: "network-printers" alias: "Network Printers" - hostgroup_name: "windows-servers" alias: "Windows Servers" services: - service_description: "SSH" use: "generic-service" #hostgroup: "linux-remote-servers" hostgroup_name: "generic-remote-hosts" check_command: "check_ssh" - service_description: "NSClient++ Version" use: "generic-service" host_name: "winserver" check_command: "check_nt!CLIENTVERSION" - service_description: Memory hostgroup_name: "linux-servers" check_command: "check_centreon_snmp_linux_mem!80!90" max_check_attempts: 1 normal_check_interval: 1 retry_check_interval: 1 check_period: "24x7" notification_interval: 2000 notification_period: "24x7" notification_options: "w,c,r" contact_groups: "support" event_handler: "trigger_memory"
Entrées :
- printer.yaml
- switch.yaml
- windows.yaml
- linux.yaml
Sorties :
- printer.cfg
- switch.cfg
- windows.cfg
- linux.cfg
On ajoute un template au fichier templates.cfg
templates.cfg
#define host { # # name tpl-host-windows # use windows-server # hostgroups windows-hosts # register 0 # } define host { name linux-remote-servers use linux-server hostgroups linux-hosts register 0 }
Il faudra créer les hostgroups associer (à faire à partir de YAML)
linux.cfg
define hostgroup { hostgroup_name linux-hosts alias Linux Hosts }
windows.cfg
define hostgroup { hostgroup_name windows-hosts alias Windows Hosts }
Changer la définition des hosts use linux-server use linux-remote-servers
templates2.cfg
############################################################################### # # HOST TEMPLATES # ############################################################################### #define host { # # name tpl-host-generic # use generic-host # hostgroups generic-remote-hosts # register 0 #} define host { name tpl-host-linux use linux-server hostgroups linux-hosts register 0 } define host { name tpl-host-windows use windows-server #hostgroups windows-servers hostgroups windows-hosts register 0 } define host { name tpl-host-printer use generic-printer hostgroups printer-hosts register 0 } define host { name tpl-host-network use generic-switch hostgroups network-hosts register 0 }
$ tree . ├── README.md ├── in │ ├── commands.cfg │ ├── contacts.cfg │ ├── localhost.cfg │ ├── printer.yaml │ ├── templates.cfg │ ├── templates2.cfg │ ├── timeperiods.cfg │ └── windows.yaml ├── out ├── play-templating-nagios-config.yml ├── roles │ └── nagios_mk_objects_definition │ └── tasks │ └── main.yml └── template.jinja
play-templating-nagios-config.yml
#! /usr/bin/env ansible-playbook --- - name: Generate Nagios objects definition conf files gather_facts: false hosts: localhost vars: line: "{{ lookup('env', 'LINE') }}" pre_tasks: - name: Assert check environment vars are correctly defined ansible.builtin.assert: that: - line is defined and line != '' msg: "Env var must be defined" tasks: - name: Mkdir out/L ansible.builtin.file: path: out/L{{ line }}/ state: directory mode: "0755" - name: Copy cfg files ansible.builtin.copy: src: "{{ item }}" dest: "out/L{{ line }}/{{ item | basename }}" mode: "0644" with_fileglob: in/*.cfg - name: Loop on each yaml file ansible.builtin.include_role: name: nagios_mk_objects_definition vars: nagios_mk_objects_definition_config_file: "{{ item }}" with_fileglob: in/*.yaml
roles/nagios_mk_objects_definition/tasks/main.yml
--- - name: Include yaml config files ansible.builtin.include_vars: file: "{{ nagios_mk_objects_definition_config_file }}" - name: Templating jinja files ansible.builtin.template: src: template.jinja dest: "out/L{{ line }}/{{ nagios_mk_objects_definition_config_file | basename | replace('.yaml', '.cfg') }}" mode: "0644"
template.jinja
###############################################################################
#
# HOST DEFINITIONS
#
###############################################################################
{% for HOST in hosts %}
{% if ( HOST.__lines is not defined ) or ( line in HOST.__lines ) %}
{% if ( HOST.__comment[line] is defined ) or ( HOST.__comment is defined and HOST.__comment is not mapping ) %}
# {{ HOST.__comment[line] | d(HOST.__comment) | d() }}
{% endif %}
define host {
{% for k, v in HOST.items() %}
{% if not k | regex_search('__') %}
{% if ( v[line] is defined ) or ( v[line] is not defined and v is not mapping ) %}
{{ k.ljust(20) }} {{ v[line] | d (v) }}
{% endif %}
{% endif %}
{% endfor %}
}
{% endif %}
{% endfor %}
###############################################################################
#
# HOST GROUP DEFINITIONS
#
###############################################################################
{% for HOSTGROUP in hostgroups %}
{% if ( HOSTGROUP.__lines is not defined ) or ( line in HOSTGROUP.__lines ) %}
{% if ( HOSTGROUP.__comment[line] is defined ) or ( HOSTGROUP.__comment is defined and HOSTGROUP.__comment is not mapping ) %}
# {{ HOSTGROUP.__comment[line] | d(HOSTGROUP.__comment) | d() }}
{% endif %}
define hostgroup {
{% for k, v in HOSTGROUP.items() %}
{% if not k | regex_search('__') %}
{% if ( v[line] is defined ) or ( v[line] is not defined and v is not mapping ) %}
{{ k.ljust(20) }} {{ v[line] | d(v) }}
{% endif %}
{% endif %}
{% endfor %}
}
{% endif %}
{% endfor %}
###############################################################################
#
# SERVICE DEFINITIONS
#
###############################################################################
{% for SERVICE in services %}
{% if ( SERVICE.__lines is not defined ) or ( line in SERVICE.__lines ) %}
{% if ( SERVICE.__comment[line] is defined ) or ( SERVICE.__comment is defined and SERVICE.__comment is not mapping ) %}
# {{ SERVICE.__comment[line] | d(SERVICE.__comment) | d() }}
{% endif %}
define service {
{% for k, v in SERVICE.items() %}
{% if not k | regex_search('__') %}
{% if ( v[line] is defined ) or ( v[line] is not defined and v is not mapping ) %}
{{ k.ljust(20) }} {{ v[line] | d(v) }}
{% endif %}
{% endif %}
{% endfor %}
}
{% endif %}
{% endfor %}
README
Nagios object configuration files generator
Cet outil sert à générer les fichiers de configuration Nagios (object configuration files) en prenant les données dans des fichiers YAML et de les exploiter grâce à un template JINJA. Les fichers .cfg en sortie seront à déposer dans nagios/etc/objects/
Avantage :
- Une seule configuration central qui peut être déclinée sur l'ensemble des lignes
- Evite d'avoir des disparités trop importantes d'une ligne à une autre
- Permet de mieux voir et comprendre les désparités
- Il devient facil et rapide de comparer la conf d'une ligne à une autre et donc les incohérences resortent mieux
- En cas de création d'une nouvelle ligne il est pertinent et facile de partir du tronc commun
- Plus besoin de merger la conf Nagios d'une ligne à une autre
Inconvéniens:
- Précaution à prendre dans le cas où les fichiers finaux seraient modifiés à la mains sur les serveurs Nagios.
Usage
Les fichiers en entrée sont dans in/ Ils sont de deux types:
- cfg (nagios object configuration files). Ces fichiers ne seront pas transformés. Ces fichiers ne devraient pas ordinairement être modifiés.
- yaml qui servirons à générer des fichiers .cfg
Les fichiers cfg existant serons copiés tel quel Ex in/localhost.cfg ⇒ out/L12/localhost.cfg in/contacts.cfg ⇒ out/L12/contacts.cfg
Chanque fichier yaml générera un fichier cfg. Ex in/printer.yaml ⇒ out/L12/printer.cfg in/servers.yaml ⇒ out/L12/servers.cfg
Noter que chaque fichier cfg généré devra être inclue dans nagios.cfg pour être pris en compte par Nagios.
Pour modifier la conf il faut :
- Editer le fichier yaml approprié. Ex: servers.yaml. Prendre garde à la clause
__linespour restreindre la définition à une liste de ligne (défaut : toutes) - Lancer la commande ci-dessous. (Exemple avec la ligne 12)
- Copier les fichiers out/L12/*.cfg dans nagios/etc/objects
- S'assurer en cas de création d'un nouveau fichier yaml que celui-ce est bien appelé dans nagios.cfg
- Vérifier la syntaxe (voir plus bas)
Exemple pour la ligne 12
env LINE=12 ./play-templating-nagios-config.yml
Le dossier out/L<line>/ contient tous les fichiers à placer dans nagios/etc/objects/ <line> correspond au numéro de la ligne
Une fois les nouveaux fichiers en place il est recommandé de les vérifier
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
Compatibilité
Compatible Nagios 3 et Nagios 4
Limites
Pour le moment seuls les types d'objects ci-dessous sont pris en charge :
- host
- hostgroup
- service
Cepandent si d'autres types sévererait nécessaire il est aisé de modifier le fichier template.jinja
