Иногда нужно быстро выполнить одну и ту же команду на нескольких серверах. Удобные тулзы для этого есть (например, 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], чтобы не путались строки.
BashTex 📱 #bash