awsssh 2.1.0 → 2.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/README.md +32 -22
- data/awsssh.gemspec +4 -3
- data/bin/awsssh +1 -1
- data/lib/awsssh.rb +132 -148
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YTMzY2U5MjNjMDU2ZDlmNGMyN2E3MDcxNThhMzA5OGY4OTRjMzRmZg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
Y2NhM2I3NGY0ZTk1OTYxODFkMDhhMWUwM2QzZTgwZDNhMzhiOTI3OQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZDQyYjY1MjBiNDBmZmIwZjRjNjYzM2JlNGVkMzM4ZWUyMGQxZTYzMWVjNGJm
|
10
|
+
OTA2N2JjNDAyZTI1YTQ0ZGVkYjZlMGQwOGQxMzRhNDliYmM4ZTY1NDg0N2I0
|
11
|
+
ZDMyYzVmMDRmMzRkNmJhMzk4ZWJkNTVmMjY1MjY3ZTcyNmRmOWU=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MzY5YmYzZjc2Mjk3NDA0MjBjNTgyM2M3ZTY4MDRhODk1MzYwY2U4ZmRhNzQw
|
14
|
+
NzAwNDgyM2Q5YjJlNmVhOTZlNGY4MzFhNzkzMDM5NDA0Njg1ZThhZDY4ZDQ3
|
15
|
+
M2M3YmY2ZjRlN2ZlNDU5MTljZGNkYzEyZmI1ODE4ZGNlZTBkYzc=
|
data/README.md
CHANGED
@@ -1,43 +1,53 @@
|
|
1
1
|
# AWSSSH
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
Mit hilfe dieses Gems kann man sich auf alle (bekannten) AWS EC2 Instancen verbinden die man durch seine Configurationen erreichen darf.
|
4
|
+
Momentan ist das beschränkt auf EC2 Instancen, die durch OpsWorks verwaltet werden.
|
5
5
|
|
6
|
-
|
7
|
-
Hostname ec2-54-194-243-71.eu-west-1.compute.amazonaws.com```
|
8
|
-
|
9
|
-
da ein Aufruf von `$ ssh sihl-live1` dann aber die einstellung ignoriert der umweg über dieses script.
|
6
|
+
Da sich die IP und der Public DNS der Server bei jedem Neustart ändern kann fragt dieses Gem immer bei AWS nach der aktuellen IP/DNS Name.
|
10
7
|
|
11
8
|
## Installation
|
12
9
|
|
13
|
-
|
14
|
-
|
15
|
-
|
10
|
+
Mitlerweile ist aus `awsssh` ein richtiges gem geworden.
|
11
|
+
|
12
|
+
1. `gem install awsssh`
|
16
13
|
|
17
14
|
### Configurationen
|
18
|
-
1.
|
19
|
-
|
20
|
-
3. Die Konfigurationsdateien müssen den Namen `aws_config_<kundenname>` heißen.
|
15
|
+
1. Die Konfigurationsdateien müssen unter `/Users/<username>/.aws/` liegen. Wenn dem nicht so ist muss es eine Umgebungsvariable geben, die den Pfad zu den Configurationsdateien beinhaltet: `export ENV['AWSSSH_CONFIG_DIR']=/path/to/configs/`
|
16
|
+
3. Die Konfigurationsdateien müssen den Namen `aws_config_<kundenname>` haben. Wenn dem nicht so ist muss es eine Umgebungsvariable geben, die den Anfang der Configurationsdateien beinhaltet: `export ENV['AWSSSH_CONFIG_FILE']=awsconf_`
|
21
17
|
|
22
18
|
## Aufruf
|
23
19
|
|
24
|
-
`awsssh HOST`
|
20
|
+
`awsssh -s HOST`
|
25
21
|
|
26
22
|
**Beispiel**<br>
|
27
|
-
`awsssh
|
23
|
+
`awsssh -s kunde-live-1`
|
28
24
|
|
29
25
|
## Hilfe
|
30
26
|
|
31
|
-
`awsssh
|
27
|
+
`awsssh help`<br>
|
32
28
|
Zeigt die Hilfe an
|
33
29
|
|
34
|
-
##
|
30
|
+
## Kontakt
|
35
31
|
|
36
|
-
|
37
|
-
`README.md`: diese README<br>
|
38
|
-
`Rakefile`: für die installation<br>
|
39
|
-
`awsssh.rb`: Erstellt die verbidnung (Programmlogik)<br>
|
32
|
+
Sebastian Thiele (@sethiele)
|
40
33
|
|
41
|
-
##
|
34
|
+
## Changelog
|
35
|
+
|
36
|
+
**2014-03-05** - v 2.1.1
|
37
|
+
* [enh] using thor as CLI Class
|
38
|
+
* **New connection call** call `awsssh -s SERVER`
|
39
|
+
* [enh] use a account for connections `awsssh -s SERVER -a ACCOUNT`
|
40
|
+
|
41
|
+
**2014-03-04** - v 2.1.0
|
42
|
+
* [enh] use AWS Ruby SDK
|
43
|
+
* [enh] use ENV variables to access configurations
|
44
|
+
|
45
|
+
**2014-02-27** - v 2.0.1 *the Ronald Fix*
|
46
|
+
* [code] Code optimization
|
47
|
+
* [enh] return a error message if config not found
|
48
|
+
|
49
|
+
**2014-02-14** - v 2.0.0
|
50
|
+
* [enh] first gem version
|
42
51
|
|
43
|
-
|
52
|
+
**earlier**
|
53
|
+
* Some experiences
|
data/awsssh.gemspec
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'awsssh'
|
3
|
-
s.version = '2.1.
|
4
|
-
s.date = '2014-
|
3
|
+
s.version = '2.1.1'
|
4
|
+
s.date = '2014-03-05'
|
5
5
|
s.summary = "Connects you with OpsWorks EC2"
|
6
|
-
s.description = "This will connects you with an
|
6
|
+
s.description = "This will connects you with an EC2 instace"
|
7
7
|
s.authors = ["Sebastian Thiele"]
|
8
8
|
s.email = [%w(Sebastian.Thiele infopark.de).join('@')]
|
9
9
|
s.license = "MIT"
|
@@ -15,4 +15,5 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.add_runtime_dependency "net-ssh", "2.7.0"
|
16
16
|
s.add_runtime_dependency "inifile", "2.0.2"
|
17
17
|
s.add_runtime_dependency "aws-sdk", "1.35.0"
|
18
|
+
s.add_runtime_dependency "thor", "0.18.1"
|
18
19
|
end
|
data/bin/awsssh
CHANGED
data/lib/awsssh.rb
CHANGED
@@ -5,182 +5,166 @@ require 'json'
|
|
5
5
|
require "aws-sdk"
|
6
6
|
# require "pry"
|
7
7
|
require "inifile"
|
8
|
+
require "thor"
|
8
9
|
|
9
|
-
class Awsssh
|
10
|
+
class Awsssh < Thor
|
10
11
|
CONFIG_DIR = ENV['AWSSSH_CONFIG_DIR'] || "/Users/#{ENV['USER']}/.aws/"
|
11
12
|
CONF_FILE = ENV['AWSSSH_CONFIG_FILE'] || "aws_config_"
|
12
13
|
|
13
|
-
|
14
|
-
|
14
|
+
desc "-s SERVER [-a ACCOUNT]", "connect to a server"
|
15
|
+
option :server, :aliases => :s, :desc => "(required) The server name to connect with"
|
16
|
+
option :account, :aliases => :a, :desc => "Specify a account for a connection. Needet if the account don't came from the server name"
|
17
|
+
option :list_accounts, :type => :boolean, :desc => "List all Accounts"
|
18
|
+
option :list_servers, :desc => "List all Servers for a given Account"
|
19
|
+
def connect
|
20
|
+
if options[:server]
|
21
|
+
connecting(options[:server], options[:account])
|
22
|
+
elsif options[:list_accounts]
|
15
23
|
list_accounts
|
16
|
-
elsif
|
17
|
-
list_servers(
|
18
|
-
elsif
|
19
|
-
|
24
|
+
elsif options[:list_servers]
|
25
|
+
list_servers(options[:list_servers])
|
26
|
+
elsif options[:server]
|
27
|
+
connecting(options[:server], options[:account])
|
20
28
|
else
|
21
|
-
help
|
29
|
+
help "connect"
|
22
30
|
end
|
23
31
|
end
|
24
32
|
|
25
|
-
|
26
|
-
|
27
|
-
#
|
28
|
-
# * *Returns* :
|
29
|
-
# - [String]
|
30
|
-
# usage: awsssh [<instance-name>|parameters]
|
31
|
-
# <instance-name> Name of the instance
|
32
|
-
# parameters:
|
33
|
-
# --help This help
|
34
|
-
# --list-accounts List all known AWS Accounts
|
35
|
-
# --list-servers <account> List all Server for an AWS Account
|
36
|
-
|
37
|
-
def help
|
38
|
-
length = 30
|
39
|
-
puts "usage: awsssh [<instance-name>|parameters]"
|
40
|
-
printf "\t %-#{length}s Name of the instance\n", "<instance-name>"
|
41
|
-
puts "parameters:"
|
42
|
-
printf "\t %-#{length}s This help\n", "--help"
|
43
|
-
printf "\t %-#{length}s List all known AWS Accounts\n", "--list-accounts"
|
44
|
-
printf "\t %-#{length}s List all Server for an AWS Account\n", "--list-servers <account>"
|
33
|
+
def help(*args)
|
34
|
+
super("connect")
|
45
35
|
end
|
46
36
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
37
|
+
private
|
38
|
+
##
|
39
|
+
# List stacks for a account
|
40
|
+
#
|
41
|
+
# * *Args* :
|
42
|
+
# - +account+ -> Account name
|
43
|
+
#
|
44
|
+
# * *Returns* :
|
45
|
+
# - [Array] StackIDs
|
46
|
+
def list_stacks(account)
|
47
|
+
ow = awscfg(account)
|
48
|
+
stacks = ow.client.describe_stacks[:stacks]
|
49
|
+
stack_ids = []
|
50
|
+
stacks.each do |stack|
|
51
|
+
stack_ids << stack[:stack_id]
|
52
|
+
end
|
53
|
+
return stack_ids
|
63
54
|
end
|
64
|
-
return stack_ids
|
65
|
-
end
|
66
|
-
|
67
|
-
|
68
|
-
##
|
69
|
-
# Read Stack
|
70
|
-
#
|
71
|
-
# * *Args* :
|
72
|
-
# - +stackid+ -> Stack ID
|
73
|
-
# - +account+ -> Account name
|
74
|
-
#
|
75
|
-
# * *Returns* :
|
76
|
-
# - Stecks JSON
|
77
|
-
#
|
78
55
|
|
79
|
-
def read_stack(stackid, account)
|
80
|
-
ow = awscfg(account)
|
81
|
-
ow.client.describe_instances({:stack_id => stackid})
|
82
|
-
# JSON.parse(`aws opsworks describe-instances --stack-id #{stackid}`)
|
83
|
-
end
|
84
56
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
57
|
+
##
|
58
|
+
# Read Stack
|
59
|
+
#
|
60
|
+
# * *Args* :
|
61
|
+
# - +stackid+ -> Stack ID
|
62
|
+
# - +account+ -> Account name
|
63
|
+
#
|
64
|
+
# * *Returns* :
|
65
|
+
# - Stecks JSON
|
66
|
+
#
|
67
|
+
def read_stack(stackid, account)
|
68
|
+
ow = awscfg(account)
|
69
|
+
ow.client.describe_instances({:stack_id => stackid})
|
70
|
+
# JSON.parse(`aws opsworks describe-instances --stack-id #{stackid}`)
|
71
|
+
end
|
92
72
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
73
|
+
##
|
74
|
+
# Lists all AWS Accounts
|
75
|
+
#
|
76
|
+
# * *Returns* :
|
77
|
+
# - [String]
|
78
|
+
# This are the known AWS Accounts:
|
79
|
+
# - account
|
80
|
+
def list_accounts
|
81
|
+
length = 30
|
82
|
+
puts "This are the known AWS Accounts:"
|
83
|
+
config_files = Dir.entries(CONFIG_DIR)
|
84
|
+
config_files.each do |file|
|
85
|
+
if file[0,CONF_FILE.length] == CONF_FILE
|
86
|
+
file_part = file.split("_")
|
87
|
+
unless file_part.last.nil?
|
88
|
+
printf "\t- %-#{length}s\n", file_part[2]
|
89
|
+
end
|
102
90
|
end
|
103
91
|
end
|
104
92
|
end
|
105
|
-
end
|
106
|
-
|
107
|
-
##
|
108
|
-
# Server Name
|
109
|
-
#
|
110
|
-
# * *Args* :
|
111
|
-
# - +stack+ -> Stack as JSON
|
112
|
-
#
|
113
|
-
# * *Returns* :
|
114
|
-
# - [String]
|
115
|
-
# - <servername> (<status>)
|
116
93
|
|
117
|
-
|
118
|
-
|
119
|
-
|
94
|
+
##
|
95
|
+
# Server Name
|
96
|
+
#
|
97
|
+
# * *Args* :
|
98
|
+
# - +stack+ -> Stack as JSON
|
99
|
+
#
|
100
|
+
# * *Returns* :
|
101
|
+
# - [String]
|
102
|
+
# - <servername> (<status>)
|
103
|
+
def server_name(stack)
|
104
|
+
stack[:instances].each do |instance|
|
105
|
+
printf "\t- %-20s %s\n", instance[:hostname], instance[:status]
|
106
|
+
end
|
120
107
|
end
|
121
|
-
end
|
122
|
-
|
123
|
-
##
|
124
|
-
# List all Servers for a given AWS Account
|
125
|
-
#
|
126
|
-
# * *Args* :
|
127
|
-
# - +account+ -> AWS Account name
|
128
|
-
#
|
129
108
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
109
|
+
##
|
110
|
+
# List all Servers for a given AWS Account
|
111
|
+
#
|
112
|
+
# * *Args* :
|
113
|
+
# - +account+ -> AWS Account name
|
114
|
+
#
|
115
|
+
def list_servers(account)
|
116
|
+
stacks = list_stacks account
|
117
|
+
stacks.each do |stack_id|
|
118
|
+
stack = read_stack stack_id, account
|
119
|
+
server_name stack
|
120
|
+
end
|
135
121
|
end
|
136
|
-
end
|
137
122
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
123
|
+
##
|
124
|
+
# Establish the connection
|
125
|
+
#
|
126
|
+
# * *Args* :
|
127
|
+
# - +server+ -> Server name
|
128
|
+
#
|
129
|
+
def connecting(server, account=nil)
|
130
|
+
public_dns = nil
|
131
|
+
host = server.split("-")
|
132
|
+
ac = account || host[0]
|
133
|
+
stack_ids = list_stacks ac
|
134
|
+
stack_ids.each do |stack_id|
|
135
|
+
stack = read_stack(stack_id, ac)
|
136
|
+
stack.instances.each do |i|
|
137
|
+
if i[:hostname] == server
|
138
|
+
public_dns = i[:public_dns]
|
139
|
+
break
|
140
|
+
end
|
155
141
|
end
|
142
|
+
break unless public_dns.nil?
|
156
143
|
end
|
157
|
-
break unless public_dns.nil?
|
158
|
-
end
|
159
144
|
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
puts "Connecting to #{server} (#{public_dns})"
|
167
|
-
exec "ssh #{public_dns}"
|
145
|
+
if public_dns.nil?
|
146
|
+
puts "Server '#{server}' not found. Try ssh"
|
147
|
+
exec "ssh #{server}"
|
148
|
+
exit -1
|
149
|
+
end
|
168
150
|
|
169
|
-
|
151
|
+
puts "Connecting to #{server} (#{public_dns})"
|
152
|
+
exec "ssh #{public_dns}"
|
170
153
|
|
171
|
-
def awscfg(account)
|
172
|
-
if cnf = IniFile.load(CONFIG_DIR + CONF_FILE + account)['default']
|
173
|
-
return AWS::OpsWorks.new(
|
174
|
-
access_key_id: cnf['aws_access_key_id'],
|
175
|
-
secret_access_key: cnf['aws_secret_access_key'],
|
176
|
-
region: cnf['region']
|
177
|
-
)
|
178
|
-
else
|
179
|
-
puts "No config #{CONF_FILE}#{account} found"
|
180
|
-
exit -1
|
181
154
|
end
|
182
|
-
end
|
183
|
-
|
184
|
-
|
185
155
|
|
156
|
+
def awscfg(account)
|
157
|
+
if cnf = IniFile.load(CONFIG_DIR + CONF_FILE + account)
|
158
|
+
cnf = cnf['default']
|
159
|
+
return AWS::OpsWorks.new(
|
160
|
+
access_key_id: cnf['aws_access_key_id'],
|
161
|
+
secret_access_key: cnf['aws_secret_access_key'],
|
162
|
+
region: cnf['region']
|
163
|
+
)
|
164
|
+
else
|
165
|
+
puts "No config #{CONF_FILE}#{account} found. Maybe use -a to specify a account."
|
166
|
+
exit -1
|
167
|
+
end
|
168
|
+
end
|
169
|
+
default_task :connect
|
186
170
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: awsssh
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sebastian Thiele
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-03-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: net-ssh
|
@@ -52,7 +52,21 @@ dependencies:
|
|
52
52
|
- - '='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 1.35.0
|
55
|
-
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: thor
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.18.1
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.18.1
|
69
|
+
description: This will connects you with an EC2 instace
|
56
70
|
email:
|
57
71
|
- Sebastian.Thiele@infopark.de
|
58
72
|
executables:
|