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

Ты всяко слышал или используешь Ansible/Puppet/Chef для размножения своего хозяйства. Молодец! Инфраструктура как код — мастхэв, но при условии, что код не превращён в кусок спутавшихся спагетти. Как показывает практика, в 99,9% случаев IaC = IaG (Infrastructure-as-Govno).

 читать первым в телеграм    читать первым в макс

Ладно, сегодня разговор не про это, сегодня поговорим про то же самое, но сбоку. Ведь одну задачу можно решать разными способами. И сегодня на повестке у нас с тобой маленький и изящный инструмент под названием Parallel SSH (PSSH).

После установки pssh в комплекте ставятся ещё такие утилиты: pscp, prsync, pnuke, pslurp. То есть из коробки у тебя ещё есть 4 инструмента, чтобы параллелить свои джобы под разные задачи.

Установка стандартная:

apt/yum/brew install pssh

После установки можешь посмотреть, что прилетело в этом пакете:

dpkg -L pssh | grep bin
parallel-nuke, parallel-rsync, parallel-scp, parallel-slurp, parallel-ssh

Для полной автоматизации тебе нужно прокинуть public SSH-ключи. Нужно взять ключ с сервера, на котором будет запускаться pssh, и положить на серверы, где будут выполняться команды.

Генерим ключик:

ssh-keygen

Закидываем ключики на хосты с помощью команды либо переносим ручками:

ssh-copy-id root@10.222.0.2
ssh-copy-id root@10.222.0.3

Если public-ключи прописаны корректно, то в дальнейшем при использовании утилит из пакета pssh не будет запрашиваться пароль. Это нам и нужно, это обычная практика.

Как пользоваться PSSH

Для начала тебе нужно создать файл инвентаря, где ты пропишешь все свои серверы, на которых нужно что-то делать:

vim ~/.pssh_hosts_1

И добавить в него, к примеру, такое:

root@10.222.0.2
root@10.222.0.3

Теперь можно запускать!

parallel-ssh -i -h ~/.pssh_hosts_1 uptime

Опа! Работает! Утилитка сходила на 2 моих сервера и притащила аптайм. Как ты заметил, я запускаю parallel-ssh, а не pssh. Чтобы запускать эти утилиты с коротким именем, нужно создать симлинки или алиасы. Это не критично, больше для удобства. Я голову не грею и запускаю с длинным именем.

У тебя могут быть несколько файлов .pssh_stage/prod/test, допустим, для прода, стейджа и тестов, тут сам уже этим наруливаешь и при запуске указываешь, какой файл инвентаря использовать через ключ -h. Ну а ключ -i выводит данные на экран.

Давай апдейтнем пакеты:

parallel-ssh -h ~/.pssh_hosts_1 -- apt -y update

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

Остальные утилиты pscp, prsync, pnuke, pslurp делают то же самое, что и их собратья, синтаксис аналогичный. К примеру, для копирования файла на несколько серверов делаем так:

parallel-scp -h ~/.pssh_hosts_1 /tmp/bs.txt /tmp

Аналогично поступаем и с другими утилитами из этого пакета:

  • pnuke = завершить процессы;
  • pslurp = скачать файлы с удалённых хостов;
  • prsync = мощнейшая штука для синка файлов туда-сюда.

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

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

Конечно, Ansible/Puppet/Chef никто не отменял, но с помощью пакета pssh ты сможешь изобрести что-то своё и, главное, тебе понятное.

Кстати, в природе существует ещё pdsh (parallel distributed shell). Но я предпочитаю именно пакет pssh, так как он включает в себя ещё 4 нужные мне софтины.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Основное рассмотрели. Похоже, пора перечитать книгу «Пиши, сокращай», но, блин, из песни слов не выкинешь. Пардон за простыню, но инфа полезная. Хорошего тебе дня!