1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
module LeapCli; module Util; module RemoteCommand
extend self
#
# FYI
# Capistrano::Logger::IMPORTANT = 0
# Capistrano::Logger::INFO = 1
# Capistrano::Logger::DEBUG = 2
# Capistrano::Logger::TRACE = 3
#
def ssh_connect(nodes, options={}, &block)
node_list = parse_node_list(nodes)
cap = new_capistrano
cap.logger = LeapCli::Logger.new(:level => LeapCli.log_level)
user = options[:user] || 'root'
cap.set :user, user
cap.set :ssh_options, ssh_options # ssh options common to all nodes
cap.set :use_sudo, false # we may want to change this in the future
# Allow password authentication when we are bootstraping a single node
# (and key authentication fails).
if options[:bootstrap] && node_list.size == 1
hostname = node_list.values.first.name
if options[:echo]
cap.set(:password) { ask "Root SSH password for #{user}@#{hostname}> " }
else
cap.set(:password) { Capistrano::CLI.password_prompt " * Typed password will be hidden (use --echo to make it visible)\nRoot SSH password for #{user}@#{hostname}> " }
end
end
node_list.each do |name, node|
cap.server node.name, :dummy_arg, node_options(node)
end
yield cap
end
private
#
# For available options, see http://net-ssh.github.com/net-ssh/classes/Net/SSH.html#method-c-start
#
def ssh_options
{
:config => false,
:global_known_hosts_file => path(:known_hosts),
:paranoid => true
}
end
#
# For notes on advanced ways to set server-specific options, see
# http://railsware.com/blog/2011/11/02/advanced-server-definitions-in-capistrano/
#
# if, in the future, we want to do per-node password options, it would be done like so:
#
# password_proc = Proc.new {Capistrano::CLI.password_prompt "Root SSH password for #{node.name}"}
# return {:password => password_proc}
#
def node_options(node)
{
:ssh_options => {
:host_key_alias => node.name,
:host_name => node.ip_address,
:port => node.ssh.port
}.merge(contingent_ssh_options_for_node(node))
}
end
def new_capistrano
# load once the library files
@capistrano_enabled ||= begin
require 'capistrano'
require 'capistrano/cli'
require 'leap_cli/remote/plugin'
Capistrano.plugin :leap, LeapCli::Remote::Plugin
true
end
# create capistrano instance
cap = Capistrano::Configuration.new
# add tasks to capistrano instance
cap.load File.dirname(__FILE__) + '/../remote/tasks.rb'
return cap
end
def contingent_ssh_options_for_node(node)
if node.vagrant?
{:keys => [vagrant_ssh_key_file]}
else
{}
end
end
end; end; end
|