cheftacular 2.10.2 → 2.11.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.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/lib/cheftacular/README.md +119 -77
  3. data/lib/cheftacular/actions/check.rb +58 -24
  4. data/lib/cheftacular/actions/deploy.rb +5 -3
  5. data/lib/cheftacular/auditor.rb +4 -3
  6. data/lib/cheftacular/cheftacular.rb +1 -0
  7. data/lib/cheftacular/cloud_provider.rb +17 -12
  8. data/lib/cheftacular/file_system.rb +20 -0
  9. data/lib/cheftacular/getter.rb +1 -1
  10. data/lib/cheftacular/helper.rb +41 -28
  11. data/lib/cheftacular/initializer.rb +5 -3
  12. data/lib/cheftacular/parser.rb +10 -6
  13. data/lib/cheftacular/queue_master.rb +24 -0
  14. data/lib/cheftacular/stateless_actions/backups.rb +2 -2
  15. data/lib/cheftacular/stateless_actions/bootstrappers/{centos_bootstrap.rb → centos_bootstrap_from_queue.rb} +1 -1
  16. data/lib/cheftacular/stateless_actions/bootstrappers/{coreos_bootstrap.rb → coreos_bootstrap_from_queue.rb} +1 -1
  17. data/lib/cheftacular/stateless_actions/bootstrappers/{fedora_bootstrap.rb → fedora_bootstrap_from_queue.rb} +1 -1
  18. data/lib/cheftacular/stateless_actions/bootstrappers/{redhat_bootstrap.rb → redhat_bootstrap_from_queue.rb} +1 -1
  19. data/lib/cheftacular/stateless_actions/bootstrappers/ubuntu_bootstrap_from_queue.rb +203 -0
  20. data/lib/cheftacular/stateless_actions/bootstrappers/vyatta_bootstrap_from_queue.rb +7 -0
  21. data/lib/cheftacular/stateless_actions/check_cheftacular_yml_keys.rb +30 -0
  22. data/lib/cheftacular/stateless_actions/chef_bootstrap_from_queue.rb +89 -0
  23. data/lib/cheftacular/stateless_actions/cheftacular_yml_help.rb +55 -6
  24. data/lib/cheftacular/stateless_actions/client_list.rb +1 -3
  25. data/lib/cheftacular/stateless_actions/cloud_bootstrap.rb +24 -15
  26. data/lib/cheftacular/stateless_actions/cloud_bootstrap_from_queue.rb +37 -0
  27. data/lib/cheftacular/stateless_actions/environment.rb +80 -31
  28. data/lib/cheftacular/stateless_actions/fix_known_hosts.rb +1 -22
  29. data/lib/cheftacular/stateless_actions/{full_bootstrap.rb → full_bootstrap_from_queue.rb} +8 -15
  30. data/lib/cheftacular/stateless_actions/knife_upload.rb +14 -3
  31. data/lib/cheftacular/stateless_actions/reinitialize.rb +1 -1
  32. data/lib/cheftacular/stateless_actions/remove_client.rb +3 -3
  33. data/lib/cheftacular/stateless_actions/restart_swap.rb +0 -1
  34. data/lib/cheftacular/stateless_actions/test_env.rb +24 -18
  35. data/lib/cheftacular/stateless_actions/update_thecheftacularcookbook.rb +1 -1
  36. data/lib/cheftacular/stateless_actions/upload_nodes.rb +2 -2
  37. data/lib/cheftacular/version.rb +1 -1
  38. data/lib/cloud_interactor/domain/create.rb +2 -2
  39. data/lib/cloud_interactor/domain/create_record.rb +1 -1
  40. data/lib/cloud_interactor/domain/destroy.rb +2 -2
  41. data/lib/cloud_interactor/domain/destroy_record.rb +1 -1
  42. data/lib/cloud_interactor/domain/list_records.rb +1 -1
  43. data/lib/cloud_interactor/domain/read.rb +1 -1
  44. data/lib/cloud_interactor/domain/read_record.rb +1 -1
  45. data/lib/cloud_interactor/domain/update.rb +2 -2
  46. data/lib/cloud_interactor/domain/update_record.rb +2 -2
  47. data/lib/cloud_interactor/helpers.rb +11 -6
  48. data/lib/cloud_interactor/server/attach_volume.rb +1 -1
  49. data/lib/cloud_interactor/server/create.rb +4 -4
  50. data/lib/cloud_interactor/server/detach_volume.rb +2 -2
  51. data/lib/cloud_interactor/server/list_volumes.rb +1 -1
  52. data/lib/cloud_interactor/server/poll.rb +2 -2
  53. data/lib/cloud_interactor/server/read_volume.rb +1 -1
  54. data/lib/cloud_interactor/version.rb +1 -1
  55. data/lib/cloud_interactor/volume/create.rb +1 -1
  56. data/lib/sshkit/getters.rb +9 -1
  57. metadata +25 -10
  58. data/lib/cheftacular/stateless_actions/bootstrappers/ubuntu_bootstrap.rb +0 -116
  59. data/lib/cheftacular/stateless_actions/bootstrappers/vyatta_bootstrap.rb +0 -7
  60. data/lib/cheftacular/stateless_actions/chef_bootstrap.rb +0 -63
@@ -30,7 +30,7 @@ class Cheftacular
30
30
 
31
31
  `rm -Rf #{ @config['locs']['cookbooks'] }/TheCheftacularCookbook` if File.exists?(File.expand_path("#{ @config['locs']['cookbooks'] }/TheCheftacularCookbook"))
32
32
  `cp -Rf #{ @config['locs']['berks'] }/#{ cheftacular_cookbook['location'] } #{ @config['locs']['cookbooks'] }/TheCheftacularCookbook`
33
-
33
+
34
34
  break
35
35
  end
36
36
  end
@@ -27,7 +27,7 @@ class Cheftacular
27
27
  end
28
28
 
29
29
  class StatelessAction
30
- def upload_nodes invalidate_file_node_cache=false
30
+ def upload_nodes invalidate_file_node_cache=true
31
31
  @config['filesystem'].cleanup_file_caches('current-nodes') if invalidate_file_node_cache
32
32
 
33
33
  raise "This action can only be performed if the mode is set to devops" if !@config['helper'].running_in_mode?('devops') && !@options['in_scaling']
@@ -38,7 +38,7 @@ class Cheftacular
38
38
  @config['initializer'].initialize_node_roles_bag_contents env
39
39
  end
40
40
 
41
- nodes = @options['multi-step'] ? @config['getter'].get_true_node_objects(true,true) : @config['getter'].get_true_node_objects(true)
41
+ nodes = @options['multi-step'] ? @config['getter'].get_true_node_objects(true) : @config['getter'].get_true_node_objects(true)
42
42
 
43
43
  node_roles_hash, bag_hash, allowed_changes_hash = {},{},{}
44
44
 
@@ -1,5 +1,5 @@
1
1
  class Cheftacular
2
2
  #major_version.minor_version.bugfixes
3
- VERSION = "2.10.2"
3
+ VERSION = "2.11.0"
4
4
  RUBY_VERSION = "2.2.2"
5
5
  end
@@ -4,14 +4,14 @@ class CloudInteractor
4
4
  read args, false
5
5
 
6
6
  unless @main_obj["specific_#{ IDENTITY }"].empty?
7
- puts "#{ IDENTITY } #{ args[IDENTITY.singularize] } already exists... returning."
7
+ puts "(#{ IDENTITY.capitalize }) #{ IDENTITY } #{ args[IDENTITY.singularize] } already exists... returning."
8
8
 
9
9
  return false
10
10
  end
11
11
 
12
12
  @classes['auth'].auth_service(RESOURCE).instance_eval('zones').create(domain: args[IDENTITY.singularize], email: @auth_hash['cloud_authentication'][@options['preferred_cloud']]['email'])
13
13
 
14
- puts "Created #{ IDENTITY } #{ args[IDENTITY.singularize] }..."
14
+ puts "(#{ IDENTITY.capitalize }) Created #{ IDENTITY } #{ args[IDENTITY.singularize] }..."
15
15
  end
16
16
  end
17
17
  end
@@ -22,7 +22,7 @@ class CloudInteractor
22
22
 
23
23
  specific_fog_object.records.create(name: args['target_domain'], value: args['target_ip'], type: args['type'], ttl: args['ttl'])
24
24
 
25
- puts "Attached #{ args['subdomain'] } (#{ args['target_ip'] }) to #{ args[IDENTITY.singularize] } (#{ args['target_domain'] })..."
25
+ puts "(#{ IDENTITY.capitalize }) Attached #{ args['subdomain'] } (#{ args['target_ip'] }) to #{ args[IDENTITY.singularize] } (#{ args['target_domain'] })..."
26
26
  end
27
27
  end
28
28
  end
@@ -4,14 +4,14 @@ class CloudInteractor
4
4
  read args, false
5
5
 
6
6
  if @main_obj["specific_#{ IDENTITY }"].empty? && @main_obj["specific_#{ IDENTITY }"].last[IDENTITY.singularize] != args[IDENTITY.singularize]
7
- puts "#{ IDENTITY } #{ args[IDENTITY.singularize] } doesn't exist... returning."
7
+ puts "(#{ IDENTITY.capitalize }) #{ IDENTITY } #{ args[IDENTITY.singularize] } doesn't exist... returning."
8
8
 
9
9
  return false
10
10
  end
11
11
 
12
12
  @classes['auth'].auth_service(RESOURCE).instance_eval('zones').get(@main_obj["specific_#{ IDENTITY }"].last['id']).destroy
13
13
 
14
- puts "Destroyed #{ IDENTITY.singularize } #{ args[IDENTITY.singularize] }..."
14
+ puts "(#{ IDENTITY.capitalize }) Destroyed #{ IDENTITY.singularize } #{ args[IDENTITY.singularize] }..."
15
15
  end
16
16
  end
17
17
  end
@@ -13,7 +13,7 @@ class CloudInteractor
13
13
 
14
14
  raise "Subdomain not found for #{ args[IDENTITY.singularize] }" unless already_exists
15
15
 
16
- puts "Destroying #{ args['subdomain'] } from #{ args[IDENTITY.singularize] }..."
16
+ puts "(#{ IDENTITY.capitalize }) Destroying #{ args['subdomain'] } from #{ args[IDENTITY.singularize] }..."
17
17
 
18
18
  specific_fog_object = @classes['auth'].auth_service(RESOURCE).instance_eval('zones').get @main_obj["specific_#{ IDENTITY }"].last['id']
19
19
 
@@ -1,7 +1,7 @@
1
1
  class CloudInteractor
2
2
  class Domain
3
3
  def list_records args, output=false
4
- puts "Querying #{ args["domain"] } for records..."
4
+ puts "(#{ IDENTITY.capitalize }) Querying #{ args["domain"] } for records..."
5
5
 
6
6
  specific_fog_object = @classes['auth'].auth_service(RESOURCE).instance_eval('zones').get @main_obj["specific_#{ IDENTITY }"].last['id']
7
7
 
@@ -17,7 +17,7 @@ class CloudInteractor
17
17
 
18
18
  ap(@main_obj["specific_#{ IDENTITY }"]) if output
19
19
 
20
- puts("#{ specific_identity } not found in #{ IDENTITY }!") if @main_obj["specific_#{ IDENTITY }"].empty?
20
+ puts("(#{ IDENTITY.capitalize }) #{ specific_identity } not found in #{ IDENTITY }!") if @main_obj["specific_#{ IDENTITY }"].empty?
21
21
  end
22
22
  end
23
23
  end
@@ -21,7 +21,7 @@ class CloudInteractor
21
21
  ap(record_hash) if output
22
22
  end
23
23
 
24
- puts("#{ args[IDENTITY.singularize] } does not have the subdomain #{ args['subdomain'] }!") if @main_obj["specific_queried_domains"].nil?
24
+ puts("(#{ IDENTITY.capitalize }) #{ args[IDENTITY.singularize] } does not have the subdomain #{ args['subdomain'] }!") if @main_obj["specific_queried_domains"].nil?
25
25
  end
26
26
  end
27
27
  end
@@ -5,14 +5,14 @@ class CloudInteractor
5
5
  read args, false
6
6
 
7
7
  if (@main_obj["specific_#{ IDENTITY }"].nil? || @main_obj["specific_#{ IDENTITY }"].empty?) && @main_obj["specific_#{ IDENTITY }"].last[IDENTITY.singularize] != args[IDENTITY.singularize]
8
- puts "#{ IDENTITY } #{ args[IDENTITY.singularize] } doesn't exist... returning."
8
+ puts "(#{ IDENTITY.capitalize }) #{ IDENTITY } #{ args[IDENTITY.singularize] } doesn't exist... returning."
9
9
 
10
10
  return false
11
11
  end
12
12
 
13
13
  @classes['auth'].auth_service(resource).instance_eval('zones').get(@main_obj["specific_#{ IDENTITY }"].last['id']).update(ttl: 5, email: @auth_hash['cloud_authentication'][@options['preferred_cloud']]['email'])
14
14
 
15
- puts "Updated #{ IDENTITY } #{ args[IDENTITY.singularize] }..."
15
+ puts "(#{ IDENTITY.capitalize }) Updated #{ IDENTITY } #{ args[IDENTITY.singularize] }..."
16
16
  end
17
17
  end
18
18
  end
@@ -8,7 +8,7 @@ class CloudInteractor
8
8
 
9
9
  read args, false
10
10
 
11
- puts "Updating #{ args['subdomain'] } for #{ args[IDENTITY.singularize] }..."
11
+ puts "(#{ IDENTITY.capitalize }) Updating #{ args['subdomain'] } for #{ args[IDENTITY.singularize] }..."
12
12
 
13
13
  @main_obj['specific_records'][args[IDENTITY.singularize]].each do |record_hash|
14
14
  already_created = true if record_hash['name'] == args['target_domain'] && record_hash['type'] == args['type']
@@ -35,7 +35,7 @@ class CloudInteractor
35
35
  raise "Unsupported action #{ __method__ } for #{ @options['preferred_cloud'] }. Please create an issue on github or submit a PR to fix this issue."
36
36
  end
37
37
 
38
- puts "Updated #{ args['subdomain'] } (#{ args['target_ip'] }) to #{ args[IDENTITY.singularize] } (#{ args['target_domain'] })..."
38
+ puts "(#{ IDENTITY.capitalize }) Updated #{ args['subdomain'] } (#{ args['target_ip'] }) to #{ args[IDENTITY.singularize] } (#{ args['target_domain'] })..."
39
39
  else
40
40
  create_record [ args ]
41
41
  end
@@ -14,7 +14,7 @@ class CloudInteractor
14
14
  end
15
15
 
16
16
  def generic_list_call identity, resource, output=true
17
- puts "Returning list of #{ identity } for #{ resource == 'DNS' ? @options['route_dns_changes_via'] : @options['preferred_cloud'] }..."
17
+ puts "(#{ identity.capitalize }) Returning list of #{ identity } for #{ resource == 'DNS' ? @options['route_dns_changes_via'] : @options['preferred_cloud'] }..."
18
18
 
19
19
  @main_obj[identity] = JSON.parse(@classes['auth'].auth_service(resource).instance_eval(identity).to_json)
20
20
 
@@ -30,7 +30,7 @@ class CloudInteractor
30
30
 
31
31
  @main_obj[identity].each do |identity_hash|
32
32
  if specific_identity.nil?
33
- puts("Query arguments \"#{ args }\" are not being mapped correctly for #{ identity.singularize } reads from method #{ caller[3][/`.*'/][1..-2] }! This read will return no objects.")
33
+ puts("(#{ identity.capitalize }) Query arguments \"#{ args }\" are not being mapped correctly for #{ identity.singularize } reads from method #{ caller[3][/`.*'/][1..-2] }! This read will return no objects.")
34
34
 
35
35
  break
36
36
  end
@@ -46,19 +46,24 @@ class CloudInteractor
46
46
  ap(identity_hash) if output
47
47
  end
48
48
 
49
- puts("#{ specific_identity } not found in #{ identity }!") if @main_obj["specific_#{ identity }"].empty?
49
+ puts("(#{ identity.capitalize }) #{ specific_identity } matched and being utilized for #{ identity }.") unless @main_obj["specific_#{ identity }"].empty?
50
+ puts("(#{ identity.capitalize }) #{ specific_identity } not found in #{ identity }!") if @main_obj["specific_#{ identity }"].empty?
50
51
  end
51
52
 
52
53
  def generic_destroy_parse destroy_hash, identity, resource, mode='name'
53
54
  puts("Queried #{ identity } #{ ap @main_obj["specific_#{ identity }"] }") if @options['verbose']
54
55
 
55
- raise "#{ identity.singularize } not found for #{ destroy_hash[mode] }" unless @main_obj["specific_#{ identity }"]
56
+ if @main_obj["specific_#{ identity }"].empty?
57
+ puts "#{ destroy_hash[mode] } was not found in #{ identity.singularize } to destroy!"
58
+
59
+ return false
60
+ end
56
61
 
57
62
  if destroy_hash[mode].empty? || @main_obj["specific_#{ identity }"].last[mode] != destroy_hash[mode] #without this it will delete the first object in the list, this is obviously bad
58
63
  raise "Name mismatch on destroy! Expected #{ destroy_hash[mode] } and was going to destroy #{ @main_obj["specific_#{ identity }"].last[mode] }"
59
64
  end
60
65
 
61
- puts "Destroying #{ destroy_hash[mode] }..."
66
+ puts "(#{ identity.capitalize }) Destroying #{ destroy_hash[mode] }..."
62
67
 
63
68
  specific_fog_object = @classes['auth'].auth_service(resource).instance_eval(identity).get @main_obj["specific_#{ identity }"].last['id']
64
69
 
@@ -68,7 +73,7 @@ class CloudInteractor
68
73
  @main_obj["#{ identity }_destroy_request"] = specific_fog_object.destroy
69
74
  end
70
75
 
71
- puts "REMINDER! This destroy is not instant! It can take up to a few minutes for a #{ identity.singularize } to actually be fully destroyed!"
76
+ puts "(#{ identity.capitalize }) REMINDER! This destroy is not instant! It can take up to a few minutes for a #{ identity.singularize } to actually be fully destroyed!"
72
77
  end
73
78
  end
74
79
  end
@@ -17,7 +17,7 @@ class CloudInteractor
17
17
  @classes['volume'].read args
18
18
  end
19
19
 
20
- puts "Attaching #{ args['volume_name'] } to #{ args['server_name'] } in #{ IDENTITY }..."
20
+ puts "(#{ IDENTITY }) Attaching #{ args['volume_name'] } to #{ args['server_name'] } in #{ IDENTITY }..."
21
21
 
22
22
  read args, false, 'name', 'server_name'
23
23
 
@@ -5,7 +5,7 @@ class CloudInteractor
5
5
  @classes['image'].read @options['preferred_cloud_image'], false
6
6
 
7
7
  #Note, if no flavor is passed it defaults to a 512MB standard!
8
- @classes['flavor'].read args['flavor']
8
+ @classes['flavor'].read args['flavor'], @options.has_key?('verbose')
9
9
 
10
10
  @classes['region'].read(@options['preferred_cloud_region'], false) if @options['preferred_cloud'] == 'digitalocean'
11
11
  @classes['sshkey'].bootstrap if @options['preferred_cloud'] == 'digitalocean'
@@ -13,12 +13,12 @@ class CloudInteractor
13
13
  read args, false
14
14
 
15
15
  unless @main_obj["specific_#{ IDENTITY }"].empty?
16
- puts "#{ IDENTITY } #{ args['name'] } already exists... returning."
16
+ puts "(#{ IDENTITY }) #{ IDENTITY } #{ args['name'] } already exists... returning."
17
17
 
18
18
  return false
19
19
  end
20
20
 
21
- puts "Creating #{ args['name'] } in #{ IDENTITY }..."
21
+ puts "(#{ IDENTITY }) Creating #{ args['name'] } in #{ IDENTITY }..."
22
22
 
23
23
  final_create_args = {
24
24
  name: args['name'],
@@ -45,7 +45,7 @@ class CloudInteractor
45
45
  @main_obj["#{ IDENTITY }_created_details"] ||= {}
46
46
  @main_obj["#{ IDENTITY }_created_details"][args['name']] = @main_obj["#{ IDENTITY }_create_request"]
47
47
 
48
- puts "Successfully created #{ args['name'] } with pass #{ @main_obj["#{ IDENTITY }_created_passwords"][args['name']] }"
48
+ puts "(#{ IDENTITY }) Successfully created #{ args['name'] } with pass #{ @main_obj["#{ IDENTITY }_created_passwords"][args['name']] }"
49
49
 
50
50
  @main_obj['output']['admin_passwords'] = { args['name'] => @main_obj["#{ IDENTITY }_created_passwords"][args['name']] }
51
51
  end
@@ -5,7 +5,7 @@ class CloudInteractor
5
5
 
6
6
  read_volume args, false, true
7
7
 
8
- puts "Detaching #{ args['volume_name'] } from #{ args['server_name'] } in #{ IDENTITY }..."
8
+ puts "(#{ IDENTITY }) Detaching #{ args['volume_name'] } from #{ args['server_name'] } in #{ IDENTITY }..."
9
9
 
10
10
  specific_fog_object = @classes['auth'].auth_service(RESOURCE).instance_eval(IDENTITY).get @main_obj["specific_#{ IDENTITY }"].last['id']
11
11
 
@@ -15,7 +15,7 @@ class CloudInteractor
15
15
  out << attachment.detach.to_s
16
16
  end
17
17
 
18
- puts "The state of the volume detachment is #{ out } for #{ args['server_name'] } in #{ IDENTITY }"
18
+ puts "(#{ IDENTITY }) The state of the volume detachment is #{ out } for #{ args['server_name'] } in #{ IDENTITY }"
19
19
  end
20
20
  end
21
21
  end
@@ -1,7 +1,7 @@
1
1
  class CloudInteractor
2
2
  class Server
3
3
  def list_volumes args, output=true
4
- puts "Returning list of volumes for #{ args['server_name'] } in #{ IDENTITY }..."
4
+ puts "(#{ IDENTITY }) Returning list of volumes for #{ args['server_name'] } in #{ IDENTITY }..."
5
5
 
6
6
  read(args, false, 'name', 'server_name') if @main_obj["specific_#{ IDENTITY }"].nil?
7
7
 
@@ -5,7 +5,7 @@ class CloudInteractor
5
5
 
6
6
  raise "Server #{ args['name'] } does not exist!" if @main_obj["specific_#{ IDENTITY }"].empty?
7
7
 
8
- puts "Polling #{ args['name'] } for status...(execution will continue when the server is finished building)"
8
+ puts "(#{ IDENTITY.capitalize }) Polling #{ args['name'] } for status...(execution will continue when the server is finished building)"
9
9
 
10
10
  specific_fog_object = @classes['auth'].auth_service(RESOURCE).instance_eval(IDENTITY).get @main_obj["specific_#{ IDENTITY }"].last['id']
11
11
 
@@ -16,7 +16,7 @@ class CloudInteractor
16
16
 
17
17
  @main_obj['output']["created_servers"] << JSON.parse(specific_fog_object.reload.to_json)
18
18
 
19
- puts "#{ args['name'] } became active in #{ duration_hash[:duration] } seconds!"
19
+ puts "(#{ IDENTITY.capitalize }) #{ args['name'] } became active in #{ duration_hash[:duration] } seconds!"
20
20
  end
21
21
  end
22
22
  end
@@ -18,7 +18,7 @@ class CloudInteractor
18
18
  ap(volume_hash) if output
19
19
  end
20
20
 
21
- puts("#{ specific_volume } not attached to #{ args['server_name'] }!") if @main_obj["specific_attached_volumes"].nil?
21
+ puts("(#{ IDENTITY }) #{ specific_volume } not attached to #{ args['server_name'] }!") if @main_obj["specific_attached_volumes"].nil?
22
22
  end
23
23
  end
24
24
  end
@@ -1,4 +1,4 @@
1
1
  class CloudInteractor
2
2
  #major_version.minor_version.bugfixes
3
- VERSION = "1.0.0"
3
+ VERSION = "1.1.0"
4
4
  end
@@ -1,7 +1,7 @@
1
1
  class CloudInteractor
2
2
  class Volume
3
3
  def create args
4
- puts "Creating #{ args['display_name'] } in #{ IDENTITY }..."
4
+ puts "(#{ IDENTITY }) Creating #{ args['display_name'] } in #{ IDENTITY }..."
5
5
 
6
6
  puts("Creating #{ IDENTITY.singularize } with args #{ ap(args) }") if @options['verbose']
7
7
 
@@ -23,7 +23,7 @@ module SSHKit
23
23
  raise "Unknown repository or rolename for #{ name }"
24
24
  end
25
25
 
26
- def get_node_from_address nodes, address, ret_node = nil
26
+ def get_node_from_address nodes, address, ret_node=nil
27
27
  nodes.each do |n|
28
28
  if n.public_ipaddress == address
29
29
  ret_node = n
@@ -64,6 +64,14 @@ module SSHKit
64
64
 
65
65
  ret
66
66
  end
67
+
68
+ def get_server_hash_from_address array_of_server_hashes, address, ret_hash=nil
69
+ array_of_server_hashes.each do |server_hash|
70
+ ret_hash = server_hash if server_hash['address'] == address
71
+ end
72
+
73
+ ret_hash
74
+ end
67
75
  end
68
76
  end
69
77
  end
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.10.2
4
+ version: 2.11.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-11-12 00:00:00.000000000 Z
11
+ date: 2015-12-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hashie
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '11.12'
41
+ - !ruby/object:Gem::Dependency
42
+ name: httpclient
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '2.7'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '2.7'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: ridley
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -253,14 +267,14 @@ files:
253
267
  - lib/cheftacular/stateless_actions/add_ssh_key_to_bag.rb
254
268
  - lib/cheftacular/stateless_actions/arguments.rb
255
269
  - lib/cheftacular/stateless_actions/backups.rb
256
- - lib/cheftacular/stateless_actions/bootstrappers/centos_bootstrap.rb
257
- - lib/cheftacular/stateless_actions/bootstrappers/coreos_bootstrap.rb
258
- - lib/cheftacular/stateless_actions/bootstrappers/fedora_bootstrap.rb
259
- - lib/cheftacular/stateless_actions/bootstrappers/redhat_bootstrap.rb
260
- - lib/cheftacular/stateless_actions/bootstrappers/ubuntu_bootstrap.rb
261
- - lib/cheftacular/stateless_actions/bootstrappers/vyatta_bootstrap.rb
270
+ - lib/cheftacular/stateless_actions/bootstrappers/centos_bootstrap_from_queue.rb
271
+ - lib/cheftacular/stateless_actions/bootstrappers/coreos_bootstrap_from_queue.rb
272
+ - lib/cheftacular/stateless_actions/bootstrappers/fedora_bootstrap_from_queue.rb
273
+ - lib/cheftacular/stateless_actions/bootstrappers/redhat_bootstrap_from_queue.rb
274
+ - lib/cheftacular/stateless_actions/bootstrappers/ubuntu_bootstrap_from_queue.rb
275
+ - lib/cheftacular/stateless_actions/bootstrappers/vyatta_bootstrap_from_queue.rb
262
276
  - lib/cheftacular/stateless_actions/check_cheftacular_yml_keys.rb
263
- - lib/cheftacular/stateless_actions/chef_bootstrap.rb
277
+ - lib/cheftacular/stateless_actions/chef_bootstrap_from_queue.rb
264
278
  - lib/cheftacular/stateless_actions/chef_server.rb
265
279
  - lib/cheftacular/stateless_actions/cheftacular_config.rb
266
280
  - lib/cheftacular/stateless_actions/cheftacular_yml_help.rb
@@ -271,6 +285,7 @@ files:
271
285
  - lib/cheftacular/stateless_actions/client_list.rb
272
286
  - lib/cheftacular/stateless_actions/cloud.rb
273
287
  - lib/cheftacular/stateless_actions/cloud_bootstrap.rb
288
+ - lib/cheftacular/stateless_actions/cloud_bootstrap_from_queue.rb
274
289
  - lib/cheftacular/stateless_actions/compile_audit_log.rb
275
290
  - lib/cheftacular/stateless_actions/compile_readme.rb
276
291
  - lib/cheftacular/stateless_actions/create_git_key.rb
@@ -278,7 +293,7 @@ files:
278
293
  - lib/cheftacular/stateless_actions/environment.rb
279
294
  - lib/cheftacular/stateless_actions/file.rb
280
295
  - lib/cheftacular/stateless_actions/fix_known_hosts.rb
281
- - lib/cheftacular/stateless_actions/full_bootstrap.rb
296
+ - lib/cheftacular/stateless_actions/full_bootstrap_from_queue.rb
282
297
  - lib/cheftacular/stateless_actions/get_active_ssh_connections.rb
283
298
  - lib/cheftacular/stateless_actions/get_haproxy_log.rb
284
299
  - lib/cheftacular/stateless_actions/get_log_from_bag.rb
@@ -1,116 +0,0 @@
1
- class Cheftacular
2
- class StatelessActionDocumentation
3
- def ubuntu_bootstrap
4
- @config['documentation']['stateless_action'][__method__] ||= {}
5
- @config['documentation']['stateless_action'][__method__]['long_description'] = [
6
- "`cft ubuntu_bootstrap ADDRESS ROOT_PASS` This command will bring a fresh server to a state " +
7
- "where chef-client can be run on it via `cft chef-bootstrap`. It should be noted that it is in "+
8
- "this step where a server's randomized deploy_user sudo password is generated."
9
- ]
10
-
11
- @config['documentation']['stateless_action'][__method__]['short_description'] = 'Updates an ubuntu server to have more secure defaults'
12
- end
13
- end
14
-
15
- class StatelessAction
16
- def ubuntu_bootstrap out=[]
17
- raise "This action can only be performed if the mode is set to devops" if !@config['helper'].running_in_mode?('devops') && !@options['in_scaling']
18
-
19
- @options['address'] = ARGV[1] unless @options['address']
20
- @options['client_pass'] = ARGV[2] unless @options['address']
21
-
22
- if `which sshpass`.empty?
23
- raise "sshpass not installed! Please run brew install https://raw.github.com/eugeneoden/homebrew/eca9de1/Library/Formula/sshpass.rb (or get it from your repo for linux)"
24
- end
25
-
26
- new_deploy_pass = @config['helper'].gen_pass(@config['cheftacular']['server_pass_length'])
27
-
28
- deploy_user = @config['cheftacular']['deploy_user']
29
-
30
- root_commands = [
31
- "cd /home",
32
- "adduser #{ deploy_user } --gecos \",,,,\" --disabled-password",
33
- "echo #{ deploy_user }:#{ new_deploy_pass } | chpasswd",
34
- "adduser #{ deploy_user } www-data",
35
- "adduser #{ deploy_user } sudo",
36
- "mkdir -p /home/#{ deploy_user }/.ssh",
37
- "touch /home/#{ deploy_user }/.ssh/authorized_keys && touch /home/#{ deploy_user }/.ssh/known_hosts",
38
- "chown -R #{ deploy_user }:www-data /home/#{ deploy_user }/.ssh",
39
- 'sed -i "s/StrictModes yes/StrictModes yes\nPasswordAuthentication no\nUseDNS no\nAllowUsers deploy postgres\n/" /etc/ssh/sshd_config'.gsub('deploy', deploy_user),
40
- 'sed -i "s/PermitRootLogin yes/PermitRootLogin no/" /etc/ssh/sshd_config'
41
- ]
42
-
43
- @config['default']['authentication_bag_hash']['authorized_keys'].each do |line|
44
- root_commands << "echo \"#{ line }\" >> /home/#{ deploy_user }/.ssh/authorized_keys"
45
- end
46
-
47
- sudo = "echo #{ new_deploy_pass } | sudo -S"
48
-
49
- deploy_commands = [
50
- "#{ sudo } apt-get update",
51
- "#{ sudo } apt-get install curl #{ @config['cheftacular']['pre_install_packages'] } -y",
52
- "#{ sudo } apt-get upgrade -y"
53
- ]
54
-
55
- final_commands = []
56
-
57
- if @config['cheftacular']['install_rvm_on_boot']
58
- deploy_commands << "gpg --keyserver hkp://keys.gnupg.net --recv-keys #{ @config['cheftacular']['rvm_gpg_key'] }"
59
- deploy_commands << "curl -L https://get.rvm.io | bash -s stable"
60
-
61
- rvm_source = "source /home/deploy/.rvm/bin/rvm &&"
62
-
63
- final_commands = [
64
- "#{ rvm_source } echo '#{ new_deploy_pass }' | rvmsudo -S rvm requirements",
65
- "#{ rvm_source } rvm install #{ @config['cheftacular']['ruby_version'] }",
66
- "#{ rvm_source } rvm alias create default #{ @config['cheftacular']['ruby_version'] }",
67
- "#{ rvm_source } rvm gemset empty --force"
68
- ]
69
-
70
- final_commands << "#{ rvm_source } rvm install 1.9.3-p327" if @config['cheftacular']['chef_version'].to_i < 12
71
- end
72
-
73
- root_execute_string = "sshpass -p \"#{ @options['client_pass'] }\" ssh -t -oStrictHostKeyChecking=no root@#{ @options['address'] } '#{ root_commands.join(' && ') } && service ssh restart'"
74
-
75
- while system(root_execute_string) != true
76
- tries ||= 5
77
- puts "Unable to complete step 1 of setup process, trying again in 60 seconds, there are #{ tries } more tries"
78
- sleep 60
79
- tries -= 1
80
- raise "Unable to complete step 1 of setup process!" if tries <= 0
81
- end
82
-
83
- out << $?.to_s #output from the system command above
84
-
85
- puts("Finished initial setup...stage 1 of 3 for server #{ @options['address'] }") if @options['in_scaling']
86
-
87
- puts(out.last) unless @options['quiet'] || @options['in_scaling']
88
-
89
- deploy_commands.each do |cmnd|
90
- puts("(#{ @options['address'] }) Running #{ cmnd.gsub("#{ new_deploy_pass }", "sudo password") }") unless @options['quiet'] || @options['in_scaling']
91
-
92
- out << `ssh -t -oStrictHostKeyChecking=no #{ deploy_user }@#{ @options['address'] } "#{ cmnd }"`
93
-
94
- puts(out.last) unless @options['quiet'] || @options['in_scaling']
95
- end
96
-
97
- puts("Finished deploy setup....stage 2 of 3 for server #{ @options['address'] }") if @options['in_scaling']
98
-
99
- final_commands.each do |cmnd|
100
- puts "(#{ @options['address'] }) Running #{ cmnd.gsub("#{ new_deploy_pass }", "sudo password") }"
101
-
102
- out << `ssh -t -oStrictHostKeyChecking=no #{ deploy_user }@#{ @options['address'] } "#{ cmnd }"`
103
-
104
- puts(out.last) unless @options['quiet'] || @options['in_scaling']
105
- end
106
-
107
- puts("Finished ruby setup......stage 3 of 3 for server #{ @options['address'] }") if @options['in_scaling']
108
-
109
- @config[@options['env']]['server_passwords_bag_hash']["#{ @options['address'] }-root-pass"] = @options['client_pass']
110
- @config[@options['env']]['server_passwords_bag_hash']["#{ @options['address'] }-deploy-pass"] = new_deploy_pass
111
- @config[@options['env']]['server_passwords_bag_hash']["#{ @options['address'] }-name"] = @options['node_name'] if @options['node_name']
112
-
113
- @config['ChefDataBag'].save_server_passwords_bag unless @options['in_scaling']
114
- end
115
- end
116
- end