cheftacular 2.5.0 → 2.6.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 (70) hide show
  1. checksums.yaml +4 -4
  2. data/lib/cheftacular/README.md +155 -63
  3. data/lib/cheftacular/actions/db_console.rb +3 -3
  4. data/lib/cheftacular/actions/deploy.rb +18 -12
  5. data/lib/cheftacular/actions/migrate.rb +1 -1
  6. data/lib/cheftacular/actions/tail.rb +1 -1
  7. data/lib/cheftacular/auditor.rb +14 -6
  8. data/lib/cheftacular/chef/data_bag.rb +1 -4
  9. data/lib/cheftacular/cheftacular.rb +19 -15
  10. data/lib/cheftacular/cloud_provider.rb +32 -0
  11. data/lib/cheftacular/dns.rb +1 -1
  12. data/lib/cheftacular/error.rb +13 -2
  13. data/lib/cheftacular/file_system.rb +122 -0
  14. data/lib/cheftacular/files/rvm.sh +55 -0
  15. data/lib/cheftacular/getter.rb +10 -3
  16. data/lib/cheftacular/helper.rb +31 -127
  17. data/lib/cheftacular/initialization_action.rb +8 -0
  18. data/lib/cheftacular/initializer.rb +104 -44
  19. data/lib/cheftacular/parser.rb +6 -0
  20. data/lib/cheftacular/stateless_actions/add_ssh_key_to_bag.rb +2 -2
  21. data/lib/cheftacular/stateless_actions/arguments.rb +9 -2
  22. data/lib/cheftacular/stateless_actions/backups.rb +1 -1
  23. data/lib/cheftacular/stateless_actions/bootstrappers/ubuntu_bootstrap.rb +16 -5
  24. data/lib/cheftacular/stateless_actions/check_cheftacular_yml_keys.rb +79 -0
  25. data/lib/cheftacular/stateless_actions/chef_bootstrap.rb +20 -4
  26. data/lib/cheftacular/stateless_actions/chef_server.rb +78 -0
  27. data/lib/cheftacular/stateless_actions/clean_cookbooks.rb +3 -3
  28. data/lib/cheftacular/stateless_actions/clean_server_passwords.rb +3 -1
  29. data/lib/cheftacular/stateless_actions/cleanup_log_files.rb +1 -0
  30. data/lib/cheftacular/stateless_actions/client_list.rb +2 -2
  31. data/lib/cheftacular/stateless_actions/cloud.rb +30 -2
  32. data/lib/cheftacular/stateless_actions/cloud_bootstrap.rb +7 -13
  33. data/lib/cheftacular/stateless_actions/compile_audit_log.rb +1 -1
  34. data/lib/cheftacular/stateless_actions/create_git_key.rb +3 -1
  35. data/lib/cheftacular/stateless_actions/environment.rb +2 -0
  36. data/lib/cheftacular/stateless_actions/file.rb +4 -2
  37. data/lib/cheftacular/stateless_actions/fix_known_hosts.rb +2 -1
  38. data/lib/cheftacular/stateless_actions/full_bootstrap.rb +2 -0
  39. data/lib/cheftacular/stateless_actions/get_active_ssh_connections.rb +1 -1
  40. data/lib/cheftacular/stateless_actions/help.rb +9 -7
  41. data/lib/cheftacular/stateless_actions/initialize_cheftacular_yml.rb +29 -0
  42. data/lib/cheftacular/stateless_actions/initialize_data_bag_contents.rb +5 -36
  43. data/lib/cheftacular/stateless_actions/list_toggleable_roles.rb +45 -0
  44. data/lib/cheftacular/stateless_actions/location_aliases.rb +24 -0
  45. data/lib/cheftacular/stateless_actions/pass.rb +4 -4
  46. data/lib/cheftacular/stateless_actions/reinitialize.rb +0 -6
  47. data/lib/cheftacular/stateless_actions/remove_client.rb +12 -7
  48. data/lib/cheftacular/stateless_actions/role_toggle.rb +141 -0
  49. data/lib/cheftacular/stateless_actions/server_update.rb +2 -2
  50. data/lib/cheftacular/stateless_actions/update_chef_client.rb +18 -0
  51. data/lib/cheftacular/stateless_actions/upload_nodes.rb +5 -3
  52. data/lib/cheftacular/stateless_actions/upload_roles.rb +1 -1
  53. data/lib/cheftacular/version.rb +1 -1
  54. data/lib/cloud_interactor/authentication.rb +78 -40
  55. data/lib/cloud_interactor/cloud_interactor.rb +4 -1
  56. data/lib/cloud_interactor/cloud_provider.rb +19 -0
  57. data/lib/cloud_interactor/domain/create.rb +1 -1
  58. data/lib/cloud_interactor/domain/create_record.rb +1 -1
  59. data/lib/cloud_interactor/domain/destroy_record.rb +1 -1
  60. data/lib/cloud_interactor/domain/list_records.rb +1 -1
  61. data/lib/cloud_interactor/domain/update.rb +1 -1
  62. data/lib/cloud_interactor/domain/update_record.rb +6 -6
  63. data/lib/cloud_interactor/helpers.rb +1 -1
  64. data/lib/cloud_interactor/parser.rb +3 -2
  65. data/lib/cloud_interactor/region.rb +27 -0
  66. data/lib/cloud_interactor/server/create.rb +9 -0
  67. data/lib/cloud_interactor/sshkey.rb +59 -0
  68. data/lib/ridley/monkeypatches.rb +12 -0
  69. data/lib/sshkit/actions/start_task.rb +8 -2
  70. metadata +16 -2
@@ -1,4 +1,4 @@
1
- require 'ridley' #chef tools outside of chef!
1
+ require 'ridley'
2
2
  require 'highline/import'
3
3
  require 'optparse'
4
4
  require 'base64'
@@ -21,32 +21,36 @@ require 'net/http'
21
21
  require 'timeout'
22
22
  require 'slack-notifier'
23
23
  require 'cloudflare'
24
- require 'zlib'
25
24
  require 'csv'
26
25
 
27
26
  Dir["#{File.dirname(__FILE__)}/../**/*.rb"].each { |f| require f }
28
27
 
29
28
  class Cheftacular
30
29
  def initialize options={'env'=>'staging'}, config={}
31
- @options, @config = options, config
30
+ @options, @config = options, config
31
+ SSHKit.config.format = :blackhole
32
+ #Fog::Logger[:warning] = nil
33
+ @config['start_time'] = Time.now
34
+ @config['helper'] = Helper.new(@options, @config)
35
+ @config['initialization_action'] = InitializationAction.new(@options, @config)
36
+ @config['filesystem'] = Cheftacular::FileSystem.new(@options, @config)
37
+ @config['initializer'] = Initializer.new(@options, @config)
32
38
 
33
- SSHKit.config.format = :blackhole
39
+ if @config['helper'].is_initialization_command?(ARGV[0])
40
+ @options['command'] = ARGV[0] #this is normally set by parse_context but that is not run for initialization commands
41
+ else
42
+ @config['stateless_action'].initialize_data_bag_contents(@options['env']) #ensure basic structure are always maintained before each run
34
43
 
35
- @config['start_time'] = Time.now
44
+ @config['parser'].parse_application_context if @config['cheftacular']['mode'] == 'application'
36
45
 
37
- @config['helper'] = Helper.new(@options, @config)
46
+ @config['parser'].parse_context
38
47
 
39
- @config['initializer'] = Initializer.new(@options, @config)
48
+ puts("Preparing to run command \"#{ @options['command'] }\"...") if @options['verbose']
40
49
 
41
- @config['stateless_action'].initialize_data_bag_contents @options['env'] #ensure basic structure are always maintained before each run
50
+ @config['auditor'].audit_run if @config['cheftacular']['auditing']
51
+ end
42
52
 
43
- @config['parser'].parse_application_context if @config['cheftacular']['mode'] == 'application'
44
-
45
- @config['parser'].parse_context
46
-
47
- puts("Preparing to run command \"#{ @options['command'] }\"...") if @options['verbose']
48
-
49
- @config['auditor'].audit_run if @config['cheftacular']['auditing']
53
+ @config['stateless_action'].send('check_cheftacular_yml_keys')
50
54
 
51
55
  @config['action'].send(@options['command']) if @config['helper'].is_command?(@options['command'])
52
56
 
@@ -0,0 +1,32 @@
1
+ #This class will store any specific differences cheftacular will run into for different providers, usually via the cloud_bootstrap command
2
+ class Cheftacular
3
+ class CloudProvider
4
+ def initialize options, config
5
+ @options, @config = options, config
6
+ end
7
+
8
+ #public address, private address
9
+ def parse_addresses_from_server_create_hash server_hash
10
+ case @options['preferred_cloud']
11
+ when 'rackspace'
12
+ [server_hash['ipv4_address'], server_hash['addresses']['private'][0]['addr']]
13
+ when 'digitalocean'
14
+ [server_hash['public_ip_address'], server_hash['private_ip_address']]
15
+ else raise "CRITICAL! Encountered unsupported preferred cloud #{ @options['preferred_cloud'] }"
16
+ end
17
+ end
18
+
19
+ def parse_server_root_password_from_server_create_hash server_hash, real_node_name
20
+ case @options['preferred_cloud']
21
+ when 'rackspace'
22
+ begin
23
+ server_hash['admin_passwords']["#{ real_node_name }"]
24
+ rescue NoMethodError => e
25
+ raise "Unable to locate an admin pass for server #{ @options['node_name'] }, does the server already exist?"
26
+ end
27
+ when 'digitalocean' #we use sshkey authentication for initial server create for digitalocean
28
+ else raise "CRITICAL! Encountered unsupported preferred cloud #{ @options['preferred_cloud'] }"
29
+ end
30
+ end
31
+ end
32
+ end
@@ -255,7 +255,7 @@ class Cheftacular
255
255
 
256
256
  next
257
257
  else
258
- @config['helper'].exception_output "There was an issue updating Cloudflare! Please create an issue on the cheftacular repository with this stacktrace!", e
258
+ @config['error'].exception_output "There was an issue updating Cloudflare! Please create an issue on the cheftacular repository with this stacktrace!", e
259
259
  end
260
260
  end
261
261
 
@@ -5,16 +5,27 @@ class Cheftacular
5
5
  @options, @config = options, config
6
6
  end
7
7
 
8
- def is_valid_node_name_option?
8
+ def is_valid_node_name_option? strict_env=false
9
9
  raise "Too few arguments, please supply a node name" if @options['node_name'].nil?
10
10
 
11
11
  nodes = @config['getter'].get_true_node_objects(true)
12
12
 
13
- nodes = @config['parser'].exclude_nodes( nodes, [{ if: { not_node: @options["node_name"] } }], true )
13
+ exclusion_args = [{ if: { not_node: @options["node_name"] } }]
14
+ exclusion_args << { if: { not_env: @options['env'] } } if strict_env
15
+
16
+ nodes = @config['parser'].exclude_nodes( nodes, exclusion_args, true )
14
17
 
15
18
  raise "Node not found for #{ @options['node_name'] }" if nodes.empty?
16
19
 
17
20
  nodes
18
21
  end
22
+
23
+ def exception_output message, exception='', exit_on_call=true, suppress_error_output=false
24
+ puts "#{ message }\n"
25
+
26
+ puts("Error message: #{ exception }\n#{ exception.backtrace.join("\n") }") unless suppress_error_output
27
+
28
+ exit if exit_on_call
29
+ end
19
30
  end
20
31
  end
@@ -0,0 +1,122 @@
1
+ class Cheftacular
2
+ class FileSystem
3
+ def initialize options, config
4
+ @options, @config = options, config
5
+ end
6
+
7
+ def write_version_file version
8
+ File.open( current_version_file_path, "w") { |f| f.write(version) }
9
+ end
10
+
11
+ def write_nodes_file_cache nodes
12
+ nodes.each do |node|
13
+ File.open( File.join( current_nodes_file_cache_path, "#{ node.name }.json"), "w") { |f| f.write(node.to_json) }
14
+ end
15
+ end
16
+
17
+ def check_nodes_file_cache nodes=[]
18
+ Dir.entries(current_nodes_file_cache_path).each do |location|
19
+ next if is_junk_filename?(location)
20
+
21
+ nodes << @config['ridley'].node.from_file("#{ current_nodes_file_cache_path }/#{ location }" )
22
+ end
23
+
24
+ nodes
25
+ end
26
+
27
+ def current_version_file_path
28
+ current_file_path 'version-check.txt'
29
+ end
30
+
31
+ def current_audit_file_path
32
+ current_file_path 'audit-check.txt'
33
+ end
34
+
35
+ def is_junk_filename? filename
36
+ filename =~ /.DS_Store|.com.apple.timemachine.supported|README.*/ || filename == '.' || filename == '..' && File.directory?(filename)
37
+ end
38
+
39
+ def compare_file_node_cache_against_chef_nodes mode='include?'
40
+ chef_server_names, nodes_file_cache_names = [],[]
41
+ included = true
42
+
43
+ @config['chef_nodes'].each { |node| chef_server_names << node.name }
44
+
45
+ check_nodes_file_cache.each { |node| nodes_file_cache_names << node.name }
46
+
47
+ nodes_file_cache_names.each do |node_name|
48
+ unless chef_server_names.include?(node_name)
49
+ included = false
50
+
51
+ break
52
+ end
53
+ end
54
+
55
+ case mode
56
+ when 'include?' then return included
57
+ when 'not_equal' then return check_nodes_file_cache.count != names.count
58
+ when 'equal' then return chef_server_names.sort == nodes_file_cache_names.sort
59
+ end
60
+ end
61
+
62
+ def current_nodes_file_cache_path
63
+ current_file_path 'node_cache'
64
+ end
65
+
66
+ def cleanup_file_caches mode='old', check_current_day_entry=false
67
+ base_dir = File.join( @config['locs']['app-root'], 'tmp', @config['helper'].declassify )
68
+
69
+ Dir.entries(base_dir).each do |entry|
70
+ next if is_junk_filename?(entry)
71
+
72
+ case mode
73
+ when 'old'
74
+ FileUtils.rm("#{ base_dir }/#{ entry }") if File.file?("#{ base_dir }/#{ entry }") && !entry.include?(Time.now.strftime("%Y%m%d"))
75
+ when 'current'
76
+ check_current_day_entry = true
77
+ when 'current-audit-only'
78
+ FileUtils.rm("#{ base_dir }/#{ entry }") if File.file?("#{ base_dir }/#{ entry }") && entry.include?(Time.now.strftime("%Y%m%d"))
79
+ end
80
+
81
+ if File.exists?("#{ base_dir }/#{ entry }") && File.directory?("#{ base_dir }/#{ entry }")
82
+ FileUtils.rm_rf("#{ base_dir }/#{ entry }") if !check_current_day_entry && !entry.include?(Time.now.strftime("%Y%m%d"))
83
+
84
+ FileUtils.rm_rf("#{ base_dir }/#{ entry }") if check_current_day_entry && entry.include?(Time.now.strftime("%Y%m%d"))
85
+
86
+ FileUtils.mkdir_p current_nodes_file_cache_path
87
+ end
88
+ end
89
+ end
90
+
91
+ def remove_current_file_node_cache
92
+ base_dir = File.join( @config['locs']['app-root'], 'tmp', @config['helper'].declassify )
93
+
94
+ Dir.entries(base_dir).each do |entry|
95
+ next if is_junk_filename?(entry)
96
+
97
+ FileUtils.rm_rf("#{ base_dir }/#{ entry }") if File.directory?("#{ base_dir }/#{ entry }") && entry.include?(Time.now.strftime("%Y%m%d"))
98
+ end
99
+ end
100
+
101
+ def current_chef_repo_cheftacular_file_cache_path
102
+ current_file_path "chef_repo_cheftacular_cache"
103
+ end
104
+
105
+ def write_chef_repo_cheftacular_cache_file hash
106
+ File.open( current_chef_repo_cheftacular_file_cache_path, "w") { |f| f.write(hash) }
107
+ end
108
+
109
+ def write_chef_repo_cheftacular_yml_file file_location
110
+ File.open( file_location, "w") { |f| f.write(@config['helper'].compile_chef_repo_cheftacular_yml_as_hash.to_yaml) }
111
+ end
112
+
113
+ def write_config_cheftacular_yml_file filename='cheftacular.yml'
114
+ File.open( File.join(@config['locs']['chef-repo'], "config", filename), "w") { |f| f.write(File.read(File.join(@config['locs']['examples'], "cheftacular.yml"))) }
115
+ end
116
+
117
+ private
118
+ def current_file_path file_name
119
+ File.join( @config['locs']['app-root'], 'tmp', @config['helper'].declassify, "#{ Time.now.strftime("%Y%m%d") }-#{ file_name }")
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,55 @@
1
+
2
+
3
+ #
4
+ # RVM profile
5
+ #
6
+ # /etc/profile.d/rvm.sh # sh extension required for loading.
7
+ #
8
+ if [ -n "${BASH_VERSION:-}" -o -n "${ZSH_VERSION:-}" ] ; then
9
+
10
+ # Load user rvmrc configurations, if exist
11
+ for file in /etc/rvmrc "$HOME/.rvmrc" ; do
12
+ [[ -s "$file" ]] && source $file
13
+ done
14
+
15
+ # Load RVM if it is installed, try user then root install.
16
+ if [[ -s "$rvm_path/scripts/rvm" ]] ; then
17
+ source "$rvm_path/scripts/rvm"
18
+
19
+ elif [[ -s "$HOME/.rvm/scripts/rvm" ]] ; then
20
+ true ${rvm_path:="$HOME/.rvm"}
21
+ source "$HOME/.rvm/scripts/rvm"
22
+
23
+ elif [[ -s "/home/deploy/.rvm/scripts/rvm" ]] ; then
24
+ true ${rvm_path:="/usr/local/rvm/scripts/rvm"}
25
+ source "/usr/local/rvm/scripts/rvm"
26
+ fi
27
+
28
+ #
29
+ # Opt-in for custom prompt through by setting:
30
+ #
31
+ # rvm_ps1=1
32
+ #
33
+ # in either /etc/rvmrc or $HOME/.rvmrc
34
+ #
35
+ if [[ ${rvm_ps1:-0} -eq 1 ]] ; then
36
+ # Source RVM ps1 functions for a great prompt.
37
+ if [[ -s "$rvm_path/contrib/ps1_functions" ]] ; then
38
+ source "$rvm_path/contrib/ps1_functions"
39
+ elif [[ -s "/usr/local/rvm/contrib/ps1_functions" ]] ; then
40
+ source "/usr/local/rvm/contrib/ps1_functions"
41
+ fi
42
+
43
+ if command -v ps1_set >/dev/null 2>&1 ; then
44
+ ps1_set
45
+ fi
46
+ fi
47
+
48
+ # Add /usr/local/rvm/bin to /bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/opt/java/bin:/opt/java/jre/bin:/usr/lib/perl5/core_perl/bin:/usr/local/rvm/bin:/usr/local/rvm/bin in necessary
49
+ if [[ "${rvm_bin_path}" != "${rvm_path}/bin" ]] ; then
50
+ regex="^([^:]*:)*${rvm_bin_path}(:[^:]*)*$"
51
+ if [[ ! "${PATH}" =~ $regex ]] ; then
52
+ export PATH="${rvm_bin_path}:${PATH}"
53
+ fi
54
+ fi
55
+ fi
@@ -17,13 +17,13 @@ class Cheftacular
17
17
 
18
18
  @config['helper'].completion_rate? 0, __method__
19
19
 
20
- file_cache_nodes = @config['helper'].check_nodes_file_cache if @config['helper'].compare_file_node_cache_against_chef_nodes('equal')
20
+ file_cache_nodes = @config['filesystem'].check_nodes_file_cache if @config['filesystem'].compare_file_node_cache_against_chef_nodes('equal')
21
21
 
22
22
  @config['chef_nodes'].each do |n|
23
23
  true_obj = if !file_cache_nodes.empty? && @config['parser'].array_of_nodes_contains_node_name?(file_cache_nodes, n.name)
24
24
  file_cache_nodes[@config['parser'].index_of_node_name_in_array_of_nodes(file_cache_nodes, n.name)]
25
25
  else
26
- @config['helper'].cleanup_file_caches('current')
26
+ @config['filesystem'].cleanup_file_caches('current')
27
27
 
28
28
  @config['ridley'].node.find(n.name)
29
29
  end
@@ -80,7 +80,7 @@ class Cheftacular
80
80
 
81
81
  names.sort.each { |name| nodes << h[name] }
82
82
 
83
- @config['helper'].write_nodes_file_cache(all_nodes) unless @config['helper'].compare_file_node_cache_against_chef_nodes('equal')
83
+ @config['filesystem'].write_nodes_file_cache(all_nodes) unless @config['filesystem'].compare_file_node_cache_against_chef_nodes('equal')
84
84
 
85
85
  puts("") unless @options['quiet']
86
86
 
@@ -149,5 +149,12 @@ class Cheftacular
149
149
 
150
150
  ret
151
151
  end
152
+
153
+ def get_current_real_node_name other_node_name='', ret=''
154
+ ret << @options['env'] + @config['cheftacular']['node_name_separator']
155
+ ret << ( other_node_name.blank? ? @options['node_name'] : other_node_name )
156
+
157
+ ret
158
+ end
152
159
  end
153
160
  end
@@ -28,26 +28,29 @@ class Cheftacular
28
28
  !@config['action'].public_methods(false).include?(command.to_sym) && !@config['stateless_action'].public_methods(false).include?(command.to_sym)
29
29
  end
30
30
 
31
- def running_on_chef_node?
32
- Dir.entries('/etc').include?('chef')
31
+ def is_initialization_command? command=''
32
+ command ||= ''
33
+
34
+ @config['initialization_action'].public_methods(false).include?(command.to_sym)
35
+ end
36
+
37
+ def running_on_chef_node? ret = false
38
+ Dir.entries('/etc').include?('chef') && File.exist?('/etc/chef/client.rb') && !File.size?('/etc/chef/client.rb').nil?
33
39
  rescue StandardError => e
34
- exception_output "An error occurred while trying to see if this system is a chef node. Assuming the system is not a chef node.", e, false
40
+ @config['error'].exception_output "An error occurred while trying to see if this system is a chef node. Assuming the system is not a chef node.", e, false
35
41
  end
36
42
 
37
43
  def running_in_mode? mode
38
44
  @config['cheftacular']['mode'] == mode
39
45
  end
40
46
 
47
+ #TODO, fix for clients that block amazon hosted rubygems?
41
48
  def fetch_remote_version
42
49
  puts "Checking remote #{ declassify } version..."
43
50
 
44
51
  `gem list #{ declassify } --remote`[/(\d+\.\d+\.\d+)/]
45
52
  end
46
53
 
47
- def is_junk_filename? filename
48
- filename =~ /.DS_Store|.com.apple.timemachine.supported|README.*/ || filename == '.' || filename == '..' && File.directory?(filename)
49
- end
50
-
51
54
  def completion_rate? percent, mode
52
55
  case mode.to_s
53
56
  when 'initializer' then print("Fetching initialization chef data for #{ @options['env'] }....0%") if !@options['quiet'] && percent == 0
@@ -102,10 +105,6 @@ class Cheftacular
102
105
  puts("\nDone in #{ Time.now - @config['start_time'] } seconds at #{ Time.now.strftime('%Y-%m-%d %l:%M:%S %P') }.") unless @options['quiet']
103
106
  end
104
107
 
105
- def write_version_file version
106
- File.open( current_version_file_path, "w") { |f| f.write(version) }
107
- end
108
-
109
108
  def set_local_instance_vars
110
109
  [
111
110
  @options,
@@ -119,61 +118,6 @@ class Cheftacular
119
118
  ]
120
119
  end
121
120
 
122
- def exception_output message, exception='', exit_on_call=true, suppress_error_output=false
123
- puts "#{ message }\n"
124
-
125
- puts("Error message: #{ exception }\n#{ exception.backtrace.join("\n") }") unless suppress_error_output
126
-
127
- exit if exit_on_call
128
- end
129
-
130
- def write_nodes_file_cache nodes
131
- nodes.each do |node|
132
- File.open( File.join( current_nodes_file_cache_path, "#{ node.name }.json"), "w") { |f| f.write(node.to_json) }
133
- end
134
- end
135
-
136
- def check_nodes_file_cache nodes=[]
137
- Dir.entries(current_nodes_file_cache_path).each do |location|
138
- next if is_junk_filename?(location)
139
-
140
- nodes << @config['ridley'].node.from_file("#{ current_nodes_file_cache_path }/#{ location }" )
141
- end
142
-
143
- nodes
144
- end
145
-
146
- def current_version_file_path
147
- current_file_path 'version-check.txt'
148
- end
149
-
150
- def current_audit_file_path
151
- current_file_path 'audit-check.txt'
152
- end
153
-
154
- def compare_file_node_cache_against_chef_nodes mode='include?'
155
- chef_server_names, nodes_file_cache_names = [],[]
156
- included = true
157
-
158
- @config['chef_nodes'].each { |node| chef_server_names << node.name }
159
-
160
- check_nodes_file_cache.each { |node| nodes_file_cache_names << node.name }
161
-
162
- nodes_file_cache_names.each do |node_name|
163
- unless chef_server_names.include?(node_name)
164
- included = false
165
-
166
- break
167
- end
168
- end
169
-
170
- case mode
171
- when 'include?' then return included
172
- when 'not_equal' then return check_nodes_file_cache.count != names.count
173
- when 'equal' then return chef_server_names.sort == nodes_file_cache_names.sort
174
- end
175
- end
176
-
177
121
  def is_higher_version? vstr1, vstr2
178
122
  Gem::Version.new(vstr1) > Gem::Version.new(vstr2)
179
123
  end
@@ -187,7 +131,7 @@ class Cheftacular
187
131
  user = @config['cheftacular']['deploy_user']
188
132
  password = @config['server_passwords'][@options['address']]
189
133
  nodename = @options['node_name']
190
- chef_ver = @config['cheftacular']['chef_client_version']
134
+ chef_ver = @config['cheftacular']['chef_version'].to_i >= 12 ? '12.4.0' : '11.16.4'
191
135
 
192
136
  "knife bootstrap #{ address } -x #{ user } -P #{ password } -N #{ nodename } --sudo --use-sudo-password --bootstrap-version #{ chef_ver }"
193
137
  end
@@ -204,14 +148,11 @@ class Cheftacular
204
148
  count = 1
205
149
 
206
150
  doc_arr.sort {|a, b| a[0] <=> b[0]}.flatten(1).each do |line|
207
-
208
151
  out << "#{ count }. #{ line }" if line.class.to_s == 'String'
209
152
 
210
153
  out << line if line.class.to_s == 'Array'
211
154
 
212
155
  count += 1 if line.class.to_s == 'String'
213
-
214
- #puts("#{ out[out.index("#{ count }. #{ line }")] }::#{ line.class }::#{ count }\n") unless line.class.to_s == 'Array'
215
156
  end
216
157
 
217
158
  out
@@ -226,49 +167,11 @@ class Cheftacular
226
167
  end
227
168
 
228
169
  def set_cloud_options
229
- @options['preferred_cloud'] = @options['preferred_cloud'].nil? ? @config['cheftacular']['preferred_cloud'] : @options['preferred_cloud']
230
- @options['preferred_cloud_image'] = @options['preferred_cloud_image'].nil? ? @config['cheftacular']['preferred_cloud_image'] : @options['preferred_cloud_image']
231
- @options['preferred_cloud_region'] = @options['preferred_cloud_region'].nil? ? @config['cheftacular']['preferred_cloud_region'] : @options['preferred_cloud_region']
232
- @options['virtualization_mode'] = @options['virtualization_mode'].nil? ? @config['cheftacular']['virtualization_mode'] : @options['virtualization_mode']
233
- end
234
-
235
- def current_nodes_file_cache_path
236
- current_file_path 'node_cache'
237
- end
238
-
239
- def cleanup_file_caches mode='old', check_current_day_entry=false
240
- base_dir = File.join( @config['locs']['app-root'], 'tmp', declassify )
241
-
242
- Dir.entries(base_dir).each do |entry|
243
- next if is_junk_filename?(entry)
244
-
245
- case mode
246
- when 'old'
247
- FileUtils.rm("#{ base_dir }/#{ entry }") if File.file?("#{ base_dir }/#{ entry }") && !entry.include?(Time.now.strftime("%Y%m%d"))
248
- when 'current'
249
- check_current_day_entry = true
250
- when 'current-audit-only'
251
- FileUtils.rm("#{ base_dir }/#{ entry }") if File.file?("#{ base_dir }/#{ entry }") && entry.include?(Time.now.strftime("%Y%m%d"))
252
- end
253
-
254
- if File.exists?("#{ base_dir }/#{ entry }") && File.directory?("#{ base_dir }/#{ entry }")
255
- FileUtils.rm_rf("#{ base_dir }/#{ entry }") if !check_current_day_entry && !entry.include?(Time.now.strftime("%Y%m%d"))
256
-
257
- FileUtils.rm_rf("#{ base_dir }/#{ entry }") if check_current_day_entry && entry.include?(Time.now.strftime("%Y%m%d"))
258
-
259
- FileUtils.mkdir_p @config['helper'].current_nodes_file_cache_path
260
- end
261
- end
262
- end
263
-
264
- def remove_current_file_node_cache
265
- base_dir = File.join( @config['locs']['app-root'], 'tmp', declassify )
266
-
267
- Dir.entries(base_dir).each do |entry|
268
- next if is_junk_filename?(entry)
269
-
270
- FileUtils.rm_rf("#{ base_dir }/#{ entry }") if File.directory?("#{ base_dir }/#{ entry }") && entry.include?(Time.now.strftime("%Y%m%d"))
271
- end
170
+ @options['preferred_cloud'] = @options['preferred_cloud'].nil? ? @config['cheftacular']['preferred_cloud'].downcase : @options['preferred_cloud'].downcase
171
+ @options['preferred_cloud_image'] = @options['preferred_cloud_image'].nil? ? @config['cheftacular']['preferred_cloud_image'] : @options['preferred_cloud_image']
172
+ @options['preferred_cloud_region'] = @options['preferred_cloud_region'].nil? ? @config['cheftacular']['preferred_cloud_region'] : @options['preferred_cloud_region']
173
+ @options['virtualization_mode'] = @options['virtualization_mode'].nil? ? @config['cheftacular']['virtualization_mode'] : @options['virtualization_mode']
174
+ @options['route_dns_changes_via'] = @options['route_dns_changes_via'].nil? ? @config['cheftacular']['route_dns_changes_via'].downcase : @options['route_dns_changes_via'].downcase
272
175
  end
273
176
 
274
177
  def does_cheftacular_config_have? key_array
@@ -331,14 +234,6 @@ class Cheftacular
331
234
  exit
332
235
  end
333
236
 
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
237
  def compile_chef_repo_cheftacular_yml_as_hash
343
238
  master_hash = get_cheftacular_yml_as_hash
344
239
  master_hash['replace_keys_in_chef_repo'].each_pair do |key, val|
@@ -348,13 +243,22 @@ class Cheftacular
348
243
  master_hash
349
244
  end
350
245
 
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
246
+ def install_rvm_sh_file out=[]
247
+ puts("Starting rvm.sh installation...") unless @options['quiet']
248
+
249
+ commands = [
250
+ "#{ @config['helper'].sudo(@options['address']) } mv /home/deploy/rvm.sh /etc/profile.d",
251
+ "#{ @config['helper'].sudo(@options['address']) } chmod 755 /etc/profile.d/rvm.sh",
252
+ "#{ @config['helper'].sudo(@options['address']) } chown root:root /etc/profile.d/rvm.sh"
253
+ ]
254
+
255
+ out << `scp -oStrictHostKeyChecking=no #{ @config['locs']['cheftacular-lib-files'] }/rvm.sh #{ @config['cheftacular']['deploy_user'] }@#{ @options['address'] }:/home/#{ @config['cheftacular']['deploy_user'] }`
256
+
257
+ commands.each do |command|
258
+ out << `ssh -t -oStrictHostKeyChecking=no #{ @config['cheftacular']['deploy_user'] }@#{ @options['address'] } "#{ command }"`
259
+ end
354
260
 
355
- private
356
- def current_file_path file_name
357
- File.join( @config['locs']['app-root'], 'tmp', declassify, "#{ Time.now.strftime("%Y%m%d") }-#{ file_name }")
261
+ puts("Completed rvm.sh installation into /etc/profile.d/rvm.sh") unless @options['quiet']
358
262
  end
359
263
  end
360
264
  end
@@ -0,0 +1,8 @@
1
+
2
+ class Cheftacular
3
+ class InitializationAction
4
+ def initialize options, config
5
+ @options, @config = options, config
6
+ end
7
+ end
8
+ end