Лучший способ перебрать список серверов
Я регулярно делаю вещи, где перебираю список серверов, чтобы предпринять какие-то действия. Например:
for s in `cat servers.txt` ; do
echo; echo $s
ssh $s 'do something'
done
Мне интересно (с точки зрения оболочки), есть ли более простой способ сделать это, чем cat servers.txt
Да, я знаю об инструментах, таких как mcollective, capistrano и т. Д. - Я часто делаю это, чтобы решить mcollective проблемы:-)
8 ответов
Мой быстрый и грязный... где Servers.txt имеет ряд хостов или IP-адресов, по одному на линию.
#!/bin/bash
SERVER_LIST=/path/to/servers.txt
while read REMOTE_SERVER
do
ssh $REMOTE_SERVER "do_something_cool"
done < $SERVER_LIST
Я использую ClusterSSH.
Он открывает множество маленьких раковин, и вы можете печатать на них все одновременно. Очень удобно, когда вы хотите выполнить одну и ту же команду на многих серверах, но все равно видите результат.
Я использую это так: clusterssh $(~/get-servers.sh), но, очевидно, вы можете сделать что-то вроде clusterssh $(cat servers.txt)
Результат выглядит так:

Он также доступен в виде пакета Debian.
Пожалуйста, сделайте себе одолжение и используйте что-то, предназначенное для этого. Вы уже знаете о mcollective, но мы оба знаем, что для работы ему нужна инфраструктура. Как и марионетка и повар.
clusterssh, параллельный ssh и dancer shell - это небольшие простые улучшения по сравнению с shell for loop. Им не нужно больше инфраструктуры.
Но есть и ANSIBLE, который позволяет вам делать это, но также и создавать многократно используемые "пьесы" с несколькими шагами. Для этого нужно установить Python в дополнение к sshd, но на практике мне никогда не приходилось устанавливать его отдельно, он всегда был доступен.
Ansible - единственная система управления конфигурацией, которую я пробовал, которая также хорошо работает в качестве инструмента развертывания и оркестровки (для этого куколке нужен mcollective и, возможно, capistrano/fabric,...)
(Да, Puppet, Chef и все остальные могут работать без центральных серверов, но вам нужно установить пакеты на хостах для управления, что для ansible не нужно)
Вот как использовать xargs для распараллеливания этих ssh-сессий:
cat servers.txt | xargs -IH -n1 -P0 ssh H 'some command to run'
Вы также можете добавить опции -n или -f в ssh, чтобы перенаправить стандартный ввод из /dev/null или поместить сеанс в фоновый режим. Если вам нужно ввести пароль для каждого хоста, то это вам мало поможет, но если вы используете ssh-ключи, тогда это работает очень хорошо.
Чтобы выполнить простую задачу на широком диапазоне серверов без использования какого-либо инструмента, предназначенного для этой цели, независимо от того, требуется ли им предыдущая инфраструктура или нет, вы можете использовать простой сценарий оболочки, который называется mussh, распространяется как пакет во многих дистрибутивах.
Вы можете вызвать его с помощью списка хостов, списка команд, сохранить обе вещи в файлах и еще несколько опций, например ssh-agent интеграция, поддержка прокси,... Проверьте man-страницу для всех деталей.
Пример может быть таким простым:
$ mussh -H host_list.txt -C command_list.txt
Рассматривали ли вы использование Parallels-SSH? https://code.google.com/p/parallel-ssh/
Я обычно прибегаю к этому, если / когда наши настройки mco или puppet нарушены. Это еще одна зависимость для управления, но она того стоит, если у вас есть большой парк управляемых блоков - с дополнительным бонусом в виде возможности выбирать, сколько машин будет работать в тандеме / параллельно или даже делать по одной за раз, как Вы привыкли к Баш.
Undeleted мой ответ. Хотя не совсем понятно, о чем ты просишь.
Существует проект, называемый параллельным SSH, который предоставляет параллельные версии ssh, scp и rsync.
Таким образом, преимущество заключается в том, что вам не нужно делать какой-либо сценарий оболочки, вы просто предоставляете ему список серверов для запуска команды, и он будет делать это параллельно.
Это замечательно, если у вас есть длинный набор команд ssh, которые будут выполнять их все параллельно, предлагая потенциально большую скорость.
например
parallel-ssh -h myhosts.txt "echo 'hello world'"
скопировано из Сарава АК в middlewareinventory и изменено ниже
#!/bin/bash
# Script to connect to a list of servers with same username and password
# and get hostname, uptime and query installed OS version
# you would need the username and password for the remote hosts
# this requires sshpass to be installed on local machine
echo "Enter the Remote username"
read rmtuname
echo "Enter the Remote password"
read -s rmtpasswrd
# read IP addresses from a predefined host list
for server in `cat /full/path/to/serverlist.txt`
do
# Printing the remote hostlist
echo "Processing Host "$server
# Write a local shell script for temporary usage and save in current location
cat << 'EOF' > ./TestScript.sh
#!/bin/bash
echo "Running in $0"
echo "on Hostname = `hostname` and "
echo "at TimeStamp = `date` for Uptime of `uptime`"
echo "for RedHat version `cat /etc/redhat-release`"
echo "for Debian base `lsb_release -a`"
exit 0
EOF
chmod a+x TestScript.sh
# SCP - copy the script file from current location to remote server tmp location
sshpass -p$rmtpasswrd scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no TestScript.sh $rmtuname@$server:/tmp/TestScript.sh
# Take Rest for 3 Seconds
sleep 3
# SSH to remote Server and Execute a Command [ Invoke the Script ]
sshpass -p$rmtpasswrd ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $rmtuname@$server "/tmp/TestScript.sh"
done
... фрагмент результата/возврата с хоста Ubuntu выглядит так
......
Processing Host 10.0.0.99
Warning: Permanently added '10.0.0.99' (ED25519) to the list of known hosts.
Warning: Permanently added '10.0.0.99' (ED25519) to the list of known hosts.
Running in /tmp/TestScript.sh
on Hostname = UBUNTU-HOST1 and
at TimeStamp = Sat 25 Mar 14:47:57 UTC 2023 for Uptime of 14:47:57 up 15 days, 18:56, 1 user, load average: 0.28, 0.19, 0.18
cat: /etc/redhat-release: No such file or directory
for RedHat version
No LSB modules are available.
for Debian base Distributor ID: Ubuntu
Description: Ubuntu 22.04.1 LTS
Release: 22.04
Codename: jammy
Processing Host 10.0.0.110
......