Как создать Perl-скрипт для доступа ко многим хостам и обновления или выполнения пользовательских заданий - PullRequest
0 голосов
/ 19 октября 2018

Итак, раз в неделю или месяц мы проводим обновление на многих серверных машинах.Иногда достаточно Git pull, иногда обновление SVN, иногда происходят изменения в базе данных.Или сочетание тех.Также есть этот проект, который имеет много маленьких серверов, которые имеют очень упрощенную версию нашей системы и очень ненадежный интернет.Иногда это может быть сделано с одного из серверов, иногда с локальных рабочих компьютеров.

Я бы хотел немного упростить нашу работу, пройдя все наши серверы и выполнив соответствующие действия.Я нашел несколько полезных пакетов Perl: Net :: SSH :: Perl и Net :: SSH :: Expect;Net :: SSH :: Perl подводит меня.Также я не узнал, как использовать команду cmd подряд.Например:

my $ssh = Net::SSH::Perl->new($host);
$ssh->login($user, $pass);

my($stdout, $stderr, $exit) = $ssh->cmd('cd web/scripts && ls -la ');
warn Dumper $stdout;

my($stdout, $stderr, $exit) = $ssh->cmd('ls -la');
warn Dumper $stdout;

Команды 2 ls -la возвращают разные результаты.Насколько я понимаю (и это объясняется в документации), ssh выполняет команду и затем завершает работу.Говорят, что я мог бы использовать версию SSH 2 протокола SSH (или что-то подобное), и у меня не должно быть этой проблемы, но она сохраняется (или я не понимаю, как ее использовать).

Такжеесли у меня спрашивают пароль (например, если я запускаю mysql -u user -p), я не могу его предоставить.Я пробовал это с $ssh->cmd($cmd, [ $stdin ]), второй вариант, но безрезультатно.MySQL является лишь примером.Возможно, я захочу добавить IP-адрес к /etc/hosts и получить запрос на ввод пароля su или svn update файла и запросить пароль SVN.Я знаю, что большинство этих процессов можно настроить так, чтобы они не запрашивали пароли, но мы хотим, чтобы они запрашивали пароль.

Опция $ssh->shell, похоже, поможет, но когда я делаю что-то вроде этого:

$ssh->shell();`ls -la`;

команда с обратной косой чертой не отправляется в ssh-shell.На самом деле я понятия не имею, куда он идет или делает ли что-нибудь.

Net :: SSH :: Expect дает сбой при плохом интернет-соединении.

Для целей MySQL я создал скрипт Perl, который устанавливает соединения с каждым другим хостом и вносит измененияЯ хочу.Но было бы замечательно, если бы я мог сделать все это в одном сценарии.

Я был бы очень признателен, чтобы получить некоторое понимание этой темы.

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

На чистом Perl-сервере у вас также есть Rex, см. rexify Web-сайт Это своего рода Ansible, у него есть ssh, параллельная работа и множество функций, но более жутко.Хорошо, это проще, чем Ansible, но стоит попробовать.

0 голосов
/ 19 октября 2018

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

Вы можете создать свое собственное управление конфигурацией с помощью perl, но с помощью команд raw(которые не требуют python в удаленной системе) или более полноценных модулей (которые делают) уже реализованы и используют тот же подход.Сделайте себе одолжение - не изобретайте это колесо.

Ansible далек от совершенства, но он очень хорошо подходит для вашего случая использования.

Я лично запускаю его из док-контейнера, потому что история установки пакета в python почти такая же плохая, как в Perl: P

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...