mirroir readonly du Gitit wiki.evolix.org (attention, ne rien commiter/merger sur ce dépôt) https://wiki.evolix.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

170 lines
4.7 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. ---
  2. title: Howto Nagios alerts wrapper.
  3. ...
  4. Cet article documente la façon dont on peut temporairement désactiver les alertes de monitoring (Nagios, Icinga…) grace à un "wrapper" autour du check réalisé sur le serveur.
  5. Le principe est de faire croire au monitoring que tout va bien, même si ça n'est pas forcément le cas, lorsque certaines conditions sont satisfaites.
  6. Plusieurs variations sont possibles, mais nous allons documenter une approche très simple, basée sur la présence d'un fichier temporaire.
  7. ## Gestion du fichier temporaire
  8. Un script `alerts_switch` s'occupera de gérer le fichier temporaire.
  9. ~~~
  10. # /usr/share/script/alerts_switch disable tomcat
  11. ~~~
  12. Cette action va créer un fichier temporaire `/tmp/tomcat_alerts_disabled` et inscrire une entrée datée dans le fichier `/var/log/tomcat_alerts.log`.
  13. ~~~
  14. # /usr/share/script/alerts_switch enable tomcat
  15. ~~~
  16. Cette action va renommer le fichier en `/tmp/tomcat_alerts_enabled` s'il existe ou le créer (pour indiquer clairement qu'on a souhaité que les alertes soient activées).
  17. NB : on ne se contente pas de supprimer le fichier "disabled" pour ne pas risquer de supprimer un fichier important qui serait là au préalable, portant par malchance le même nom.
  18. Détail du script `alerts_switch` :
  19. ~~~{.bash}
  20. #!/bin/bash
  21. set -e
  22. readonly PROGNAME=$(basename $0)
  23. readonly PROGDIR=$(readlink -m $(dirname $0))
  24. readonly ARGS="$@"
  25. usage() {
  26. echo "$PROGNAME action prefix"
  27. }
  28. disable_alerts () {
  29. disabled_file="$1_disabled"
  30. enabled_file="$1_enabled"
  31. if [ -e "${enabled_file}" ]; then
  32. mv "${enabled_file}" "${disabled_file}"
  33. else
  34. touch "${disabled_file}"
  35. fi
  36. }
  37. enable_alerts () {
  38. disabled_file="$1_disabled"
  39. enabled_file="$1_enabled"
  40. if [ -e "${disabled_file}" ]; then
  41. mv "${disabled_file}" "${enabled_file}"
  42. else
  43. touch "${enabled_file}"
  44. fi
  45. }
  46. now () {
  47. date --iso-8601=seconds
  48. }
  49. log_disable () {
  50. echo "$(now) - alerts disabled by $(logname)" >> $1
  51. }
  52. log_enable () {
  53. echo "$(now) - alerts enabled by $(logname)">> $1
  54. }
  55. main () {
  56. local action=$1
  57. local prefix=$2
  58. local file_path="/tmp/${prefix}_alerts"
  59. local log_file="/var/log/${prefix}_alerts.log"
  60. case "$action" in
  61. enable)
  62. enable_alerts ${file_path}
  63. log_enable ${log_file}
  64. ;;
  65. disable)
  66. disable_alerts ${file_path}
  67. log_disable ${log_file}
  68. ;;
  69. help)
  70. usage
  71. ;;
  72. *)
  73. >&2 echo "Unknown action '$action'"
  74. exit 1
  75. ;;
  76. esac
  77. }
  78. main $ARGS
  79. ~~~
  80. ## (Dés)activation des alertes
  81. L'activation/désactivation des alertes peut se faire manuellement par exécution du script, mais elle peut aussi se faire automatiquement depuis le script d'initialisation d'un service.
  82. Par exemple, avec Tomcat on peut ajouter les commandes citées plus haut dans les fonctions start/stop, juste après l'appel à `log_daemon_msg`
  83. ## Wrapper pour le check
  84. Il reste à tenir compte de la présence ou pas du fichier temporaire au niveau des checks Nagios/NRPE.
  85. Pour un check `check_tcp -p 8080`, on va jouter une commande et un argument juste avant :
  86. ~~~
  87. $ alerts_wrapper tomcat check_tcp -p 8080
  88. ~~~
  89. On peut ainsi invoquer n'importe quel check NRPE en le précédant du wrapper et du prefix voulu.
  90. Détail du script `alerts_wrapper` :
  91. ~~~{.bash}
  92. #!/bin/bash
  93. readonly check_file="/tmp/$1_alerts_disabled"
  94. shift
  95. readonly check_stdout=$($@)
  96. readonly check_rc=$?
  97. if [ -e "${check_file}" ]; then
  98. local last_change=$(stat -c %Z "${check_file}")
  99. local limit=$(date --date '24 hours ago' +'%s')
  100. if [ ${last_change} -le ${limit} ]; then
  101. rm "${check_file}"
  102. fi
  103. fi
  104. if [ -e "${check_file}" ]; then
  105. local formatted_last_change=$(date --date "@$(stat -c %Z "${check_file}")" +'%c')
  106. echo "ALERTS DISABLED (since ${formatted_last_change}) - ${check_stdout}"
  107. if [ ${check_rc} = 0 ]; then
  108. # Nagios OK
  109. exit 0
  110. else
  111. # Nagios WARNING
  112. exit 1
  113. fi
  114. else
  115. echo ${check_stdout}
  116. exit ${check_rc}
  117. fi
  118. ~~~
  119. Le wrapper exécute le check et en met de côté la sortie standard et le code de sortie.
  120. Il cherche ensuite le fichier `/var/tmp/tomcat_alerts_disabled`.
  121. S'il est présent et vieux de plus de 24h, il sera détruit pour ne pas risquer d'oubli.
  122. Si après ça il ets toujours présent (donc valide), le wrapper informe le monitoring que les alertes sont désactivées (depuis quand) et lui donne également le résultat du check réel. L'état du check est au pire "warning" si le check a échoué.
  123. NB: le scripts doit bien être exécutable par l'utilisateur du monitoring. Dans notre cas, un bon emplacement est `/usr/local/lib/nagios/plugins/`, avec des droits en `0755`.