Имам клъстер от Raspberry Pi-та вкъщи, на които върви Docker Swarm. За да ги държа в крак, те използват една и съща конфигурация – потребители, версии на Docker и т.н.

Понякога някои от обновленията изискват да се изпълни едно и също нещо на всички възли в клъстера – например – създаване на нова Docker macvlan мрежа.

За да стане това, човек трябва или да изпълни ръчно едни и същи команди на всички възли, като влиза с ssh във всеки един от тях, изпълнява командите и преминава към следващия.

Тъй като се опитвам в дългосрочен план да си намалям работата и да направя нещата възможно най-подредени, започнах да търся начини да изпълнявам команди на всички възли едновременно.

Итерация 1: Собствен Python скрипт

Първата ми идея беше да напиша собствен Python скрипт. От една страна, така щях да науча Python малко по-добре, а от друга – не можах да намеря добър начин да изпълнявам команди по по-„роден“ начин.

Както може да се очаква (хей, все още имам малко опит с езика 🙂 ), много бързо се превърна в раздут хаос и беше много податлив на счупвания.

Трябваше да намеря друг начин, без да се налага да си припомням наново какво съм направил преди 3 седмици и какво се е счупило миналия път.

Итерация 2: pssh

Ровейки в Google, попаднах на [pssh](https://linux.die.net/man/1/pssh), който може да изпълнява неща паралелно през SSH.

Като цяло беше доста лесно да го пусна и да проработи.

Проблемът беше, че за част от нещата, които исках да правя, ми трябваше sudo. Подаването на пароли насам-натам не беше най-доброто решение, така че пак трябваше да потърся как да изпратя sudo паролата, когато отдалеченият сървър я поиска.

Оказва се, че е доста лесно, ако попаднеш на правилния коментар в StackOverflow.

Кратката версия е:

stty -echo; printf "Password: "; read PASS; stty echo; echo "${PASS}" | \
pssh -h <HOSTFILE> -o /tmp/output -t 0 -I "`cat ./commands.sh`"

Частта -I "`cat ./commands.sh`" трябва да се напише точно така (заобиколена с кавички и обратни кавички), иначе командите не се изпълняват правилно. Паролата ще бъде изпратена като отделна команда, а не като вход към sudo.

Другата уловка е, че заради начина, по който е направено всичко това, sudo трябва да се изпълнява с параметъра -S, за да приеме правилно паролата от входа.