✔️Иногда нужно быстро выполнить одну и ту же команду на нескольких серверах. Удобные тулзы для этого есть (например, pssh, ansible), но что если хочется сделать это в чистом bash, без сторонних зависимостей?
➡️ Попробуем реализовать, основная идея такова:
💠список хостов хранится в текстовом файле;
💠скрипт пробегает по ним циклом и запускает команду через ssh;
💠чтобы все шло параллельно - используем background (&) и ограничитель числа потоков.
➡️ Пример скрипта:
#!/bin/bash
# parallel-ssh.sh
# Одновременное выполнение команд на хостах
HOSTFILE="hosts.txt"
CMD="$*"
MAX_PARALLEL=5 # ограничение параллельных подключений
if [[ -z "$CMD" ]]; then
echo "Использование: $0 'команда для выполнения'"
exit 1
fi
sem=0
while read -r host; do
[[ -z "$host" || "$host" =~ ^# ]] && continue
{
echo ">>> [$host]"
ssh -o BatchMode=yes -o ConnectTimeout=5 "$host" "$CMD" 2>&1 | sed "s/^/[$host] /"
} &
((sem++))
if (( sem >= MAX_PARALLEL )); then
wait -n
((sem--))
fi
done < "$HOSTFILE"
wait
➡️ Пример hosts.txt:
server1
192.168.1.12
192.168.1.15
➡️ Запуск:
./parallel-ssh.sh "uptime"
▶️Вывод будет помечен [host], чтобы не путались строки.
🖼️ Ссылка на источник
🔨 bash_help
