ec2ssh 2.0.8 → 3.0.0.beta1
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 +4 -4
- data/.gitignore +15 -5
- data/.travis.yml +1 -1
- data/ChangeLog.md +0 -5
- data/Gemfile +4 -2
- data/Guardfile +1 -5
- data/README.md +26 -90
- data/Rakefile +1 -0
- data/example/example.ec2ssh +17 -0
- data/lib/ec2ssh/builder.rb +29 -0
- data/lib/ec2ssh/cli.rb +66 -91
- data/lib/ec2ssh/command.rb +25 -0
- data/lib/ec2ssh/command/init.rb +72 -0
- data/lib/ec2ssh/command/migrate.rb +34 -0
- data/lib/ec2ssh/command/remove.rb +20 -0
- data/lib/ec2ssh/command/update.rb +39 -0
- data/lib/ec2ssh/dsl.rb +55 -0
- data/lib/ec2ssh/ec2_instances.rb +38 -0
- data/lib/ec2ssh/exceptions.rb +9 -0
- data/lib/ec2ssh/migrator.rb +74 -0
- data/lib/ec2ssh/ssh_config.rb +5 -6
- data/lib/ec2ssh/version.rb +1 -1
- data/spec/lib/ec2ssh/builder_spec.rb +67 -0
- data/spec/lib/ec2ssh/command/init_spec.rb +41 -0
- data/spec/lib/ec2ssh/command/migrate_spec.rb +108 -0
- data/spec/lib/ec2ssh/command/remove_spec.rb +68 -0
- data/spec/lib/ec2ssh/command/update_spec.rb +97 -0
- data/spec/lib/ec2ssh/dsl_spec.rb +33 -0
- data/spec/lib/ec2ssh/migrator_spec.rb +59 -0
- data/spec/lib/ec2ssh/ssh_config_spec.rb +70 -54
- data/spec/spec_helper.rb +10 -8
- metadata +30 -8
- data/lib/ec2ssh/dotfile.rb +0 -49
- data/lib/ec2ssh/hosts.rb +0 -42
- data/spec/lib/ec2ssh/cli_spec.rb +0 -171
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4ba8b5318372505cf30fc98a44565ae291d35c70
|
4
|
+
data.tar.gz: f2e69c94b92e1f8f795fe894e84ee6779a3906bd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bc87a5021187606885dbed6ef6e9f297af5544477ce6ce4063e0f7d3b64ee114507e16c721e64d6c29abb5e6c53e82854e826399bd9aabfc50cbf097bb2d66e0
|
7
|
+
data.tar.gz: 91b1bedabe6f6409251df5415ff0b53ad9d65afb2a9a13dc5396e5f0ac9af24ab8212dc446630206d192c31a54d9fb4672ebe489e2a1227ced631f4d8f8105b3
|
data/.gitignore
CHANGED
@@ -1,7 +1,17 @@
|
|
1
|
-
vendor
|
2
|
-
.bundle
|
3
|
-
tmp
|
4
1
|
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
.yardoc
|
5
6
|
Gemfile.lock
|
6
|
-
|
7
|
-
|
7
|
+
InstalledFiles
|
8
|
+
_yardoc
|
9
|
+
coverage
|
10
|
+
doc/
|
11
|
+
lib/bundler/man
|
12
|
+
pkg
|
13
|
+
rdoc
|
14
|
+
spec/reports
|
15
|
+
test/tmp
|
16
|
+
test/version_tmp
|
17
|
+
tmp
|
data/.travis.yml
CHANGED
data/ChangeLog.md
CHANGED
data/Gemfile
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
gemspec
|
3
3
|
|
4
|
-
gem 'rspec', '~>
|
5
|
-
gem '
|
4
|
+
gem 'rspec', '~> 3.0'
|
5
|
+
gem 'rspec-its', '~> 1.0'
|
6
|
+
gem 'guard-rspec', '~> 4.3'
|
6
7
|
gem 'webmock', '~> 1.9'
|
7
8
|
gem 'rb-fsevent', '~> 0.9.1'
|
8
9
|
gem 'timecop', '~> 0.5'
|
10
|
+
gem 'fakefs', require: 'fakefs/safe'
|
data/Guardfile
CHANGED
@@ -1,9 +1,5 @@
|
|
1
|
-
|
2
|
-
# More info at https://github.com/guard/guard#readme
|
3
|
-
|
4
|
-
guard 'rspec' do
|
1
|
+
guard :rspec, cmd: 'bundle exec rspec' do
|
5
2
|
watch(%r{^spec/.+_spec\.rb$})
|
6
3
|
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
7
4
|
watch('spec/spec_helper.rb') { "spec" }
|
8
5
|
end
|
9
|
-
|
data/README.md
CHANGED
@@ -26,13 +26,21 @@ $ ec2ssh init
|
|
26
26
|
```
|
27
27
|
$ vi ~/.ec2ssh
|
28
28
|
---
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
29
|
+
aws_keys(
|
30
|
+
default: {
|
31
|
+
access_key_id: ENV['AWS_ACCESS_KEY_ID'],
|
32
|
+
secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
|
33
|
+
},
|
34
|
+
# my_key1: { access_key_id: '...', secret_access_key: '...' }, ...
|
35
|
+
)
|
36
|
+
regions 'us-east-1'
|
37
|
+
|
38
|
+
# You can use methods of AWS::EC2::Instance.
|
39
|
+
# See http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/EC2/Instance.html
|
40
|
+
host_line <<END
|
41
|
+
Host <%= tags['Name'] %>.<%= availability_zone %>
|
42
|
+
HostName <%= dns_name || private_ip_address %>
|
43
|
+
END
|
36
44
|
```
|
37
45
|
|
38
46
|
### 5. Execute `ec2ssh update`
|
@@ -45,7 +53,7 @@ Then host-names of your instances are generated and wrote to .ssh/config
|
|
45
53
|
### 6. And you can ssh to your instances with your tagged name.
|
46
54
|
|
47
55
|
```
|
48
|
-
$ ssh app-server-1.us-
|
56
|
+
$ ssh app-server-1.us-east-1a
|
49
57
|
```
|
50
58
|
|
51
59
|
# Commands
|
@@ -57,13 +65,6 @@ $ ec2ssh remove # Remove ec2ssh mark from ssh_config
|
|
57
65
|
```
|
58
66
|
|
59
67
|
## Options
|
60
|
-
### --path
|
61
|
-
Each command can use `--path` option to set ssh_config path. `~/.ssh/config` is default.
|
62
|
-
|
63
|
-
```
|
64
|
-
$ ec2ssh init --path /path/to/ssh_config
|
65
|
-
```
|
66
|
-
|
67
68
|
### --dotfile
|
68
69
|
Each command can use `--dotfile` option to set dotfile (.ec2ssh) path. `~/.ec2ssh` is default.
|
69
70
|
|
@@ -71,14 +72,6 @@ Each command can use `--dotfile` option to set dotfile (.ec2ssh) path. `~/.ec2ss
|
|
71
72
|
$ ec2ssh init --dotfile /path/to/ssh_config
|
72
73
|
```
|
73
74
|
|
74
|
-
### --aws-key
|
75
|
-
`ec2ssh update` allows `--aws-key` option. If you have multiple aws keys, you can choose from them as you like using this option. See Dotfile section for details.
|
76
|
-
|
77
|
-
```
|
78
|
-
$ ec2ssh update --aws-key my_key1
|
79
|
-
```
|
80
|
-
|
81
|
-
|
82
75
|
# ssh_config and mark lines
|
83
76
|
`ec2ssh init` command inserts mark lines your `.ssh/config` such as:
|
84
77
|
|
@@ -110,85 +103,28 @@ Host db-server-1.ap-southeast-1
|
|
110
103
|
|
111
104
|
`ec2ssh remove` command removes the mark lines.
|
112
105
|
|
113
|
-
#
|
114
|
-
|
106
|
+
# How to upgrade from 1.x to 2.x
|
107
|
+
If you have used ec2ssh-1.x, it seems that you may not have '~/.ec2ssh'.
|
108
|
+
So you need execute `ec2ssh init` once to create `~/.ec2ssh`, and edit it as you like.
|
115
109
|
|
116
110
|
```
|
117
111
|
$ ec2ssh init
|
118
|
-
$
|
119
|
-
---
|
120
|
-
path: /home/yourname/.ssh/config
|
121
|
-
aws_keys:
|
122
|
-
default:
|
123
|
-
access_key_id: ...(Filled by ENV['AMAZON_ACCESS_KEY_ID']
|
124
|
-
secret_access_key: ...(Filled by ENV['AMAZON_SECRET_ACCESS_KEY'])
|
125
|
-
regions:
|
126
|
-
- ap-northeast-1
|
127
|
-
```
|
128
|
-
|
129
|
-
## multiple aws keys
|
130
|
-
You can use multiple aws keys at `ec2ssh update` with `--aws-key` option.
|
131
|
-
|
132
|
-
```
|
133
|
-
$ cat ~/.ec2ssh
|
134
|
-
---
|
135
|
-
path: /home/yourname/.ssh/config
|
136
|
-
aws_keys:
|
137
|
-
default:
|
138
|
-
access_key_id: ...
|
139
|
-
secret_access_key: ...
|
140
|
-
my_key1:
|
141
|
-
access_key_id: ...
|
142
|
-
secret_access_key: ...
|
143
|
-
regions:
|
144
|
-
- ap-northeast-1
|
145
|
-
```
|
146
|
-
|
147
|
-
Updating ssh_config by 'default' aws key:
|
148
|
-
|
149
|
-
```
|
150
|
-
$ ec2ssh update
|
112
|
+
$ vi ~/.ec2ssh
|
151
113
|
```
|
152
114
|
|
153
|
-
|
154
|
-
|
155
|
-
```
|
156
|
-
$ ec2ssh update --aws-key my_key1
|
157
|
-
```
|
115
|
+
# How to upgrade from 2.x to 3.x
|
116
|
+
Dotfile (`.ec2ssh`) format has been changed from YAML to Ruby DSL.
|
158
117
|
|
159
|
-
|
160
|
-
You can set other ssh options such as IdentityFile or User.
|
118
|
+
Don't panic and run `ec2ssh migrate` if you have ec2ssh-2.x styled dotfile.
|
161
119
|
|
162
120
|
```
|
163
|
-
$
|
164
|
-
---
|
165
|
-
path: /home/yourname/.ssh/config
|
166
|
-
aws_keys:
|
167
|
-
default:
|
168
|
-
access_key_id: ...
|
169
|
-
secret_access_key: ...
|
170
|
-
my_key1:
|
171
|
-
access_key_id: ...
|
172
|
-
secret_access_key: ...
|
173
|
-
regions:
|
174
|
-
- ap-northeast-1
|
175
|
-
ssh_options:
|
176
|
-
- "IdentityFile ~/.ssh/ec2.id_rsa"
|
177
|
-
- "User ec2-user"
|
178
|
-
- "TCPKeepAlive yes"
|
121
|
+
$ ec2ssh migrate
|
179
122
|
```
|
180
123
|
|
181
|
-
|
182
|
-
If you have used ec2ssh-1.x, it seems that you may not have '~/.ec2ssh'.
|
183
|
-
So you need execute `ec2ssh init` once to create `~/.ec2ssh`, and edit it as you like.
|
184
|
-
|
185
|
-
```
|
186
|
-
$ ec2ssh init
|
187
|
-
$ vi ~/.ec2ssh
|
188
|
-
```
|
124
|
+
This command converts your existing `.ec2ssh` file into 3.x style.
|
189
125
|
|
190
126
|
# Notice
|
191
127
|
`ec2ssh` command updates your `.ssh/config` file default. You should make a backup of it.
|
192
128
|
|
193
129
|
# License
|
194
|
-
ec2ssh is released under the MIT license.
|
130
|
+
Copyright (c) 2014 Issei Naruta. ec2ssh is released under the MIT license.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,17 @@
|
|
1
|
+
path '~/.ssh/config'
|
2
|
+
aws_keys(
|
3
|
+
{
|
4
|
+
access_key_id: ENV['AWS_ACCESS_KEY_ID'],
|
5
|
+
secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
|
6
|
+
},
|
7
|
+
#{
|
8
|
+
# access_key_id: '...'
|
9
|
+
# secret_access_key: '...'
|
10
|
+
#}
|
11
|
+
)
|
12
|
+
regions 'ap-northeast-1', 'us-east-1'
|
13
|
+
reject {|instance| instance.tags['Name'] =~ /.../ }
|
14
|
+
host_lines <<END
|
15
|
+
Host <%= tags['Name'] %>
|
16
|
+
HostName <%= private_ip_address %>
|
17
|
+
END
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'ec2ssh/ec2_instances'
|
2
|
+
require 'erb'
|
3
|
+
require 'stringio'
|
4
|
+
|
5
|
+
module Ec2ssh
|
6
|
+
class Builder
|
7
|
+
def initialize(container)
|
8
|
+
@container = container
|
9
|
+
@host_lines_erb = ERB.new @container.host_line
|
10
|
+
end
|
11
|
+
|
12
|
+
def build_host_lines
|
13
|
+
out = StringIO.new
|
14
|
+
@container.aws_keys.each do |name, key|
|
15
|
+
out.puts "# section: #{name}"
|
16
|
+
ec2s.instances(name).each do |instance|
|
17
|
+
bind = instance.instance_eval { binding }
|
18
|
+
next if @container.reject && @container.reject.call(instance)
|
19
|
+
out.puts @host_lines_erb.result(bind)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
out.string
|
23
|
+
end
|
24
|
+
|
25
|
+
def ec2s
|
26
|
+
@ec2s ||= Ec2Instances.new @container.aws_keys, @container.regions
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/ec2ssh/cli.rb
CHANGED
@@ -1,79 +1,93 @@
|
|
1
1
|
require 'thor'
|
2
2
|
require 'highline'
|
3
|
-
require 'ec2ssh/hosts'
|
4
3
|
require 'ec2ssh/ssh_config'
|
5
|
-
require 'ec2ssh/
|
4
|
+
require 'ec2ssh/exceptions'
|
5
|
+
require 'ec2ssh/migrator'
|
6
6
|
|
7
7
|
module Ec2ssh
|
8
8
|
class CLI < Thor
|
9
|
-
class_option :
|
10
|
-
class_option :
|
9
|
+
class_option :dotfile, banner: '$HOME/.ec2ssh', default: "#{ENV['HOME']}/.ec2ssh"
|
10
|
+
class_option :verbose, banner: 'enable debug log', default: false
|
11
11
|
|
12
|
-
desc
|
12
|
+
desc 'init', 'Add ec2ssh mark to ssh_config'
|
13
13
|
def init
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
green "Added mark to #{config_path}"
|
20
|
-
end
|
21
|
-
dotfile = Dotfile.update_or_create(options.dotfile, 'path' => config_path)
|
22
|
-
yellow "Please check and edit #{options.dotfile} before run `ec2ssh update`"
|
14
|
+
check_dotfile_version
|
15
|
+
command = make_command :init
|
16
|
+
command.run
|
17
|
+
rescue MarkAlreadyExists
|
18
|
+
red "Marker already exists in #{command.ssh_config_path}"
|
23
19
|
end
|
24
20
|
|
25
|
-
desc
|
26
|
-
method_option :aws_key, :
|
21
|
+
desc 'update', 'Update ec2 hosts list in ssh_config'
|
22
|
+
method_option :aws_key, banner: 'aws key name', default: 'default'
|
27
23
|
def update
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
yellow config_str
|
40
|
-
green "Updated #{hosts.size} hosts on #{config_path}"
|
41
|
-
rescue AwsEnvNotDefined, AwsKeyNotFound
|
42
|
-
red "Set aws keys at #{options.dotfile}"
|
24
|
+
check_dotfile_existence
|
25
|
+
check_dotfile_version
|
26
|
+
set_aws_logging
|
27
|
+
command = make_command :update
|
28
|
+
command.run
|
29
|
+
green "Updated #{command.ssh_config_path}"
|
30
|
+
rescue AwsKeyNotFound
|
31
|
+
red "Set aws keys at #{command.dotfile_path}"
|
32
|
+
rescue MarkNotFound
|
33
|
+
red "Marker not found in #{command.ssh_config_path}"
|
34
|
+
red "Execute '#{$0} init' first!"
|
43
35
|
end
|
44
36
|
|
45
|
-
desc
|
37
|
+
desc 'remove', 'Remove ec2ssh mark from ssh_config'
|
46
38
|
def remove
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
39
|
+
check_dotfile_existence
|
40
|
+
check_dotfile_version
|
41
|
+
command = make_command :remove
|
42
|
+
command.run
|
43
|
+
green "Removed mark from #{command.ssh_config_path}"
|
44
|
+
rescue MarkNotFound
|
45
|
+
red "Marker not found in #{command.ssh_config_path}"
|
46
|
+
end
|
47
|
+
|
48
|
+
desc 'migrate', 'Migrate dotfile from old versions'
|
49
|
+
def migrate
|
50
|
+
command = make_command :migrate
|
51
|
+
command.run
|
54
52
|
end
|
55
53
|
|
56
54
|
no_tasks do
|
57
|
-
def
|
58
|
-
|
55
|
+
def check_dotfile_version
|
56
|
+
return unless File.exist?(options.dotfile)
|
57
|
+
migrator = Migrator.new options.dotfile
|
58
|
+
if migrator.check_version < '3'
|
59
|
+
red "#{options.dotfile} is old style."
|
60
|
+
red "Try '#{$0} migrate' to migrate to version 3"
|
61
|
+
abort
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def check_dotfile_existence
|
66
|
+
unless File.exist?(options.dotfile)
|
67
|
+
red "#{options.dotfile} doesn't exist."
|
68
|
+
red "Try '#{$0} init' to generate it or specify the path with --dotfile option"
|
69
|
+
abort
|
70
|
+
end
|
59
71
|
end
|
60
72
|
|
61
|
-
def
|
62
|
-
|
73
|
+
def make_command(cmd)
|
74
|
+
require "ec2ssh/command/#{cmd}"
|
75
|
+
cls = eval "Ec2ssh::Command::#{cmd.capitalize}"
|
76
|
+
cls.new(self)
|
63
77
|
end
|
64
78
|
|
65
|
-
def
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
79
|
+
def set_aws_logging
|
80
|
+
if options.verbose
|
81
|
+
require 'logger'
|
82
|
+
require 'aws-sdk'
|
83
|
+
logger = ::Logger.new($stdout)
|
84
|
+
logger.level = ::Logger::DEBUG
|
85
|
+
::AWS.config logger: logger
|
72
86
|
end
|
73
87
|
end
|
74
88
|
|
75
|
-
def
|
76
|
-
|
89
|
+
def hl
|
90
|
+
@hl ||= ::HighLine.new
|
77
91
|
end
|
78
92
|
|
79
93
|
[:red,:green,:yellow].each do |col|
|
@@ -81,45 +95,6 @@ module Ec2ssh
|
|
81
95
|
puts hl.color(str, col)
|
82
96
|
end
|
83
97
|
end
|
84
|
-
|
85
|
-
def merge_sections(config)
|
86
|
-
ssh_options = dotfile['ssh_options']
|
87
|
-
|
88
|
-
section_str = hosts.map { |h|
|
89
|
-
section = <<-END
|
90
|
-
Host #{h[:host]}
|
91
|
-
HostName #{h[:dns_name]}
|
92
|
-
END
|
93
|
-
|
94
|
-
unless ssh_options.nil?
|
95
|
-
ssh_options.each {|line|
|
96
|
-
section << " #{line}\n"
|
97
|
-
}
|
98
|
-
end
|
99
|
-
|
100
|
-
section
|
101
|
-
}.join
|
102
|
-
|
103
|
-
config.sections[options.aws_key] ||= SshConfig::Section.new(
|
104
|
-
options.aws_key,
|
105
|
-
section_str
|
106
|
-
)
|
107
|
-
|
108
|
-
sections = config.sections.values.map do |section|
|
109
|
-
if (
|
110
|
-
# section is matched
|
111
|
-
(section.name == options.aws_key) ||
|
112
|
-
|
113
|
-
# for backward compatibility
|
114
|
-
(config.sections.size == 1 && options.aws_key != 'default')
|
115
|
-
)
|
116
|
-
section.name = options.aws_key
|
117
|
-
section.replace!(section_str)
|
118
|
-
end
|
119
|
-
|
120
|
-
section.to_s
|
121
|
-
end
|
122
|
-
end
|
123
98
|
end
|
124
99
|
end
|
125
100
|
end
|