Alternatywy dla cron'a

Teoretycznie to poszukiwanie oprogramowania, ale mam wrażenie, że osoby odwiedzające ten dział będą bardziej wiedziały o co mi chodzi :wink:

Mam kilka serwerów z Debianem. Chodzi tam webserwer, parę aplikacji i cron do synchronizacji, backupów itd.
Serwery są identyczne i chciałbym, żeby miały identyczne harmonogramy crona. Obecnie kopiuję crontab do pliku i wczytuję go na każdym serwerze ręcznie. Wolałbym obsłużyć to przy pomocy gita, tak, żeby zmiana skryptu była rozpropagowana automatycznie, a crontab odpowiednio zmodyfikowany.

Testowałem hcron ale nie potrafię go uruchomić, dokumentacja jest w postaci niepełnego i chaotycznego wiki oraz pdfa który też pokazuje raczej koncepcję, a nie konkretne zastosowania.

Czy ma ktoś jakieś propozycje na alternatywy? Ważne, żeby było to lekkie, proste, zdolne do synchronizacji w oparciu o pliki.

Jeśli niczego lepszego nie znajdę, zawsze mogę zrobić link do /var/spool/cron/crontabs, dostosować odpowiednio uprawnienia i zarządzać w ten sposób - ale mam wrażenie, że to bardziej hack niż rozwiązanie problemu.

Z góry dziękuję za propozycje!

Chcesz synchronizować przy pomocy github lub własnego serwera git?

Jeśli tak to musiałbyś na każdej maszynie zainstalować klienta gita no i stworzyć skrypt bashowy uruchamiany z crona.
Skrypt musiałby git clone do jakiegoś tymczasowego miejsca i podmienić crontaba na aktualną wersję. Oczywiście w crontabie musisz mieć zawsze dodane wywoływanie tego skryptu.

Własny serwer gita. To akurat żaden problem, synchronizuję w ten sposób pliki na webserwerach - cron uruchamia git pull i gotowe.
Chcę po prostu mieć osobne repozytorium na skrypty cron’a - i mechanizm, który to ładnie obsłuży.

No to zakładasz kolejne repo na serwerze do którego będziesz pushował zmiany, a na serwerach piszesz skrypt bashowy który albo robi git clone z konkretnego adresu, albo git pull dla istniejącego repo. Tylko albo musisz takie repo zawsze utworzyć, albo zrobić bardziej inteligenty skrypt który wykryje czy ma już lokalne repo czy nie, i jeśli nie będzie go miał to zrobi git clone.
Dlatego wydaje mi się że prościej za każdym razem zrobić git clone do tymczasowej ścieżki i kasować pliki niż komplikować sam skrypt.
No i oczywiście po pobraniu nowych wersji gita podmieniasz zadania crona tym samym skryptem na te nowe.

Wydaje mi się, że lepszym rozwiązaniem byłby zwykły skrypt odpalający rsync, czy inny wget, bo po co ci na każdej maszynie wersjonowanie tych plików?

Spokojnie, jednorazowo mogę zrobić git clone ręcznie - zresztą sprawdzenie, czy repozytorium istnieje jest proste - także z poziomu skryptu bashowego.
Lokalne repozytorium gita dla konfiguracji jest bardzo ważne, bo w razie czego można przywrócić poprzednią, działającą wersję, wprowadzić lokalne zmiany które będą się merge’owały z tymi z remote itd.

Bardziej interesuje mnie to, czy istnieje prosta alternatywa dla crona z podejściem plikowym, tzn. że crontab nie jest w jednym pliku, tylko znajduje się w hierarchii plików. Dzięki temu zarządzanie jest łatwiejsze, bo struktura jest przejrzysta i łatwiej jest dodać nowy plik lokalnie (jeśli chcemy robić na tym serwerze coś jeszcze) niż robić zmiany w istniejącym pliku i przy każdym pobraniu konfiguracji z serwera tracić tą zmianę albo merge’ować. Coś takiego zapewniał teoretycznie właśnie hcron - ale niestety poległem przy konfiguracji.

EDIT - zobaczcie zresztą na ten artykuł w PDF który pokazuje strukturę wpisu hcrona oraz proponowaną strukturę katalogów - https://expl.info/display/HCRON/Downloads?preview=/1048591/1310722/hcron_article-20101019.pdf

Nie bawił bym się w takim przypadku z jakimiś alternatywami tylko sam zdecentralizował crontaba.
Mam ty na myśli zostawienie crontab w spokoju i dodanie tam tylko jednego wpisu wywołującego skrypt basha co 1 min. np. (w zależności od potrzeb).
Skrypt by sprawdzał załóżmy pierwszy komentarz w danym pliku skryptu zawierający datę/godzinę wykonania np. przy pomocy grep.
Ponieważ jest to serwer to niepotrzebne są uruchomienia asynchroniczne jak np. w przypadku komputerów, które są nieregularnie włączane/wyłączane.

Czyli podsumowując masz w crontabie zdefiniowany skrypt typu “checker” wywoływany, co określony czas, który sprawdza obecność nowych rzeczy do uruchomienia i pobiera z komentarza już samego uruchamianego skryptu definicję, kiedy ma być to wykonane.
Jeżeli porównywana data/czas się zgadza z obecnym to następuje wywołanie tego skryptu.

I na tym się pewnie skończy. Udało mi się jeszcze znaleźć grupę dyskusyjną projektu (co jest trochę na wyrost, jeśli chodzi o dyskusję, bo większość to wpisy autora o wydaniu nowej wersji i może ze 3 tematy od innych użytkowników, praktycznie bez aktywności). Napisałem do autora, zobaczymy czy coś poradzi.

Możesz też pójść na całość i zainteresować się frameworkami do zarządzania środowiskami wieloserwerowymi, jak Ansible (polecam, bo jest bezagentowy), Chef albo Puppet. Zazwyczaj masz jeden centralny serwer, na którym definiujesz, co, gdzie, kiedy i jak ma się dziać, a ten w odpowiedni sposób łączy się z “podopiecznymi” i robi, co trzeba.
Przyznaję, próg wejścia nie jest najniższy, ale każda z tych technologii ma przeogromny potencjał i pozwala zautomatyzować praktycznie wszystko, co można zrobić z poziomu konsoli.

Ok, z pomocą autora programu, udało mi się odpalić hcrona. Spróbuję teraz ubrać to ładnie w repozytorium gita i zobaczymy jak to zadziała. Może nawet skrobnę jakiś poradnik jak to ładnie skonfigurować? Zobaczymy - w każdym razie dziękuję za pomoc i podsunięte pomysły. Na pewno przydadzą się komuś z podobnym problemem :slight_smile: