2009-10-21 13 views
20

In che modo le persone distribuiscono/cronjob di controllo della versione in produzione? Sono più curioso delle convenzioni/standard che le persone usano rispetto a qualsiasi soluzione particolare, ma mi capita di usare git per il controllo di revisione, e il cronjob sta eseguendo uno script python/django.Come si distribuiscono i lavori cron alla produzione?

risposta

20

Se si utilizza Fabric per deploment, è possibile aggiungere una funzione che modifica il crontab.

def add_cronjob(): 
    run('crontab -l > /tmp/crondump')    
    run('echo "@daily /path/to/dostuff.sh 2> /dev/null" >> /tmp/crondump') 
    run('crontab /tmp/crondump') 

Questo sarebbe aggiungere un annuncio nel tuo crontab (disclaimer: totalmente non testati e non molto idempotente).

  1. Salvare il crontab in un tempfile.

  2. Aggiungi una riga al file tmp.

  3. Scrivere indietro il crontab.

Questa è stata riordinata non è esattamente ciò che si vuole fare, ma in questo senso si potrebbe pensare controllando il crontab in git e sovrascrivere sul server con ogni deploy. (Se c'è un utente dedicato per il vostro progetto.)

+0

In realtà, l'utilizzo del comando append di Fabric non è idempotente se si modifica la riga cron. Finirai con la vecchia linea più la nuova linea. – Dave

+2

Ho dovuto aggiungere la sintassi per elencare crontab durante la creazione di/tmp/crondump, altrimenti si blocca (su Ubuntu atleast). (es. 'crontab -l>/tmp/crondump') – joet3ch

+0

Sto usando questo metodo per installare crontab sul mio server di produzione ma non funziona. Non fa nulla, anche se quando 'SSH' nel server e controllo' crontab -l', tutto sembra essere ok. Ho notato che se lo modifico con 'crontab -e', anche se aggiungo solo uno spazio senza significato, quando salvi il file dice" installa new crontab "e poi inizia a funzionare. Qualche idea del perché accada questo? –

1

Probabilmente si può usare qualcosa come cfengine/Chef per la distribuzione (IT possono distribuire tutto - lavoro compreso cron)

Tuttavia, se si chiede a questa domanda - che poteva è che ci sono molti server di produzione che eseguono ogni volta un numero elevato di lavori programmati. Se questo è il caso, probabilmente vuoi uno strumento che non solo può distribuire lavori, ma anche tenere traccia di errori riusciti, consentire di esaminare facilmente i registri dell'ultima esecuzione, eseguire statistiche, consentire di modificare facilmente la pianificazione per molti lavori e server contemporaneamente (a causa di manutenzione programmata ...) ecc.

Io uso uno strumento commerciale chiamato "UC4". Non lo consiglio veramente, quindi spero che tu possa trovare un programma migliore che possa risolvere lo stesso problema. Sto solo dicendo che l'amministrazione dei lavori non finisce quando li distribuisci.

0

Se si utilizza Django, dare un'occhiata allo jobs system from django-command-extensions.

I vantaggi sono che è possibile mantenere i propri lavori all'interno della struttura del progetto, con controllo della versione, scrivere tutto in Python e configurare crontab una sola volta.

8

Utilizzando Fabric, preferisco mantenere una versione pristine del mio crontab localmente, in questo modo so esattamente cosa è in produzione e posso facilmente modificare le voci oltre ad aggiungerle.

Lo script di tessuto che uso sembra qualcosa di simile (un codice redatto ad esempio prendersi cura di backup):

def deploy_crontab(): 
    put('crontab', '/tmp/crontab') 
    sudo('crontab < /tmp/crontab') 
0

Io uso Buildout per gestire i miei progetti Django. Con Buildout, io uso z3c.recipe.usercrontab per installare i lavori cron in distribuzione o aggiornamento.

1

Esistono davvero 3 opzioni di distribuzione manuale di un crontab se non è possibile connettere il sistema a un sistema di gestione della configurazione come cfengine/puppet.

È possibile utilizzare semplicemente crontab -u utente -e ma si rischia che qualcuno abbia un errore nella copia/incolla.

Si potrebbe anche copiare il file nella directory cron ma non c'è il controllo della sintassi per il file e in Linux è necessario eseguire touch/var/spool/cron in ordine per crond per pick-up le modifiche.

Nota A un certo punto tutti dimenticheranno il comando touch.

Nella mia esperienza questo metodo è il mio metodo manuale preferito di distribuzione di un crontab.

diff /var/spool/cron/<user> /var/tmp/<user>.new 
crontab -u <user> /var/tmp/<user>.new 

penso che il metodo che ho citato sopra è il migliore perché non si corre il rischio di errori di copia/incolla che ti aiuta a mantenere la coerenza con il file controllato versione. Esegue il controllo della sintassi delle attività cron all'interno del file e non sarà necessario eseguire il comando touch come se si dovesse semplicemente copiare il file.

+0

La parola "distribuzione" indica un processo interamente automatizzato. Non dovrebbero mai esserci tocchi manuali, né differenze per controllare cosa sta cambiando. Un singolo comando fa tutto, punto. (ad esempio "fab staging deploy: v1.23") –

0

Avere il progetto sotto il controllo di versione, compreso il vostro crontab.txt, è ciò che preferisco. Poi, con Fabric, è semplice come questo:

@task 
def crontab(): 
    run('crontab deployment/crontab.txt') 

Questo installerà i contenuti del deployment/crontab.txt alla crontab dell'utente che si connette al server. Se non si ha il progetto completo sul server, si desidera prima il file crontab put.

Problemi correlati