What exactly is a "role" in Capistrano?

Ruby on-RailsRubyCapistrano

Ruby on-Rails Problem Overview


What is the purpose and function of "roles" in a Capistrano recipe? When I look at sample recipes, I often see something like this:

role :app, 'somedomain.com'
role :web, 'somedomain.com'
role :db,  'somedomain.com', :primary => true

So it looks like a role is basically a server where Capistrano executes commands. If that's the case, then why would it be called a "role" rather than a "host" or "server"?

In the above example, what is the difference between the :app and :web roles?

What does the :primary => true option do?

Ruby on-Rails Solutions


Solution 1 - Ruby on-Rails

Roles allow you to write capistrano tasks that only apply to certain servers. This really only applies to multi-server deployments. The default roles of "app", "web", and "db" are also used internally, so their presence is not optional (AFAIK)

In the sample you provided, there is no functional difference.

The ":primary => true" is an attribute that allows for further granularity in specifying servers in custom tasks.

Here is an example of role specification in a task definition:

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

See the capistrano website @ https://github.com/capistrano/capistrano/wiki/2.x-DSL-Configuration-Roles-Role for a more extensive explanation.

Solution 2 - Ruby on-Rails

The ":primary => true" option indicates that the database server is primary server. This is important for when you want to use replication with MySQL, for example. It allows you to create another mirrored database server that can be used for automatic failover. It's also used for deciding on which database server the model migrations should be run (as those changes will be replicated to the failover servers). This link clarifies it a bit more: https://github.com/capistrano/capistrano/wiki/2.x-from-the-beginning#back-to-configuration

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionEthanView Question on Stackoverflow
Solution 1 - Ruby on-RailscodeprimateView Answer on Stackoverflow
Solution 2 - Ruby on-RailsBobby WallaceView Answer on Stackoverflow