That is brilliant clear, thanks.

Basically defining a task with a role safeguards you against using the
task on a server where it would'nt make any sense.

I have been thinking of tasks as a bit more abstract. For me copy
files to a apache server is a generic task but specific to webservers.
However my server list is not static and might change 3 times a day
and I have found it strange to include my server lists as part of my
capistrano program. I guess you can import an external file that
contains a list of servers and dynamically build your role members. It
boils down to how you use capistrano.

Regards

On Jan 22, 4:14 pm, Jamis Buck <[email protected]> wrote:
> On 1/22/09 4:12 AM, Gerhardus Geldenhuis wrote:
>
> > I have found this very usefull, however I do not understand the
> > difference between HOSTS and HOSTFILTER. It would be great if you
> > could explain it from another angle
>
> I'll give it another try. Consider this concrete example. Suppose your
> script defines three servers, A, B, and C. And it defines a task, "foo",
> that (by default) wants to run on A and B, but not C. Like this:
>
>   role :app, "A", "B"
>   role :web, "C"
>
>   task :foo, :roles => :app do
>     run "echo hello"
>   end
>
> Now, if you do "cap foo", it will run the echo command on both A and B.
>
> If you do "cap HOSTS=C foo", it will run the echo command on C,
> regardless of the :roles parameter to the task.
>
> If you do "cap HOSTFILTER=C foo", it will not run the echo command at
> all, because the intersection of (A B) and (C) is an empty set. (There
> are no hosts in foo's host list that match C.)
>
> If you do "cap HOSTFILTER=A foo", it will run the echo command on only
> A, because (A B) intersected with (A) is (A).
>
> Lastly, if you do "cap HOSTFILTER=A,B,C foo", it will run the echo
> command on A and B (but not C), because (A B) intersected with (A B C)
> is (A B).
>
> To summarize: HOSTS completely overrides the hosts or roles declaration
> of the task, and forces everything to run against the specified host(s).
> The HOSTFILTER, on the other hand, simply filters the existing hosts
> against the given list, choosing only those servers that are already in
> the tasks server list.
>
> Hope that's clearer,
>
> Jamis
>
>
>
> > Regards
>
> > On Jan 21, 5:03 pm, Jamis Buck <[email protected]> wrote:
> >> Try the HOSTS environment variable:
>
> >>   cap HOSTS=app2.example.com production deploy
>
> >> Note that doing this will treat app2 as being in every role, not just
> >> whichever role(s) it happens to be declared in.
>
> >> If what you want is to do a regular deploy, but only act on app2, and
> >> only as app2 is declared in your recipe file, you can use the HOSTFILTER
> >> variable instead:
>
> >>   cap HOSTFILTER=app2.example.com production deploy
>
> >> Sorry if the distinction isn't clear there. Let me know if you need more
> >> clarification as to the difference between HOSTS and HOSTFILTER.
>
> >> - Jamis
>
> >> On 1/21/09 9:54 AM, Pete Hodgson wrote:
>
> >>> Hi Folks,
> >>> I have a system in production that has several servers in serveral
> >>> roles. I would like to test a new app server by deploying to that
> >>> specific server, without having to redeploy to every server in
> >>> production. Is there a way to ask Capistrano to deploy to a specific
> >>> server? Ideally I'd like to be able to run something like cap
> >>> SERVER=app2.example.com ROLE=app production deploy if I just wanted to
> >>> deploy to app2.example.com.
> >>> I original posted this question on Stack Overflow a few days back [1]
> >>> and got a few answers, but neither solution seemed to work for me.
> >>> Hope it's not bad form to now post here.
> >>> Cheers,
> >>> Pete
> >>> [1]http://stackoverflow.com/questions/429816/how-to-deploy-to-a-single-s...
--~--~---------~--~----~------------~-------~--~----~
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