mofa 0.3.39 → 0.3.40
Sign up to get free protection for your applications and to get access to all the features.
- data/.rubocop.yml +18 -0
- data/lib/mofa/provision_cmd.rb +30 -37
- data/lib/mofa/version.rb +1 -1
- metadata +2 -2
data/.rubocop.yml
CHANGED
@@ -1,5 +1,23 @@
|
|
1
1
|
Metrics/LineLength:
|
2
2
|
Enabled: false
|
3
3
|
|
4
|
+
Metrics/MethodLength:
|
5
|
+
Enabled: false
|
6
|
+
|
7
|
+
Metrics/ClassLength:
|
8
|
+
Enabled: false
|
9
|
+
|
10
|
+
Metrics/AbcSize:
|
11
|
+
Enabled: false
|
12
|
+
|
13
|
+
Metrics/CyclomaticComplexity:
|
14
|
+
Enabled: false
|
15
|
+
|
16
|
+
Metrics/PerceivedComplexity:
|
17
|
+
Enabled: false
|
18
|
+
|
4
19
|
Style/Encoding:
|
5
20
|
Enabled: false
|
21
|
+
|
22
|
+
Style/Documentation:
|
23
|
+
Enabled: false
|
data/lib/mofa/provision_cmd.rb
CHANGED
@@ -58,10 +58,10 @@ class ProvisionCmd < MofaCmd
|
|
58
58
|
|
59
59
|
def prepare_host(hostname, host_index, solo_dir)
|
60
60
|
puts
|
61
|
-
puts
|
62
|
-
puts "Chef-Solo on Host #{hostname} (#{host_index}/#{hostlist.list.length
|
63
|
-
puts
|
64
|
-
Net::SSH.start(hostname, Mofa::Config.config['ssh_user'], :
|
61
|
+
puts '----------------------------------------------------------------------'
|
62
|
+
puts "Chef-Solo on Host #{hostname} (#{host_index}/#{hostlist.list.length})"
|
63
|
+
puts '----------------------------------------------------------------------'
|
64
|
+
Net::SSH.start(hostname, Mofa::Config.config['ssh_user'], keys: [Mofa::Config.config['ssh_keyfile']], port: Mofa::Config.config['ssh_port'], verbose: :error) do |ssh|
|
65
65
|
puts "Remotely creating solo_dir \"#{solo_dir}\" on host #{hostname}"
|
66
66
|
# remotely create the temp folder
|
67
67
|
out = ssh_exec!(ssh, "[ -d #{solo_dir} ] || mkdir #{solo_dir}")
|
@@ -79,8 +79,8 @@ class ProvisionCmd < MofaCmd
|
|
79
79
|
end
|
80
80
|
|
81
81
|
def create_solo_rb(sftp, hostname, solo_dir)
|
82
|
-
puts "Remotely creating \"#{solo_dir}/solo.rb\""
|
83
|
-
sftp.file.open("#{solo_dir}/solo.rb",
|
82
|
+
puts "Remotely creating \"#{solo_dir}/solo.rb\" on #{hostname}..."
|
83
|
+
sftp.file.open("#{solo_dir}/solo.rb", 'w') do |file|
|
84
84
|
solo_rb = <<-"EOF"
|
85
85
|
cookbook_path [ "#{solo_dir}/cookbooks" ]
|
86
86
|
data_bag_path "#{solo_dir}/data_bags"
|
@@ -94,20 +94,20 @@ class ProvisionCmd < MofaCmd
|
|
94
94
|
end
|
95
95
|
|
96
96
|
def create_node_json(sftp, hostname, solo_dir, attributes_map)
|
97
|
-
puts "Remotely creating \"#{solo_dir}/node.json\""
|
97
|
+
puts "Remotely creating \"#{solo_dir}/node.json\" on #{hostname}..."
|
98
98
|
node_json = {}
|
99
99
|
node_json.store('run_list', runlist_map.mp[hostname])
|
100
100
|
attributes_map.mp[hostname].each do |key, value|
|
101
101
|
node_json.store(key, value)
|
102
102
|
end
|
103
103
|
|
104
|
-
sftp.file.open("#{solo_dir}/node.json",
|
104
|
+
sftp.file.open("#{solo_dir}/node.json", 'w') do |file|
|
105
105
|
file.write(JSON.pretty_generate(node_json))
|
106
106
|
end
|
107
107
|
end
|
108
108
|
|
109
109
|
def create_data_bags(sftp, hostname, solo_dir)
|
110
|
-
puts "Remotely creating data_bags items..."
|
110
|
+
puts "Remotely creating data_bags items on #{hostname}..."
|
111
111
|
if File.directory?("#{cookbook.source_dir}/data_bags")
|
112
112
|
Dir.entries("#{cookbook.source_dir}/data_bags/").each do |data_bag|
|
113
113
|
next if data_bag =~ /^\.\.?$/
|
@@ -115,7 +115,7 @@ class ProvisionCmd < MofaCmd
|
|
115
115
|
Dir.entries("#{cookbook.source_dir}/data_bags/#{data_bag}").select { |f| f.match(/\.json$/) }.each do |data_bag_item|
|
116
116
|
puts "Uploading data_bag_item #{data_bag_item}... "
|
117
117
|
sftp.upload!("#{cookbook.source_dir}/data_bags/#{data_bag}/#{data_bag_item}", "#{solo_dir}/data_bags/#{data_bag}/#{data_bag_item}")
|
118
|
-
puts
|
118
|
+
puts 'OK.'
|
119
119
|
end
|
120
120
|
end
|
121
121
|
end
|
@@ -132,10 +132,10 @@ class ProvisionCmd < MofaCmd
|
|
132
132
|
chef_solo_runs = {}
|
133
133
|
host_index = 0
|
134
134
|
hostlist.list.each do |hostname|
|
135
|
-
host_index
|
135
|
+
host_index += 1
|
136
136
|
chef_solo_runs.store(hostname, {})
|
137
137
|
|
138
|
-
unless
|
138
|
+
unless options.key?('ignore_ping') && options[:ignore_ping] == true
|
139
139
|
unless host_avail?(hostname)
|
140
140
|
chef_solo_runs[hostname].store('status', 'UNAVAIL')
|
141
141
|
chef_solo_runs[hostname].store('status_msg', "Host #{hostname} unreachable.")
|
@@ -146,8 +146,7 @@ class ProvisionCmd < MofaCmd
|
|
146
146
|
|
147
147
|
prepare_host(hostname, host_index, solo_dir)
|
148
148
|
|
149
|
-
Net::SFTP.start(hostname, Mofa::Config.config['ssh_user'], :
|
150
|
-
|
149
|
+
Net::SFTP.start(hostname, Mofa::Config.config['ssh_user'], keys: [Mofa::Config.config['ssh_keyfile']], port: Mofa::Config.config['ssh_port'], verbose: :error) do |sftp|
|
151
150
|
# remotely creating solo.rb
|
152
151
|
create_solo_rb(sftp, hostname, solo_dir)
|
153
152
|
|
@@ -159,18 +158,17 @@ class ProvisionCmd < MofaCmd
|
|
159
158
|
|
160
159
|
puts "Uploading Package #{cookbook.pkg_name}... "
|
161
160
|
sftp.upload!("#{cookbook.pkg_dir}/#{cookbook.pkg_name}", "#{solo_dir}/#{cookbook.pkg_name}")
|
162
|
-
puts
|
161
|
+
puts 'OK.'
|
163
162
|
|
164
163
|
# Do it -> Execute the chef-solo run!
|
165
|
-
Net::SSH.start(hostname, Mofa::Config
|
166
|
-
|
164
|
+
Net::SSH.start(hostname, Mofa::Config.config['ssh_user'], keys: [Mofa::Config.config['ssh_keyfile']], port: Mofa::Config.config['ssh_port'], verbose: :error) do |ssh|
|
167
165
|
puts "Remotely unpacking Cookbook Package #{cookbook.pkg_name}... "
|
168
166
|
out = ssh_exec!(ssh, "cd #{solo_dir}; tar xvfz #{cookbook.pkg_name}")
|
169
167
|
if out[0] != 0
|
170
168
|
puts "ERROR (#{out[0]}): #{out[2]}"
|
171
169
|
puts out[1]
|
172
170
|
else
|
173
|
-
puts
|
171
|
+
puts 'OK.'
|
174
172
|
end
|
175
173
|
|
176
174
|
puts "Remotely running chef-solo -c #{solo_dir}/solo.rb -j #{solo_dir}/node.json"
|
@@ -183,14 +181,14 @@ class ProvisionCmd < MofaCmd
|
|
183
181
|
chef_solo_runs[hostname].store('status', 'FAIL')
|
184
182
|
chef_solo_runs[hostname].store('status_msg', out[1])
|
185
183
|
else
|
186
|
-
|
187
|
-
out = ssh_exec!(ssh, "sudo grep 'Chef Run' #{solo_dir}/log")
|
188
|
-
puts "ERROR (#{out[0]}): #{out[2]}" if out[0] != 0
|
189
|
-
puts "Done."
|
190
|
-
else
|
184
|
+
if Mofa::CLI.option_debug
|
191
185
|
out = ssh_exec!(ssh, "sudo cat #{solo_dir}/log")
|
192
186
|
puts "ERROR (#{out[0]}): #{out[2]}" if out[0] != 0
|
193
187
|
puts out[1]
|
188
|
+
else
|
189
|
+
out = ssh_exec!(ssh, "sudo grep 'Chef Run' #{solo_dir}/log")
|
190
|
+
puts "ERROR (#{out[0]}): #{out[2]}" if out[0] != 0
|
191
|
+
puts 'Done.'
|
194
192
|
end
|
195
193
|
chef_solo_runs[hostname].store('status', 'SUCCESS')
|
196
194
|
chef_solo_runs[hostname].store('status_msg', '')
|
@@ -208,15 +206,16 @@ class ProvisionCmd < MofaCmd
|
|
208
206
|
puts "ERROR (#{out[0]}): #{out[2]}" if out[0] != 0
|
209
207
|
out = ssh_exec!(ssh, "echo #{chef_solo_runs[hostname]['status']} | sudo tee /var/lib/mofa/last_status")
|
210
208
|
puts "ERROR (#{out[0]}): #{out[2]}" if out[0] != 0
|
211
|
-
out = ssh_exec!(ssh, "
|
209
|
+
out = ssh_exec!(ssh, "date '+%Y-%m-%d %H:%M:%S' | sudo tee /var/lib/mofa/last_timestamp")
|
210
|
+
puts "ERROR (#{out[0]}): #{out[2]}" if out[0] != 0
|
211
|
+
out = ssh_exec!(ssh, "echo '#{solo_dir}/log' | sudo tee /var/lib/mofa/last_log")
|
212
212
|
puts "ERROR (#{out[0]}): #{out[2]}" if out[0] != 0
|
213
|
-
out = ssh_exec!(ssh, "date '+%Y-%m-%d %H:%M:%S' | sudo tee -a /var/lib/mofa/
|
213
|
+
out = ssh_exec!(ssh, "echo $(date '+%Y-%m-%d %H:%M:%S')': #{cookbook.name}@#{cookbook.version} (#{chef_solo_runs[hostname]['status']})' | sudo tee -a /var/lib/mofa/history")
|
214
214
|
puts "ERROR (#{out[0]}): #{out[2]}" if out[0] != 0
|
215
215
|
out = ssh_exec!(ssh, "sudo find #{solo_dir} -type d | xargs chmod 700")
|
216
216
|
puts "ERROR (#{out[0]}): #{out[2]}" if out[0] != 0
|
217
217
|
out = ssh_exec!(ssh, "sudo find #{solo_dir} -type f | xargs chmod 600")
|
218
218
|
puts "ERROR (#{out[0]}): #{out[2]}" if out[0] != 0
|
219
|
-
|
220
219
|
end
|
221
220
|
end
|
222
221
|
at_least_one_chef_solo_run_failed = true unless chef_solo_runs[hostname]['status'] == 'SUCCESS'
|
@@ -224,10 +223,10 @@ class ProvisionCmd < MofaCmd
|
|
224
223
|
|
225
224
|
# ------- print out report
|
226
225
|
puts
|
227
|
-
puts
|
228
|
-
puts
|
229
|
-
puts
|
230
|
-
puts "Chef-Solo has been run on #{chef_solo_runs.keys.length
|
226
|
+
puts '----------------------------------------------------------------------'
|
227
|
+
puts 'Chef-Solo Run REPORT'
|
228
|
+
puts '----------------------------------------------------------------------'
|
229
|
+
puts "Chef-Solo has been run on #{chef_solo_runs.keys.length} hosts."
|
231
230
|
|
232
231
|
chef_solo_runs.each do |hostname, content|
|
233
232
|
status_msg = ''
|
@@ -235,18 +234,12 @@ class ProvisionCmd < MofaCmd
|
|
235
234
|
puts "#{content['status']}: #{hostname} #{status_msg}"
|
236
235
|
end
|
237
236
|
|
238
|
-
exit_code = 0
|
239
|
-
if at_least_one_chef_solo_run_failed
|
240
|
-
exit_code = 1
|
241
|
-
end
|
242
|
-
|
237
|
+
exit_code = at_least_one_chef_solo_run_failed ? 1 : 0
|
243
238
|
puts "Exiting with exit code #{exit_code}."
|
244
239
|
|
245
240
|
if exit_code != 0
|
246
241
|
raise Thor::Error, "Chef client exited with non zero exit code: #{exit_code}"
|
247
242
|
end
|
248
243
|
exit_code
|
249
|
-
|
250
244
|
end
|
251
|
-
|
252
245
|
end
|
data/lib/mofa/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mofa
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.40
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-
|
12
|
+
date: 2017-04-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|