Вопрос или проблема
#!/bin/bash
SERVER_LIST=/path/to/servers.txt
while read REMOTE_SERVER
do
ssh $REMOTE_SERVER "do_something_cool"
done < $SERVER_LIST
что происходит, когда один из серверов недоступен в этом коде?
я использовал hss для запуска приложений на 25 удаленных компьютерах, но только что столкнулся с одним, который был недоступен, и тогда hss продолжал искать этот хост и никогда не переходил дальше. это не оптимально, если один из моих компьютеров оффлайн.
перейдет ли указанный выше код к следующему хосту в списке серверов, если он наткнется на тот, который оффлайн? или есть ли корректировка, которую нужно внести в этот код для этого?
Насколько я знаю, цикл продолжится до 5 минут (или около того). Если вы хотите избежать ожидания, вы можете внести эти изменения в ваш код:
while read REMOTE_SERVER
do
if (exec 3<>/dev/tcp/74.207.252.238/22) 2> /dev/null; then
ssh $REMOTE_SERVER "do_something_cool"
fi
done < $SERVER_LIST
условие if
проверяет, открыт ли порт 22 выбранного IP. Это не означает, что вы можете быть уверены в наличии демона ssh
на нем. Я взял эту идею из этого поста.
Ответ или решение
Что делать, если один из серверов недоступен?
При работе с большим количеством удалённых серверов, как в представленном коде, крайне важно правильно обработать ситуацию, когда один из хостов недоступен. В вашем случае код предназначен для выполнения команды на каждом сервере из списка, однако, если сервер недоступен, SSH соединение может зависнуть, что приведёт к значительной задержке в выполнении скрипта.
Анализ исходного кода
Исходный код:
#!/bin/bash
SERVER_LIST=/path/to/servers.txt
while read REMOTE_SERVER
do
ssh $REMOTE_SERVER "do_something_cool"
done < $SERVER_LIST
При выполнении данного кода, если один из серверов в списке (REMOTE_SERVER
) недоступен, команда ssh
будет пытаться установить соединение, и это приведёт к ожиданию (по умолчанию до 5 минут), что делает скрипт неэффективным. Ваша задача — сделать так, чтобы в случае недоступности сервера скрипт перешёл к следующему хосту.
Решение проблемы
В случае, если сервер недоступен, вы можете использовать предварительную проверку доступности порта, например, с помощью проверки TCP соединения. Обновленный код может выглядеть следующим образом:
while read REMOTE_SERVER
do
if (exec 3<>/dev/tcp/$REMOTE_SERVER/22) 2>/dev/null; then
ssh $REMOTE_SERVER "do_something_cool"
else
echo "Сервер $REMOTE_SERVER недоступен"
fi
done < $SERVER_LIST
Объяснение изменений:
-
Проверка доступности порта: Использование
exec 3<>/dev/tcp/$REMOTE_SERVER/22
позволяет проверить, открыт ли порт 22 (по умолчанию используется для SSH). Если порт недоступен, код не зависает на попытке подключения к серверу. -
Вывод ошибки: Если сервер недоступен, мы выводим сообщение в консоль, что позволяет отслеживать статус каждого хоста.
-
Эффективность: Теперь, даже если один из серверов недоступен, скрипт немедленно пропустит его и продолжит выполнение на следующем сервере, что в значительной степени повышает общую эффективность вашего процесса развертывания.
Заключение
При работе с множеством серверов, важно заранее предусмотреть возможность их недоступности. Использование методов, таких как проверка открытых портов, помогает избежать зависания операций и делает скрипт более устойчивым и удобным в использовании. Подходите к контролю состояния серверов осознанно, и ваш рабочий процесс станет гораздо более эффективным.
Для достижения наилучших результатов также рекомендуем рассмотреть использование инструментов для управления конфигурациями, таких как Ansible или Puppet, которые предоставляют более совершенные методы для контроля состояния и управления узлами сети.