ec2-ssh 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f7fc4d61b4b6469b8a4c7ff5f1a40cefab2782ac
4
- data.tar.gz: 4cd60c018fc113b9746adfd30e52c713bd4d2a77
3
+ metadata.gz: 1937a7b40c0d0eca79b23921c42e33aab59f5d22
4
+ data.tar.gz: 89a9a42e2726cda0b87bffc40dec71d3430fff9b
5
5
  SHA512:
6
- metadata.gz: 811f77f8b9dfb8e626da2b2581b12d9530cbaf7808649ae0bc727b1a4c3b9ff6a1f91bbe1120ef8be30ed8a95d9bd74cca7f8218327fd34454473ebc5159e8ce
7
- data.tar.gz: 6803e2d985724957600fe947db7288bfcdc9f88414967617fe7f608c37caad6ff9e61ccdf9cac7fb831fe2f3b1b53c51166c18194ac4593187ffcc61d9f3fc16
6
+ metadata.gz: 10708e39a4966fa9e944775fa06ba878dd41c49250b0bfeca699d9b0d3759dfd5253d059d1610b6a67b8901b253a7fc7226709c4e69abab697c4732778e397f5
7
+ data.tar.gz: 4a54d77fb72beaea0d336e4e0e49c4189029d6e3b7f616acb6b9763fc86f3abf7f33bf34d687afd11edcd07a890514f4277ea02edd27a5cf5924c1a38ebbe16f
data/README.md CHANGED
@@ -1,20 +1,51 @@
1
- This is a utility for connecting on ec2to autoscale groups and run multiple commands either parallel sequential or in groups
1
+ ````bash
2
+ Usage:
3
+ ec2-ssh connect
4
+
5
+ Options:
6
+ [--cmd=CMD] # commmand to run on remote servers
7
+ [--profile=PROFILE] # Aws cli profile name as listed in ~/aws/credentials
8
+ # Default: default
9
+ [--region=REGION] # region
10
+ # Default: us-east-1
11
+ u, [--user=USER] # run as user
12
+ # Default: ec2-user
13
+ p, [--parallel=PARALLEL] # run in parallel
14
+ s, [--sequence=SEQUENCE] # run in sequence
15
+ g, [--groups=GROUPS] # run in groups
16
+ l, [--groups-limit=N] # limit
17
+ w, [--wait=N] # wait
18
+ [--as=AS] # filter by autoscale groups
19
+ [--tag-key=TAG_KEY] # tag key to filter instances by
20
+ # Default: Name
21
+ [--tag-value=TAG_VALUE] # tag value to filter instances by
22
+ t, [--terminal=TERMINAL] # open terminal tabs for all servers
23
+ c, [--capture-output=CAPTURE_OUTPUT] # capture output
24
+ [--upload=source,destination] # upload a file - source,destination (make sure seperate these by comma)
25
+ [--download=source,destination] # download a file - source,destination (make sure seperate these by comma)
26
+
27
+ Connect to autoscale instance (random instance), Pass --cmd='whatever' to run a cmd on the server (use ; to seperate commands)
28
+ ````
29
+
30
+ This is a utility for connecting on ec2 to autoscale groups and run multiple commands either parallel sequential or in groups
2
31
 
3
32
  (based on sshkit https://github.com/capistrano/sshkit)
4
33
 
5
34
  use it where you need to upload / download / capture output/ exec commands
6
35
 
7
- ````txt
8
36
  seperate commands with a semicolon
9
37
 
38
+ default values are:
39
+ ````txt
10
40
  default region: us-east-1
11
41
  default user: ec2-user
12
- default connnection :parallel
42
+ default connnection: parallel
43
+ default tag key: Name
13
44
  ````
14
45
 
15
- Groups were designed in this case to relieve problems (mass Git checkouts) where you rely on a contested resource that you don't want to DDOS by hitting it too hard.
46
+ --groups flag was designed to relieve problems (such as mass Git checkouts) where you rely on a contested resource that you don't want to DDOS by hitting it too hard.
16
47
 
17
- Sequential runs were intended to be used for rolling restarts, amongst other similar use-cases.
48
+ --sequence flag is intended to be used for rolling restarts, amongst other similar use-cases.
18
49
 
19
50
  if the instance is on a private subnet (given you have a VPN connection) it will fallback to connecting using the internal IP address
20
51
 
@@ -42,7 +73,7 @@ $ ec2-ssh --tag-value ElasticSearch --profile otherAccountName --cmd 'touch /tmp
42
73
  ````
43
74
  -------------------
44
75
 
45
- connect by selecting autoscale group name
76
+ connect interactively by selecting from a list of autoscale group names
46
77
 
47
78
  ````bash
48
79
  $ ec2-ssh --as --cmd 'touch /tmp/test'
@@ -56,34 +87,3 @@ simply selct the number corresponding to the autoscale group (limit of AWS SDk i
56
87
 
57
88
  -------------------
58
89
 
59
-
60
- ##Possible command line options
61
- ````bash
62
- Usage:
63
- ec2-ssh connect
64
-
65
- Options:
66
- [--cmd=CMD] # commmand to run on remote servers
67
- [--profile=PROFILE] # Aws cli profile name as listed in ~/aws/credentials
68
- # Default: default
69
- [--region=REGION] # region
70
- # Default: us-east-1
71
- u, [--user=USER] # run as user
72
- # Default: ec2-user
73
- p, [--parallel=PARALLEL] # run in parallel
74
- s, [--sequence=SEQUENCE] # run in sequence
75
- g, [--groups=GROUPS] # run in groups
76
- l, [--groups-limit=N] # limit
77
- w, [--wait=N] # wait
78
- [--as=AS] # filter by autoscale groups
79
- [--tag-key=TAG_KEY] # tag key to filter instances by
80
- # Default: Name
81
- [--tag-value=TAG_VALUE] # tag value to filter instances by
82
- t, [--terminal=TERMINAL] # open terminal tabs for all servers
83
- c, [--capture-output=CAPTURE_OUTPUT] # capture output
84
- [--upload=source,destination] # upload a file - source,destination (make sure seperate these by comma)
85
- [--download=source,destination] # download a file - source,destination (make sure seperate these by comma)
86
- [--pty=PTY] # enable pty for sudo operations
87
-
88
- Connect to autoscale instance (random instance), Pass --cmd='whatever' to run a cmd on the server (use ; to seperate commands)
89
- ````
@@ -1,5 +1,5 @@
1
1
  module Ec2Ssh
2
- VERSION = "1.1.0"
2
+ VERSION = "1.2.0"
3
3
  ABOUT = "ec2-ssh v#{VERSION} (c) #{Time.now.strftime("2015-%Y")} @innovia"
4
4
 
5
5
  $:.unshift File.expand_path(File.join(File.dirname(__FILE__), %w[.. lib]))
@@ -7,40 +7,33 @@ module Ec2Ssh::Cli::Aws
7
7
  @as = Aws::AutoScaling::Client.new()
8
8
  @ec2 = Aws::EC2::Client.new()
9
9
 
10
- say "Currently running AWS User is: #{Aws::IAM::CurrentUser.new.arn}"
10
+ say "Currently running user is: #{Aws::IAM::CurrentUser.new.arn}"
11
11
  end
12
12
 
13
- def get_auto_scale_groups(grep_pattern)
14
- say "Fetching AutoScale Groups - please wait..."
15
- @as_groups = @as.describe_auto_scaling_groups({max_records: 100}).auto_scaling_groups
13
+ def get_auto_scale_groups
14
+ say "Fetching AutoScale groups from #{@region} please wait..."
15
+ @as_groups = @as.describe_auto_scaling_groups.auto_scaling_groups
16
16
 
17
17
  as_group_names = @as_groups.inject([]) {|acc, asg| acc << asg.auto_scaling_group_name; acc }
18
18
 
19
19
  as_selection = {}
20
-
21
- if grep_pattern
22
- as_groups = as_group_names.grep(grep_pattern)
23
- else
24
- as_groups = as_group_names
25
- end
26
- as_groups.each_with_index.inject(as_selection) {|acc, pair|
20
+ as_group_names.each_with_index.inject(as_selection) {|acc, pair|
27
21
  element, index = pair
28
22
  as_selection[index] = element
29
23
  acc
30
- }
31
-
24
+ }
25
+
32
26
  say "AutoScale Group in #{options[:region]}:\n"
33
27
  as_selection.each {|k,v| say "#{k}: #{v}"}
34
28
 
35
29
  selected_as = ask("Which server group do you want to ssh to?", color = :yellow)
36
-
30
+
37
31
  get_instances('aws:autoscaling:groupName', as_selection[selected_as.to_i])
38
32
  end
39
33
 
40
34
  def get_instances(tag_key, tag_value)
41
35
  @all_servers = []
42
36
 
43
- say "Fetching instances with #{tag_key}: #{tag_value}", color = :white
44
37
  response = @ec2.describe_instances({
45
38
  filters: [
46
39
  {
@@ -58,17 +51,11 @@ module Ec2Ssh::Cli::Aws
58
51
  })
59
52
 
60
53
  if !response.reservations.empty?
61
- response.reservations.each {|r| r.instances.inject(@all_servers){|acc, k|
62
- if k.public_ip_address.nil?
63
- say "Could not find public ip address for instance: #{k.instance_id}, falling back to private ip address", color = :yellow
64
- acc << k.private_ip_address; acc
65
- else
66
- acc << k.public_ip_address; acc
67
- end
68
- }}
54
+ response.reservations.each {|r| r.instances.inject(@all_servers){|acc, k| acc << k.public_ip_address; acc}}
69
55
  else
70
56
  say "could not find any instances with the tag #{tag_key}: #{tag_value} on #{@region}"
71
57
  end
72
- say "All servers: #{@all_servers}"
58
+
59
+ say "All servers: #{@all_servers.size}"
73
60
  end
74
61
  end
@@ -18,7 +18,7 @@ class Ec2Ssh::Cli < Thor
18
18
 
19
19
  desc "connect", "Connect to autoscale instance (random instance), Pass --cmd='whatever' to run a cmd on the server (use ; to seperate commands)"
20
20
  method_option :cmd, :desc => 'commmand to run on remote servers'
21
- method_option :profile, :desc => 'Aws cli profile name as listed in ~/aws/credentials', :default => 'default'
21
+ method_option :profile, :desc => 'aws cli profile', :default => 'default'
22
22
  method_option :region, :desc => "region", :default => 'us-east-1'
23
23
  method_option :user, :aliases => 'u', :desc => 'run as user', :default => 'ec2-user'
24
24
  method_option :parallel, :aliases => 'p', :desc => 'run in parallel'
@@ -26,32 +26,24 @@ class Ec2Ssh::Cli < Thor
26
26
  method_option :groups, :aliases => 'g', :desc => 'run in groups'
27
27
  method_option :groups_limit, :aliases => 'l', :desc => 'limit', :type => :numeric
28
28
  method_option :wait, :aliases => 'w', :desc => 'wait', :type => :numeric
29
- method_option :as, :desc => 'filter by autoscale groups'
30
- method_option :grep, :desc => 'grep autoscale name when list is fecthed'
29
+ method_option :as, :desc => 'display interactive choices for autoscale groups'
31
30
  method_option :tag_key, :desc => 'tag key to filter instances by', :default => 'Name'
32
31
  method_option :tag_value, :desc => 'tag value to filter instances by'
33
32
  method_option :terminal, :aliases => 't', :desc => 'open terminal tabs for all servers'
34
- method_option :capture_output, :aliases => 'c', :desc => 'capture output'
35
- method_option :upload, :desc => 'upload a file - source,destination (make sure seperate these by comma)', :banner => 'source,destination'
36
- method_option :download, :desc => 'download a file - source,destination (make sure seperate these by comma)', :banner => 'source,destination'
37
- method_option :pty, :desc => 'enable pty for sudo operations', :type => :boolean, :default => false
38
33
  def connect
39
34
  extend Aws
40
35
  extend Ssh
41
36
  extend Utils
42
- set_ssh(options[:user], options[:pty])
43
- aws_init(options[:profile], options[:region])
44
37
 
38
+ set_ssh(options[:user])
39
+ aws_init(options[:profile], options[:region])
40
+
45
41
  if options[:as]
46
42
  get_auto_scale_groups
47
43
  elsif options[:tag_value]
48
44
  get_instances(options[:tag_key].chomp, options[:tag_value].chomp)
49
- else
50
- say "No value provided for filtering instances", color = :red
51
- Ec2Ssh::Cli.start(%w{help connect})
52
- exit
53
45
  end
54
-
46
+
55
47
  if options[:terminal]
56
48
  open_in_terminal
57
49
  else
@@ -61,18 +53,17 @@ class Ec2Ssh::Cli < Thor
61
53
  exit 1
62
54
  end
63
55
 
64
- mode = :parallel if options[:parallel]
56
+ mode = :parallel if options[:parallel] || mode.nil?
65
57
  mode = :groups if options[:groups]
66
58
  mode = :sequence if options[:sequence]
67
59
 
68
- mode = :parallel if mode.nil?
69
60
  dsl_options = {}
70
61
  dsl_options[:in] = mode
71
62
  dsl_options[:wait] = options[:wait] if options[:wait]
72
63
  dsl_options[:limit] = options[:groups_limit] if options[:groups_limit]
73
-
74
- say "dsl opts: #{dsl_options}", color = :cyan
75
- ssh_to(options[:user], dsl_options, options[:cmd], options[:capture_output], options[:upload], options[:download])
64
+
65
+ say "user: #{options[:user]}\ndsl_options: #{dsl_options}\ncmd: #{options[:cmd]}", color = :cyan
66
+ ssh_to(options[:user], dsl_options, options[:cmd])
76
67
  end
77
68
  end
78
69
 
@@ -80,6 +71,6 @@ class Ec2Ssh::Cli < Thor
80
71
  desc "version", "version"
81
72
  def version
82
73
  say Ec2Ssh::ABOUT, color = :green
83
- end
74
+ end
84
75
 
85
76
  end
@@ -1,47 +1,23 @@
1
+ require 'sshkit'
2
+ require 'sshkit/dsl'
3
+ include SSHKit::DSL
4
+
1
5
  module Ec2Ssh::Cli::Ssh
2
- def set_ssh(user, pty)
6
+ def set_ssh(user)
3
7
  ENV['SSHKIT_COLOR'] = 'TRUE'
4
8
  SSHKit.config.output_verbosity = Logger::DEBUG
5
- ssh_options = {
9
+ SSHKit::Backend::Netssh.configure { |ssh|
10
+ ssh.ssh_options = {
6
11
  :user => user,
7
12
  :paranoid => false,
8
13
  :forward_agent => true,
9
14
  :user_known_hosts_file => '/dev/null'
15
+ }
10
16
  }
11
-
12
- SSHKit::Backend::Netssh.configure { |ssh|
13
- ssh.ssh_options = ssh_options
14
- ssh.pty = true if pty
15
- }
16
-
17
-
18
17
  end
19
18
 
20
- def ssh_to(user, dsl_options, cmd, capture_output, upload, download)
19
+ def ssh_to(user, dsl_options, cmd)
21
20
  say "Running #{cmd} via ssh in #{dsl_options}", color = :cyan
22
- on @all_servers, dsl_options do |host|
23
-
24
- if upload
25
- file = upload.split(',').map { |e| e.strip }
26
- source = File.expand_path(file.first)
27
- destination = file.last
28
- puts "uploading #{source} to #{destination}"
29
- upload! source, destination
30
- end
31
-
32
- if download
33
- file = download.split(',').map { |e| e.strip }
34
- source = file.first
35
- destination = File.expand_path(file.last)
36
- puts "downloading #{source} to #{destination}.#{host}"
37
- download! source, "#{destination}.#{host}"
38
- end
39
-
40
- if capture_output
41
- puts capture cmd
42
- elsif upload.nil? && download.nil?
43
- execute cmd
44
- end
45
- end
21
+ on(@all_servers, in: dsl_options[:in]) { |host| execute cmd }
46
22
  end
47
23
  end
@@ -1,19 +1,19 @@
1
1
  module Ec2Ssh::Cli::Utils
2
2
  def open_in_terminal
3
3
  @all_servers.each do |server|
4
- say "Opening #{server} in a new tab", color = :cyan
5
4
  `osascript <<-eof
6
- tell application "iTerm"
7
- make new terminal
8
- tell the current terminal
9
- activate current session
10
- launch session "Default Session"
11
- tell the last session
12
- set name to "#{server}"
13
- write text "ssh ec2-user@#{server}"
5
+ tell application "iTerm"
6
+ tell current window
7
+ create tab with default profile
8
+ tell the current tab
9
+ activate current session
10
+ tell the last session
11
+ set name to "#{server}"
12
+ write text "ssh -o StrictHostKeyChecking=no ec2-user@#{server}"
13
+ end tell
14
14
  end tell
15
15
  end tell
16
- end tell
16
+ end tell
17
17
  eof`
18
18
  end
19
19
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ec2-ssh
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ami Mahloof
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-25 00:00:00.000000000 Z
11
+ date: 2016-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -110,7 +110,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
110
110
  version: 1.3.6
111
111
  requirements: []
112
112
  rubyforge_project:
113
- rubygems_version: 2.4.5.1
113
+ rubygems_version: 2.6.4
114
114
  signing_key:
115
115
  specification_version: 4
116
116
  summary: run commmands on multiple servers by tag or by autoscale group