Делаем больше с меньшими усилиями: использование утилит для быстрого запуска команд и сценариев на нескольких серверах IBM AIX

Системным администраторам приходится иметь дело все с большим количеством серверов, вследствие чего времени, которое можно посвятить работе с каждым отдельным сервером, становится все меньше. Ключевым инструментом в управлении большим количеством серверов являются специальные утилиты, позволяющие экономить время системных администраторов. Такие утилиты, как dsh и Parallel SSH, позволяют запускать (как последовательно, так и параллельно) однострочные SSH-циклы и сценарии, существенно повышая эффективность работы, особенно в крупных организациях.

Брайан Смит, системный администратор, специалист

Photo of Brian SmithБрайан Смит (Brian Smith) – системный администратор UNIX/Linux. Живет в г. Колорадо-Спрингс, штат Колорадо, с женой и двумя детьми. Брайан работал с IBM AIX последние семь лет. В его профессиональные обязанности входят работа с AIX, Linux и IBM PowerVM, написание сценариев, а также программирование на Perl. Узнать больше о Брайане и о его работе вы можете из блога Brian Smith's AIX / UNIX / Linux / Open Source blog (EN).



06.09.2013

Введение

В большинстве организаций от системных администраторов требуют сделать больше работы с меньшими затратами ресурсов. Благодаря широкому распространению технологий виртуализации (например, IBM PowerVM®), системным администраторам приходится управлять очень большим количеством серверов IBM® AIX®. Гипервизор PowerVM позволяет создавать на одном физическом сервере десяти и даже сотни виртуальных серверов IBM AIX. Несколько лет назад системным администраторам приходилось отвечать лишь за пару десятков экземпляров AIX, тогда как в наши дни рабочие среды зачастую насчитывают сотни логических серверов AIX, которыми необходимо управлять.

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


Обзор ключей SSH

Все способы, рассматриваемые в этой статье, основаны на ключах SSH, которые настраиваются на центральном сервере управления и остальных серверах.

Первый шаг заключается в выборе центрального сервера управления. Следует выбрать наиболее защищенный сервер, являющийся доступным для всех других серверов в вашей рабочей среде. Один из вариантов заключается в создании отдельного логического сервера, выделенного специально под эти задачи, и максимальном ограничении его функциональности. Другой вариант может заключаться в использовании сервера Network Installation Manager (NIM) или сервера системного мониторинга.

На следующем шаге необходимо выбрать учетную запись для использования. Многие задачи, которые вы, вероятно, захотите автоматизировать, требуют привилегий пользователя root. Однако непосредственно использовать учетную запись с привилегиями root не рекомендуется по причине потенциальных проблем с безопасностью. Хорошим решением этой проблемы является создание учетной записи с правами обычного пользователя и предоставление ей root-привилегий при помощи утилит наподобие sudo.

После того как вы определитесь с выбором центрального сервера и учетной записью, необходимо сгенерировать ключи SSH. Эта процедура описана во многих руководствах, поэтому здесь мы не будем останавливаться на этом. По сути, необходимо с помощью команды ssh-keygen создать на центральном сервере управления закрытый и открытый ключи. Закрытый ключ хранится только на центральном сервере, а открытый ключ можно скопировать на все остальные серверы.

Далее на каждом сервере необходимо создать новую учетную запись, создать в домашней директории пользователя файл ".ssh/authorized_keys" и поместить в файл открытый ключ. Если вы планируете выполнять команды, требующие привилегий root, то следует также настроить команду sudo или подобную утилиту для предоставления дополнительных привилегий. Если вы используете sudo, то используйте опцию "NOPASSWD", чтобы пользователь не получал запрос на ввод пароля.

Для проверки работоспособности ключей SSH попытайтесь с помощью команды ssh удаленно запустить на одном из серверов какую-нибудь команду, например, hostname. Если сервер называется "server1", то в ответ на команду ssh server1 hostname вы должны получить имя сервера server1. Для проверки работоспособности sudo запустите команду ssh server1 sudo su -c whoami – в ответ вы должны получить значение root.


Запуск отдельной команды на нескольких серверах с помощью простого цикла for

Одним из способов удаленного запуска команды является простой однострочный цикл. Имена серверов, на которых должна быть выполнена команда, считываются из файла. Каждая строка в этом файле содержит имя одного сервера. В листинге 1 приведен пример командной строки цикла for для запуска команды на нескольких серверах.

Листинг 1. Пример ssh-цикла for
for server in `cat serverlist`; do printf "%-20s" $server; 
ssh -q -o "BatchMode yes" $server oslevel -s 2>&1; echo; done | grep -v ^$

Разберем этот листинг подробно:

  • for server in `cat serverlist`; do – создается цикл, в котором обрабатываются все серверы из файла serverlist; имя сервера передается через переменную $server.
  • printf "%-20s" $server; – выводится имя сервера, выровненное по левому краю и дополненное пробелами. Таким образом, имена серверов и вывод результатов соответствующим образом выравниваются.
  • ssh -q -o "BatchMode yes" $server oslevel -s 2>&1; – вызов команды ssh с несколькими опциями. Опция -q отключает вывод на экран заголовка, отображаемого при подключении. Опция -o "BatchMode yes" заставляет SSH выполняться в пакетном режиме; при этом пользователь не получает никаких запросов. Переменная $server принимает различные значения и содержит имя текущего сервера, обрабатываемого в цикле for. Команда oslevel -s – это команда, которую в этом примере необходимо выполнить на удаленном сервере. Опция 2>&1 используется для перенаправления стандартного потока ошибок на устройство стандартного вывода; без этой опции порядок вывода результатов может нарушиться, если стандартный поток ошибок не буферизирован.
  • echo; – заставляет курсор перемещаться на следующую строку независимо от того, вернула ли команда какой-либо результат или нет; таким образом, имя следующего сервера всегда будет выводиться в нужном месте с новой строки. Это достигается путем использования символа возврата каретки в конце каждой строки: если вывод команды не содержит результатов, то происходит переход на новую строку, в противном случае добавляется пустая строка. Все пустые строки удаляются на следующем шаге.
  • done | grep -v ^$ – остановка цикла for и последующее удаление пустых строк из вывода.

На рисунке 1 представлен пример запуска этой командной строки с выводом результатов. Файл serverlist содержит имена всех серверов (одно имя в каждой строке), а на каждом сервере выполняется команда oslevel -s.

Рисунок 1. Пример командной строки цикла for с выводом результатов
Пример командной строки цикла for с выводом результатов

На рисунке 2 представлен пример запуска цикла for с использованием sudo и выводом результатов.

Рисунок 2. Пример командной строки цикла for с использованием sudo для получения root-привилегий и выводом результатов
Пример командной строки цикла for с использованием sudo для получения root-привилегий и выводом результатов

В примере на рисунке 2 с нескольких серверов удаляется учетная запись пользователя testuser. Привилегии пользователя root, необходимые для запуска команды rmuser, были предоставлены с помощью sudo. На серверах aixtest1 и aixtest3 не было получено никаких сообщений – это означает, что указанный пользователь был удален. На серверах aixtest2, aixtest4 и aixtest5 команда rmuser выдала ошибку, поскольку пользователя testuser не существует.

Недостаток цикла for заключается в том, что команды выполняются на серверах поочередно. Для установки SSH-соединения и выполнения несложной команды обычно требуется не менее ¼ секунды. При наличии сетевых задержек или в случае более сложных команд их выполнение может занять до нескольких секунд (или даже больше) на каждом сервере. Если вы работаете с сотнями или тысячами серверов, то использование цикла for может оказаться очень затратным по времени. Тем не менее этот метод очень прост и эффективен при небольшом количестве серверов.


Запуск сценария на нескольких серверах с помощью простого цикла for

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

Это можно сделать, например, следующим способом: скопировать сценарий на каждый сервер (например, с помощью протокола Secure Copy Protocol [SCP] или любого другого), удаленно запустить его с помощью SSH и затем при необходимости удалить с помощью другого SSH-подключения. Однако такой способ очень неэффективен, поскольку в этом случае для каждого сервера требуется выполнить несколько подключений и скопировать файл сценария.

Намного лучше использовать другой метод: запустить на удаленном сервере командный интерпретатор или интерпретатор сценариев (например, Perl) и перенаправить ему на обработку требуемый сценарий с локального сервера. Этот метод позволяет выполнять сценарии на удаленных серверах без копирования файлов.

В листинге 2 показано содержимое файла сценария info.sh, расположенного на центральном сервере управления. Этот простой сценарий определяет, является ли сервер AIX-сервером или нет. Если сервер является AIX-сервером, то выводятся его уровень ОС, режим центрального процессора и значение разрешенной мощности для него, а также количество оперативной памяти.

Листинг 2. Сценарий info.sh, расположенный на центральном сервере управления
#!/usr/bin/ksh

if [ "`uname`" = "AIX" ]; then
printf "This server is running AIX level           : "
oslevel -s
echo "CPU and Memory info: "
lparstat -i | egrep "^Mode|^Entitled Capacity  |^Online Memory"
echo "------------------------------"
else
echo "This is not an AIX server"
fi

В листинге 3 показан простой цикл for, похожий на тот, что мы рассматривали ранее. Однако в этом цикле в качестве удаленно запускаемой команды выступает командный интерпретатор Korn (ksh), а ввод перенаправляется интерпретатору ksh из файла info.sh. В результате сценарий info.sh выполняется на каждом удаленном сервере без его копирования.

Листинг 3. Пример цикла for для запуска сценария “info.sh” на всех серверах, перечисленных в списке servelist
for server in `cat serverlist`; do printf "%-20s\n" $server; 
ssh -q -o "BatchMode yes" $server 'ksh 2>&1' < ./info.sh ; echo; done | grep -v ^$

В листинге 3 показан пример цикла for для запуска локального сценария “info.sh” на каждом сервере, чье имя содержится в файле servelist; при этом копирования сценария на каждый сервер не происходит.

На рисунке 3 показан процесс выполнения этой команды, т. е. процесс выполнения сценария info.sh на каждом сервере из списка serverlist.

Рисунок 3. Использование простого цикла for для запуска сценария на удаленных серверах при помощи перенаправления ввода
Использование простого цикла for для запуска сценария на удаленных серверах при помощи перенаправления ввода

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


Сравнение последовательного и параллельного способов запуска сценариев

В рассмотренных выше примерах с циклами for команды выполнялись на удаленных серверах последовательно, т. е. сначала команда выполнялась на одном сервере, потом на следующем и т. д. Тем не менее существует возможность запускать команды параллельно, когда центральный сервер запускает их одновременно на нескольких серверах. Предположим, что вам необходимо выполнить команду на 35 серверах, а время создания SSH-подключения и выполнения этой команды составляет 1 секунду. При последовательном выполнении на это уйдет 35 секунд. Если же запускать параллельный процесс одновременно на 16 серверах, то для выполнения этой же задачи потребуется около 3 секунд (35 серверов / 16 одновременных запусков = приблизительно 3 секунды). Таким образом, параллельная обработка существенно ускоряет выполнение задач на большом количестве серверов. На рисунке 4 изображена диаграмма, на которой приводится сравнение последовательного и параллельного запуска команд.

Рисунок 4. Диаграмма, демонстрирующая разницу между последовательным и параллельным способами выполнения сценариев
Диаграмма, демонстрирующая разницу между последовательным и параллельным способами выполнения сценариев

Запуск команды на нескольких серверах при помощи dsh

В состав AIX входит команда dsh, предназначенная для параллельного запуска команд на нескольких серверах. По умолчанию команда dsh может запускать параллельно до 64 команд (настраивается с помощью флага -f).

Прежде чем приступить к использованию программы dsh, убедитесь, что она установлена на центральном сервере управления. Это можно проверить, запустив команду which dsh: если на экране отобразится путь к команде dsh, значит, она установлена. В противном случае необходимо установить либо набор файлов csm.dsh для AIX 6.1, либо наборы файлов dsm.dsh и dsm.core для AIX 7.1. соответствующие наборы файлов для AIX 6.1 или AIX 7.1 должны присутствовать на носителе с дистрибутивом AIX.

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

Листинг 4. Настройка переменных среды для команды dsh
export DSH_NODE_LIST="/home/user/serverlist"
export DSH_NODE_RSH=/usr/bin/ssh
export DSH_NODE_OPTS="-q -o BatchMode=yes"

В листинге 4 показаны переменные, которые должны быть настроены перед использованием dsh.

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

Переменной DSH_NODE_RSH следует присвоить значение /usr/bin/ssh, которое указывает dsh на использование протокола SSH.

Переменной DSH_NODE_OPTS присваивается значение -q -o BatchMode=yes, которое указывает SSH-клиенту не отображать заголовок подключения и не отправлять никаких запросов пользователям.

После настройки всех переменных среды можно использовать dsh для запуска команд на нескольких удаленных серверах. Для этого наберите dsh и далее укажите строку команд, которую необходимо запустить на каждом сервере. На рисунке 5 показан процесс выполнения команды oslevel на нескольких серверах с помощью dsh.

Рисунок 5. Выполнение команды oslevel на нескольких серверах с помощью dsh
Выполнение команды oslevel на нескольких серверах с помощью dsh

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

Рисунок 6. Форматирование вывода команды "dsh" с помощью "dshbak"
Форматирование вывода команды dsh с помощью dshbak

Запуск команд и сценариев на нескольких серверах с помощью Parallel SSH

Parallel SSH – это утилита, предназначенная для параллельного выполнения команд SSH на нескольких серверах; ее работа аналогична работе утилиты dsh. Тем не менее у Parallel SSH имеется ряд достоинств, включая кроссплатформенность (утилита работает как в Linux®, так и в различных версиях UNIX®), открытый исходный код и возможность запуска сценариев с помощью перенаправления.

Установочные пакеты Parallel SSH содержатся в репозиториях большинства дистрибутивов Linux.

Для использования Parallel SSH в AIX сначала необходимо установить Python версии 2.4 или выше. Я считаю, что программа установки Parallel SSH setup.py может оказаться сложной для запуска в AIX, и, кроме того, в этом нет необходимости. Вместо этого можно вручную скопировать двоичные файлы Parallel SSH в любое местоположение и запускать программу оттуда.

В листинге 5 показано, как можно запустить команду на нескольких удаленных серверах с помощью Parallel SSH.

Листинг 5. Пример запуска команды на нескольких серверах с помощью pssh

# pssh -h serverlist -i oslevel -s

Команда -h serverlist задает список серверов, хранящийся в файле serverlist (одно имя в каждой строке файла). Опция -i указывает, что вывод не должен выходить за границы экрана. Параметр oslevel -s – это имя команды, которую необходимо выполнить на каждом удаленном сервере.

На рисунке 7 показан вывод команды oslevel, запущенной на нескольких серверах с помощью pssh.

Рисунок 7. Запуск команды oslevel на нескольких серверах с помощью pssh
Запуск команды oslevel на нескольких серверах с помощью pssh

Утилита pssh позволяет так же легко запускать и сценарии. Для этого нет необходимости копировать файл сценария на каждый сервер, а можно воспользоваться функцией перенаправления ввода. Этот метод практически совпадает с методом, рассмотренным ранее в разделе Запуск сценария на нескольких серверах с помощью простого цикла for. Однако в данном случае все задачи выполняются параллельно, и, следовательно, намного быстрее.

В листинге 6 показан пример запуска сценария info.sh (из листинга 2) с помощью утилиты pssh.

Листинг 6. Запуск локального сценария на нескольких серверах с помощью утилиты "pssh"

# pssh -h serverlist -i -I < info.sh

Переключатель -I указывает команде pssh считать команду, которую необходимо выполнить, со стандартного устройства ввода. Опция info.sh перенаправляет сценарий info.sh на стандартное устройство ввода pssh, в результате чего сценарий выполняется на каждом сервере без необходимости его копирования.

На рисунке 8 показан вывод сценария info.sh, запущенного на нескольких серверах с помощью pssh.

Рисунок 8. Запуск сценария info.sh на нескольких серверах с помощью "pssh"
Запуск сценария info.sh на нескольких серверах с помощью pssh

Что дальше

Пакет утилит AIX dsh также содержит команду под названием dcp, позволяющую параллельно копировать или получать файлы с нескольких серверов. С ее помощью можно быстро и легко передавать файлы на множество виртуальных серверов.

Утилита Parallel SSH также содержит похожие команды для параллельного копирования. Команда pscp копирует файлы на удаленные серверы, а команда pslurp – с удаленных серверов.

На рисунке 9 показано копирование файла info.sh в директорию /tmp на несколько серверов с помощью команды pscp.

Рисунок 9. Копирование файла info.sh в директорию /tmp на несколько серверов с помощью "pscp"
Рисунок 9. Копирование файла info.sh в директорию /tmp на несколько серверов с помощью pscp

Заключение

Как видно из этой статьи, существует несколько методов запуска команд или сценариев на нескольких серверах. Системные администраторы могут использовать как простые однострочные циклы, последовательно запускающие указанную команду или сценарий на каждом сервере, так и утилиты для параллельного запуска команд (например, dsh и Parallel SSH). Использование этих утилит и методов позволяет системным администраторам работать более эффективно и выполнять больше задач за меньшее время.


Ресурсы

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=AIX и UNIX
ArticleID=943671
ArticleTitle=Делаем больше с меньшими усилиями: использование утилит для быстрого запуска команд и сценариев на нескольких серверах IBM AIX
publish-date=09062013