Лучший способ перебрать список серверов

Я регулярно делаю вещи, где перебираю список серверов, чтобы предпринять какие-то действия. Например:

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
......
Другие вопросы по тегам