Выполнение сценариев 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