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.
- checksums.yaml +4 -4
- data/lib/cheftacular/README.md +119 -77
- data/lib/cheftacular/actions/check.rb +58 -24
- data/lib/cheftacular/actions/deploy.rb +5 -3
- data/lib/cheftacular/auditor.rb +4 -3
- data/lib/cheftacular/cheftacular.rb +1 -0
- data/lib/cheftacular/cloud_provider.rb +17 -12
- data/lib/cheftacular/file_system.rb +20 -0
- data/lib/cheftacular/getter.rb +1 -1
- data/lib/cheftacular/helper.rb +41 -28
- data/lib/cheftacular/initializer.rb +5 -3
- data/lib/cheftacular/parser.rb +10 -6
- data/lib/cheftacular/queue_master.rb +24 -0
- data/lib/cheftacular/stateless_actions/backups.rb +2 -2
- data/lib/cheftacular/stateless_actions/bootstrappers/{centos_bootstrap.rb → centos_bootstrap_from_queue.rb} +1 -1
- data/lib/cheftacular/stateless_actions/bootstrappers/{coreos_bootstrap.rb → coreos_bootstrap_from_queue.rb} +1 -1
- data/lib/cheftacular/stateless_actions/bootstrappers/{fedora_bootstrap.rb → fedora_bootstrap_from_queue.rb} +1 -1
- data/lib/cheftacular/stateless_actions/bootstrappers/{redhat_bootstrap.rb → redhat_bootstrap_from_queue.rb} +1 -1
- data/lib/cheftacular/stateless_actions/bootstrappers/ubuntu_bootstrap_from_queue.rb +203 -0
- data/lib/cheftacular/stateless_actions/bootstrappers/vyatta_bootstrap_from_queue.rb +7 -0
- data/lib/cheftacular/stateless_actions/check_cheftacular_yml_keys.rb +30 -0
- data/lib/cheftacular/stateless_actions/chef_bootstrap_from_queue.rb +89 -0
- data/lib/cheftacular/stateless_actions/cheftacular_yml_help.rb +55 -6
- data/lib/cheftacular/stateless_actions/client_list.rb +1 -3
- data/lib/cheftacular/stateless_actions/cloud_bootstrap.rb +24 -15
- data/lib/cheftacular/stateless_actions/cloud_bootstrap_from_queue.rb +37 -0
- data/lib/cheftacular/stateless_actions/environment.rb +80 -31
- data/lib/cheftacular/stateless_actions/fix_known_hosts.rb +1 -22
- data/lib/cheftacular/stateless_actions/{full_bootstrap.rb → full_bootstrap_from_queue.rb} +8 -15
- data/lib/cheftacular/stateless_actions/knife_upload.rb +14 -3
- data/lib/cheftacular/stateless_actions/reinitialize.rb +1 -1
- data/lib/cheftacular/stateless_actions/remove_client.rb +3 -3
- data/lib/cheftacular/stateless_actions/restart_swap.rb +0 -1
- data/lib/cheftacular/stateless_actions/test_env.rb +24 -18
- data/lib/cheftacular/stateless_actions/update_thecheftacularcookbook.rb +1 -1
- data/lib/cheftacular/stateless_actions/upload_nodes.rb +2 -2
- data/lib/cheftacular/version.rb +1 -1
- data/lib/cloud_interactor/domain/create.rb +2 -2
- data/lib/cloud_interactor/domain/create_record.rb +1 -1
- data/lib/cloud_interactor/domain/destroy.rb +2 -2
- data/lib/cloud_interactor/domain/destroy_record.rb +1 -1
- data/lib/cloud_interactor/domain/list_records.rb +1 -1
- data/lib/cloud_interactor/domain/read.rb +1 -1
- data/lib/cloud_interactor/domain/read_record.rb +1 -1
- data/lib/cloud_interactor/domain/update.rb +2 -2
- data/lib/cloud_interactor/domain/update_record.rb +2 -2
- data/lib/cloud_interactor/helpers.rb +11 -6
- data/lib/cloud_interactor/server/attach_volume.rb +1 -1
- data/lib/cloud_interactor/server/create.rb +4 -4
- data/lib/cloud_interactor/server/detach_volume.rb +2 -2
- data/lib/cloud_interactor/server/list_volumes.rb +1 -1
- data/lib/cloud_interactor/server/poll.rb +2 -2
- data/lib/cloud_interactor/server/read_volume.rb +1 -1
- data/lib/cloud_interactor/version.rb +1 -1
- data/lib/cloud_interactor/volume/create.rb +1 -1
- data/lib/sshkit/getters.rb +9 -1
- metadata +25 -10
- data/lib/cheftacular/stateless_actions/bootstrappers/ubuntu_bootstrap.rb +0 -116
- data/lib/cheftacular/stateless_actions/bootstrappers/vyatta_bootstrap.rb +0 -7
- data/lib/cheftacular/stateless_actions/chef_bootstrap.rb +0 -63
@@ -3,11 +3,13 @@ class Cheftacular
|
|
3
3
|
def check
|
4
4
|
@config['documentation']['action'][__method__] ||= {}
|
5
5
|
@config['documentation']['action'][__method__]['long_description'] = [
|
6
|
-
"`cft check` Checks the commits for all servers for a repository (for an environment) and returns them in a simple chart. " +
|
6
|
+
"`cft check [all]` Checks the commits for all servers for a repository (for an environment) and returns them in a simple chart. " +
|
7
7
|
"Also shows when these commits were deployed to the server.",
|
8
8
|
[
|
9
9
|
" 1. If the node has special repository based keys from TheCheftacularCookbook, this command will also display information " +
|
10
|
-
"about the branch and organization currently deployed to the node(s)."
|
10
|
+
"about the branch and organization currently deployed to the node(s).",
|
11
|
+
|
12
|
+
" 2. If the all argument is provided, all repositories will be checked for the current environment"
|
11
13
|
]
|
12
14
|
]
|
13
15
|
@config['documentation']['action'][__method__]['short_description'] = "Checks the branches currently deployed to an env for your repo"
|
@@ -15,41 +17,71 @@ class Cheftacular
|
|
15
17
|
end
|
16
18
|
|
17
19
|
class Action
|
18
|
-
def check commit_hash={}, have_revisions=false, have_changed_orgs=false
|
20
|
+
def check commit_hash={}, have_revisions=false, have_changed_orgs=false, fetch_all_repository_data=false, headers=[], deployment_args={ in: :parallel }
|
19
21
|
@config['filesystem'].cleanup_file_caches('current-nodes')
|
22
|
+
|
23
|
+
fetch_all_repository_data = ARGV[1] == 'all'
|
20
24
|
|
21
|
-
nodes = @config['getter'].get_true_node_objects
|
25
|
+
nodes = @config['getter'].get_true_node_objects(fetch_all_repository_data)
|
26
|
+
|
27
|
+
nodes = @config['parser'].exclude_nodes(nodes, [{ if: { not_env: @options['env'] } }])
|
28
|
+
|
29
|
+
repositories_to_check = @config['getter'].get_repo_names_for_repositories
|
30
|
+
repositories_to_check = repositories_to_check.reject { |key,val| key != @options['repository'] } unless fetch_all_repository_data
|
31
|
+
|
32
|
+
deployment_args = { in: :groups, limit: 2, wait: 5 } if fetch_all_repository_data
|
22
33
|
|
23
34
|
#this must always precede on () calls so they have the instance variables they need
|
24
35
|
options, locs, ridley, logs_bag_hash, pass_bag_hash, bundle_command, cheftacular, passwords = @config['helper'].set_local_instance_vars
|
25
36
|
|
26
|
-
on ( nodes.map { |n| @config['cheftacular']['deploy_user'] + "@" + n.public_ipaddress } ),
|
37
|
+
on ( nodes.map { |n| @config['cheftacular']['deploy_user'] + "@" + n.public_ipaddress } ), deployment_args do |host|
|
27
38
|
n = get_node_from_address(nodes, host.hostname)
|
28
39
|
|
29
|
-
puts("Beginning commit check run for #{ n.name } (#{ n.public_ipaddress })
|
40
|
+
puts("Beginning commit check run for #{ n.name } (#{ n.public_ipaddress })...") unless options['quiet']
|
30
41
|
|
31
|
-
|
42
|
+
repositories_to_check.each_pair do |repo, repo_hash|
|
43
|
+
next unless n.run_list.include?("role[#{ repo_hash['role'] }]")
|
32
44
|
|
33
|
-
|
34
|
-
commit_hash[n.name]
|
35
|
-
|
36
|
-
|
45
|
+
options['repository'] = repo
|
46
|
+
commit_hash[n.name] ||= {}
|
47
|
+
|
48
|
+
commit_hash[n.name][repo] = start_commit_check( n.name, n.public_ipaddress, options, locs, cheftacular, passwords)
|
49
|
+
|
50
|
+
next if commit_hash[n.name][repo].nil?
|
37
51
|
|
38
|
-
|
39
|
-
|
52
|
+
if n.normal_attributes.has_key?(options['repository'])
|
53
|
+
commit_hash[n.name][repo]['branch'] = n.normal_attributes[options['repository']]['repo_branch'] if n.normal_attributes[options['repository']].has_key?('repo_branch')
|
54
|
+
commit_hash[n.name][repo]['organization'] = n.normal_attributes[options['repository']]['repo_group'] if n.normal_attributes[options['repository']].has_key?('repo_group')
|
55
|
+
end
|
56
|
+
|
57
|
+
have_revisions = true if commit_hash[n.name].has_key?(repo) && commit_hash[n.name][repo].has_key?('branch')
|
58
|
+
have_changed_orgs = true if commit_hash[n.name].has_key?(repo) && commit_hash[n.name][repo].has_key?('organization')
|
59
|
+
|
60
|
+
sleep 5
|
61
|
+
end
|
40
62
|
end
|
41
63
|
|
42
|
-
|
64
|
+
headers << "\n#{ 'name'.ljust(20) }"
|
65
|
+
headers << 'repository'.ljust(30,'_') if repositories_to_check.length > 1
|
66
|
+
headers << "#{ 'deployed_on'.ljust(22) } #{ 'commit'.ljust(40) }"
|
67
|
+
headers << 'revision'.ljust(21) if have_revisions
|
68
|
+
headers << 'organization'.ljust(30) if have_changed_orgs
|
69
|
+
|
70
|
+
puts headers.join(' ')
|
43
71
|
nodes.each do |n|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
72
|
+
next if commit_hash[n.name].nil?
|
73
|
+
repositories_to_check.each_pair do |repo, repo_hash|
|
74
|
+
if commit_hash[n.name].has_key?(repo) && !commit_hash[n.name][repo].nil?
|
75
|
+
out = []
|
76
|
+
out << n.name.ljust(20, '_')
|
77
|
+
out << repo.ljust(30) if repositories_to_check.length > 1
|
78
|
+
out << commit_hash[n.name][repo]['time'].ljust(22)
|
79
|
+
out << commit_hash[n.name][repo]['name'].ljust(40)
|
80
|
+
out << commit_hash[n.name][repo]['branch'].ljust(21, '_') if commit_hash[n.name][repo].has_key?('branch')
|
81
|
+
out << commit_hash[n.name][repo]['organization'].ljust(30) if commit_hash[n.name][repo].has_key?('organization')
|
82
|
+
|
83
|
+
puts out.join(' ')
|
84
|
+
end
|
53
85
|
end
|
54
86
|
end
|
55
87
|
end
|
@@ -59,7 +91,7 @@ end
|
|
59
91
|
module SSHKit
|
60
92
|
module Backend
|
61
93
|
class Netssh
|
62
|
-
def start_commit_check name, ip_address, options, locs, cheftacular, out={'name'=>'', 'time'=> ''}
|
94
|
+
def start_commit_check name, ip_address, options, locs, cheftacular, passwords, out={'name'=>'', 'time'=> ''}
|
63
95
|
app_loc = "#{ cheftacular['base_file_path'] }/#{ options['repository'] }/releases"
|
64
96
|
|
65
97
|
if test("[ -d #{ app_loc } ]") #true if file exists
|
@@ -68,6 +100,8 @@ module SSHKit
|
|
68
100
|
|
69
101
|
out['time'] = Time.parse(capture( :stat, out['name'], '--printf=%y' )).strftime('%Y-%m-%d %I:%M:%S %p')
|
70
102
|
end
|
103
|
+
else
|
104
|
+
return nil
|
71
105
|
end
|
72
106
|
|
73
107
|
out
|
@@ -26,16 +26,18 @@ class Cheftacular
|
|
26
26
|
end
|
27
27
|
|
28
28
|
class Action
|
29
|
-
def deploy
|
30
|
-
nodes = @config['getter'].get_true_node_objects
|
29
|
+
def deploy deployment_args={ in: :groups, limit: 6, wait: 5 }
|
30
|
+
nodes = @config['getter'].get_true_node_objects(false) #when this is run in scaling we'll need to make sure we deploy to new nodes
|
31
31
|
|
32
32
|
nodes = @config['parser'].exclude_nodes( nodes, [{ if: "role[#{ @options['negative_role'] }]" }]) if @options['negative_role']
|
33
33
|
|
34
34
|
#this must always precede on () calls so they have the instance variables they need
|
35
35
|
options, locs, ridley, logs_bag_hash, pass_bag_hash, bundle_command, cheftacular, passwords = @config['helper'].set_local_instance_vars
|
36
36
|
|
37
|
+
deployment_args = { in: :groups, limit: 10, wait: 5 } if @options['env'] == 'production'
|
38
|
+
|
37
39
|
#on is namespaced to SSHKit::Backend::Netssh.on
|
38
|
-
on ( nodes.map { |n| @config['cheftacular']['deploy_user'] + "@" + n.public_ipaddress } ),
|
40
|
+
on ( nodes.map { |n| @config['cheftacular']['deploy_user'] + "@" + n.public_ipaddress } ), deployment_args do |host|
|
39
41
|
n = get_node_from_address(nodes, host.hostname)
|
40
42
|
|
41
43
|
puts("Beginning chef client run for #{ n.name } (#{ n.public_ipaddress }) on role #{ options['role'] }") unless options['quiet']
|
data/lib/cheftacular/auditor.rb
CHANGED
@@ -40,10 +40,11 @@ class Cheftacular
|
|
40
40
|
ret_hash
|
41
41
|
end
|
42
42
|
|
43
|
-
def compile_audit_hash_entry_as_array audit_hash, entry_number=0, ret_array=[]
|
43
|
+
def compile_audit_hash_entry_as_array audit_hash, entry_number=0, ret_array=[], directory_content=''
|
44
|
+
directory_content = " (#{ audit_hash['directory'] })" if audit_hash.has_key?('directory')
|
45
|
+
|
44
46
|
ret_array << "#{ (entry_number.to_s + '. ') unless entry_number == 0 }#{ audit_hash['command'] }"
|
45
|
-
ret_array << " Hostname: #{ audit_hash['hostname'] }"
|
46
|
-
ret_array << " Directory: #{ audit_hash['directory'] }" if audit_hash.has_key?('directory')
|
47
|
+
ret_array << " Hostname: #{ audit_hash['hostname'] }#{ directory_content }"
|
47
48
|
ret_array << " Arguments: #{ audit_hash['arguments'] }" if !audit_hash['arguments'].nil? && !audit_hash['arguments'].empty?
|
48
49
|
ret_array << " Options: #{ audit_hash['options'].to_hash }" unless audit_hash['options'].empty?
|
49
50
|
|
@@ -6,18 +6,23 @@ class Cheftacular
|
|
6
6
|
end
|
7
7
|
|
8
8
|
#public address, private address
|
9
|
-
def parse_addresses_from_server_create_hash
|
10
|
-
ap
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
9
|
+
def parse_addresses_from_server_create_hash cloud_server_hash, ret_array=[]
|
10
|
+
ap(cloud_server_hash) if @options['verbose']
|
11
|
+
|
12
|
+
ret_array = case @options['preferred_cloud']
|
13
|
+
when 'rackspace'
|
14
|
+
[cloud_server_hash['ipv4_address'], cloud_server_hash['addresses']['private'][0]['addr']]
|
15
|
+
when 'digitalocean'
|
16
|
+
[
|
17
|
+
cloud_server_hash['networks']['v4'].select { |hash| hash['type'] == 'public' }.first['ip_address'],
|
18
|
+
cloud_server_hash['networks']['v4'].select { |hash| hash['type'] == 'private' }.first['ip_address']
|
19
|
+
]
|
20
|
+
else raise "CRITICAL! Encountered unsupported preferred cloud #{ @options['preferred_cloud'] }"
|
21
|
+
end
|
22
|
+
|
23
|
+
raise "CRITICAL! Unable to capture addresses for the server!" if ret_array[0].nil? || ret_array[1].nil?
|
24
|
+
|
25
|
+
ret_array
|
21
26
|
end
|
22
27
|
|
23
28
|
def parse_server_root_password_from_server_create_hash server_hash, real_node_name
|
@@ -189,6 +189,26 @@ class Cheftacular
|
|
189
189
|
File.read(File.expand_path("#{ @config['locs']['root'] }/Gemfile"))[/#{ gem_name }.*([\d\.]+)/][/([\d\.]+)/]
|
190
190
|
end
|
191
191
|
|
192
|
+
def scrub_from_known_hosts target
|
193
|
+
puts "Clearing #{ target } from known_hosts file."
|
194
|
+
case CONFIG['host_os']
|
195
|
+
when /mswin|windows/i
|
196
|
+
puts "#{ __method__ } does not support this operating system at this time"
|
197
|
+
when /linux|arch/i
|
198
|
+
puts "#{ __method__ } does not support this operating system at this time"
|
199
|
+
when /sunos|solaris/i
|
200
|
+
puts "#{ __method__ } does not support this operating system at this time"
|
201
|
+
when /darwin/i
|
202
|
+
#Removes the entire line containing the string
|
203
|
+
`sed -i '' "s/#{ target }.*//g" ~/.ssh/known_hosts`
|
204
|
+
|
205
|
+
#remove empty lines
|
206
|
+
`sed -i '' "/^$/d" ~/.ssh/known_hosts`
|
207
|
+
else
|
208
|
+
puts "#{ __method__ } does not support this operating system at this time"
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
192
212
|
private
|
193
213
|
def current_file_path file_name, use_timestamp=true
|
194
214
|
File.join( @config['locs']['app-root'], 'tmp', @config['helper'].declassify, ( use_timestamp ? "#{ Time.now.strftime("%Y%m%d") }-#{ file_name }" : file_name ))
|
data/lib/cheftacular/getter.rb
CHANGED
@@ -10,7 +10,7 @@ class Cheftacular
|
|
10
10
|
end
|
11
11
|
|
12
12
|
#[TODO] if ridley changes its parsing strategy
|
13
|
-
def get_true_node_objects get_all_nodes=false
|
13
|
+
def get_true_node_objects get_all_nodes=false
|
14
14
|
nodes, all_nodes, names, iter_arr, file_cache_nodes, h = [],[],[],[],[],{}
|
15
15
|
|
16
16
|
@config['chef_nodes'] = @config['ridley'].node.all
|
data/lib/cheftacular/helper.rb
CHANGED
@@ -126,16 +126,6 @@ class Cheftacular
|
|
126
126
|
@config['dummy_sshkit'].set_log_loc_and_timestamp @config['locs']
|
127
127
|
end
|
128
128
|
|
129
|
-
def knife_bootstrap_command
|
130
|
-
address = @options['address']
|
131
|
-
user = @config['cheftacular']['deploy_user']
|
132
|
-
password = @config['server_passwords'][@options['address']]
|
133
|
-
nodename = @options['node_name']
|
134
|
-
chef_ver = @config['cheftacular']['chef_version'].to_i >= 12 ? '12.4.0' : '11.16.4'
|
135
|
-
|
136
|
-
"knife bootstrap #{ address } -x #{ user } -P #{ password } -N #{ nodename } --sudo --use-sudo-password --bootstrap-version #{ chef_ver }"
|
137
|
-
end
|
138
|
-
|
139
129
|
#the documentation hashes must be populated *before* this method runs for it to return anything!
|
140
130
|
def compile_documentation_lines mode, out=[]
|
141
131
|
doc_arr = case mode
|
@@ -250,24 +240,6 @@ class Cheftacular
|
|
250
240
|
master_hash
|
251
241
|
end
|
252
242
|
|
253
|
-
def install_rvm_sh_file out=[]
|
254
|
-
puts("Starting rvm.sh installation...") unless @options['quiet']
|
255
|
-
|
256
|
-
commands = [
|
257
|
-
"#{ @config['helper'].sudo(@options['address']) } mv /home/deploy/rvm.sh /etc/profile.d",
|
258
|
-
"#{ @config['helper'].sudo(@options['address']) } chmod 755 /etc/profile.d/rvm.sh",
|
259
|
-
"#{ @config['helper'].sudo(@options['address']) } chown root:root /etc/profile.d/rvm.sh"
|
260
|
-
]
|
261
|
-
|
262
|
-
out << `scp -oStrictHostKeyChecking=no #{ @config['locs']['cheftacular-lib-files'] }/rvm.sh #{ @config['cheftacular']['deploy_user'] }@#{ @options['address'] }:/home/#{ @config['cheftacular']['deploy_user'] }`
|
263
|
-
|
264
|
-
commands.each do |command|
|
265
|
-
out << `ssh -t -oStrictHostKeyChecking=no #{ @config['cheftacular']['deploy_user'] }@#{ @options['address'] } "#{ command }"`
|
266
|
-
end
|
267
|
-
|
268
|
-
puts("Completed rvm.sh installation into /etc/profile.d/rvm.sh") unless @options['quiet']
|
269
|
-
end
|
270
|
-
|
271
243
|
def send_log_bag_hash_slack_notification logs_bag_hash, method, on_failing_exit_status_message=''
|
272
244
|
if @config['cheftacular']['slack']['webhook']
|
273
245
|
logs_bag_hash.each_pair do |key, hash|
|
@@ -302,6 +274,47 @@ class Cheftacular
|
|
302
274
|
@config['helper'].fetch_remote_version
|
303
275
|
end
|
304
276
|
end
|
277
|
+
|
278
|
+
def return_options_as_hash options_array, return_hash={}
|
279
|
+
options_array.each do |key|
|
280
|
+
return_hash[key] = @options[key]
|
281
|
+
end
|
282
|
+
|
283
|
+
return_hash
|
284
|
+
end
|
285
|
+
|
286
|
+
def check_if_possible_repo_state repo_state_hash, git_output=''
|
287
|
+
revision_to_check = repo_state_hash.has_key?('revision') ? repo_state_hash['revision'] : nil
|
288
|
+
org_name_to_check = repo_state_hash.has_key?('deploy_organization') ? repo_state_hash['deploy_organization'] : @config['cheftacular']['TheCheftacularCookbook']['organization_name']
|
289
|
+
|
290
|
+
revision_to_check = nil if revision_to_check == '<use_default>'
|
291
|
+
|
292
|
+
@config['cheftacular']['TheCheftacularCookbook']['chef_environment_to_app_repo_branch_mappings'].each_pair do |chef_env, app_env|
|
293
|
+
revision_to_check = app_env if @options['env'] == chef_env && revision_to_check.nil?
|
294
|
+
end
|
295
|
+
|
296
|
+
git_output = `git ls-remote --heads git@github.com:#{ org_name_to_check }/#{ @options['repository'] }.git`
|
297
|
+
|
298
|
+
if git_output.blank?
|
299
|
+
puts "! The remote organization #{ org_name_to_check } does not have the repository: #{ @options['repository'] }! Please verify your repositories and try again"
|
300
|
+
|
301
|
+
exit
|
302
|
+
elsif !git_output.include?(revision_to_check)
|
303
|
+
puts "! The remote organization #{ org_name_to_check } does not have a revision / branch #{ revision_to_check } for repository: #{ @options['repository'] } !"
|
304
|
+
|
305
|
+
sorted_heads = git_output.scan(/refs\/heads\/(.*)/).flatten.uniq.sort_by { |head| compare_strings(revision_to_check, head)}
|
306
|
+
|
307
|
+
puts "The closest matches for #{ revision_to_check } are:"
|
308
|
+
puts " #{ sorted_heads.at(0) }"
|
309
|
+
puts " #{ sorted_heads.at(1) }"
|
310
|
+
puts " #{ sorted_heads.at(2) }"
|
311
|
+
puts " #{ sorted_heads.at(3) }\n"
|
312
|
+
|
313
|
+
puts "Please verify the correct revision / branch and run this command again."
|
314
|
+
|
315
|
+
exit
|
316
|
+
end
|
317
|
+
end
|
305
318
|
end
|
306
319
|
end
|
307
320
|
|
@@ -168,7 +168,7 @@ class Cheftacular
|
|
168
168
|
end
|
169
169
|
|
170
170
|
# client-list
|
171
|
-
opts.on('-W', '--with-priv', "On
|
171
|
+
opts.on('-W', '--with-priv', "On cft client_list this will show each server's private addresses") do
|
172
172
|
@options['with_private'] = true
|
173
173
|
end
|
174
174
|
|
@@ -243,7 +243,8 @@ class Cheftacular
|
|
243
243
|
end
|
244
244
|
|
245
245
|
def initialize_queues
|
246
|
-
@config['slack_queue']
|
246
|
+
@config['slack_queue'] ||= []
|
247
|
+
@config['server_creation_queue'] ||= []
|
247
248
|
end
|
248
249
|
|
249
250
|
def initialize_yaml_configuration
|
@@ -319,6 +320,7 @@ class Cheftacular
|
|
319
320
|
locs['chef-log'] = File.expand_path("#{ locs['root']}/log") unless locs['chef-log']
|
320
321
|
locs['app-tmp'] = File.expand_path("#{ locs['app-root']}/tmp")
|
321
322
|
locs['examples'] = File.expand_path("../../../examples", __FILE__)
|
323
|
+
locs['doc'] = File.expand_path("../../../doc", __FILE__)
|
322
324
|
locs['cheftacular-lib'] = File.expand_path("../..", __FILE__)
|
323
325
|
locs['cheftacular-lib-files'] = locs['cheftacular-lib'] + '/cheftacular/files'
|
324
326
|
|
@@ -472,7 +474,7 @@ class Cheftacular
|
|
472
474
|
end
|
473
475
|
|
474
476
|
def initialize_directories
|
475
|
-
['applog', 'deploy', 'failed-deploy', 'rolelog', 'rvm', 'stashedlog'].each do |sub_log_directory|
|
477
|
+
['applog', 'deploy', 'failed-deploy', 'rolelog', 'rvm', 'server-setup', 'stashedlog'].each do |sub_log_directory|
|
476
478
|
FileUtils.mkdir_p File.join( @config['locs']['chef-log'], sub_log_directory )
|
477
479
|
end
|
478
480
|
|
data/lib/cheftacular/parser.rb
CHANGED
@@ -113,6 +113,8 @@ class Cheftacular
|
|
113
113
|
repo_state_hash['deploy_organization'] = nil
|
114
114
|
end
|
115
115
|
|
116
|
+
@config['helper'].check_if_possible_repo_state(repo_state_hash) if @config['cheftacular']['git']['check_remote_for_branch_existence'] && !@config['helper'].running_on_chef_node?
|
117
|
+
|
116
118
|
@config['helper'].slack_current_deploy_arguments unless @config['cheftacular']['slack']['notify_on_deployment_args'].blank?
|
117
119
|
|
118
120
|
@config['ChefDataBag'].save_config_bag
|
@@ -131,7 +133,7 @@ class Cheftacular
|
|
131
133
|
end
|
132
134
|
|
133
135
|
#parse nodes out of array based on hash, ex: [{ unless: 'role[rails]'}, {if: 'role[worker]'}, { if: { run_list: 'role[db]', role: 'pg_data' } }]
|
134
|
-
def exclude_nodes nodes, statement_arr, only_one_node
|
136
|
+
def exclude_nodes nodes, statement_arr, only_one_node=false, ret_arr=[]
|
135
137
|
nodes.each do |n|
|
136
138
|
go_next = false
|
137
139
|
|
@@ -190,17 +192,19 @@ class Cheftacular
|
|
190
192
|
end
|
191
193
|
end
|
192
194
|
|
193
|
-
def parse_to_dns dns_string
|
194
|
-
raise "Unable to parse DNS without
|
195
|
+
def parse_to_dns dns_string, node_name=''
|
196
|
+
raise "Unable to parse DNS without node_name for #{ dns_string }!" if dns_string.include?('NODE_NAME') && node_name.blank?
|
195
197
|
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?
|
196
198
|
|
197
|
-
dns_string.gsub('NODE_NAME',
|
199
|
+
dns_string.gsub('NODE_NAME', node_name).gsub('ENV_TLD', @config[@options['env']]['config_bag_hash'][@options['sub_env']]['tld'])
|
198
200
|
end
|
199
201
|
|
200
|
-
def parse_repository_hash_from_string string
|
202
|
+
def parse_repository_hash_from_string string, checked_hashes={}
|
201
203
|
@config['getter'].get_repo_names_for_repositories.each do |repository, repository_hash|
|
202
|
-
|
204
|
+
checked_hashes[repository_hash['role']] = @config['helper'].compare_strings(string, repository)
|
203
205
|
end
|
206
|
+
|
207
|
+
return @config['cheftacular']['repositories'][ Hash[checked_hashes.sort_by { |key, val| val }].keys.first ]
|
204
208
|
end
|
205
209
|
|
206
210
|
def parse_location_alias string
|
@@ -14,5 +14,29 @@ class Cheftacular
|
|
14
14
|
|
15
15
|
@config['slack_queue'] = []
|
16
16
|
end
|
17
|
+
|
18
|
+
def sync_server_hash_into_queue server_hash, server_queue='server_creation_queue', found_result=false
|
19
|
+
@config[server_queue].select { |hash| hash['node_name'] == server_hash['node_name']}.each do |queue_hash|
|
20
|
+
@config[server_queue][ @config[server_queue].index(queue_hash) ] = queue_hash.merge(server_hash)
|
21
|
+
|
22
|
+
found_result = true
|
23
|
+
end
|
24
|
+
|
25
|
+
@config[server_queue] << server_hash unless found_result
|
26
|
+
|
27
|
+
server_hash
|
28
|
+
end
|
29
|
+
|
30
|
+
def generate_passwords_for_each_server_hash_in_queue server_queue='server_creation_queue'
|
31
|
+
@config[server_queue].each do |queue_hash|
|
32
|
+
@config[server_queue][ @config[server_queue].index(queue_hash) ] = queue_hash.merge(
|
33
|
+
{ 'deploy_password' => @config['helper'].gen_pass(@config['cheftacular']['server_pass_length']) }
|
34
|
+
)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def return_hash_from_queue queue_name, hash, hash_key
|
39
|
+
@config[queue_name].select { |queue_hash| queue_hash[hash_key] == hash[hash_key] }.first
|
40
|
+
end
|
17
41
|
end
|
18
42
|
end
|
@@ -49,7 +49,7 @@ class Cheftacular
|
|
49
49
|
old_role, old_env, backup_env = @options['role'], @options['env'], @config['cheftacular']['backup_config']['global_backup_environ']
|
50
50
|
|
51
51
|
if backup_env != @options['env']
|
52
|
-
@config['initializer'].initialize_data_bags_for_environment(backup_env, false, ['addresses', 'server_passwords'])
|
52
|
+
@config['initializer'].initialize_data_bags_for_environment(backup_env, false, ['addresses', 'server_passwords', 'logs'])
|
53
53
|
@config['initializer'].initialize_passwords backup_env
|
54
54
|
end
|
55
55
|
|
@@ -57,7 +57,7 @@ class Cheftacular
|
|
57
57
|
@options['env'] = backup_env
|
58
58
|
|
59
59
|
puts "Deploying to backup master to force refresh of the ssh keys..."
|
60
|
-
|
60
|
+
@config['action'].deploy
|
61
61
|
|
62
62
|
@options['role'] = old_role
|
63
63
|
@options['env'] = old_env
|