Лучший способ перебрать список серверов
Я регулярно делаю вещи, где перебираю список серверов, чтобы предпринять какие-то действия. Например:
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
......