cheftacular 2.3.0 → 2.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cacccbd73021b45400cb3eda03bb8cb22f1ba9fe
4
- data.tar.gz: 70f82785708bd038080088e905a0ef5cf4f84598
3
+ metadata.gz: 46547d3aa90d80b995df07810a4675b88f3d4822
4
+ data.tar.gz: 1e8ea61b705880d022271335953a9c2364b200a7
5
5
  SHA512:
6
- metadata.gz: 08b9fbaee4acc4edebff56241cdf369a30fc1684dbee05f37021c4e3d85002f267fd9c942303d6003fcbd095010d34a0a1a775d30c8e73c71f2cbca3134d8b2b
7
- data.tar.gz: 2dee13991458ac134f24af9b2685e2c9e389934a5214a100d737612a23220d9d4ef5eca643a652c1be978471d685b1bcb93d90e7a9784b742bf4dce2a923583a
6
+ metadata.gz: b5a4f09cba60332a5d60ed2de80747b900601006132a5dbcb6e10ed9fa6f741c2b82482bcc5ac4c6689a30cbfb708b24d253f66bae9c9fdf82f8c0895170a293
7
+ data.tar.gz: 5e0101b89e3f56ad978669ca89c5f0a460e0aa19dfde40d1ee73ec0f2dfb9aed5565854b497a1b2eab5b56e8bc239e5384b5a2aa5f1a0f258ba53c30ce475bbf
@@ -41,7 +41,7 @@ class Cheftacular
41
41
 
42
42
  def start_console_ruby_on_rails ip_address, run_list
43
43
  app_loc = "#{ @config['cheftacular']['base_file_path'] }/#{ @options['repository'] }/current"
44
- true_env = @config['dummy_sshkit'].get_true_environment run_list, @config['cheftacular']['run_list_environments'], @options['env']
44
+ true_env = @config['dummy_sshkit'].get_true_environment run_list, @config['cheftacular']['run_list_environments'][@options['env']], @options['env']
45
45
 
46
46
  #the >/dev/tty after the ssh block redirects the full output to stdout, not /dev/null where it normally goes
47
47
  `ssh -oStrictHostKeyChecking=no -tt deploy@#{ ip_address } "cd #{ app_loc } && RAILS_ENV=#{ true_env } #{ @config['bundle_command'] } exec rails c" > /dev/tty`
@@ -7,7 +7,10 @@ class Cheftacular
7
7
 
8
8
  [
9
9
  " 1. This command also restarts services on the server and updates the code. Changes behavior slightly with the `-z|-Z` args " +
10
- "but only if your cookbooks support switching revisions based on tags / branch names."
10
+ "but only if your cookbooks support switching revisions based on tags / branch names.",
11
+
12
+ " 2. This command will also run migrations on both an role's normal servers and its split servers if certain " +
13
+ "conditions are met (such as the role having a database, etc)."
11
14
  ]
12
15
  ]
13
16
  end
@@ -36,6 +39,26 @@ class Cheftacular
36
39
  #@config['ChefDataBag'].save_logs_bag unless @options['debug'] #We don't really need to store entire chef runs in the logs bag
37
40
 
38
41
  migrate(nodes) if @config['getter'].get_current_repo_config['database'] != 'none' && !@options['run_migration_already']
42
+
43
+ split_nodes_hash = {}
44
+
45
+ @config['cheftacular']['run_list_environments'][@options['env']].each_key do |role_name|
46
+ split_nodes_hash[role_name] = @config['parser'].exclude_nodes( nodes, [{ unless: "role[#{ role_name }]" }])
47
+ end
48
+
49
+ split_nodes_hash.each_pair do |role, split_nodes|
50
+ next if split_nodes.empty?
51
+
52
+ unless @options["run_#{ role }_migrations_already"]
53
+ @options["run_#{ role }_migrations_already"] = true
54
+
55
+ if @config['getter'].get_current_repo_config['database'] != 'none'
56
+ puts("Running migration on split environment #{ role }...") if !@options['quiet']
57
+
58
+ migrate(split_nodes)
59
+ end
60
+ end
61
+ end
39
62
  end
40
63
  end
41
64
  end
@@ -76,7 +76,7 @@ module SSHKit
76
76
 
77
77
  def start_log_fetch_ruby_on_rails name, ip_address, run_list, options, locs, cheftacular, passwords, out=""
78
78
  log_loc, timestamp = set_log_loc_and_timestamp(locs)
79
- true_env = get_true_environment run_list, cheftacular['run_list_environments'], options['env']
79
+ true_env = get_true_environment run_list, cheftacular['run_list_environments'][options['env']], options['env']
80
80
  app_log_loc = "#{ cheftacular['base_file_path'] }/#{ options['repository'] }/current/log"
81
81
  log_cmnd, log_lines = get_log_command_and_lines(options)
82
82
 
@@ -43,7 +43,7 @@ class Cheftacular
43
43
  end
44
44
 
45
45
  def start_tail_ruby_on_rails ip_address, run_list
46
- true_env = @config['dummy_sshkit'].get_true_environment run_list, @config['cheftacular']['run_list_environments'], @options['env']
46
+ true_env = @config['dummy_sshkit'].get_true_environment run_list, @config['cheftacular']['run_list_environments'][@options['env']], @options['env']
47
47
 
48
48
  #special servers should be listed first as most of them will have web role
49
49
  log_loc = "#{ @config['cheftacular']['base_file_path'] }/#{ @options['repository'] }/current/log/#{ true_env }.log"
@@ -46,7 +46,7 @@ class Cheftacular
46
46
 
47
47
  puts("Preparing to run command \"#{ @options['command'] }\"...") if @options['verbose']
48
48
 
49
- @config['auditor'].audit_run if @config['cheftacular']['auditing'] == 'true'
49
+ @config['auditor'].audit_run if @config['cheftacular']['auditing']
50
50
 
51
51
  @config['action'].send(@options['command']) if @config['helper'].is_command?(@options['command'])
52
52
 
@@ -143,7 +143,7 @@ class Cheftacular
143
143
  #puts "repositories:#{ repository_hash['role'] }:#{ repository_hash['repo_name'] }:route_wildcard_requests_for_tld"
144
144
 
145
145
  if @config['helper'].does_cheftacular_config_have?(["repositories:#{ repository_hash['role'] }:route_wildcard_requests_for_tld"])
146
- should_route_requests = @config['cheftacular']['repositories'][repository_hash['role']]['route_wildcard_requests_for_tld'] == 'true'
146
+ should_route_requests = @config['cheftacular']['repositories'][repository_hash['role']]['route_wildcard_requests_for_tld']
147
147
  end
148
148
 
149
149
  should_route_requests
@@ -122,7 +122,7 @@ class Cheftacular
122
122
 
123
123
  def get_split_branch_hash ret={}
124
124
  @config['cheftacular']['repositories'].each_pair do |name, repo_hash|
125
- ret[repo_hash['name']] = repo_hash if repo_hash.has_key?('has_split_branches') && repo_hash['has_split_branches'] == 'true'
125
+ ret[repo_hash['name']] = repo_hash if repo_hash.has_key?('has_split_branches') && repo_hash['has_split_branches']
126
126
  end
127
127
 
128
128
  ret
@@ -251,7 +251,6 @@ class Cheftacular
251
251
  FileUtils.rm("#{ base_dir }/#{ entry }") if File.file?("#{ base_dir }/#{ entry }") && entry.include?(Time.now.strftime("%Y%m%d"))
252
252
  end
253
253
 
254
-
255
254
  if File.exists?("#{ base_dir }/#{ entry }") && File.directory?("#{ base_dir }/#{ entry }")
256
255
  FileUtils.rm_rf("#{ base_dir }/#{ entry }") if !check_current_day_entry && !entry.include?(Time.now.strftime("%Y%m%d"))
257
256
 
@@ -314,6 +313,45 @@ class Cheftacular
314
313
  end
315
314
  end
316
315
 
316
+ #this must be in helpers because getter class is not yet loaded at the time this method is needed.
317
+ def get_cheftacular_yml_as_hash
318
+ config_location = if File.exist?(File.join( Dir.getwd, 'config', 'cheftacular.yml' ))
319
+ File.join( Dir.getwd, 'config', 'cheftacular.yml' )
320
+ elsif File.exist?('/root/cheftacular.yml')
321
+ '/root/cheftacular.yml'
322
+ else
323
+ raise "cheftacular.yml configuration file could not be found in either #{ File.join( Dir.getwd, 'config', 'cheftacular.yml' ) } or /root/cheftacular.yml"
324
+ end
325
+
326
+ YAML::load(ERB.new(IO.read(File.open(config_location))).result)
327
+ rescue StandardError => e
328
+ puts "The cheftacular.yml configuration file could not be parsed."
329
+ puts "Error message: #{ e }\n#{ e.backtrace.join("\n") }"
330
+
331
+ exit
332
+ end
333
+
334
+ def current_chef_repo_cheftacular_file_cache_path
335
+ current_file_path "chef_repo_cheftacular_cache"
336
+ end
337
+
338
+ def write_chef_repo_cheftacular_cache_file hash
339
+ File.open( current_chef_repo_cheftacular_file_cache_path, "w") { |f| f.write(hash) }
340
+ end
341
+
342
+ def compile_chef_repo_cheftacular_yml_as_hash
343
+ master_hash = get_cheftacular_yml_as_hash
344
+ master_hash['replace_keys_in_chef_repo'].each_pair do |key, val|
345
+ master_hash[key] = val
346
+ end
347
+
348
+ master_hash
349
+ end
350
+
351
+ def write_chef_repo_cheftacular_yml_file file_location
352
+ File.open( file_location, "w") { |f| f.write(compile_chef_repo_cheftacular_yml_as_hash.to_yaml) }
353
+ end
354
+
317
355
  private
318
356
  def current_file_path file_name
319
357
  File.join( @config['locs']['app-root'], 'tmp', declassify, "#{ Time.now.strftime("%Y%m%d") }-#{ file_name }")
@@ -48,9 +48,11 @@ class Cheftacular
48
48
 
49
49
  @config['helper'].completion_rate? 100, 'initializer'
50
50
 
51
- initialize_version_check if @config['cheftacular']['strict_version_checks'] == 'true'
51
+ initialize_version_check if @config['cheftacular']['strict_version_checks']
52
52
 
53
- initialize_auditing_checks if @config['cheftacular']['auditing'] == 'true'
53
+ initialize_auditing_checks if @config['cheftacular']['auditing']
54
+
55
+ initialize_chef_repo_up_to_date if @config['cheftacular']['keep_chef_repo_cheftacular_yml_up_to_date']
54
56
  end
55
57
 
56
58
  #changes to arguments should show up in the documentation methods in their appropriate method file
@@ -212,20 +214,7 @@ class Cheftacular
212
214
  end
213
215
 
214
216
  def initialize_yaml_configuration
215
- config_location = if File.exist?(File.join( Dir.getwd, 'config', 'cheftacular.yml' ))
216
- File.join( Dir.getwd, 'config', 'cheftacular.yml' )
217
- elsif File.exist?('/root/cheftacular.yml')
218
- '/root/cheftacular.yml'
219
- else
220
- raise "cheftacular.yml configuration file could not be found in either #{ File.join( Dir.getwd, 'config', 'cheftacular.yml' ) } or /root/cheftacular.yml"
221
- end
222
-
223
- @config['cheftacular'] = YAML::load(ERB.new(IO.read(File.open(config_location))).result)
224
- rescue StandardError => e
225
- puts "The cheftacular.yml configuration file could not be parsed."
226
- puts "Error message: #{ e }\n#{ e.backtrace.join("\n") }"
227
-
228
- exit
217
+ @config['cheftacular'] = @config['helper'].get_cheftacular_yml_as_hash
229
218
  end
230
219
 
231
220
  def initialize_default_cheftacular_options
@@ -299,7 +288,7 @@ class Cheftacular
299
288
  client_name: (@config['helper'].running_on_chef_node? ? @config['helper'].parse_node_name_from_client_file : @config['cheftacular']['cheftacular_chef_user']),
300
289
  client_key: File.expand_path("#{ @config['locs']['chef'] }/#{ @config['helper'].running_on_chef_node? ? 'client' : @config['cheftacular']['cheftacular_chef_user'] }.pem"),
301
290
  encrypted_data_bag_secret: @config['data_bag_secret'],
302
- ssl: { verify: @config['cheftacular']['ssl_verify'] == 'true' }
291
+ ssl: { verify: @config['cheftacular']['ssl_verify'] }
303
292
  )
304
293
  end
305
294
 
@@ -393,7 +382,7 @@ class Cheftacular
393
382
  if @config['helper'].is_higher_version? detected_version, current_version
394
383
  puts "\n Your Cheftacular is out of date. Currently #{ current_version } and remote version is #{ detected_version }.\n"
395
384
 
396
- puts "Please update the gemfile to #{ detected_version } and restart this process.\n"
385
+ puts "Please update the gemfile to #{ detected_version }, bundle install and then restart this process.\n"
397
386
 
398
387
  exit
399
388
  else
@@ -439,6 +428,39 @@ class Cheftacular
439
428
  @config['helper'].cleanup_file_caches
440
429
  end
441
430
 
431
+ def initialize_chef_repo_up_to_date
432
+ if @config['helper'].running_in_mode?('devops')
433
+ @config['cheftacular']['wrapper_cookbooks'].split(',').each do |wrapper_cookbook|
434
+ parsed_hash = if File.exists?( @config['helper'].current_chef_repo_cheftacular_file_cache_path )
435
+ File.read( @config['helper'].current_chef_repo_cheftacular_file_cache_path )
436
+ else
437
+ Digest::SHA2.hexdigest(@config['helper'].compile_chef_repo_cheftacular_yml_as_hash.to_yaml.to_s)
438
+ end
439
+
440
+ wrapper_cookbook_cheftacular_loc = "#{ @config['locs']['cookbooks'] }/#{ wrapper_cookbook }" +
441
+ @config['cheftacular']['location_of_chef_repo_cheftacular_yml'] + '/cheftacular.yml'
442
+
443
+ unless File.exist?(wrapper_cookbook_cheftacular_loc)
444
+ puts "Wrapper cookbook \"#{ wrapper_cookbook }\" does not have a cheftacular.yml file in #{ @config['cheftacular']['location_of_chef_repo_cheftacular_yml'] }! Creating..."
445
+
446
+ @config['helper'].write_chef_repo_cheftacular_yml_file wrapper_cookbook_cheftacular_loc
447
+ end
448
+
449
+ if parsed_hash == Digest::SHA2.hexdigest(File.read(wrapper_cookbook_cheftacular_loc))
450
+ next if File.exists?( @config['helper'].current_chef_repo_cheftacular_file_cache_path )
451
+ else
452
+ puts "Wrapper cookbook (#{ wrapper_cookbook }) does not have a current cheftacular.yml file in #{ @config['cheftacular']['location_of_chef_repo_cheftacular_yml'] }\"! Overwriting..."
453
+
454
+ @config['helper'].write_chef_repo_cheftacular_yml_file wrapper_cookbook_cheftacular_loc
455
+ end
456
+
457
+ puts "Creating file cache for #{ Time.now.strftime("%Y%m%d") }'s cheftacular.yml."
458
+
459
+ @config['helper'].write_chef_repo_cheftacular_cache_file parsed_hash
460
+ end
461
+ end
462
+ end
463
+
442
464
  def initialize_bag_for_all_environments bag_name, total_percent=100
443
465
  total_bags = @config['chef_environments'].count
444
466
  current_bags = 1
@@ -191,9 +191,9 @@ class Cheftacular
191
191
 
192
192
  def parse_to_dns dns_string
193
193
  raise "Unable to parse DNS without @option['node_name'] for #{ dns_string }!" if dns_string.include?('NODE_NAME') && @options['node_name'].nil?
194
- raise "Unable to parse DNS without a tld set in the config bag for #{ @options['env'] }!" if dns_string.include?('ENV_TLD') && @config[@options['env']]['config_bag_hash']['tld'].nil?
194
+ raise "Unable to parse DNS without a tld set in the config bag for #{ @options['env'] }!" if dns_string.include?('ENV_TLD') && @config[@options['env']]['config_bag_hash'][@options['sub_env']]['tld'].nil?
195
195
 
196
- dns_string.gsub('NODE_NAME', @options['node_name']).gsub('ENV_TLD', @config[@options['env']]['config_bag_hash']['tld'])
196
+ dns_string.gsub('NODE_NAME', @options['node_name']).gsub('ENV_TLD', @config[@options['env']]['config_bag_hash'][@options['sub_env']]['tld'])
197
197
  end
198
198
 
199
199
  def parse_repository_hash_from_string string
@@ -48,7 +48,7 @@ class Cheftacular
48
48
 
49
49
  '2. `-z|--unset-revision` will unset a custom revision specified in the arg below and make the codebase utilize the default.',
50
50
 
51
- "3. `-Z|--revision REVISION` will force the role you're deploying to to utilize the revision specified here. This can be a specific commit or a branch name.",
51
+ "3. `-Z|--revision REVISION` will force the role you're deploying to to utilize the revision specified here. This can be a specific commit, a branch name or even a tag.",
52
52
 
53
53
  ' 1. Note: The system does not check if the revision exists, if you pass a non-existent revision no one will be able to deploy to that role until -Z with a correction revision or -z is passed.'
54
54
  ]
@@ -51,7 +51,7 @@ class Cheftacular
51
51
 
52
52
  final_commands = []
53
53
 
54
- if @config['cheftacular']['install_rvm_on_boot'] == 'true'
54
+ if @config['cheftacular']['install_rvm_on_boot']
55
55
  deploy_commands << "gpg --keyserver hkp://keys.gnupg.net --recv-keys #{ @config['cheftacular']['rvm_gpg_key'] }"
56
56
  deploy_commands << "curl -L https://get.rvm.io | bash -s stable"
57
57
 
@@ -27,17 +27,17 @@ class Cheftacular
27
27
  end
28
28
  end
29
29
 
30
- compiled_audit_hash.each_pair do |day, time_log_hash|
30
+ compiled_audit_hash.keys.sort.each do |day|
31
31
  out << "# Audit Log Entries for #{ Date.parse(day) }"
32
32
 
33
33
  entry_count, int_times = 1, []
34
34
 
35
- time_log_hash.keys.each do |time|
35
+ compiled_audit_hash[day].keys.each do |time|
36
36
  out << "#{ entry_count }. #{ time }"
37
37
 
38
38
  log_array_entry_count = 1
39
39
 
40
- time_log_hash[time].each do |log_arr|
40
+ compiled_audit_hash[day][time].each do |log_arr|
41
41
  log_arr.each do |log_hash|
42
42
  out << " #{ log_array_entry_count }. #{ log_hash['command'] }"
43
43
  out << " 1. Hostname: #{ log_hash['hostname'] }"
@@ -47,7 +47,7 @@ class Cheftacular
47
47
 
48
48
  log_array_entry_count += 1
49
49
  end
50
- end if time_log_hash.has_key?(time)
50
+ end if compiled_audit_hash[day].has_key?(time)
51
51
 
52
52
  entry_count += 1
53
53
  end
@@ -38,7 +38,7 @@ class Cheftacular
38
38
  @options['force_yes'] = true
39
39
  @options['in_scaling'] = true
40
40
 
41
- initial_servers = @config['cheftacular']['env_boot_nodes']["#{ @options['env'] }_node_names"]
41
+ initial_servers = @config['cheftacular']['env_boot_nodes']["#{ @options['env'] }_nodes"]
42
42
 
43
43
  if initial_servers.empty?
44
44
  puts "There are no servers defined for #{ @options['env'] } in the env_boot_nodes hash in your cheftacular.yml... Exiting"
@@ -49,12 +49,12 @@ class Cheftacular
49
49
  case type
50
50
  when 'boot'
51
51
  initial_servers.each_pair do |name, config_hash|
52
+ next if nodes.map { |n| n.name }.include?(name)
53
+
52
54
  @options['node_name'] = name
53
55
  @options['flavor_name'] = config_hash.has_key?('flavor') ? config_hash['flavor'] : @config['cheftacular']['default_flavor_name']
54
56
  @options['descriptor'] = config_hash.has_key?('descriptor') ? config_hash['descriptor'] : name
55
57
  @options['with_dn'] = config_hash.has_key?('dns_config') ? @config['parser'].parse_to_dns(config_hash['dns_config']) : @config['parser'].parse_to_dns('NODE_NAME.ENV_TLD')
56
-
57
- next if nodes.map { |n| n.name }.include?(@options['node_name'])
58
58
 
59
59
  puts("Preparing to boot server #{ @options['node_name'] } for #{ @options['env'] }!") unless @options['quiet']
60
60
 
@@ -91,7 +91,7 @@ class Cheftacular
91
91
  end
92
92
  end
93
93
 
94
- if @config['cheftacular']['git_based_deploys'] == 'true'
94
+ if @config['cheftacular']['git_based_deploys']
95
95
  if !hash.has_key?('git_private_key') || !hash.has_key?('git_public_key') || !hash.has_key?('git_OAuth')
96
96
  puts "Warning! github user credentials in default authentication bag were not found! Please run `cft help create_git_key` and then run that command itself!" unless @command == 'help'
97
97
  end
@@ -161,8 +161,8 @@ class Cheftacular
161
161
 
162
162
  config_fix_message = "\n\n knife data bag edit #{ main_env } config\n\n"
163
163
 
164
- if @config['cheftacular']['split_environments'].has_key?(main_env)
165
- @config['cheftacular']['split_environments'][main_env].each_key do |sub_env|
164
+ if @config['cheftacular']['run_list_environments'].has_key?(main_env)
165
+ @config['cheftacular']['run_list_environments'][main_env].each_value do |sub_env|
166
166
  envs_to_build_in_hash << sub_env
167
167
  end
168
168
  end
@@ -30,7 +30,9 @@ class Cheftacular
30
30
 
31
31
  type = ARGV[env_index] if ARGV[env_index]
32
32
 
33
- raise "Unknown split_env: #{ split_env }, can only be #{ @config['cheftacular']['run_list_environments'].values.join(', ') }" unless (split_env =~ /#{ @config['cheftacular']['run_list_environments'].values.join('|') }/) == 0
33
+ split_envs = @config['cheftacular']['run_list_environments'][@options['env']]
34
+
35
+ raise "Unknown split_env: #{ split_env }, can only be #{ split_envs.values.join(', ') }" unless (split_env =~ /#{ split_envs.values.join('|') }/) == 0
34
36
 
35
37
  raise "Unknown type: #{ type }, can only be 'boot' or 'destroy'" unless (type =~ /boot|destroy/) == 0
36
38
 
@@ -44,7 +46,9 @@ class Cheftacular
44
46
  case type
45
47
  when 'boot'
46
48
  @config['cheftacular']['split_env_nodes'].each_pair do |name, config_hash|
47
- true_name = name.gsub('SPLITENV', split_env)
49
+ config_hash ||= {}
50
+ true_name = name.gsub('SPLITENV', split_env)
51
+ @options['sub_env'] = split_env
48
52
  @options['node_name'] = "#{ true_name }#{ 'p' if @options['env'] == 'production' }"
49
53
  @options['flavor_name'] = config_hash.has_key?('flavor') ? config_hash['flavor'] : @config['cheftacular']['default_flavor_name']
50
54
  @options['descriptor'] = config_hash.has_key?('descriptor') ? "#{ config_hash['descriptor'] }-#{ split_env }" : name
@@ -48,10 +48,12 @@ class Cheftacular
48
48
  "git fetch origin",
49
49
  ]
50
50
 
51
- @config['run_list_environments'].each_key do |branch_name|
52
- true_branch_name = branch_name.gsub('_','-')
51
+ @config['run_list_environments'].each_pair do |env, branch_hash|
52
+ branch_hash.keys.each do |branch_name|
53
+ true_branch_name = branch_name.gsub('_','-')
53
54
 
54
- commands << ["git checkout #{ true_branch_name }", "git pull origin #{ true_branch_name }", 'git merge master --no-edit', "git push origin #{ true_branch_name }"]
55
+ commands << ["git checkout #{ true_branch_name }", "git pull origin #{ true_branch_name }", 'git merge master --no-edit', "git push origin #{ true_branch_name }"]
56
+ end
55
57
  end
56
58
 
57
59
  commands << "git checkout #{ current_revision }"
@@ -1,5 +1,5 @@
1
1
  class Cheftacular
2
2
  #major_version.minor_version.bugfixes
3
- VERSION = "2.3.0"
3
+ VERSION = "2.4.0"
4
4
  RUBY_VERSION = "2.2.2"
5
5
  end
@@ -18,6 +18,9 @@ class CloudInteractor
18
18
  def run args
19
19
  parse_args(args) unless args.empty?
20
20
 
21
+ #clear out the main_obj so repeated runs do not cause strange data
22
+ @main_obj = @main_obj.keep_if {|key, value| key == 'output'}
23
+
21
24
  @main_obj['output']
22
25
  end
23
26
  end
@@ -3,7 +3,7 @@ module SSHKit
3
3
  class Netssh
4
4
  def start_task name, ip_address, run_list, command, options, locs, cheftacular, out=""
5
5
  log_loc, timestamp = set_log_loc_and_timestamp(locs)
6
- true_env = get_true_environment run_list, cheftacular['run_list_environments'], options['env']
6
+ true_env = get_true_environment run_list, cheftacular['run_list_environments'][options['env']], options['env']
7
7
 
8
8
  puts "Running #{ command } for #{ name } (#{ ip_address }) (Run with with --debug to generate a log as well)"
9
9
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cheftacular
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Louis Alridge
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-26 00:00:00.000000000 Z
11
+ date: 2015-06-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hashie