chef-metal-ssh 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -26,8 +26,8 @@ Or install it yourself as:
26
26
  provisioner ChefMetalSsh::SshProvisioner.new
27
27
  provisioner_options 'target_ip' => '192.168.33.21',
28
28
  'ssh_user' => 'vagrant',
29
- 'ssh_connect_options' => {
30
- 'ssh_pass' => 'vagrant'
29
+ 'ssh_options' => {
30
+ 'password' => 'vagrant'
31
31
  }
32
32
  recipe 'ssh_test::remote1'
33
33
  notifies :create, 'machine[two]'
@@ -60,7 +60,11 @@ cd into the test directory:
60
60
 
61
61
  then run:
62
62
 
63
- `bash run_zero install`
63
+ `bash run_zero install_local` if you built the gem locally first using `rake build`
64
+
65
+ otherwise:
66
+
67
+ `bash run_zero install_rubygems`
64
68
 
65
69
  this will install the prereqs. then run:
66
70
 
@@ -1,3 +1,4 @@
1
+ require 'resolv'
1
2
  require 'chef_metal/provisioner'
2
3
  require 'chef_metal/version'
3
4
  require 'chef_metal/machine/basic_machine'
@@ -27,17 +28,17 @@ module ChefMetalSsh
27
28
  # node will have node['normal']['provisioner_options'] in it with any options.
28
29
  # It is a hash with this format:
29
30
  #
30
- # -- provisioner_url: ssh:<ssh_path>
31
+ # -- provisioner_url: ssh:<@target_host>
31
32
  # -- target_ip: the IP address of the target machine - IP or FQDN is required
32
33
  # -- target_fqdn: The Resolvable name of the target machine - IP or FQDN is required
33
34
  # -- ssh_user: the user to ssh as
34
- # -- ssh_config: options to pass the ssh command. available options are here - https://github.com/net-ssh/net-ssh/blob/master/lib/net/ssh.rb#L61
35
+ # -- ssh_options: options to pass the ssh command. available options are here - https://github.com/net-ssh/net-ssh/blob/master/lib/net/ssh.rb#L61
35
36
  #
36
37
  # node['normal']['provisioner_output'] will be populated with information
37
38
  # about the created machine. For ssh, it is a hash with this
38
39
  # format:
39
40
  #
40
- # -- provisioner_url: ssh:<ssh_path>
41
+ # -- provisioner_url: ssh:<@target_host>
41
42
  # -- name: container name
42
43
  #
43
44
  def acquire_machine(action_handler, node)
@@ -59,7 +60,7 @@ module ChefMetalSsh
59
60
  # Set up Provisioner Output
60
61
  # TODO - make url the chef server url path? maybe disk path if zero?
61
62
  provisioner_output = node['normal']['provisioner_output'] || {
62
- 'provisioner_url' => "ssh:#{target_host}",
63
+ 'provisioner_url' => "ssh:#{@target_host}",
63
64
  'name' => node['name']
64
65
  }
65
66
 
@@ -127,8 +128,28 @@ module ChefMetalSsh
127
128
  if @target_host
128
129
  remote_host = @target_host
129
130
  elsif target_ip
131
+ raise 'Invalid IP' unless ( target_ip =~ Resolv::IPv4::Regex ||
132
+ target_ip =~ Resolv::IPv6::Regex )
130
133
  remote_host = target_ip
131
134
  elsif target_fqdn
135
+ rh = Resolv::Hosts.new
136
+ rd = Resolv.new
137
+
138
+ begin
139
+ rh.getaddress(target_fqdn)
140
+ in_hosts_file = true
141
+ rescue
142
+ in_hosts_file = false
143
+ end
144
+
145
+ begin
146
+ rd.getaddress(target_fqdn)
147
+ in_dns = true
148
+ rescue
149
+ in_dns = false
150
+ end
151
+
152
+ raise 'Unresolvable Hostname' unless ( in_hosts_file || in_dns )
132
153
  remote_host = target_fqdn
133
154
  else
134
155
  raise "aint got no target yo, that dog dont hunt"
@@ -151,12 +172,26 @@ module ChefMetalSsh
151
172
  end
152
173
  end
153
174
 
175
+ def symbolize_keys(hash)
176
+ hash.inject({}){|result, (key, value)|
177
+ new_key = case key
178
+ when String then key.to_sym
179
+ else key
180
+ end
181
+ new_value = case value
182
+ when Hash then symbolize_keys(value)
183
+ else value
184
+ end
185
+ result[new_key] = new_value
186
+ result
187
+ }
188
+ end
189
+
154
190
  # Setup Ssh
155
191
  def create_ssh_transport(node)
156
- # TODO - verify target_host resolves
157
- # Verify Valid IP
158
192
 
159
- provisioner_options = node['normal']['provisioner_options']
193
+ provisioner_options = node['normal']['provisioner_options']
194
+ provisioner_ssh_options = provisioner_options['ssh_options']
160
195
 
161
196
  Chef::Log.debug("======================================>")
162
197
  Chef::Log.debug("create_ssh_transport - target_host: #{@target_host}")
@@ -164,8 +199,8 @@ module ChefMetalSsh
164
199
 
165
200
  ##
166
201
  # Ssh Username
167
- username = ''
168
- username = provisioner_options['ssh_user'] || 'vagrant'
202
+ username = ''
203
+ username = provisioner_options['ssh_user'] || 'vagrant'
169
204
 
170
205
  Chef::Log.debug("======================================>")
171
206
  Chef::Log.debug("create_ssh_transport - username: #{username}")
@@ -173,29 +208,76 @@ module ChefMetalSsh
173
208
 
174
209
  ##
175
210
  # Ssh Password
176
- ssh_pass = ''
177
- ssh_pass = provisioner_options['ssh_connect_options']['ssh_pass']
211
+ ssh_pass = false
212
+ ssh_pass = provisioner_ssh_options['password'] if provisioner_ssh_options['password']
213
+ # ssh_pass = ssh_options[:password] if ssh_options[:password]
214
+
215
+ ##
216
+ # Ssh Key
217
+ ssh_key = false
218
+ ssh_key = provisioner_ssh_options['host_key'] if provisioner_ssh_options['host_key']
178
219
 
179
220
  Chef::Log.debug("======================================>")
180
- Chef::Log.debug("create_ssh_transport - ssh_pass: #{ssh_pass}")
221
+ if ssh_pass
222
+ Chef::Log.debug("create_ssh_transport - ssh_pass: #{ssh_pass}")
223
+ elsif ssh_key
224
+ Chef::Log.debug("create_ssh_transport - ssh_key: #{ssh_key}")
225
+ else
226
+ Chef::Log.debug("create_ssh_transport - no ssh_pass or ssh_key given")
227
+ end
181
228
  Chef::Log.debug("======================================>")
182
229
 
230
+ raise "no ssh_pass or ssh_key given" unless ( ssh_pass || ssh_key )
183
231
  ##
184
232
  # Ssh Main Options
185
- ssh_options = {}
186
- ssh_options = {
187
- # TODO create a user known hosts file
188
- # :user_known_hosts_file => provisioner_options['ssh_connect_options']['UserKnownHostsFile'],
189
- # :paranoid => true,
190
- # :auth_methods => [ 'publickey' ],
191
- :keys_only => false,
192
- :password => ssh_pass
193
- }
233
+ valid_ssh_options = [
234
+ :auth_methods, :bind_address, :compression, :compression_level, :config,
235
+ :encryption, :forward_agent, :hmac, :host_key,
236
+ :keepalive, :keepalive_interval, :kex, :keys, :key_data,
237
+ :languages, :logger, :paranoid, :password, :port, :proxy,
238
+ :rekey_blocks_limit,:rekey_limit, :rekey_packet_limit, :timeout, :verbose,
239
+ :global_known_hosts_file, :user_known_hosts_file, :host_key_alias,
240
+ :host_name, :user, :properties, :passphrase, :keys_only, :max_pkt_size,
241
+ :max_win_size, :send_env, :use_agent
242
+ ]
243
+
244
+ ##
245
+ # Ssh Main Options
246
+ ssh_options = symbolize_keys(provisioner_ssh_options)
247
+
248
+ # Validate Ssh Options
249
+ ssh_options.each { |k,v| raise 'Invalid Shh Option' unless valid_ssh_options.include?(k) }
250
+
251
+ ##
252
+ # Ssh Main Options
253
+ # ssh_options = symbolize_keys(provisioner_ssh_options)
254
+ # ssh_options = {
255
+ # # TODO create a user known hosts file
256
+ # # :user_known_hosts_file => provisioner_options['ssh_connect_options']['UserKnownHostsFile'],
257
+ # # :paranoid => true,
258
+ # # :auth_methods => [ 'publickey' ],
259
+ # :keys_only => false,
260
+ # :host_key => ssh_key,
261
+ # :password => ssh_pass
262
+ # }
194
263
 
195
264
  Chef::Log.debug("======================================>")
196
265
  Chef::Log.debug("create_ssh_transport - ssh_options: #{ssh_options.inspect}")
197
266
  Chef::Log.debug("======================================>")
198
267
 
268
+ # Make Sure We Can Connect
269
+ begin
270
+ ssh = Net::SSH.start(@target_host, username, ssh_options)
271
+ ssh.close
272
+ Chef::Log.debug("======================================>")
273
+ Chef::Log.debug("ABLE to Connect to #{@target_host} using #{username} and #{ssh_options.inspect}")
274
+ Chef::Log.debug("======================================>")
275
+ rescue
276
+ Chef::Log.debug("======================================>")
277
+ Chef::Log.debug("UNABLE to Connect to #{@target_host} using #{username} and #{ssh_options.inspect}")
278
+ Chef::Log.debug("======================================>")
279
+ raise "UNABLE to Connect to #{@target_host} using #{username} and #{ssh_options.inspect}"
280
+ end
199
281
 
200
282
  ##
201
283
  # Ssh Additional Options
@@ -1,3 +1,3 @@
1
1
  module ChefMetalSsh
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef-metal-ssh
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-04-07 00:00:00.000000000 Z
12
+ date: 2014-04-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: chef
16
- requirement: !ruby/object:Gem::Requirement
16
+ requirement: &13107560 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,15 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ! '>='
28
- - !ruby/object:Gem::Version
29
- version: '0'
24
+ version_requirements: *13107560
30
25
  - !ruby/object:Gem::Dependency
31
26
  name: chef-metal
32
- requirement: !ruby/object:Gem::Requirement
27
+ requirement: &13163400 !ruby/object:Gem::Requirement
33
28
  none: false
34
29
  requirements:
35
30
  - - ~>
@@ -37,15 +32,10 @@ dependencies:
37
32
  version: '0.6'
38
33
  type: :runtime
39
34
  prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ~>
44
- - !ruby/object:Gem::Version
45
- version: '0.6'
35
+ version_requirements: *13163400
46
36
  - !ruby/object:Gem::Dependency
47
37
  name: bundler
48
- requirement: !ruby/object:Gem::Requirement
38
+ requirement: &13161940 !ruby/object:Gem::Requirement
49
39
  none: false
50
40
  requirements:
51
41
  - - ~>
@@ -53,15 +43,10 @@ dependencies:
53
43
  version: '1.5'
54
44
  type: :development
55
45
  prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
- requirements:
59
- - - ~>
60
- - !ruby/object:Gem::Version
61
- version: '1.5'
46
+ version_requirements: *13161940
62
47
  - !ruby/object:Gem::Dependency
63
48
  name: rspec
64
- requirement: !ruby/object:Gem::Requirement
49
+ requirement: &13160480 !ruby/object:Gem::Requirement
65
50
  none: false
66
51
  requirements:
67
52
  - - ! '>='
@@ -69,15 +54,10 @@ dependencies:
69
54
  version: '0'
70
55
  type: :development
71
56
  prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
- requirements:
75
- - - ! '>='
76
- - !ruby/object:Gem::Version
77
- version: '0'
57
+ version_requirements: *13160480
78
58
  - !ruby/object:Gem::Dependency
79
59
  name: rake
80
- requirement: !ruby/object:Gem::Requirement
60
+ requirement: &13158020 !ruby/object:Gem::Requirement
81
61
  none: false
82
62
  requirements:
83
63
  - - ! '>='
@@ -85,12 +65,7 @@ dependencies:
85
65
  version: '0'
86
66
  type: :development
87
67
  prerelease: false
88
- version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
- requirements:
91
- - - ! '>='
92
- - !ruby/object:Gem::Version
93
- version: '0'
68
+ version_requirements: *13158020
94
69
  description: Provisioner for managing servers using ssh in Chef Metal.
95
70
  email: zackzondlo@gmail.com
96
71
  executables: []
@@ -102,8 +77,8 @@ files:
102
77
  - Rakefile
103
78
  - LICENSE.txt
104
79
  - README.md
105
- - lib/chef_metal_ssh.rb
106
80
  - lib/chef_metal/provisioner_init/ssh_init.rb
81
+ - lib/chef_metal_ssh.rb
107
82
  - lib/chef_metal_ssh/ssh_provisioner.rb
108
83
  - lib/chef_metal_ssh/version.rb
109
84
  homepage: https://github.com/double-z/chef-metal-ssh
@@ -126,7 +101,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
126
101
  version: '0'
127
102
  requirements: []
128
103
  rubyforge_project:
129
- rubygems_version: 1.8.23.2
104
+ rubygems_version: 1.8.11
130
105
  signing_key:
131
106
  specification_version: 3
132
107
  summary: Provisioner for managing servers using ssh in Chef Metal.