In the spirit of iterative development I found yet another problem
with this strategy.  Cap doesn't like it when a task is executed with
a role/extra information spec that isn't defined.  I'm using other
tasks to assign server names to roles (ie. "cap production deploy" and
"cap stage deploy").  Some of those environments don't have any
Solaris servers.  So I decided to use a variation on your second
suggested method:

## redefine restart to check for solaris vs non
task :restart, :roles => :app do
  run <<-CMD
  if [ \`uname\` == \"SunOS\" ]; then svcadm restart network/mongrel/
ideeli; else mongrel_rails cluster::restart -C #{mongrel_conf}; fi
  CMD
end


Thanks for your help,

Mark

On Apr 5, 11:47 am, Jamis Buck <[EMAIL PROTECTED]> wrote:
> On Apr 5, 2007, at 8:15 AM, maui wrote:
>
> > The first solution works well for me as I don't plan on running both
> > types of servers in production by the time we launch.  However, I'm
> > running into a problem whereby the restart task is calling
> > restart_solaris and restart_other as expected but both are executing.
> > For some reason the :except seems to be ignored.  Is there some way to
> > turn on debugging output to figure out what is going on?
>
> Can you paste the role definitions and task definitions from your
> deploy.rb here? Or, if there is anything sensitive there, feel free
> to email it to me directly, and I'll take a look.
>
> - Jamis
>
>
>
> > On Apr 4, 2:23 pm, Jamis Buck <[EMAIL PROTECTED]> wrote:
> >> And, _actually_, there's an even better way to do it. (Why do I
> >> always think of these things after opening my mouth?)
>
> >> The problem with the solution I gave you is that the restarts will
> >> happen serially, instead of in parallel. First, the solaris servers
> >> will restart, and then the others.
>
> >> A cleaner way to do it is to package your custom restart code in a
> >> script that detects the OS on which it is executing and "does the
> >> right thing." Then, your restart task just needs to call that script,
> >> and all servers will execute it, choosing the branch that works for
> >> them, and the restarts occur in parallel again:
>
> >>    task :restart, :roles => :app do
> >>      run "#{current_path}/script/restart"
> >>    end
>
> >> I'd give the script/restart script here, too, but my shell-fu is
> >> limited enough that I can't do it off the top of my head. I'll leave
> >> it as an exercise for the reader. :)
>
> >> - Jamis
>
> >> On Apr 4, 2007, at 12:10 PM, maui wrote:
>
> >>> Very cool!
>
> >>> Thank You Jamis
>
> >>> On Apr 4, 12:51 pm, Jamis Buck <[EMAIL PROTECTED]> wrote:
> >>>> On Apr 4, 2007, at 9:03 AM, maui wrote:
>
> >>>>> Hi everyone,
>
> >>>>> Over here we're using multiple OSs for our rails app.  Our dev
> >>>>> env is
> >>>>> on a FreeBSD box and we're using TextDrive Accelerators for
> >>>>> deployment
> >>>>> (OpenSolaris).  As a result we need to customize a few of our
> >>>>> tasks
> >>>>> based on the server type.  One idea we had was to use extra
> >>>>> information to indicate which servers are running OpenSolaris.
> >>>>> For
> >>>>> example s1.foo.com is running FreeBSD and s1.foo.com is running
> >>>>> Solaris.
>
> >>>>> role :app, "s1.foo.com"
> >>>>> role :app, "s2.foo.com", :solaris => true
>
> >>>>> So, the question is can a task see which server it is being
> >>>>> executed
> >>>>> on?  For instance:
>
> >>>>> task :restart do
> >>>>>   if <extra information for this server hash>[:solaris]
> >>>>>     run 'svcadm restart /network/mongrel'
> >>>>>   else
> >>>>>     mongrel_rails cluster::restart
> >>>>>   end
> >>>>> end
>
> >>>>> Does the magic code in angle brackets above exist?
>
> >>>> Mark, no, because the task is not executed once for each server,
> >>>> but
> >>>> once for all matching servers. The "right" way to do that would
> >>>> be to
> >>>> put the different parts in different tasks, and put the
> >>>> condition on
> >>>> the task:
>
> >>>>    task :restart do
> >>>>      restart_solaris
> >>>>      restart_other
> >>>>    end
>
> >>>>    task :restart_solaris, :only => { :solaris => true } do
> >>>>      run 'svcadm restart /network/mongrel'
> >>>>    end
>
> >>>>    task :restart_other, :except => { :solaris => true } do
> >>>>      run "mongrel_rails cluster::restart"
> >>>>    end
>
> >>>> Hope that helps,
>
> >>>> Jamis


--~--~---------~--~----~------------~-------~--~----~
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/capistrano
-~----------~----~----~----~------~----~------~--~---

Reply via email to