Как запускать команды на нескольких серверах через 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 нужные мне софтины.
