Class: Opsicle::SSH
- Inherits:
-
Object
- Object
- Opsicle::SSH
- Defined in:
- lib/opsicle/commands/ssh.rb
Instance Attribute Summary collapse
-
#client ⇒ Object
readonly
Returns the value of attribute client.
Instance Method Summary collapse
- #bastion_ip ⇒ Object
- #execute(options = {}) ⇒ Object
-
#initialize(environment) ⇒ SSH
constructor
A new instance of SSH.
- #instance_info(instance) ⇒ Object
- #instances ⇒ Object
- #public_ips ⇒ Object
- #ssh_command(instance, options = {}) ⇒ Object
- #ssh_ip(instance) ⇒ Object
- #ssh_username ⇒ Object
- #use_bastion? ⇒ Boolean
Constructor Details
Instance Attribute Details
#client ⇒ Object (readonly)
Returns the value of attribute client.
5 6 7 |
# File 'lib/opsicle/commands/ssh.rb', line 5 def client @client end |
Instance Method Details
#bastion_ip ⇒ Object
45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/opsicle/commands/ssh.rb', line 45 def bastion_ip if client.config.opsworks_config[:bastion_layer_id] online_bastions = client.api_call( :describe_instances, {layer_id: client.config.opsworks_config[:bastion_layer_id] } )[:instances].select { |instance| instance[:status].to_s == 'online'} bastion_ip = online_bastions.sample[:public_ip] Output.say "Connecting via bastion with IP #{bastion_ip}" bastion_ip elsif client.config.opsworks_config[:bastion_hostname] bastion_hostname = client.config.opsworks_config[:bastion_hostname] Output.say "Connecting via bastion with hostname '#{bastion_hostname}'" bastion_hostname end end |
#execute(options = {}) ⇒ Object
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# File 'lib/opsicle/commands/ssh.rb', line 13 def execute(={}) if instances.length == 1 choice = 1 else Output.say "Choose an Opsworks instance:" instances.each_with_index do |instance, index| Output.say "#{index+1}) #{instance[:hostname]} #{instance_info(instance)}" end choice = Output.ask("? ", Integer) { |q| q.in = 1..instances.length } end command = ssh_command(instances[choice-1], ) Output.say_verbose "Executing shell command: #{command}" system(command) end |
#instance_info(instance) ⇒ Object
91 92 93 94 95 96 |
# File 'lib/opsicle/commands/ssh.rb', line 91 def instance_info(instance) infos = [] infos << instance[:layer_ids].map{ |layer_id| @stack.layer_name(layer_id) } if instance[:layer_ids] infos << "EIP" if instance[:elastic_ip] "(#{infos.join(', ')})" end |
#instances ⇒ Object
31 32 33 34 35 |
# File 'lib/opsicle/commands/ssh.rb', line 31 def instances @instances ||= client.api_call(:describe_instances, { stack_id: client.config.opsworks_config[:stack_id] })[:instances] .select { |instance| instance[:status].to_s == 'online'} .sort { |a,b| a[:hostname] <=> b[:hostname] } end |
#public_ips ⇒ Object
37 38 39 |
# File 'lib/opsicle/commands/ssh.rb', line 37 def public_ips instances.map{|instance| instance[:elastic_ip] || instance[:public_ip] }.compact end |
#ssh_command(instance, options = {}) ⇒ Object
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/opsicle/commands/ssh.rb', line 73 def ssh_command(instance, ={}) ssh_command = " \"#{[:"ssh-cmd"].gsub(/'/){ %q(\') }}\"" if [:"ssh-cmd"] #escape single quotes = [:"ssh-opts"] ? "#{[:"ssh-opts"]} " : "" external_ip = public_ips.sample if use_bastion? external_ip = bastion_ip ssh_string = "#{ssh_username}@#{external_ip} ssh #{instance[:private_ip]}" .concat('-A -t ') elsif instance_ip = ssh_ip(instance) ssh_string = "#{ssh_username}@#{instance_ip}" else ssh_string = "#{ssh_username}@#{external_ip} ssh #{instance[:private_ip]}" .concat('-A -t ') end "ssh #{}#{ssh_string}#{ssh_command}" end |
#ssh_ip(instance) ⇒ Object
64 65 66 67 68 69 70 71 |
# File 'lib/opsicle/commands/ssh.rb', line 64 def ssh_ip(instance) if client.config.opsworks_config[:internal_ssh_only] Output.say "This stack requires a private connection, only using internal IPs." instance[:private_ip] else instance[:elastic_ip] || instance[:public_ip] end end |
#ssh_username ⇒ Object
41 42 43 |
# File 'lib/opsicle/commands/ssh.rb', line 41 def ssh_username @user_profile.ssh_username end |
#use_bastion? ⇒ Boolean
60 61 62 |
# File 'lib/opsicle/commands/ssh.rb', line 60 def use_bastion? !!(client.config.opsworks_config[:bastion_layer_id] || client.config.opsworks_config[:bastion_hostname]) end |