Pregunta

¿Cómo implementan / controlan las versiones los cronjobs de producción? Tengo más curiosidad por las convenciones / estándares que la gente usa que cualquier solución en particular, pero estoy usando git para el control de revisión, y el cronjob está ejecutando un script python / django.

¿Fue útil?

Solución

Si está utilizando Fabric para deploment, puede agregar una función que edite su 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')

Esto agregaría un trabajo a su crontab (descargo de responsabilidad: totalmente no probado y poco idempotente).

  1. Guarde el crontab en un archivo temporal.

  2. Añade una línea al archivo tmp.

  3. Escribe el crontab de vuelta.

Es probable que esto no sea exactamente lo que quiere hacer, pero en ese sentido, podría pensar en colocar el crontab en git y sobrescribirlo en el servidor con cada implementación. (si hay un usuario dedicado para su proyecto).

Otros consejos

Usando Fabric, prefiero mantener una versión prístina de mi crontab localmente, de esa manera sé exactamente qué hay en producción y puedo editar entradas fácilmente además de agregarlas.

El script de estructura que utilizo se parece a esto (algo de código redactado, por ejemplo, al cuidar las copias de seguridad):

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

También puedes echar un vistazo a:

http: // django- fab-deploy.readthedocs.org/en/0.7.5/_modules/fab_deploy/crontab.html#crontab_update

El módulo django-fab-deploy tiene una serie de scripts convenientes que incluyen crontab_set y crontab_update

Probablemente pueda usar algo como CFEngine / Chef para la implementación (puede implementar todo, incluidos los trabajos cron)

Sin embargo, si hace esta pregunta, es posible que tenga muchos servidores de producción que ejecuten una gran cantidad de trabajos programados. Si este es el caso, es probable que desee una herramienta que no solo pueda implementar trabajos, sino que también haga un seguimiento del fracaso del éxito, le permita ver fácilmente los registros de la última ejecución, ejecutar estadísticas, permitirle cambiar fácilmente la programación de muchos trabajos y servidores a la vez (debido al mantenimiento planeado ...) etc.

Utilizo una herramienta comercial llamada "UC4". Realmente no lo recomiendo, así que espero que puedas encontrar un mejor programa que pueda resolver el mismo problema. Solo digo que la administración de trabajos no termina cuando los implementa.

En realidad, hay 3 opciones para implementar manualmente un crontab si no puede conectar su sistema a un sistema de gestión de configuración como cfengine / puppet.

Simplemente puede usar crontab -u usuario -e pero corre el riesgo de que alguien cometa un error al copiar / pegar.

También puede copiar el archivo en el directorio cron pero no hay verificación de sintaxis para el archivo y en Linux debe ejecutar touch / var / spool / cron para que crond pueda recoger los cambios .

Nota Todos olvidarán el comando táctil en algún momento.

En mi experiencia, este método es mi forma manual favorita de implementar un crontab.

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

Creo que el método que mencioné anteriormente es el mejor porque no corre el riesgo de copiar / pegar errores, lo que le ayuda a mantener la coherencia con su archivo de versión controlada. Realiza la verificación de sintaxis de las tareas cron dentro del archivo, y no necesitará ejecutar el comando táctil como lo haría si simplemente copiara el archivo.

Si está utilizando Django, eche un vistazo a los empleos sistema de django-command-extensiones .

Los beneficios son que puede mantener sus trabajos dentro de la estructura de su proyecto, con el control de versiones, escribir todo en Python y configurar Crontab solo una vez.

Uso Buildout para administrar mis proyectos de Django. Con Buildout, uso z3c.recipe.usercrontab para instalar trabajos cron en despliegue o actualización.

Tener tu proyecto bajo control de versión, incluido tu crontab.txt, es lo que prefiero. Luego, con Fabric , es tan simple como esto:

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

Esto instalará el contenido de deployment / crontab.txt en el crontab del usuario que se conecta al servidor. Si no tiene su proyecto completo en el servidor, primero querrá poner el archivo crontab.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top