2017-01-24 11 views
0

я написал небольшой Баш скрипт в этом посте: How to search for a string in a text file and perform a specific action based on the resultВ то время как петля для выполнения Nagios команды не работает должным образом

Я заметил, что когда я запускал скрипт и проверьте журналы, все, кажется, работает, но когда я смотрю на пользовательский интерфейс Nagios, почти половина серверов, перечисленных в моем текстовом файле, не отключили уведомления. Пересмотренный вариант сценария ниже:

host=/Users/bob/wsus.txt 

password="[email protected]" 

while read -r host; do 
    region=$(echo "$host" | cut -f1 -d-) 

    if [[ $region == *sea1* ]] 
     then 
      echo "Disabling host notifications for: $host" 
      curl -vs -o /dev/null -d "cmd_mod=2&cmd_typ=25&host=$host&btnSubmit=Commit" https://nagios.$region.blah.com/nagios/cgi-bin/cmd.cgi" -u "bob:$password" -k 2>&1 
     else 
      echo "Disabling host notifications for: $host" 
      curl -vs -o /dev/null -d "cmd_mod=2&cmd_typ=25&host=$host&btnSubmit=Commit" https://nagios.$region.blah02.com/nagios/cgi-bin/cmd.cgi" -u "bob:$password" -k 2>&1 
    fi 
done <wsus.txt>> /Users/bob/disable.log 2>&1 

Если я запустить команду против серверов, имеющих проблемы вручную, он отключенный в Nagios UI, поэтому я немного запутался. FYI, я не очень разбираюсь в Bash, так что это была моя попытка попытаться автоматизировать этот процесс.

+0

Вы можете определить из своего журнала, если проблема вызвана тем, что цикл while не считывает строки для отсутствующих серверов, или если это потому, что команда вызывается, но не выполняется? – Fred

+1

Переименуйте host var в 'hostsfile =/Users/bob/wsus.txt', убедитесь, что файл существует, затем измените строку done на' done <$ hostsfile >> /Users/bob/disable.log 2> & 1' , Это должно сделать это. –

+0

@NagiosSupport Это сработало, спасибо! Я также заметил, что некоторые из «неудачных» серверов раньше имели неправильное полное доменное имя в моем текстовом файле ... –

ответ

0

1 - Существует не хватает двойной кавычки перед первой Https встречаемости:

У вас есть:

curl -vs -o /dev/null -d "cmd_mod=2&cmd_typ=25&host=$host&btnSubmit=Commit" https://nagios.$region.blah.com/nagios/cgi-bin/cmd.cgi" -u "bob:$password" -k 2>&1 

Должно быть:

curl -vs -o /dev/null -d "cmd_mod=2&cmd_typ=25&host=$host&btnSubmit=Commit" "https://nagios.$region.blah.com/nagios/cgi-bin/cmd.cgi" -u "bob:$password" -k 2>&1 

2 - Ваша первая переменная host является никогда не использовался (перезаписан внутри цикла while). Я предполагаю, что вы пытаетесь сделать что-то вроде:

hosts_file="/Users/bob/wsus.txt" 
log_file="/Users/bob/disable.log" 

# ... 

while read -r host; do 
    # Do stuff with $host 
done < $hosts_file >> $log_file 2>&1 

3 - Это выглядит подозрительно ко мне:

if [[ $region == *sea1* ]] 

Примечание: Я не проверял еще, так что это мое общее чувство об этом может быть неправильным.

$region не имеет двойных кавычек, поэтому убедитесь, что там не может быть пробелов/забавных вещей (но это не должно быть проблемой внутри теста с двойной скобкой [[).

*sea* похоже, что он будет расширен, чтобы соответствовать вашим текущим файлам каталога, соответствующим этому globbing. Если вы хотите, чтобы проверить это как регулярное выражение, вы должны использовать ~= оператора или (мой любимый по какой-то причине) grep команды:

if grep -q ".*sea.*" <<< "$region"; then 
    # Your code if match 
else 
    # Your code if no match 
fi 
  • -q сохраняет grepд uiet
  • Существует нет необходимо для теста, такого как [ или [[, потому что код возврата grep уже равен 0, если соответствует
  • <<< просто перенаправляет правильные строки в качестве стандартного d ввода левой команды (избегайте бесполезных трубопроводов, например echo "$region" | grep -q ".*sea.*").

Если это не поможет решить вашу проблему, предоставьте образец вашего входного файла hosts_file, а также несколько журналов вывода.

Вы также можете попробовать посмотреть, что действительно происходит под капотом, включив ваш сценарий с помощью set -x и set +x, чтобы активировать режим отладки/трассировки.

+0

спасибо, но после того, как я внес изменения @NagiosSupport, я могу подтвердить через веб-интерфейс Nagios, что все проблемные хосты не правильно реагируют и уведомления отключены. –