If you can't read please download the document
Upload
rafael-garcia
View
2.492
Download
2
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