Имам клъстер от 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, за да приеме правилно паролата от входа.