Бывают ситуации, когда администратору необходимо собрать информацию сразу же с нескольких серверов, или администратор обслуживает ряд однотипных серверов, на которых должны выполняться одни и те же изменения. В 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