Linux, эквивалентный удаленному взаимодействию PowerShell «один ко многим»

38

Исходя из администрирования Windows, я хочу углубиться в Linux (Debian). Один из моих острых вопросов, на которые я не смог ответить при поиске в Интернете (не нашел его): как мне добиться так называемого удаленного взаимодействия «один ко многим», как в PowerShell для Windows?

Чтобы разбить его на основы, я бы сказал:

Мой взгляд на Linux:

  • Я могу SSH на сервер и введите мою команду
  • Я получаю результат. Для среды из 10 серверов мне нужно было бы написать (perl / python?) Скрипт, отправляющий команду для каждого из них?

Мой опыт работы с Windows:

  1. Я набираю свою команду и с помощью «invoke-command» могу «отправить» ее на несколько серверов (возможно, из текстового файла), чтобы выполнить одновременно и получить результат обратно (как объект для дальнейшей работы).

  2. Я даже могу установить несколько сеансов, соединение поддерживается в фоновом режиме, и выборочно отправлять команды на эти сеансы и удаленно входить и выходить, как мне нужно.

(Я слышал о поваре, марионетке и т. Д. Это что-то подобное?)


Update 2019:
После многих попыток - я предлагаю Rex (см. Этот комментарий ниже ) - простую настройку (для этого просто нужен ssh, больше ничего) и использование (если вы знаете немного Perl, это даже лучше, но это необязательно)
с Rex (ify ) вы можете выполнить команду adhoc и перейти к реальному управлению конфигурацией (... это означает, что это КМ, в первую очередь, но также хорош для задач adhoc). Сайт кажется устаревшим, но в настоящее время (по состоянию на 01/2019) он активно развивается, и IRC-канал также активен.

С новым openssh Windows есть еще больше возможностей

можешь попробовать: rex -u user -p password -H 192.168.1.3 -e 'say run "hostname"'

Eli
источник
параллельный ssh ​​может сделать это: serverfault.com/questions/2533/…
rogerdpack
MobaXTerm поддерживает «многократное выполнение» во многих сеансах ssh: mobaxterm.mobatek.net/features.html (прокрутите вниз). Кроме того, если вашей основной рабочей станцией является Windows, это также довольно приятный инструмент для подключения к Linux-системам и многое другое.
Кев
с tmux: :setw synchronize-panes on( unix.stackexchange.com/a/124800/161003 )
eli

Ответы:

50

Резюме

  • Ansible - это инструмент DevOps, который является мощной заменой PowerShell
  • RunDeck в качестве графического интерфейса удобен
  • Некоторые люди запускают RunDeck + Ansible вместе

ClusterSSH

Для отправки удаленных команд на несколько серверов, для начинающих я бы порекомендовал clusterssh

Чтобы установить clustersshв Debian:

apt-get install clusterssh

Еще один кластерный урок :

ClusterSSH - это оболочка Tk / Perl для стандартных инструментов Linux, таких как XTerm и SSH. Таким образом, он будет работать практически на любой POSIX-совместимой ОС, где есть библиотеки - я запускаю его на Linux, Solaris и Mac OS X. Требуются библиотеки Perl Tk (perl-tk в Debian или Ubuntu) и X11 :: Protocol (libx11-protocol-perl в Debian или Ubuntu), в дополнение к xterm и OpenSSH.

анзибль

Что касается удаленной инфраструктуры для администрирования нескольких систем, Ansible является очень интересной альтернативой Puppet. Он более бережный, и ему не нужны выделенные удаленные агенты, так как он работает через SSH (он также был куплен RedHat)

Playbooks более сложны, чем параметры командной строки.

Однако, чтобы начать использовать Ansible, вам нужна простая установка и настройка текстового файла списка клиентов.

После этого, чтобы выполнить команду на всех серверах, это так же просто, как сделать:

ansible all -m command -a "uptime"

Вывод также очень хорошо отформатирован и разделен для каждого правила / сервера, и во время работы в фоновом режиме его можно перенаправить в файл и просмотреть позже.

Вы можете начать с простых правил, и использование Ansible будет становиться все интереснее по мере того, как вы будете расти в Linux, и ваша инфраструктура станет больше. Как таковой он будет делать гораздо больше, чем PowerShell.

Например, очень простая Playbook для обновления серверов Linux, которую я написал:

---
- hosts: all
  become: yes
  gather_facts: False
  tasks:
   - name: updates a server
     apt: update_cache=yes
   - name: upgrade a server
     apt: upgrade=full

Он также имеет много определенных модулей, которые позволяют вам легко создавать комплексные политики.

Индекс модуля - Ansible Documentation

У него также есть интересный официальный хаб / «социальная» сеть репозиториев для поиска уже сделанных политиками сообщества. Галактика

Ansible также широко используется, и вы найдете множество проектов в github, например, этот от меня для установки FreeRadius .

Хотя Ansible является бесплатной платформой с открытым исходным кодом, она также имеет платный интерфейс веб-панели, Ansible Tower, хотя лицензирование довольно дорогое.

В настоящее время, после того, как RedHat купил его, Tower также имеет версию с открытым исходным кодом, известную как AWX .

В качестве бонуса, Ansible также способен администрировать серверы Windows, хотя я никогда не использовал его для этого.

Он также способен администрировать сетевое оборудование (маршрутизаторы, коммутаторы и брандмауэры), что делает его очень интересным решением для автоматизации под ключ.

Как установить Ansible

Rundeck

Еще раз, для удаленного фреймворка, более легкого в использовании, но не настолько мощного, как Ansible, я рекомендую Rundeck .

Это очень мощный графический интерфейс для нескольких пользователей и входа в систему, в котором вы можете автоматизировать многие из ваших обычных повседневных задач и даже предоставлять расширенные представления системным администраторам или сотрудникам службы поддержки.

При запуске команд также отображаются окна с выходными данными, разбитыми по серверу / задаче.

Он может беспрепятственно выполнять несколько заданий в фоновом режиме и позволяет просматривать отчет и выводить его позже.

изображение rundeck

Как установить RunDeck

Обратите внимание, что есть люди, использующие Ansible + RunDeck в качестве веб-интерфейса; не все дела присваиваются для этого.

Само собой разумеется, что использование Ansible и / или RunDeck может быть истолковано как форма или часть документации инфраструктуры, и со временем позволяет копировать и улучшать действия / рецепты / Playbooks.

Наконец, говоря о центральном командном сервере, я бы создал его для этой задачи. На самом деле технический термин - прыжковая коробка. «Ящики для прыжков» повышают безопасность, если вы правильно их настроили .

Руи Ф Рибейро
источник
1
Ansible - отличное решение по сравнению с некоторым скриптом или утилитой, которая просто передает команду нескольким SSH-серверам. Ansible делает это (и лучше подходит для этой цели, чем Puppet или Chef), но также дает вам возможность достичь своей цели лучшим способом, например, используя встроенный модуль для установки чего-то идемпотентно, а не просто посылая команду установки и надеяться на лучшее.
Дж.Бентли
24

Если вы хотите сделать это в интерактивном режиме, вы можете использовать, terminatorкоторый позволяет транслировать команду на несколько терминалов.

введите описание изображения здесь

См .: Как запустить одну и ту же команду linux в нескольких вкладках / оболочке одновременно?

jlliagre
источник
Очень раздражает, когда вы случайно нажали на ярлык для этой функции ... :)
труба
tmux:set sync on
12

Вы также можете использовать pssh(или parallel-ssh), который является SSH-клиентом, который подключается к списку хостов и выполняет команду на всех хостах параллельно:

$ parallel-ssh -i -H "host1 host2" uname -a
[1] 11:37:12 [SUCCESS] host2
Linux host2 3.19.0-25-generic #26~14.04.1-Ubuntu SMP Fri Jul 24 21:16:20 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[2] 11:37:12 [SUCCESS] host1
Linux host1 3.19.0-25-generic #26~14.04.1-Ubuntu SMP Fri Jul 24 21:16:20 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
morxa
источник
11

Возможно, вы можете достичь своей цели с помощью простой функции zsh (bash). Допустим, у вас есть серверы l61, l62, l63, и вам часто нужно запустить на них команду:

function run_on_cluster()
{
    (for srv in l61 l62 l63;
    do
        echo "ssh $srv $1";
    done) | parallel --gnu
}

Итак, в командной строке:

$ run_on_cluster "uname -r"
2.6.32-279.el6.x86_64
2.6.32-279.el6.x86_64
2.6.32-504.23.4.el6.x86_64
Сергей Куренков
источник
5
Я бы порекомендовал распечатать имена серверов перед их выводом. Параллельный запуск сценария также приводит к другим причудам, таким как обработка выходных данных сценария - необходимо принять дополнительные меры для сохранения активности выходных данных. Запуск каждой задачи на переднем плане также предлагает возможность минимального взаимодействия ввода.
Руи Ф Рибейру
3

Если вы используете KDE, вот другой метод.
- Откройте окно Konsole.
Для каждого сервера, с которым вы хотите установить связь:
- открыть вкладку
- установить ssh-соединение с сервером.
В меню «Редактировать» выбрать «копировать ввод» во «все вкладки».

Каждая команда, которую вы вводите на этой вкладке, будет скопирована на все серверы.
Вы можете переключаться с вкладки на вкладку, чтобы посмотреть на разные результаты.

Примечание: мои ярлыки меню (в кавычках) могут быть неправильными, так как я не использую английскую версию KDE

user161210
источник
1

Параллельный GNU

Он позволяет использовать простые однострочники с сохраненными настройками, поэтому вы можете создать профиль «prod», который будет содержать список серверов и общие параметры. Затем просто добавьте нужную команду, и вы готовы. Он также может копировать файлы в сервер и автоматически удалить их в конце, и это довольно удобно для еще больших сценариев. Также это очень быстро.

Единственная проблема в том, что у него так много опций;) Но документация также включает в себя множество примеров, так что вы можете просто посмотреть на них в начале.

alkuzad
источник
2
Привет, добро пожаловать в Linux и Linux. Кто-то уже давал скрипт, используя gnu-параллельный пример. Я советую вам осмотреться, более сложные ответы приветствуются и дадут вам больше очков.
Руи Ф. Рибейру
1
@RuiFRibeiro извините, я не заметил, ТАК андроид приложение глючит с кодовыми полями, и я не мог видеть большую часть контента (он генерирует пустой пробел). Вы упомянули, что GNU-параллель - неуклюжий вывод - он может записать его по порядку, но вы должны сказать это для этого :)
alkuzad
Да, я не знаком с этим, но уже подозревал, что, следовательно, упоминание ответа нуждается в улучшении. Спасибо. Ничто не мешает вам написать лучший ответ вокруг этого, однако для комментариев я рекомендую комментировать в этом ответе.
Руи Ф Рибейро
1

Я также хочу упомянуть «Рекс» здесь: https://www.rexify.org/

Это потрясающий инструмент, использующий perl + ssh (аутентификация пользователя / пароля или ключа), и поскольку perl установлен в каждой (?!) Системе linux, я думаю, что он кажется более естественным в использовании (он имеет некоторые сходства с Ansible & Co.)

вы можете запускать команды adhoc на нескольких серверах одновременно (server1, server2, server ... - после настройки аутентификации или в качестве альтернативы использовать параметры -p / -u и -s / -S для выполнения команды sudo):

$ rex -H "server[1..3]" -e 'say run "uptime"'

или создайте файл, в котором вы указываете различные «задачи» и вызываете их оттуда

$ rex -f myConfigFile.rex uptime

Его можно установить через репозитории или даже с помощью perls cpan (или cpanm Rex), и его первоначальная настройка проста, см .:
- https://www.rexify.org/ или
- https://www.rexify.org/docs/guides/. start_using__r__ex.html и
- http://www.admin-magazine.com/Archive/2014/21/First-steps-in-IT-automation-by-Rex

Eli
источник