Для реализации механизма проверки файлов конфигурации 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