В файле .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 (но я думаю, что это не имеет значения.
ssh
scripting
parallelism
LanceBaynes
источник
источник
Ответы:
Предполагая, что вы не можете установить pssh или другие программы, вы можете сделать что-то похожее на:
источник
-o StrictHostKeyChecking=no
чтобы избежать этого. Однако лучше сначала сканировать все серверы из командной строки, чтобы можно было добавить ключи хоста.wait
восстанавливает эти ресурсы, включая код возврата процесса (как вышли процессы). Затем, если позже в программе вы поместите другой процесс, скажем, сжатие, в фоновом режиме и должны ждать его, то без этого цикла ожидание вернет одну из завершенных программ ssh, а не сжатие, которое может бегать Вы получите статус возврата на неправильный дочерний процесс. Хорошо убирать за собой.Есть несколько инструментов, которые позволяют вам входить в систему и выполнять серии команд на нескольких машинах одновременно. Вот пара:
источник
Если вы занимаетесь написанием скриптов на Python больше, чем
bash
написанием скриптов, то Fabric может стать для вас инструментом.С домашней страницы Fabric :
источник
Я использую для этого параллельный GNU , в частности, вы можете использовать этот рецепт:
Имея
your.txt
файл с IP-адресом / именами сервера.источник
ssh
, но вам нужен какой-то способ входа на другие компьютеры, и эти способы раньше были менее безопасными (напримерrsh
). Вы не описываете, что вы используете сейчас, чтобы перейти от машины к машине (telnet
?,rsh
?).Очень базовая настройка:
Аутентификация с именем / паролем действительно не очень хорошая идея. Вы должны установить закрытый ключ для этого:
источник
ssh $host $command
для каждого хоста. Попробуйте запустить эти команды вручную, чтобы узнать, что происходит.Я предлагаю Ansible.cc . Это менеджер конфигурации и диспетчер команд.
источник
Я думаю, что вы ищете pssh и связанные с ним параллельные версии обычного scp, rsync и т. Д.
источник
Я создал инструмент с открытым исходным кодом под названием Overcast, чтобы упростить эту задачу.
Сначала вы определяете свои серверы:
Затем вы можете запустить несколько команд и файлов сценариев для них, последовательно или параллельно, например так:
источник
В проекте Hypertable недавно был добавлен многостанционный ssh-инструмент. Этот инструмент построен на libssh и устанавливает соединения и выдает команды асинхронно и параллельно для максимального параллелизма. См. Multi-Host SSH Tool для полной документации. Чтобы запустить команду на множестве хостов, вы должны выполнить ее следующим образом:
Вы также можете указать имя хоста или шаблон IP, например:
Он также поддерживает
--random-start-delay <millis>
параметр, который будет задерживать запуск команды на каждом хосте на случайный интервал времени от 0 до<millis>
миллисекунд. Эту опцию можно использовать, чтобы избежать громких проблем со стадом, когда выполняемая команда обращается к центральному ресурсу.источник
Я разработал Collectnode, очень простой и эффективный для выполнения задач на нескольких серверах (включая Windows)
Как использовать CollectNode:
Создайте список серверов для работы с:
Выполните CollectNode, передавая список обслуживаний:
Опционально можно отфильтровать результаты, например, эта команда отображает только сервер, на котором выполняется условие.
https://collectnode.com/5-tasks-collectnode-can-help-managing-servers/
источник
Просто HeadSup для действительно хорошего вопроса:
Лучшее решение, которое я нашел, это, что неудивительно, tmux.
Вы можете сделать Ctrl-B: setw synchronize-panes в tmux для потрясающего результата. Для этого у вас должны быть открыты все ваши ssh-соединения в разных панелях 1 окна Tmux.
источник
Может быть, что-то вроде этого работает, чтобы запустить команду на нескольких хостах? Предположим, что все хосты настроены в .ssh / config для входа без пароля.
$ < hosts.txt xargs -I {} ssh {} command
источник
Создайте файл / etc / sxx / hosts
заселить вот так:
поделитесь ключом ssh на всех машинах.
Установите sxx из пакета:
https://github.com/ericcurtin/sxx/releases
Затем запустите команду так:
источник
Использование http://www.paramiko.org/ Paramiko и параллелизма на основе потоков https://docs.python.org/3/library/threading.html .below позволяет выполнять несколько команд на каждом сервере параллельно!
Примечание: повторите приведенные выше инструкции для каждого сервера.
источник
Я думаю «ожидать» - это то, что вам нужно.
Многие люди даже не знают, что он существует. Это основанная на Tcl программа, которая будет задавать вопросы и возможные ответы от вашего имени. Загляните на https://wiki.tcl-lang.org/page/Expect
источник