opsicle 2.4.1 → 2.5.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 +4 -4
- data/lib/opsicle/commands/ssh.rb +19 -1
- data/lib/opsicle/version.rb +1 -1
- data/spec/opsicle/commands/ssh_spec.rb +56 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bfb0c5b2df559b5e304081b7873a6b2a1cb54056
|
4
|
+
data.tar.gz: 003e30c1669eaa33aca7fe4c98d9442099c30e4d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d94244b39e85e12301faa568330dae5a22fb937397fd55acee3f57fa0843e220d3bad89c1b3f45e08805dda16e609efd9d38a7792078ef5b313189242ddbf14c
|
7
|
+
data.tar.gz: d46d043f5ef64d3f74580cb9645a6b733533dc49323922f16f51bdb8acd523e2711e63aef8ce4b47c71db5be0dd7edff72cccfd2d19e1573148b75791067746d
|
data/lib/opsicle/commands/ssh.rb
CHANGED
@@ -42,6 +42,23 @@ module Opsicle
|
|
42
42
|
@user_profile.ssh_username
|
43
43
|
end
|
44
44
|
|
45
|
+
def bastion_ip
|
46
|
+
if client.config.opsworks_config[:bastion_layer_id]
|
47
|
+
online_bastions = client.api_call(
|
48
|
+
:describe_instances, {layer_id: client.config.opsworks_config[:bastion_layer_id] }
|
49
|
+
)[:instances].select { |instance| instance[:status].to_s == 'online'}
|
50
|
+
bastion_ip = online_bastions.sample[:public_ip]
|
51
|
+
Output.say "Connecting via bastion with IP #{bastion_ip}"
|
52
|
+
bastion_ip
|
53
|
+
elsif client.config.opsworks_config[:bastion_hostname]
|
54
|
+
bastion_hostname = client.config.opsworks_config[:bastion_hostname]
|
55
|
+
Output.say "Connecting via bastion with hostname '#{bastion_hostname}'"
|
56
|
+
bastion_hostname
|
57
|
+
else
|
58
|
+
false
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
45
62
|
def ssh_ip(instance)
|
46
63
|
if client.config.opsworks_config[:internal_ssh_only]
|
47
64
|
Output.say "This stack requires a private connection, only using internal IPs."
|
@@ -54,10 +71,11 @@ module Opsicle
|
|
54
71
|
def ssh_command(instance, options={})
|
55
72
|
ssh_command = " \"#{options[:"ssh-cmd"].gsub(/'/){ %q(\') }}\"" if options[:"ssh-cmd"] #escape single quotes
|
56
73
|
ssh_options = options[:"ssh-opts"] ? "#{options[:"ssh-opts"]} " : ""
|
74
|
+
external_ip = bastion_ip || public_ips.sample
|
57
75
|
if instance_ip = ssh_ip(instance)
|
58
76
|
ssh_string = "#{ssh_username}@#{instance_ip}"
|
59
77
|
else
|
60
|
-
ssh_string = "#{ssh_username}@#{
|
78
|
+
ssh_string = "#{ssh_username}@#{external_ip} ssh #{instance[:private_ip]}"
|
61
79
|
ssh_options.concat('-A -t ')
|
62
80
|
end
|
63
81
|
|
data/lib/opsicle/version.rb
CHANGED
@@ -120,6 +120,30 @@ module Opsicle
|
|
120
120
|
end
|
121
121
|
end
|
122
122
|
|
123
|
+
context "#bastion_ip" do
|
124
|
+
let(:instance) { { hostname: "host1", elastic_ip: "123.123.123.123", public_ip: "123.345.567.789", private_ip: "10.10.10.10" } }
|
125
|
+
context "when bastion_layer_id is enabled" do
|
126
|
+
let(:client) { double(config: double(opsworks_config: {stack_id: "1234", bastion_layer_id: "4321"})) }
|
127
|
+
it "returns a Bastion IP" do
|
128
|
+
expect(client).to receive(:api_call).with(:describe_instances, {layer_id: "4321"})
|
129
|
+
.and_return(instances: [{:hostname => "taco", :status => "stopped", :public_ip => "123.123.123.123"},{:hostname => "bar", :status => "online", :public_ip => "213.213.213.213"}])
|
130
|
+
expect(Output).to receive(:say).with("Connecting via bastion with IP 213.213.213.213")
|
131
|
+
expect(subject.bastion_ip).to eq("213.213.213.213")
|
132
|
+
end
|
133
|
+
end
|
134
|
+
context "when bastion_hostname is enabled" do
|
135
|
+
let(:client) { double(config: double(opsworks_config: {stack_id: "1234", bastion_hostname: "sebastion"})) }
|
136
|
+
it "returns the hostname of the bastion host" do
|
137
|
+
expect(subject.bastion_ip).to eq("sebastion")
|
138
|
+
end
|
139
|
+
end
|
140
|
+
context "when bastion is not used" do
|
141
|
+
it "returns false" do
|
142
|
+
expect(subject.bastion_ip).to eq(false)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
123
147
|
context "#ssh_ip" do
|
124
148
|
let(:instance) { { hostname: "host1", elastic_ip: "123.123.123.123", public_ip: "123.345.567.789", private_ip: "10.10.10.10" } }
|
125
149
|
context "when internal_ssh_only is enabled" do
|
@@ -165,12 +189,42 @@ module Opsicle
|
|
165
189
|
it "creates the proper ssh_command for an instance with a private ip" do
|
166
190
|
expect(subject.ssh_command({private_ip: "789.789.789.789" })).to eq("ssh -A -t mrderpyman2014@123.123.123.123 ssh 789.789.789.789")
|
167
191
|
end
|
168
|
-
it "properly adds ssh options to the ssh_command for an
|
192
|
+
it "properly adds ssh options to the ssh_command for an instance with a public ip" do
|
169
193
|
expect(subject.ssh_command({elastic_ip: "123.123.123.123" }, { :"ssh-opts" => "-c"})).to eq("ssh -c mrderpyman2014@123.123.123.123")
|
170
194
|
end
|
171
|
-
it "properly adds ssh options to the ssh_command for an
|
195
|
+
it "properly adds ssh options to the ssh_command for an instance with a private ip" do
|
172
196
|
expect(subject.ssh_command({private_ip: "789.789.789.789"}, { :"ssh-opts" => "-c"} )).to eq("ssh -c -A -t mrderpyman2014@123.123.123.123 ssh 789.789.789.789")
|
173
197
|
end
|
198
|
+
context "when bastion_layer_id is enabled" do
|
199
|
+
let(:client) { double(config: double(opsworks_config: {stack_id: "1234", bastion_layer_id: "4321"})) }
|
200
|
+
it "creates the proper ssh_command for an instance with a private ip" do
|
201
|
+
expect(client).to receive(:api_call).with(:describe_instances, {layer_id: "4321"})
|
202
|
+
.and_return(instances: [
|
203
|
+
{:hostname => "taco", :status => "stopped", :public_ip => "123.123.123.123"},
|
204
|
+
{:hostname => "bar", :status => "online", :public_ip => "213.213.213.213"}
|
205
|
+
])
|
206
|
+
expect(subject.ssh_command({private_ip: "789.789.789.789" })).to eq("ssh -A -t mrderpyman2014@213.213.213.213 ssh 789.789.789.789")
|
207
|
+
end
|
208
|
+
it "properly adds ssh options to the ssh_command for an instance with a private ip" do
|
209
|
+
expect(client).to receive(:api_call).with(:describe_instances, {layer_id: "4321"})
|
210
|
+
.and_return(instances: [
|
211
|
+
{:hostname => "taco", :status => "stopped", :public_ip => "123.123.123.123"},
|
212
|
+
{:hostname => "bar", :status => "online", :public_ip => "213.213.213.213"}
|
213
|
+
])
|
214
|
+
expect(subject.ssh_command({private_ip: "789.789.789.789"}, { :"ssh-opts" => "-c"} )).to eq("ssh -c -A -t mrderpyman2014@213.213.213.213 ssh 789.789.789.789")
|
215
|
+
end
|
216
|
+
end
|
217
|
+
context "when bastion_hostname is enabled" do
|
218
|
+
let(:client) { double(config: double(opsworks_config: {stack_id: "1234", bastion_hostname: "sebastion"})) }
|
219
|
+
it "creates the proper ssh_command for an instance with a private ip" do
|
220
|
+
expect(Output).to receive(:say).with("Connecting via bastion with hostname 'sebastion'")
|
221
|
+
expect(subject.ssh_command({private_ip: "789.789.789.789" })).to eq("ssh -A -t mrderpyman2014@sebastion ssh 789.789.789.789")
|
222
|
+
end
|
223
|
+
it "properly adds ssh options to the ssh_command for an instance with a private ip" do
|
224
|
+
expect(Output).to receive(:say).with("Connecting via bastion with hostname 'sebastion'")
|
225
|
+
expect(subject.ssh_command({private_ip: "789.789.789.789"}, { :"ssh-opts" => "-c"} )).to eq("ssh -c -A -t mrderpyman2014@sebastion ssh 789.789.789.789")
|
226
|
+
end
|
227
|
+
end
|
174
228
|
end
|
175
229
|
|
176
230
|
context "#instance_info" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opsicle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Fleener
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-04-
|
12
|
+
date: 2017-04-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: aws-sdk
|