Debian.pro

Блог для пользователей и администраторов Debian


Управляем пачками debian серверов. Выполняем команды разом на куче хостов. Sysadmin lifehack.

Перед прочтением этого мануала крайне советую разрешить авторизацию рутом по ключам по ssh на всех подопытных серверах (и запретить авторизацию по паролю, если беспокоитесь). Заодно не забудьте поставить fail2ban.

Иногда необходимо выполнить команду на всех серверах. У меня, например, каждый час. И как то я для этого давно завел утилиту и считаю её само собой разумеющейся. А оказалось, что про неё мало кто знает в общем-то.

В общем утилита называется DSH.

Есть у неё некоторые проблемы (было бы офигенно, если бы она перехватывала открытие ncurses-приложений и открывала их в разных фреймах screen’a…), но вот с stdout она работает прекрасно. Без проблем можно апдейтить так все машинки. Ну так вот. Начнемс. На своем любимом нетбуке-ноутбуке-десктопе ставим DSH:
root@laptop:~# aptitude install dsh

Теперь нам необходимо описать группы серверов (разделите сервера по каким то своим признакам, по которым вам необходимо выполнять на них одинаковые команды). Я заведу 2 группы — vdshosts, websrvrs.

Опишем первую группу (vdshosts). Описывать группу с таким названием нужно в файле /etc/dsh/group/vdshosts
Файл у меня получился, например, таким:
#начало файла
#помечтать не вредно же — указываем просто IP адрес:
8.8.8.8
# пользователь@IP:
root@213.213.213.213
# указываем обычный домен:
vdshost1.qs.biz
# пользователь@домен:
root@vdshost2.qs.biz
# это подойдёт, если такой сабдомен есть в вашем domain-search:
root@vdshost1

В общем в такой конфиг мы можем написать всё, что можно скормить в качестве адреса ssh демона обычной команде ssh. К сожалению, я не нашел способа указать порт (да и не надо оно мне, я ssh на 22м порту оставляю, просто ограничиваю доступ по портам). Если найдете — обязательно отпишитесь. Решение найдено, спасибо @riarheos за подсказку -) — «Алиасы» для ssh. Используем ~/.ssh/config для упрощения своей жизни.
Теперь опишем вторую группу в файле /etc/dsh/group/websrvrs (над ней уже и будем издеваться)
#начало файла
root@1
root@2
root@3
root@5
#все хосты, само собой, есть в моём domain-search.

Теперь начнем выполнять команды в нашей группе хостов websrvrs.
Для начала самое тупое:
inky@laptop:~$ dsh -g websrvrs uptime
23:46:20 up 136 days, 21:41, 0 users, load average: 2.06, 2.08, 2.08
21:46:21 up 54 days, 7:02, 0 users, load average: 1.84, 1.65, 1.57
21:46:07 up 183 days, 17:23, 0 users, load average: 0.61, 0.71, 0.56
21:47:04 up 23 days, 20:15, 0 users, load average: 1.25, 1.49, 1.84

Всё хорошо, только непонятно — с какого сервера пришел ответ. Нужно добавить ключ -M
inky@inky-laptop:~$ dsh -g websrvrs -M uptime
root@1: 23:47:39 up 136 days, 21:42, 0 users, load average: 2.10, 2.09, 2.08
root@2: 21:47:40 up 54 days, 7:04, 0 users, load average: 1.84, 1.70, 1.59
root@3: 21:47:25 up 183 days, 17:24, 0 users, load average: 0.96, 0.74, 0.57
root@5: 21:48:22 up 23 days, 20:17, 0 users, load average: 1.23, 1.43, 1.79

Так уже лучше. Но слишком медленно… Добавим ключ -c — этот ключ запускает все команды одновременно (ранее они запускались по очереди). Стоит заметить, что aptitude update всё же лучше запускать без -c, если вы недостаточно опытны, чтобы одновременно наблюдать вывод сразу 5-10 серверов.
inky@inky-laptop:~$ dsh -g websrvrs -M -c uptime
root@3: 21:53:40 up 183 days, 17:30, 0 users, load average: 0.76, 0.95, 0.75
root@2: 21:53:56 up 54 days, 7:10, 0 users, load average: 1.71, 1.64, 1.58
root@1: 23:53:57 up 136 days, 21:48, 0 users, load average: 2.13, 2.08, 2.07
root@5: 21:54:42 up 23 days, 20:23, 0 users, load average: 1.25, 1.49, 1.70

Как вы видите, хосты ответили не порядку — законнектились ко всем одновременно, но ответ получили в разном порядке.

Ну и последнее. Команду с параметрами лучше передавать в кавычках:
inky@inky-laptop:~$ dsh -g websrvrs -M -c "cat /proc/cpuinfo | grep MHz|tail -n1"
root@5: cpu MHz : 1600.000
root@3: cpu MHz : 1600.000
root@2: cpu MHz : 1600.000
root@1: cpu MHz : 1600.000

Ну и напоследок. В некоторых мануалах видел, что люди создают группу all (а-ля ручками надо перечислить там все серверы). Для этого есть файл /etc/dsh/machines.list и ключ -a

Ну вот, пользуйтесь.


Комментарии (8):

  1. спасибо, useful information,
    но пока справлялся ручками )

  2. Дмитрий :

    Реально удобная штука, не знал про нее раньше. Когда нужно на 50 серверах что-то выполнить — то, что надо. Не мешало бы сюда добавить ссылку на статью «Гуляем с сервера на сервер с одним ssh-ключом. SSH-agent forwarding» (https://debian.pro/567) для реализации варианта когда подключаешься к одному из серверов через putty c pagent

  3. vitich :

    Интересная утилита. Однако не лучше ли puppet? Он не только команды умеет, но и много чего еще.

  4. Это совершенно разные вещи.

  5. vitich :

    Я в курсе что puppet это не dsh :)
    Применительно к коментарию про 50 серверов и про ssh по ключам мне показалось уместным упомянуть про puppet т.к. лично мне управлять большим количеством машин через него удобнее, надежнее и безопаснее.

  6. Вот уж про надежность с puppet я бы поостерегся говорить.

    Надежно и безопасно — это deb-пакеты с конфигурацией. А остальное от лукавого и рано или поздно навернется к чертям.

  7. vitich :

    Инструментом пользуются и пользуются плотно.
    Но, как говорится, каждому свой инструмент по душе.
    Извечные вопросы для холиваров, к примеру, уносить ssh на нестандартный порт или просто настроить bruteblock или просто забить? И ведь каждый уверен что его вариант достаточно секьюрный, а главное правильный, т.к у нас у каждого свой уровень паранои :)

  8. > Инструментом пользуются и пользуются плотно.
    Да я вот тоже пользовался какое-то время ;) Больше не буду.

    > уносить ssh на нестандартный порт
    Паранойя здесь не при чем. ssh порт находится сканированием за примерно 4 секунды при хорошем RTT в диапазоне 1-65535. Так что перенос порта не исключает так называемый «bruteblock».
    Вешать фейковый ssh на 22 и держать настоящий ssh на другом порту ещё имеет смысл.

Написать комментарий