Cómo crear tareas personalizadas utilizando capistrano

  • por Thomas Vogt

Sobre Capistrano

Capistrano es una herramienta muy poderosa que permite automatizar deployments al trabajar en Ruby on Rails. Además, facilita el uso de comandos que interactúen con los servidores que utiliza la aplicación.

Ya existen varios tutoriales sobre cómo instalar y configurar Capistrano ( por ejemplo este ). En este artículo asumiremos que Capistrano ya está funcionando y veremos cómo crear tareas personalizadas que podrían ser de utilidad.

El directorio en el que Capistrano busca sus tareas personalizadas es:

lib/capistrano/tasks/

Es importante recalcar que los archivos que creemos deben tener extensión .rake. Para este ejemplo crearemos el archivo remote.rake

 

Ejemplo 1: Revisión de Logs

Como primer ejemplo, haremos una pequeña y simple tarea que nos permita revisar los logs de NGINX de nuestros servidores:

namespace :remote do
  desc 'Check server log'                            #Pequeña decripción de la tarea
  task :log do                                       #Comienza definición de la tarea
    log_name = ENV['LOG'] || 'error'                 #El comando puede recibir variables de ambiente
    if ['access', 'error'].include? log_name         #para saber qué log accesar y cuántas lineas
      lines = ENV['LINES'] || '100'                  #mostrar
      follow = ENV['FOLLOW']
      on roles(:app) do |host|                       #El contenido de este bloque se ejecuta en el servidor
        execute "tail /opt/nginx/logs/#{log_name}.log --lines=#{lines} #{'-f' if follow}"
      end
    else
      puts 'LOG NAME NOT VALID'
    end
  end
end

Luego, para revisar lo logs de nuetro servidor bastaría con ejecutar el comando:

cap production remote:log

 

El código de la tarea no difiere mucho de un rake task normal, fuera del siguiente bloque:

on roles(:app) do |host|
  execute "tail /opt/nginx/logs/#{log_name}.log --lines=#{lines} #{'-f' if follow}"
end

El bloque básicamente hace que en el servidor escogido se ejecute el comando tail con lo modificadores indicados. Si deseamos que un comando en particular dentro de la tarea se ejecute localmente en vez de en el servidor, debemos llamarlo fuera del bloque on roles o anteponer run_locally si está definido dentro del bloque.

 

Ejemplo 2: Descarga de Dumps

La siguiente tarea de ejemplo combina comandos ejecutados localmente con comandos ejecutados en el servidor:

namespace :remote do
  desc "Get remote dump"
  task :copy_dump do
    puts "GETTING DUMPS: ..."
    set :shell, '/usr/bin/bash'
    Dir.mkdir("#{Dir.pwd}/tmp/dumps") unless Dir.exist?("#{Dir.pwd}/tmp/dumps")
    on roles(:all) do |host|
      execute 'sh ~/scripts/generate_current_backup.sh'                   #Llamamos un script en el servidor que genera un dump actualizado de la base de datos
      execute 'ls ~/dumps'
      download! 'dumps/current.dump', "tmp/dumps/remote_current.dump"     #Descargamos el dump recién generado
    end
  end
end

Esta tarea primero revisa que localmente exista el direcotorio tmp/dumps (si no existe lo crea) y posteriormente, en el servidor, ejecuta los comandos necesarios para generar y descargar el dump.

 

Con estos dos sencillos ejemplos podemos ver cómo funcionan las tareas personalizadas de Capistrano e ir tomando más confianza para poder empezar a construir tareas más complejas, si el proyecto lo amerita.

work working GIF by NewQuest

 

Ver también:

Sitio oficial de Capistrano: http://capistranorb.com/

Repositorio en GitHub: https://github.com/capistrano/capistrano