Если вам необходимо выполнить одновременно на нескольких хостах какую-то команду по SSH, можно воспользоваться очень удобным и простым инструментом для этого - orgalorg. Сразу скажу, что способов решения данной задачи очень много, начиная от простого однострочника на bash и заканчивая ClusterSSH или Ansible. Покажу в конце примеры.
Я пишу именно про orgalorg, потому что там это реализовано максимально просто и быстро. Для тех, кому нет нужды разбираться в настройках, разных подходах и тем более изучать ansible.
Основные возможности orgalorg:
◽ параллельное выполнение ssh команд на удалённых хостах
◽ одновременная загрузка файла на несколько удалённых хостов
◽ аутентификация как по ключам, так и интерактивно по паролю
◽ возможность выбрать файл как источник команд для удалённых хостов
Orgalorg написан на go и может быть установлен с его помощью:
# apt install golang# go get github.com/reconquest/orgalorg
В директории ~/go/bin будет собранный бинарник orgalorg.
Одновременное выполнение команды uptime на двух хостах с аутентификацией через пароль:
# ./orgalorg -p -o 10.20.1.44 -o 10.20.1.45 -C uptimePassword: 10.20.1.45 12:46:49 up 18 min, 2 users, load average: 0.02, 0.03, 0.0610.20.1.44 12:46:49 up 18 min, 2 users, load average: 0.02, 0.03, 0.06
С помощью orgalorg можно легко добавить свой публичный ключ на эти хосты:
# ./orgalorg -p -o 10.20.1.44 -o 10.20.1.45 \-i ~/.ssh/id_rsa.pub -C tee -a ~/.ssh/authorized_keys
После этого можно выполнять команды напрямую, минуя ключ -p и ввод пароля. Смотрим информацию о шлюзе по умолчанию на группе хостов:
# ./orgalorg -o 10.20.1.43 -o 10.20.1.44 -o 10.20.1.45 \-i ~/.ssh/id_rsa.pub -C ip r | grep default10.20.1.45 default via 10.20.1.1 dev eth010.20.1.43 default via 10.20.1.1 dev eth0 10.20.1.44 default via 10.20.1.1 dev eth0
Загрузим файл ~/file.txt с текущего хоста на два удалённых в директорию /tmp:
# ./orgalorg -o 10.20.1.44 -o 10.20.1.45 \-i ~/.ssh/id_rsa.pub -er /tmp -U ~/file.txt
Orgalorg поддерживает много функций. Например, открытие интерактивного сеанса с удалённым хостом или отображение в режиме реального времени изменение одного и того же лог файла с разных хостов.
Если у вас рабочая система на Linux, то похожий функционал можно получить с помощью ClusterSSH. При выполнении команд на разных хостах, будут автоматом открываться терминалы с автоматическим подключением к ним. Это удобно в тестовой среде. Позволяет выполнить какую-то команду и тут же в терминале наблюдать за выполнением, а потом продолжить работу в этом терминале.
Всё описанное выше можно выполнить с помощью Ansible. Вот пример выполнения команды на нескольких хостах с интерактивной аутентификацией по паролю:
# ansible -k -u root -a "uptime" -i hosts.txt servers
Файл host.txt с инвентарём должен быть следующего содержания:
[servers]10.20.1.4410.20.1.45
А вот эта же задача решается с помощью однострочника на bash:
# hosts=('10.20.1.44' '10.20.1.45'); \for HOST in "${hosts[@]}"; \do ssh -f root@$HOST "uptime"; done
#bash