Hey Doug,
I finally found some time today to do dig into capistrano souce code to
check some assumptions around this. Your config helped steer the focus.
I first want to amend what I said (guessed) a couple posts above. So having
the following in your config:
server '<server_ip>', user: 'deploy', roles: %w{web app}
server '<server_ip>', user: 'deploy', roles: %w{db}
It turns out capistrano does treat this as a *single* server (note the user
and server ip are the same)!
- here's the
method<https://github.com/capistrano/capistrano/blob/master/lib/capistrano/configuration/servers.rb#L9-11>that
adds a new server
- the above method invokes this
one<https://github.com/capistrano/capistrano/blob/master/lib/capistrano/configuration/servers.rb#L33-35>.
It
checks if the server is already added, or returns a new server.
Doug, your config:
role :app, %w{<myUser>@apps2.aidt.edu}
role :web, %w{<myUser>@apps2.aidt.edu}
role :db, %w{<myUser>@apps2.aidt.edu}
should also be recognized as a *single* server with 3 roles (app, web, db)!
Tasks should not be executed redundantly 3 times.
I was playing with these configs on one of my apps and I could confirm
that: even if there are multiple `server` or `role` declarations -
capistrano will "merge" them if they have the same user, hostname and port.
Also, here's an idea how to use the 'postgres' user for the db role:
set the DB role to 'no_release'. That way, the db role does not have to
worry about checking git strategy.
Invoking `cap staging git:check --trace` for the below setup passed for my
test app. I'm able to reproduce your issue when `no_relase: true` setting
is removed.
role :app, %w{<myUser>@apps2.aidt.edu}
role :web, %w{<myUser>@apps2.aidt.edu}
role :db, %w{[email protected]}, no_release: true
Or maybe just leave things as-is since they're working LOL.
Anyway, sorry for the misinformation from the previous posts. This
investigation helped me a bit to understand how capistrano works from the
inside, hopefully it was informative to you too.
Bruno
On Thursday, April 24, 2014 4:33:55 PM UTC+2, Doug Hall wrote:
>
> You were close. I actually commented out my server definition, because of
> what the comments said. Here is my current deploy/staging.rb file, minus a
> few <variables>.
> # ------------
> set :rails_env, 'staging' # For some reason, this is not being set
> automatically.
>
> role :app, %w{<myUser>@apps2.aidt.edu}
> role :web, %w{<myUser>@apps2.aidt.edu}
> role :db, %w{<myUser>@apps2.aidt.edu}
>
> # Extended Server Syntax
> # ======================
> # This can be used to drop a more detailed server definition into the
> # server list. The second argument is a, or duck-types, Hash and is
> # used to set extended properties on the server.
>
> # server 'example.com', user: 'deploy', roles: %w{web app}, my_property:
> :my_value
>
> #--------------
>
> As you can see, the "server" line is commented out, because I didn't need
> to set any server-specific variables.
>
> Web/App and DB roles are all on the same server. My problem was that I had
> set the db role to the "postgres" user, because postgresql "best practices"
> say to do so. (This isolates the database from the web user, making it
> ostensibly more secure.) So now, my setup works, but is less secure. I
> don't really have any more questions, but maybe this clarification will
> help someone else. If there's an advantage to using a single "server"
> definition, as you prescribed, over what I did, let me know.
>
> Thanks,
> Doug
>
> On Tuesday, April 22, 2014 4:33:13 PM UTC-5, Bruno Sutic wrote:
>>
>> Hey Doug,
>> I'm glad things work now.
>>
>> I'm not 100% what's going on with your setup, but it seems as if you have
>> multiple `server` declarations in you stage file (ie.
>> config/deploy/production.rb), even though you're deploying only to 1 server.
>> Care to provide the config files you're using in a gist? (deploy.rb and a
>> stage file)
>>
>> Generally, if you're deploying to a single server, something like this
>> should be fine for your stage file:
>>
>> server '<server_ip>', user: 'deploy', roles: %w{web app db}
>>
>> Now, (and I'm doing a bit of guessing here) if you have something like
>> this in your setup:
>>
>> server '<server_ip>', user: 'deploy', roles: %w{web app}
>> server '<server_ip>', user: 'deploy', roles: %w{db}
>>
>> even though you're deploying to the same server, with the same user -
>> capistrano won't know that. It will assume 2 different servers are at play
>> and will do everything twice: once for each server definition.
>> I hope it's kinda obvious Capistrano doesn't perform any checks if there
>> are "duplicate" servers. That's left for us humans to do :)
>>
>> About the "no release" question:
>> I never used that "feature", but here's the example use case in
>> capistrano tests:
>>
>> https://github.com/bruno-/capistrano/blob/tweak_revision_log/spec/integration/dsl_spec.rb#L18
>> If you're not explicitly specifying `no_release` option, I'd say you're
>> fine and all your servers/roles are "release_roles".
>>
>> Hope I helped and pls provide your config files if you have more
>> questions!
>>
>> Bruno
>>
>> On Tuesday, April 22, 2014 12:05:56 AM UTC+2, Doug Hall wrote:
>>>
>>> I changed my db user to be the same as my app/web user, and that worked.
>>> But, this creates more questions.
>>>
>>> I was under the impression that it was only going to try to upload it by
>>> user two, if it failed under user one. From what I could tell of my log, it
>>> failed on the first two roles (app/web) and then succeeded under the db
>>> role.
>>>
>>> Are you saying that, if you say to do something with all roles, then
>>> it's going to do that task with ALL roles, even if it can do it with the
>>> first one? Here is the task in question from the git.rake file:
>>>
>>>
>>> desc 'Upload the git wrapper script, this script guarantees that we
>>> can script git without getting an interactive prompt'
>>> task :wrapper do
>>> on release_roles :all do
>>> execute :mkdir, "-p", "#{fetch(:tmp_dir)}/#{fetch(:application)}/"
>>> upload! StringIO.new("#!/bin/sh -e\nexec /usr/bin/ssh -o
>>> PasswordAuthentication=no -o StrictHostKeyChecking=no \"$@\"\n"),
>>> "#{fetch(:tmp_dir)}/#{fetch(:application)}/git-ssh.sh"
>>> execute :chmod, "+x",
>>> "#{fetch(:tmp_dir)}/#{fetch(:application)}/git-ssh.sh"
>>> end
>>> end
>>>
>>> The way I understand what you're telling me is, it's executing the task
>>> under EACH of the "release_roles". Why? It makes no freaking sense to do
>>> the same thing with multiple logins. If the app/web user has permissions to
>>> do what it needs to do, why would it possibly do the same thing with the db
>>> role?
>>>
>>> How do I determine what the release roles are, by the way?
>>>
>>> Thanks!
>>>
>>> On Monday, April 21, 2014 3:30:45 PM UTC-5, Bruno Sutic wrote:
>>>>
>>>> Hey,
>>>> hm.. that's gotta be frustrating..
>>>> So hey - how far along did you go with this issue?
>>>> https://github.com/capistrano/capistrano/issues/687
>>>>
>>>> That issue seems to indicate the problem:
>>>> - you're using 2 separate users for web/app and db group
>>>> - user 1 uploads the git-ssh.sh file and "chmod's" it.
>>>> - user 2 uploads the git-ssh.sh file. Things break apart here because
>>>> file already exists (created by/for user 1). The trace provided above
>>>> indicates this happens: see it fails just after trying to upload
>>>> git-ssh.sh
>>>> script *for the second time*.
>>>>
>>>> How about you first try doing everything with 1 user and see what
>>>> happens?
>>>>
>>>> On Monday, April 21, 2014 5:16:29 PM UTC+2, Doug Hall wrote:
>>>>>
>>>>> I can ssh into my server and manually create the /tmp/<application>
>>>>> folder with my app/web role. However, when I try to do >cap staging
>>>>> git:check (which does the same thing), it attempts and fails to use my
>>>>> app/web role to create this folder. It succeeds with the db role, but
>>>>> then
>>>>> fails when attempting to use the /tmp/<application>/.git-ssh.sh at the
>>>>> end
>>>>> of the script. (See below) Both my app/web and db roles are members of
>>>>> the
>>>>> same (deploy) group.
>>>>>
>>>>> I then simply manually created the /tmp/<application> folder on the
>>>>> server, to make sure that the folder's owner and group settings would
>>>>> permit executing the ./git-ssh.sh file, whomever created it. This didn't
>>>>> work, either. I'd appreciate any help.
>>>>>
>>>>>
>>>>> I found this: <https://github.com/capistrano/capistrano/issues/687>,
>>>>> but it wasn't helpful. Something's got to be wrong with my ssh setup or
>>>>> something. Here are my ssh options:
>>>>>
>>>>> set :ssh_options, {
>>>>> forward_agent: true,
>>>>> port: ####
>>>>> }
>>>>>
>>>>> Yes, I've done the ssh-add on my Mac.
>>>>>
>>>>> Thanks!
>>>>>
>>>>>
>>>>>
>>>>> Versions:
>>>>>
>>>>> - Ruby: 2.1.0
>>>>> - Capistrano: 3.2.0
>>>>> - Rake / Rails / etc : 10.2.2
>>>>>
>>>>> Platform:
>>>>>
>>>>> - Working on.... Mac
>>>>> - Deploying to... Ubuntu 12.0.4 (LTS) server
>>>>>
>>>>> Logs:
>>>>>
>>>>> $ cap staging git:check --trace
>>>>> [9:23:58]
>>>>> ** Invoke staging (first_time)
>>>>> ** Execute staging
>>>>> ** Invoke load:defaults (first_time)
>>>>> ** Execute load:defaults
>>>>> ** Invoke rbenv:validate (first_time)
>>>>> ** Execute rbenv:validate
>>>>> DEBUG [fa95292a] Running /usr/bin/env [ ! -d /usr/local/bin ] on
>>>>> apps2.aidt.edu
>>>>> DEBUG [fa95292a] Command: [ ! -d /usr/local/bin ]
>>>>> DEBUG [f90faa17] Running /usr/bin/env [ ! -d /usr/local/bin ] on
>>>>> apps2.aidt.edu
>>>>> DEBUG [f90faa17] Command: [ ! -d /usr/local/bin ]
>>>>> DEBUG [fa95292a] Finished in 0.097 seconds with exit status 1 (failed).
>>>>> DEBUG [f90faa17] Finished in 0.167 seconds with exit status 1 (failed).
>>>>> ** Invoke rbenv:map_bins (first_time)
>>>>> ** Execute rbenv:map_bins
>>>>> ** Invoke bundler:map_bins (first_time)
>>>>> ** Execute bundler:map_bins
>>>>> ** Invoke git:check (first_time)
>>>>> ** Invoke git:wrapper (first_time)
>>>>> ** Execute git:wrapper
>>>>> INFO [f6132a7c] Running /usr/bin/env mkdir -p /tmp/j3/ on
>>>>> apps2.aidt.edu
>>>>> INFO [e631d419] Running /usr/bin/env mkdir -p /tmp/j3/ on
>>>>> apps2.aidt.edu
>>>>> DEBUG [f6132a7c] Command: ( RBENV_ROOT=~/.rbenv RBENV_VERSION=2.1.0
>>>>> /usr/bin/env mkdir -p /tmp/j3/ )
>>>>> DEBUG [e631d419] Command: ( RBENV_ROOT=~/.rbenv RBENV_VERSION=2.1.0
>>>>> /usr/bin/env mkdir -p /tmp/j3/ )
>>>>> INFO [f6132a7c] Finished in 0.108 seconds with exit status 0
>>>>> (successful).
>>>>> DEBUG Uploading /tmp/j3/git-ssh.sh 0.0%
>>>>> INFO Uploading /tmp/j3/git-ssh.sh 100.0%
>>>>> INFO [06c59e05] Running /usr/bin/env chmod +x /tmp/j3/git-ssh.sh on
>>>>> apps2.aidt.edu
>>>>> DEBUG [06c59e05] Command: ( RBENV_ROOT=~/.rbenv RBENV_VERSION=2.1.0
>>>>> /usr/bin/env chmod +x /tmp/j3/git-ssh.sh )
>>>>> INFO [06c59e05] Finished in 0.010 seconds with exit status 0
>>>>> (successful).
>>>>> INFO [e631d419] Finished in 0.173 seconds with exit status 0
>>>>> (successful).
>>>>> DEBUG Uploading /tmp/j3/git-ssh.sh 0.0%
>>>>> cap aborted!
>>>>> scp: /tmp/j3/git-ssh.sh: Permission denied
>>>>>
>>>>>
--
You received this message because you are subscribed to the Google Groups
"Capistrano" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web, visit
https://groups.google.com/d/msgid/capistrano/f38929ff-6615-44fc-8b5a-d7fd08401419%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.