Alternatywy dla cron'a


(hindus) #1

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!


(Fizyda) #2

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.


(hindus) #3

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.


(Fizyda) #4

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.


(pocolog) #5

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?


(hindus) #6

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


(Domker) #7

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.


(hindus) #8

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.


(Frankfurterium) #9

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.


(hindus) #10

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: