LinuxForum.Fans
Тема

Удаленное управление демонами

Автор: opryatniyav 195 сообщений 20488 просмотров
#195561

Lupo Alberto как всегда вы правы не было пробела перед последней скобкой
поставил пробел все заработало

когда связь с сервером есть
на почту пришло письмо с ошибками в теле письма (но ошибки не критичные это нормально просто это тестовый сервер на нем до конца не настроен JBOSS и java и то что он ругается это нормально)

когда связи с сервером нет
на почту пришло письмо с прикрепленным файлом attachment
и внутри етого файла
ssh: connect to host 10.77.11.37 port 22: No route to host
ssh: connect to host 10.77.11.37 port 22: No route to host

такой вопросик почему когда нет связи информация приходит в файле attachment а не в теле письма?

#195564
Lupo Alberto написал:
opryatniyav, в этом скрипте не учтено много различных ситуаций и сама его структура неправильна.

вот здесь если можно поподробнее !!!

#195595

Ваш скрипт делает следующее:
1. Подключиться к удалённому серверу и запустить команду остановки сервиса.
2.
а) Если команда закончилась с ошибкой, запустить команду принудительной остановки java;
б) если же команда остановки сервиса закончилась правильно, выполнить копирование файла на удалённый сервер.
3. При его удачном копировании запустить сервис.
4. Все сообщения об ошибках помещать в лог-файл. Затем этот лог-файл отправлять на почту.

Мне не нравится, что вместо того, чтобы запустить один скрипт на удалённом сервере, ему по ssh посылается три команды.
Мне не нравится, что сервис при определённых обстоятельствах просто «убивается». При таком завершении работы есть вероятность, что он в дальнейшем не сможет запуститься.
Если копирование произведено с ошибкой, сервис не запустится.
Если скрипт предполагается использовать для управления несколькими серверами, адрес и название лог-файла лучше вынести в переменные.
P.S. Оставляйте пробел после 2>> перед именем лог-файла ssh_02.log — быть может не критично, но «глаз режет» wink
P.S.S. Насчёт разных форматов почтовых отправлений, подумаю.
Однако, надеюсь, кто-либо быстрее подскажет причину такого поведения. wink

#195610

что можно сделать чтоб проконтролировать копирование
может как то можно сравнить записи по md5summ

#195613

подскажите как в этот конфиг вставить переменные допустим вместо айпи адреса и чтоб он запрашивал в начале скрипта этот адрес
#!/bin/bash
set -x
ssh 10.77.11.37 /etc/init.d/jboss stop 2>> ssh_02.log || \
ssh 10.77.11.37 pkill -9 java 2>> ssh_02.log && \
scp /opt/test 10.77.11.37:/opt/test 2>> ssh_02.log && \
ssh 10.77.11.37 /etc/init.d/jboss start 2>> ssh_02.log
[ -f ssh_02.log ] && cat ssh_02.log | mail -s "Error log on ssh_02" aleksandr.opryatniy@co.ksoe.com.ua
set +x

#195614
opryatniyav написал:
может как то можно сравнить записи по md5summ

Можно. Ещё нужно рассмотреть ситуацию, когда копируется поверх существующего файла.

#195619
opryatniyav написал:
подскажите как в этот конфиг вставить переменные допустим вместо айпи адреса и чтоб он запрашивал в начале скрипта этот адрес

Вы не забудьте потом убрать set -x, set +x — это только для отладки.
Переменные можно передавать в качестве аргументов скрипта

#!/bin/bash
REMOTE_IP=$1
ERROR_LOG=${REMOTE_IP}_error.log
ssh $REMOTE_IP /etc/init.d/jboss stop 2>> $ERROR_LOG || \
ssh $REMOTE_IP pkill -9 java 2>> $ERROR_LOG && \
scp /opt/test $REMOTE_IP:/opt/test 2>> $ERROR_LOG && \
ssh $REMOTE_IP /etc/init.d/jboss start 2>> $ERROR_LOG
[ -f $ERROR_LOG ] && cat $ERROR_LOG | mail -s "Error log on $REMOTE_IP" aleksandr.opryatniy@co.ksoe.com.ua

... и вызывать скрипт так:
[console]
./ssh_remote.sh 10.77.11.37
[/console]

либо в каждом экземпляре скрипта записать определённый адрес и вызывать без аргументов.

#!/bin/bash
REMOTE_IP="10.77.11.37"
ERROR_LOG=${REMOTE_IP}_error.log
ssh $REMOTE_IP /etc/init.d/jboss stop 2>> $ERROR_LOG || \
ssh $REMOTE_IP pkill -9 java 2>> $ERROR_LOG && \
scp /opt/test $REMOTE_IP:/opt/test 2>> $ERROR_LOG && \
ssh $REMOTE_IP /etc/init.d/jboss start 2>> $ERROR_LOG
[ -f $ERROR_LOG ] && cat $ERROR_LOG | mail -s "Error log on $REMOTE_IP" aleksandr.opryatniy@co.ksoe.com.ua

... и вызывать скрипт так:
[console]
./ssh_remote.sh
[/console]

#195620

так вроде scp копирует с заменой

#195622
opryatniyav написал:
так вроде scp копирует с заменой

Я же не знаю, насколько это для вас критично. Как велик размер файла, и стоит ли производить копирование, если файл существует.

#195644

размер файла около 20 мб
на сервере файл существует и его придется каждый раз заменять
каналы связи не очень 2-4 мегабита

#195648

opryatniyav, на компьютере, с которого производится управление, или даже на любом другом компьютере, есть возможность поднять ftp- или rsync-сервисы? Насколько критична информация, копируемая на сервера?

#195664

есть возможность поднять rsync только для каких целей если оно и так работает с помощью scp

#195673

вот итог наших с вами трудов за что я вам очень благодарен скрипт работает отлично
но остался последний вопрос как настроить сравнение файлов на клиенте и сервере? с помощью md5sum или же есть какие то другие варианты?

text
#!/bin/bash$
#set -x$
REMOTE_IP=$1$
ERROR_LOG=${REMOTE_IP}_error.log$
ssh $REMOTE_IP /etc/init.d/jboss stop 2>> $ERROR_LOG || \$
ssh $REMOTE_IP pkill -9 java 2>> $ERROR_LOG && \$
scp /opt/test $REMOTE_IP:/opt/test 2>> $ERROR_LOG && \$
ssh $REMOTE_IP /etc/init.d/jboss start 2>> $ERROR_LOG$
[ -f $ERROR_LOG ] && cat $ERROR_LOG | mail -s "Error log on $REMOTE_IP" aleksandr.opryatniy@co.ksoe.com.ua && rm -f $ERROR_LOG$
#set +x$
#195675
opryatniyav написал:
есть возможность поднять rsync только для каких целей если оно и так работает с помощью scp

Я всё не теряю надежды убедить вас, чтобы скрипт выполнялся на удалённых компьютерах, а по rsync они бы получали нужный файл. wink

#195773

дело в том что этот скрипт со временем будет модернизироваться что то добавляться что то убираться. А если делать скрипт на каждом сервере потом замучаюсь редактировать
Мои мега боссы сказали чтоб было так smile

#195783

opryatniyav,
для примера набросал «на коленке»:

text

#!/bin/bash
set -x
REMOTE_HOST=${1}
FILE=${2}
FILE_MD5SUM=${FILE}.md5
scp ${FILE} ${REMOTE_HOST}:
ssh ${REMOTE_HOST} md5sum ${FILE} > ${FILE_MD5SUM}
md5sum -c --status ${FILE_MD5SUM} && echo "Файл скопировался успешно" || echo "Повторите передачу файла"
set +x

Вот отладочный вывод скрипта:
[console]
lupo@gentoo-laptop ~ % ./test.sh gentoo-home config.amd64
+ REMOTE_HOST=gentoo-home
+ FILE=config.amd64
+ FILE_MD5SUM=config.amd64.md5
+ scp config.amd64 gentoo-home:
config.amd64 100% 127KB 126.8KB/s 126.8KB/s 00:00
+ ssh gentoo-home md5sum config.amd64
+ md5sum -c --status config.amd64.md5
+ echo 'Файл скопировался успешно'
Файл скопировался успешно
+ set +x
[/console]

По уму бы надо добавить проверку передаваемых скрипту аргументов.

#195875

Lupo Alberto

REMOTE_HOST=${1}
FILE=${2}

а что обозначают {} просто в предыдущем конфиге их небыло

REMOTE_IP=$1
ERROR_LOG=${REMOTE_IP}_error.log

#195894
opryatniyav написал:
а что обозначают {} просто в предыдущем конфиге их небыло

Более строгое задание переменных, некоторые оболочки требуют.

#195914

появились новые условия в моем скрипте мой мозг сейчас взорвется :(
в этой части скрипта

text
ssh $REMOTE_IP /etc/init.d/jboss stop 2>> $ERROR_LOG || \
ssh $REMOTE_IP pkill -9 java 2>> $ERROR_LOG && \

нужно добавить проверку того что если JBOSS не остановился по команде STOP то после выполнения pkill проверять удалился ли процесс если он не удалился то отправлять отчет по почте
и еще одно как заставить команду после выполнения ждать определенное количество времени допустим 180 сек

да кстати даже если все этапы скрипта выполняются нормально то все ровно приходит пустое письмо, не в курсе почему?

как можно вас отблагодарить за вашу помощь?

#195917

только начал разбираться с сравнение суммы MD5 как выяснилось что я не рассмотрел все варианты не выполнения скрипта!!!

Войдите или зарегистрируйтесь, чтобы ответить.