Taller de Capistrano

Embed Size (px)

Citation preview

Qu es Capistrano?

Segn la Wikipedia:Capistrano is an open source tool for running scripts on multiple servers; its main use is deploying web applications. It automates the process of making a new version of an application available on one or more web servers, including supporting tasks such as changing databases. ...

http://en.wikipedia.org/wiki/Capistrano

Qu es Capistrano?

Se puede usar para: - Despliegue de aplicaciones - Instalacin de software - Monitorizacin Ad-hoc - Ejecucin en paralelo

Por defecto nos ofrece: - Soporte consistente para diferentes sistemas de control de versiones. - Tareas tipo Rake - Transacciones - Capacidad de detectar y hacer rollback de tareas fallidas....

Puede automatizar cualquier* comando SSH

Se puede usar para: - Despliegue de aplicaciones - Instalacin de software - Monitorizacin Ad-hoc - Ejecucin en paralelo

Regreso al pasado

...son las tantas de la tarde...

...tienes ganas de dejarlo por hoy...

...has quedado para tomar algo...

...peeero...!

Te toca Despliegue...

colgar cartel de cerrado... parar servicios... actualizar cdigo... ejecutar migraciones... reiniciar otros servicios... volver a arrancar... quitar cartel el cartel de cerrado...

Ejecutas comandos... bueno lo intentas... repite la operacin... sale mal de nuevo...El parche milagroso que intentaba instalar no funciona!

Regreso al pasado

Introduccin

...Gota de sudor fro por la sien...

...Taquicardia...

...ansiedad...

...

SOCORRO!!

Regreso al pasado

Pasado

Application Deployment with Rails Posted by Jamis on July 14, 2005 @ 12:48 PM

Introducing SwitchTower Posted by Jamis on August 05, 2005 @ 05:43 PM

SwitchTower: Renamed Posted by Jamis on March 05, 2006 @ 05:49 PM

Net::SSH, Capistrano, and Saying Goodbye Posted by Jamis on February 24, 2009 @ 09:38 PM

Regreso al pasado

Presente

Presente

Lee Hambley

@leehambley

Actualmente trabaja en Xing AG

E-Mail: [email protected]: http://lee.hambley.name/

Presente

Lee Hambley

E-Mail: [email protected]: http://lee.hambley.name/

Estructura de Capistrano

$ gem dependency capistrano

Gem capistrano-2.5.10 net-ssh (>= 2.0.14, runtime) net-sftp (>= 2.0.0, runtime) net-scp (>= 1.0.0, runtime) net-ssh-gateway (>= 1.0.0, runtime) highline (>= 0, runtime) mocha (>= 0, development)

- Implementacin en Ruby del protocolo SSH - Respeta tu configuracin (~/.ssh/config) - Soporta tneles, gateway, agent, forwarding,... - Sintaxis superclara

Instalacin

$ gem install capistrano

Instalacin

$ mkdir foo$ capify foo

Capfile carga las tareas por defecto y las de los plugins (si existiese alguna)

En deploy.rb ponemos en los roles vapor.aspgems.com y usuario el que corresponda

Ejecucin de tareas

En nuestro deploy.rb:task :whoami dorun 'whoami'end

$ cap whoami

Ejecucin de tareas

Nuestra segunda tarea:task :whatispolitics dorun 'whatis politics'end

$ cap whatispolitics

Tareas encadenadas

task :freespace dorun 'df -h'endtask :my_files_usagedorun 'cd ~ ; du -h'end

Tareas encadenadas

$ cap freespace my_files_usage

Tareas encadenadas

task 'check-ruby-version' docmd = 'ruby --version'local_ruby = run_locally(cmd)remote_ruby = capture(cmd)unless local_ruby == remote_rubywarn "Warning: Different Ruby Versions:\nwarn Local: #{local_ruby} Remote: #{remote_ruby}"exit(1)endend$ cap freespace check-ruby-version my_files_usage

run_locally ejecuta un comando localmente capture ejecuta el comando en una sola mquina y guarda la salida. warn,info, fatal son mtodos de la clase Logger. El nombre de la tarea es un string. Esto es ruby seores!

Para en la segunda tarea toda la ejecucin

Tareas encadenadas

$ cap freespace whatispolitics my_files_usage

Tareas encadenadas

Para siempre* en la primera tarea que falla

Listados de tareas

$ cap -T$ cap -vT$ cap -e deploy$ cap -e my_files_usage

Dnde estn mis tareas?Ah estnProbamos cap -e whoami

Listados de tareas

desc Muestra el espacio libretask :freespace dorun 'df -h'enddesc Mis ficheros ocupan...task :my_files_usagedorun 'cd ~ ; du -h'end

Vamos a ponerle remedio a esta situacin

Listados de tareas

$ cap -T$ cap -vT$ cap -e my_files_usage

Definir tareas nuevas

La manera mas simple:task :whoami dorun 'whoami'end

Definir tareas nuevas

Limitando por roles:

task :whoami, :roles => [:web,:app] dorun 'whoami'end

String o smbolo(para un solo rol), o array de strings o smbolos

Definir tareas nuevas

Limitando por hosts:

task :whoami, :hosts => '[email protected]' dorun 'whoami'end

String o smbolo(para un solo rol), o array de strings o smbolos

Definir tareas nuevas

Otras opciones::max_hosts => 3:on_error => :continue:except => [:no_release => true]:only => [:master => true]

Namespaces

Ejemplos:namespace :deploy dotask :enable_everything do deploy.web.enableendend

Los namespaces se introdujeron en la versin 2 de capistranoSon la herramienta que nos ofrece Capistrano para diferenciar nuestras tareas de otras con el mismo nombre.

Namespaces

namespace :deploy dotask :enable_everything dodeploy.web.enableendnamespace :web dotask :enable, :roles => :web do# endendend

Namespaces

Cmo invocamos las tareas?

after "deploy:migrate", "deploy:web:enable"

task :enable_everything dodeploy.web.enableend

Cuando hacemos referencia a una tarea lo hacemos por medio de un string: Las tareas pueden ser invocadas como mtodos. Simplemente cambiando los ":" por "."

Roles

Como definir los roles:

role :role_name, 'host1'role : role_name2, 'host2', 'host3'

El mtodo role es la manera de asociar uno o varias mquinas a un rol.

Roles

role :web, 'web.mor.org'role :app, 'app1.mor.org', 'app2.mor.org'

task :some_task, :role => :web do# runs only on web serverend

task :some_other_task, :role => :app do# runs on both app servers in parallelend

task :global_task do# runs on all three servers in parallelend

Roles

Filtrando hosts con except/only:

role :db, "db.mor.org", :master => true

task :migrate, :roles => :db, :only => { :master => true } do# end

La terminal es nuestra amiga...
y como hablar con ella

Run

Ejecuta el comando en uno o mas servidores:

run "uptime"run "#{sudo} apachectl restart"

run "ln -s config/mailer-$CAPISTRANO:HOST$.conf \ /app/config/initializer/mailer.conf"

Admite las opciones que vimos en roles (:hosts, :roles, :only, :except, :once,...)

The run action is used to execute commands on one or more servers. It can be used to execute arbitrary shell commands, including any POSIX shell script syntax.

Capture

Helper usado para capturar la salida de comandos(en un servidor):

version = capture("cat /u/apps/mor/current/REVISION")

Se ejecuta en un solo server!!

Stream

Captura la salida de comandos con mucho texto (por ej. tail o grep):

stream "#{sudo} tail -f /var/log/apache2/access.log"

stream "ls -l / 2>&1"

Prompts

set(:scm_username) do capistrano::CLI.ui.ask("Type your svn username: ")end

set(:scm_password) doCapistrano::CLI.password_prompt("Type your svn password: ")End

Subiendo! - Upload

Transfiere ficheros/directorios de localhost a servidores remotos:

upload 'mailer.yml', 'config/initiliazer/mailer.yml'

Puede ser configurado para usar SFTP o SCP Opciones que acepta: :mode (acepta octal y permisos del tipo +x) y :via (:scp y :sfp)

Subiendo! - Put

Sube el contenido de una cadena como un fichero:

config = { "adapter" => "mysql","database" => "mor_prod","host" => "db.mor","username" => "mor","password" => "mor-password" }

put config.to_yaml, "/apps/mor/current/config/database.yml"

Puede ser configurado para usar SFTP o SCP Opciones que acepta: :mode (acepta octal y permisos del tipo +x) y :via (:scp y :sfp)

Bajando! - Download

Todo lo contrario a upload :)

download(/"etc/hosts", "downloads/hosts-$CAPISTRANO:HOST$")

Opciones que acepta: :via (:scp y :sfp)

Bajando! - Get

Transfiere un fichero de un solo servidor remoto a nuestra mquina local:

get "/etc/hosts", "downloads/hosts"

download "/etc/hosts", "downloads/hosts", :once => true

Stdout, stderror, ...

task 'passenger-install-apache2-module' dorun 'passenger-install-apache2-module' do |channel, stream, data|break if stream == :errif data =~ /Press Enter to continue/channel.send('\n')elsif data =~ /Which Ruby would you like to install against?/channel.send('/opt/local/bin/ruby1.9')else # Capistrano::Configuration.default_io_proc.call[channel, stream, output]puts '#{channel[:host]}: #{data}' endendend

El camino del Deploy

El camino del Deploy

1. capify2. cap deploy:setup3. cap deploy:check4. cap deploy:cold5. cap deploy

El camino del Deploy

1. capify2. cap deploy:setup3. cap deploy:check4. cap deploy:cold5. cap deploy

El camino del Deploy

Setup bsico de deploy.rb

1. capify2. cap deploy:setup3. cap deploy:check4. cap deploy:cold5. cap deploy

El camino del Deploy

Mostramos los directorios generados

1. capify2. cap deploy:setup3. cap deploy:check4. cap deploy:cold5. cap deploy

El camino del Deploy

1. capify2. cap deploy:setup3. cap deploy:check4. cap deploy:cold5. cap deploy

El camino del Deploy

cap deploy:migrationscap deploy:rollbackcap deploy:cleanup

El camino del Deploy

Checkout (por defecto)ExportCopyRemote CacheSCM none

Estrategias

http://github.com/rgo/capistrano-generic-template

Una receta mejorada

Keep releasesTemplates (database y mailer)Config files linksAssets links

Preguntas?

Gracias!

ENLACES DE INTERS

Capistrano http://capify.org

Capistrano Mailing listhttp://groups.google.co.uk/group/capistrano

APIhttp://www.capify.org/index.php/API_Documentation

Capistrano at your commandhttp://www.slideshare.net/leehambley/intermediate-capistrano

Commanding your SSH universe with Capistranohttp://en.oreilly.com/oscon2008/public/schedule/detail/3087