Выполнение сценариев BASH на нескольких удаленных серверах
Любую команду, которую вы можете запустить из командной строки, можно использовать в сценарии bash. Скрипты используются для выполнения ряда команд. Bash доступен по умолчанию в операционных системах Linux и macOS.
Давайте представим гипотетический сценарий, в котором вам нужно выполнить сценарий BASH на нескольких удаленных серверах, но вы не хотите вручную копировать сценарий на каждый сервер, затем снова входить на каждый сервер по отдельности и только затем выполнять сценарий.
Конечно, вы можете использовать такой инструмент, как Ansible, но давайте научимся делать это с помощью Bash!
Предварительные условия
В этом примере я буду использовать 3 удаленных сервера Ubuntu, развернутых в DigitalOcean. Если у вас еще нет учетной записи Digital Ocean, вы можете зарегистрироваться в DigitalOcean и получить бесплатный кредит в размере 100 долларов США по этой реферальной ссылке здесь:
https://m.do.co/c/2a9bba940f39
Как только ваша учетная запись Digital Ocean будет готова, разверните 3 дроплета.
Я пошел дальше и создал 3 сервера Ubuntu:
Я помещу IP-адреса этих серверов в servers.txt
файл, который буду использовать для зацикливания с помощью нашего сценария Bash.
Если вы новичок в DigitalOcean, вы можете выполнить действия по созданию капли здесь:
Вы также можете выполнить шаги из этого видео здесь, чтобы выполнить первоначальную настройку сервера:
Или, что еще лучше, вы можете прочитать эту статью здесь о том, как автоматизировать первоначальную настройку сервера с помощью Bash:
Автоматизация первоначальной настройки сервера с помощью Ubuntu 18.04 с помощью Bash
Имея три новых сервера, мы можем сосредоточиться на запуске нашего сценария Bash на всех из них с помощью одной команды!
BASH-скрипт
Я повторно использую демонстрационный сценарий из предыдущей главы с некоторыми небольшими изменениями. Он просто выполняет несколько проверок, таких как текущее использование памяти, текущее использование ЦП, количество TCP-соединений и версию ядра.
#!/bin/bash
##
# BASH script that checks the following:
# - Memory usage
# - CPU load
# - Number of TCP connections
# - Kernel version
##
##
# Memory check
##
server_name=$(hostname)
function memory_check() {
echo "#######"
echo "The current memory usage on ${server_name} is: "
free -h
echo "#######"
}
function cpu_check() {
echo "#######"
echo "The current CPU load on ${server_name} is: "
echo ""
uptime
echo "#######"
}
function tcp_check() {
echo "#######"
echo "Total TCP connections on ${server_name}: "
echo ""
cat /proc/net/tcp | wc -l
echo "#######"
}
function kernel_check() {
echo "#######"
echo "The exact Kernel version on ${server_name} is: "
echo ""
uname -r
echo "#######"
}
function all_checks() {
memory_check
cpu_check
tcp_check
kernel_check
}
all_checks
Скопируйте приведенный ниже код и добавьте его в файл с именем remote_check.sh
. Вы также можете получить сценарий отсюда .
Запуск скрипта на всех серверах
Теперь, когда у нас есть готовый сценарий и серверы и мы добавили эти серверы в наш файл server.txt, мы можем запустить следующую команду, чтобы просмотреть все серверы и выполнить сценарий удаленно, без необходимости копировать сценарий на каждый сервер и индивидуально подключаться к каждому серверу.
for server in $(cat servers.txt) ; do ssh your_user@${server} 'bash -s' < ./remote_check.sh ; done
Этот цикл for проходит через каждый сервер в файле server.txt, а затем выполняет следующую команду для каждого элемента в списке:
ssh your_user@the_server_ip 'bash -s' < ./remote_check.sh
Вы получите следующий результат:
Заключение
Это очень простой пример того, как выполнить простой сценарий на нескольких серверах без необходимости копировать сценарий на каждый сервер и без необходимости обращаться к серверам по отдельности.
Конечно, вы можете запустить гораздо более сложный сценарий и на гораздо большем количестве серверов.
Last updated