Одновременное выполнение команд на нескольких серверах


Бывают ситуации, когда администратору необходимо собрать информацию сразу же с нескольких серверов, или администратор обслуживает ряд однотипных серверов, на которых должны выполняться одни и те же изменения. В AIX для подобных операций предусмотрена команда dsh, работающая поверх rsh или ssh.

Для работы с dsh сначала необходимо выбрать тот механизм, который будет использоваться в дальнейшем – ssh или rsh. В случае с rsh, Вам необходимо на всех необходимых серверах прописать файл /etc/hosts.equiv или /.rhosts. Для работы через ssh, необходмио сгенерировать ключи и разложить их по серверам.

После этого прописываем в /etc/environment необходимые переменные окружения:

DSH_NODE_RSH=/usr/bin/ssh
DSH_NODE_RCP=/usr/bin/scp

WCOLL=/etc/dsh.nodes

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

DSH_NODE_RCP – определяет команду, которая будет использоваться для копирования файлов на другие сервера.

WCOLL – определяет файл, в котором хранится список серверов.

После того, как определены все переменные, необходимо в файле, который определен переменной WCOLL, указать все необходимые сервера:

$ cat >$WCOLL

server1

server2

server3

server4

server5

server6

^D

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

server:/$ dsh ls -l /unix
server1: lrwxrwxrwx    1 root     system           21 Jan 22 10:27 /unix -> /usr/lib/boot/unix_64
server2: lrwxrwxrwx    1 root     system           21 Jan 28 19:01 /unix -> /usr/lib/boot/unix_64
server3: lrwxrwxrwx    1 root     system           21 Jan 22 10:30 /unix -> /usr/lib/boot/unix_64
server4: lrwxrwxrwx    1 root     system           21 Jan 28 18:59 /unix -> /usr/lib/boot/unix_64
server5: lrwxrwxrwx    1 root     system           21 Jan 28 19:01 /unix -> /usr/lib/boot/unix_64
server6: lrwxrwxrwx    1 root     system           21 Jan 22 10:32 /unix -> /usr/lib/boot/unix_64

Чтобы результат выглядел чуть более привлекательно для окружающих, можно воспользоваться специальным фильтром – dshbak:

server:/$ dsh ls -l /unix | dshbak
HOST: server1
———————————-
lrwxrwxrwx    1 root     system           21 Jan 22 10:30 /unix -> /usr/lib/boot/unix_64

HOST: server2
———————————-
lrwxrwxrwx    1 root     system           21 Jan 22 10:32 /unix -> /usr/lib/boot/unix_64

HOST: server3
———————————-
lrwxrwxrwx    1 root     system           21 Jan 28 19:01 /unix -> /usr/lib/boot/unix_64

HOST: server4
———————————-
lrwxrwxrwx    1 root     system           21 Jan 28 19:01 /unix -> /usr/lib/boot/unix_64

HOST: server5
———————————-
lrwxrwxrwx    1 root     system           21 Jan 22 10:27 /unix -> /usr/lib/boot/unix_64

HOST: server6
———————————-
lrwxrwxrwx    1 root     system           21 Jan 28 18:59 /unix -> /usr/lib/boot/unix_64

Теперь рассмотрим более интересный случай, который в моей практике встречается гораздо чаще, чем ls -l /unix. Нам необходимо выполнить на всех серверах некий скрипт. Стандартный подход – пишем скрипт, раскидываем его по всем серверам, затем запускаем на каждом из сервере и, если он нам больше не нужен, удаляем его. dsh позволяет немного сократить этот процесс, но к сожалению, от написания скрипта Вас никто не избавит 😉

$ cat >hello.sh

#!/bin/ksh

echo "Hello, world!"

^D

$ chmod +x hello.sh

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

$ dsh -e hello.sh | dshbak

HOST: server1
———————————-
Hello, wolrd!

HOST: server2
———————————-
Hello, wolrd!

HOST: server3
———————————-
Hello, wolrd!

HOST: server4
———————————-
Hello, wolrd!

HOST: server5
———————————-
Hello, wolrd!

Что делать, если нам необходимо сегодня выполнить команду не на всех серверах, а только на двух? Воспользоваться еще одним ключом dsh, который позволяет указывать конкретные серверах, на которых надо запустить команду:

$ dsh -n server3,server5 ls -l /unix | dshbak

HOST: server3

———————————-
lrwxrwxrwx    1 root     system           21 Jan 22 10:30 /unix -> /usr/lib/boot/unix_64

HOST: server5
———————————-
lrwxrwxrwx    1 root     system           21 Jan 28 18:59 /unix -> /usr/lib/boot/unix_64

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

$ mkdir /etc/dsh

$ export DSH_NODEGROUP_PATH=/etc/dsh

$ cat >/etc/dsh/group1

server1

server2

^D

$ cat >/etc/dsh/group2

server3

server4

^D

Теперь можно сказать dsh, для какой группы серверов надо выполнить команду:

$ dsh -N group1 ls -l /unix | dshbak
HOST: server1
———————————-
lrwxrwxrwx    1 root     system           21 Jan 22 10:27 /unix -> /usr/lib/boot/unix_64

HOST: server2
———————————-
lrwxrwxrwx    1 root     system           21 Jan 28 18:59 /unix -> /usr/lib/boot/unix_64
 

Оставьте комментарий