ec2-ssh 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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