Механизм проверки конфигов Nagios/Icinga

Для реализации механизма проверки файлов конфигурации nagios/icinga, поступающие из svn (https://svn.local/puppet/nagios/files/nagios.local/), создан специальный виртуальный сервер checker1.nagios.local на котором нет ничего кроме чистого nagios.

На эту машину с помощью хука svn-precommit прилетают измененные пользователем конфиги, парсятся, определяются куда их нужно положить, бекапяться старые и копируются по соответствующим путям каждый новый, далее запускается проверка конфигцрации.

По результатам работы скрипт отдает код ошибки. Если успешно отработал то новые файлы сохраняются. В случае обнаружения ошибки конфигурация сервера checker1.nagios.local восстанавливается в прежнее состояние из файлов бекапов. Лог хранится по пути /tmp/svnlog-commit

Содержание:

1. Нода checker1.nagios.local

2. Хук svn-precommit

 

1. Нода checker1.nagios.local

Для реализации механизма проверки файлов конфигурации nagios/icinga, поступающие из svn (https://svn.local/puppet/nagios/files/nagios.local/), создан специальный виртуальный сервер checker1.nagios.local на котором нет ничего кроме чистого nagios.

На эту машину с помощью хука svn-precommit прилетают измененные пользователем конфиги, парсятся, определяются куда их нужно положить, бекапяться старые и копируются по соответствующим путям каждый новый, далее запускается проверка конфигцрации.

По результатам работы скрипт отдает код ошибки. Если успешно отработал то новые файлы сохраняются. В случае обнаружения ошибки конфигурация сервера checker1.nagios.local восстанавливается в прежнее состояние из файлов бекапов. Лог хранится по пути /tmp/svnlog-commit

Т.к. в организации распределенная система мониторинга, т.е. у нас есть slave сервера и master, то конфигурация ноды checker1 наделена возможностью подстраиваться под редактируемый конфиг.

 

2. Хук svn-precommit (svn.local)

pre-commit запускается в конце транзакции, но до того как произойдет commit.

Хук /usr/local/www/svn/puppet/hooks/pre-commit определяет какие файлы меняются, у нас это 'nagios/ files/nagios.local/(sites | private_templates | global_templates 

| hostgroups | servicegroups)'

Если это нужные файлы то запоминаем названия файлов и для каждого создаем файл с содержимым, которое присылает пользователь (он же коммитер) + туда же вписываем имя фала. Затем эти файлы отправляются на ноду checker1.nagios.local, где запускается скрипт /var/spool/nagios/checker_cfg.pl

Обработчиком кода ошибки коммит или проходит или нет, пользователю отправляется соответствующее сообщение.

Скрипт checker_cfg.pl

#!/usr/bin/perl -w

 

$svnprecommit=$ARGV[0];

$luser=$ARGV[1];

#if ($svnprecommit =~ /(.\/)(.*)$/) {print "$2\n";}

#$svnprecommit=$2;

$svnprecommit=~ s|.*/||;

$nn=`ls /tmp/ | grep $svnprecommit | wc -l | tr -d " "`;

$SITES=`tail -1 "/tmp/$svnprecommit.0" | cut -d/ -f 7-`;

 

for ($i=0; $i < $nn; $i++) 

        {

#       print "$i\n";

        `sed '\$d' "/tmp/$svnprecommit.$i" > /tmp/ng.$svnprecommit.$i`;

        $SITES=`tail -1 "/tmp/$svnprecommit.$i" | cut -d/ -f 7-`;

#       print "$SITES\n";

        $count=`cat "/tmp/$svnprecommit.$i" | wc -l | tr -d " "`;

#       print "count=$count\n";

#       print "sites=$SITES\n";

        if ($count == 1 && !($SITES=~ /\.cfg$/)) {

#                        print "est mkdir\n";

                        `rm -rf /usr/local/etc/nagios/$SITES/`;

                        `mkdir -p /usr/local/etc/nagios/$SITES`;

                        `echo "\`date\` $luser edit dir /usr/local/etc/nagios/$SITES" >> /tmp/svnlog-commit`;

                        `rm /tmp/ng.$svnprecommit.$i`;

                        }

        $_=$SITES;

        if (/private_templates(.*?)slaves/) 

                {

                system(" sed -I -e 's/private_templates\\/master/private_templates\\/slaves/g' /usr/local/etc/nagios/nagios.cfg ");

                }

        else

                {

                system(" sed -I -e 's/private_templates\\/slaves/private_templates\\/master/g' /usr/local/etc/nagios/nagios.cfg ");

                }

 

        $per="/usr/local/etc/nagios/$SITES";

        chomp $per;

        `/bin/cp $per /tmp/ng.$svnprecommit.$i.old > /dev/null 2> /dev/null; cp /tmp/ng.$svnprecommit.$i $per > /dev/null 2> /dev/null`;

        }

$error='';

$error=`sudo /usr/local/etc/rc.d/icinga checkconfig | grep Error | sort | uniq -d`;

if ($error ne '') {print "$error\n"; `date >> /tmp/svnlog-commit`; `echo " $luser --- $error " >> /tmp/svnlog-commit`; `echo " --------- " >> /tmp/svnlog-commit`;}

if ($error eq '')

        {

        for ($i=0; $i < $nn; $i++) 

                {

                $SITES=`tail -1 /tmp/$svnprecommit.$i | cut -d/ -f 7-`;

                ` echo "\`date\` --- OK --- /tmp/$svnprecommit.$i --- $luser ---  $SITES " >> /tmp/svnlog-commit `;

                ` rm /tmp/$svnprecommit.$i > /dev/null 2> /dev/null; rm /tmp/ng.$svnprecommit.$i > /dev/null 2> /dev/null; rm /tmp/ng.$svnprecommit.$i.old > /dev/null 2> /dev/null `;

                }

        exit 0;

        }

else

        {

        for ($i=0; $i < $nn; $i++) 

                {

                $SITES=`tail -1 /tmp/$svnprecommit.$i | cut -d/ -f 7-`;

                $per="/usr/local/etc/nagios/$SITES";

                chomp $per;

                `rm $per > /dev/null 2> /dev/null; /bin/cp /tmp/ng.$svnprecommit.$i.old $per > /dev/null 2> /dev/null`;

                `rm /tmp/$svnprecommit.$i > /dev/null 2> /dev/null; rm /tmp/ng.$svnprecommit.$i > /dev/null 2> /dev/null; rm /tmp/ng.$svnprecommit.$i.old > /dev/null 2> /dev/null`;

                }

        exit 1;

 

}

 

Pre-commit:

#!/bin/sh

 

REPOS="$1"

TXN="$2"

SVNLOOK=/usr/local/bin/svnlook

 

luser=`$SVNLOOK author -t "$TXN" "$REPOS"`

$SVNLOOK changed -t "$TXN" "$REPOS" | egrep 'nagios/files/ru.hostcomm.nagios/(sites|private_templates

|global_templates|hostgroups|servicegroups)' > /dev/null 

 

if [ $? -eq 0 ] ; then

 

CHANGED=`$SVNLOOK changed -t "$TXN" "$REPOS" | awk '{print $2}'`

$SVNLOOK changed -t "$TXN" "$REPOS" |  awk '{print $2}' > /tmp/svnprecommit_test

mytmpfile=`mktemp /tmp/svnprecommit.XXXXX`

nn=0

for LINE in $CHANGED

do

`$SVNLOOK cat -t "$TXN" "$REPOS" "$LINE" > "$mytmpfile.$nn"`

echo "$LINE" >> "$mytmpfile.$nn"

scp -o UserKnownHostsFile=/usr/local/www/svn/.ssh/known_hosts -o StrictHostKeyChecking=no -i /usr/local/www/svn/.ssh/id_dsa "$mytmpfile.$nn" Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. :/tmp/

rm -f "$mytmpfile.$nn"

nn=$(($nn+1))

done

rm -f "$mytmpfile"

 

ssh -i /usr/local/www/svn/.ssh/id_dsa Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. "/usr/bin/lockf /tmp/checker_lock  /var/spool/nagios/checker_cfg.pl  $mytmpfile $luser" >& 2

if [ $? -eq 0 ] ; then

exit 0

else

echo "ERROR" >& 2;

exit 1

fi

fi

 

 

exit 0

 

 

Обновлено 05.04.2016 12:01

unix-way