it-swarm-ru.tech

Автоматически запускать команды через SSH на многих серверах

В файле .txt есть список IP-адресов, например:

1.1.1.1
2.2.2.2
3.3.3.3

За каждым IP-адресом есть сервер, и на каждом сервере есть sshd, работающий на порту 22. Не каждый сервер находится в known_hosts список (на моем ПК Ubuntu 10.04 LTS/bash).

Как я могу запускать команды на этих серверах и собирать вывод?

В идеале я хотел бы запускать команды параллельно на всех серверах.

Я буду использовать аутентификацию с открытым ключом на всех серверах.

Вот некоторые потенциальные подводные камни:

  • SSH побуждает меня поставить указанный ключ сервера SSH к моему known_hosts файл.
  • Данные команды могут возвращать ненулевой код выхода, что указывает на то, что вывод потенциально недействителен. Мне нужно это признать.
  • Возможно, не удалось установить соединение с данным сервером, например, из-за сетевой ошибки.
  • Должен быть тайм-аут в случае, если команда выполняется дольше, чем ожидалось, или сервер не работает во время выполнения команды.

Серверы AIX/ksh (но я думаю, что это не имеет значения.

47
LanceBaynes

Предполагая, что вы не можете установить pssh или другие программы, вы можете сделать что-то похожее на:

tmpdir=${TMPDIR:-/tmp}/pssh.$$
mkdir -p $tmpdir
count=0
while IFS= read -r userhost; do
    ssh -n -o BatchMode=yes ${userhost} 'uname -a' > ${tmpdir}/${userhost} 2>&1 &
    count=`expr $count + 1`
done < userhost.lst
while [ $count -gt 0 ]; do
    wait $pids
    count=`expr $count - 1`
done
echo "Output for hosts are in $tmpdir"
15
Arcege

Есть несколько инструментов, которые позволяют вам входить в систему и выполнять серии команд на нескольких машинах одновременно. Вот пара:

62
Caleb

Если вы в Python сценарии больше, чем bash сценарии, то Fabric может быть инструментом для вас.

С Домашняя страница Fabric :

Fabric - это библиотека библиотек и командной строки Python (2.5 или выше) для оптимизации использования SSH для задач развертывания приложений или системного администрирования.

Он предоставляет базовый набор операций для выполнения локальных или удаленных команд оболочки (обычно или через Sudo) и загрузки/выгрузки файлов, а также вспомогательные функции, такие как запрос работающего пользователя на ввод или прерывание выполнения.

Типичное использование заключается в создании Python модуля, содержащего одну или несколько функций, а затем их выполнение с помощью инструмента командной строки fab.

18
Riccardo Murri

Я использую GNU параллельно для этого, наиболее конкретно вы можете использовать это рецепт:

parallel --tag --nonall --slf your.txt command

С your.txt файл с IP-адресом/именами сервера.

11
Anthon

Очень базовая настройка:

for Host in $(cat hosts.txt); do ssh "$Host" "$command" >"output.$Host"; done

Аутентификация с именем/паролем действительно не очень хорошая идея. Вы должны установить закрытый ключ для этого:

ssh-keygen && for Host in $(cat hosts.txt); do ssh-copy-id $Host; done
8
michas

Я предлагаю Ansible.cc . Это менеджер конфигурации и диспетчер команд.

4
Tom

В проект Hypertable недавно был добавлен многостанционный ssh-инструмент. Этот инструмент построен с использованием libssh и устанавливает соединения и выдает команды асинхронно и параллельно для максимального параллелизма. Смотрите Multi-Host SSH Tool для полной документации. Чтобы запустить команду на множестве хостов, вы должны выполнить ее следующим образом:

$ ht ssh 1.1.1.1,2.2.2.2,3.3.3.3 uptime

Вы также можете указать имя хоста или шаблон IP, например:

$ ht ssh 1.1.1.[1-99] uptime
$ ht ssh Host[00-99] uptime

Он также поддерживает --random-start-delay <millis> опция, которая задержит запуск команды на каждом хосте на случайный интервал времени от 0 до <millis> миллисекунды. Эту опцию можно использовать, чтобы избежать громких проблем со стадом, когда выполняемая команда обращается к центральному ресурсу.

2
Doug judd

Я думаю, что вы ищете pssh и связанные с ним параллельные версии обычного scp, rsync и т.д.

2
unclejamil

Я создал инструмент с открытым исходным кодом под названием Overcast , чтобы упростить эту задачу.

Сначала вы определяете свои серверы:

overcast import vm.01 --ip 1.1.1.1 --ssh-key /path/to/key
overcast import vm.02 --ip 2.2.2.2 --ssh-key /path/to/key

Затем вы можете запустить несколько команд и файлов сценариев для них, последовательно или параллельно, например так:

overcast run vm.* uptime "free -m" /path/to/script --parallel
2
Andrew Childs

Я разработал collectnode Очень просто и эффективно получать задачи, выполняемые на нескольких серверах (включая Windows)

Как использовать CollectNode:

  1. Создайте список серверов для работы с:

    # cat hosts.file
    server1
    server2
    server3
    server4
    server5
    
  2. Выполните CollectNode, передавая список обслуживаний:

    collectnode --file servers.txt --command='cat /etc/httpd/conf/httpd.conf |grep ^User'
    
  3. Опционально можно фильтровать результаты, например, эта команда отображает только сервер, на котором выполнено условие.

    collectnode --file servers.txt --command='cat /etc/httpd/conf/httpd.conf |grep ^User' --where="command contain User"
    

https://collectnode.com/5-tasks-collectnode-can-help-managing-servers/

2
fvidalmolina

Просто HeadSup для действительно хороший вопрос:

Лучшее решение, которое я нашел, это, что неудивительно, tmux.

Вы можете сделать Ctrl-B: setw synchronize-panes в tmux для потрясающего результата. Для этого у вас должны быть открыты все ваши ssh-соединения в разных панелях 1 окна Tmux.

1
Mikhail Krutov

Я думаю, что "ожидать" это то, что вам нужно.
Многие люди даже не знают, что он существует. Это основанная на Tcl программа, которая будет задавать вопросы и возможные ответы от вашего имени. Посмотрите https://wiki.tcl-lang.org/page/Expect

0
Clement

Создайте файл/etc/sxx/hosts

заселить вот так:

[grp_ips]
1.1.1.1
2.2.2.2
3.3.3.3

поделитесь ключом ssh на всех машинах.

Установите sxx из пакета:

https://github.com/ericcurtin/sxx/releases

Затем выполните команду так:

sxx [email protected]_ips "whatever bash command"
0
ericcurtin

Может быть, что-то вроде этого работает, чтобы запустить команду на нескольких хостах? Предположим, что все хосты настроены в .ssh/config для входа без пароля.

$ < hosts.txt xargs -I {} ssh {} command

0
Y0NG

Используйте Paramiko http://www.paramiko.org/ и параллелизм на основе потоков https://docs.python.org/3/library/threading.html .below Код позволяет выполнять несколько команд на каждом сервере параллельно!

ssh = paramiko.SSHClient()
ssh.set_missing_Host_key_policy(paramiko.AutoAddPolicy())
ssh.load_system_Host_keys()
ssh.connect(hostname, port, username, password)
t = threading.Thread(target=tasks[index], args=(ssh, box_ip,))
t.start()

Примечание: повторите приведенные выше инструкции для каждого сервера.

0
Sharma