Für Nagios gibt es fast alles – aber ein Modul zum Über­wa­chen für (Ruby on Rails-) Gems schein­bar noch nicht. Ich beschrei­be daher im fol­gen­den kurz ein Bash-Skript und des­sen Ein­bin­dung in einer Nagios-NRPE-Instanz, mit der man das Vor­han­den­sein von Gem-Aktua­li­sie­run­gen mit Nagios über­wa­chen kann.

Kern des Skripts ist der Auf­ruf von gem obsolet, das eine Lis­te mit allen Gems zurück­lie­fert, für die Aktua­li­sie­run­gen vor­han­den sind. Das Skript zählt mit wc ein­fach die Anzahl der zurück­ge­ge­be­nen Zei­len der Stan­dard­aus­ga­be STDOUT. Wird kei­ne Zei­le zurück­ge­ge­ben, sind alle instal­lier­ten Gems auf dem aktu­el­len Stand.

#!/bin/bash
#
# Nagios plugin for detection of available updates for Ruby gems.

# Gem outdated returns a list of gems for which are updates available.
# If the line count of STDOUT is > 0, one update is available at least.
gem_update_count=$(/var/www/.rvm/bin/gem outdated | wc -l)

if [ gem_update_count="0" ]; then
 echo "All gems are up to date."
 exit 0
else
 if [ gem_update_count="1" ]; then
  echo "1 gem update is available."
 else
  echo "$gem_update_count gem updates are available."
 fi
 exit 1
fi

Das Skript muss auf dem zu über­wa­chen­den Ser­ver abge­legt und von dem Nagios-Benut­zer (nor­ma­ler­wei­se nagios) aus­führ­bar gemacht werden.

Dabei kann aber ein Pro­blem auf­tre­ten, wenn Ruby über die Paket­ver­wal­tung RVM instal­liert wur­de. In die­sem Fall wird das .rvm-Ver­zeich­nis nor­ma­ler­wei­se in die PATH-Umge­bungs­va­ria­ble hin­zu­ge­fügt und in der .bashrc ein Init-Skript source ~/.rvm/scripts/rvm aus­ge­führt. Die­ses Skript wird aber unter dem Nagios-Benut­zer nicht aus­ge­führt, womit er den Befehl gem in einer fal­schen Umge­bung auf­ru­fen und das Skript nicht funk­tio­nie­ren würde.

Ich habe das Pro­blem gelöst, in dem ich per sudo dem Benut­zer nagios erlau­be, ohne Authen­ti­fi­zie­rung das Skript als Benut­zer www-data aus­zu­füh­ren. Per visudo als Root habe ich daher die Datei /etc/sudoers mit fol­gen­dem ergänzt:

# Cmnd alias specification
Defaults:nagios !authenticate
nagios ALL=(www-data) /var/www/check_gem.sh

Als letz­tes habe ich in der Nagios-NRPE-Kon­fi­gu­ra­ti­on unter /etc/nagios/nrpe.cfg das Kom­man­do check_gem defi­niert durch fol­gen­de Zei­le (am Datei­ende sind ent­spre­chen­de wei­te­ren Bei­spie­le zu finden):

command[check_gem]=sudo -u www-data /var/www/check_gem.sh

Nach einem Neu­start des Nagios-NRPE-Ser­vers auf dem zu über­wa­chen­den Sys­tem ist es nun bereit, um von dem Nagios-Ser­ver abge­fragt zu wer­den. Dort muss (z.B. in der services_nagios2.cfg) ein neu­er Dienst ange­ge­ben werden:

define service {
 host_name <HOST>

 use generic-service
 service_description Gemfiles
 notification_interval 0

 check_command check_nrpe_1arg!check_gem
}

(Der Befehl host_name ist mög­li­cher­wei­se durch hostgroup zu erset­zen, wenn du die Diens­te dadurch an die Hosts bindest.)

Nach einem Neu­start von Nagios erschei­nen die Ein­trä­ge für die Hosts nun z.B. in der Web­ober­flä­che oder in der Mobil­an­wen­dung. Die wei­te­re Kon­fi­gu­ra­ti­on mit Benach­rich­ti­gun­gen usw. läuft dann wie gewohnt ab.