cheftacular 2.14.0 → 2.14.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/cheftacular/actions/backups.rb +9 -7
- data/lib/cheftacular/actions/check.rb +2 -2
- data/lib/cheftacular/actions/db_console.rb +4 -0
- data/lib/cheftacular/actions/deploy.rb +6 -4
- data/lib/cheftacular/actions/verify.rb +5 -1
- data/lib/cheftacular/auditor.rb +19 -16
- data/lib/cheftacular/getter.rb +8 -3
- data/lib/cheftacular/helper.rb +6 -0
- data/lib/cheftacular/initializer.rb +1 -0
- data/lib/cheftacular/stateless_actions/server_update.rb +2 -2
- data/lib/cheftacular/stateless_actions/update_cookbook.rb +35 -16
- data/lib/cheftacular/stateless_actions/update_the_cheftacular_cookbook_and_knife_upload.rb +31 -0
- data/lib/cheftacular/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 827adc94d0f767ea316d7bcf827cfb10cd3fa2ee
|
4
|
+
data.tar.gz: f5cf035f7411a8a7ec542c836e28f5820581dbb7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0f5e9bc8c1f3e075fa0f084857bf6ba940b2adf3434be56f903e2f6ed3ca35aad6ea1914dbdd5011e35332cec9da7a0e6bb7b2babbe092758bef1fe316f46318
|
7
|
+
data.tar.gz: b2360f856866988ff682fa1aa4f1b223fb955bbe89604f73fb9309603de1e1796367505dc31bcbc6455943e80fd55f87c1d998df5cc77491a8c4cad23cdb50ab
|
@@ -1,6 +1,6 @@
|
|
1
1
|
|
2
2
|
class Cheftacular
|
3
|
-
class
|
3
|
+
class ActionDocumentation
|
4
4
|
def backups
|
5
5
|
@config['documentation']['action'][__method__] ||= {}
|
6
6
|
@config['documentation']['action'][__method__]['long_description'] = [
|
@@ -18,7 +18,8 @@ class Cheftacular
|
|
18
18
|
" 4. `load` will fetch the latest backup from the production primary **if it doesn't already exist on " +
|
19
19
|
"the server** and run the _backup loading command_ to load this backup into the env.",
|
20
20
|
|
21
|
-
" 5. `restore` will simply just run the _backup loading command_ to load the latest backup onto the server."
|
21
|
+
" 5. `restore` will simply just run the _backup loading command_ to load the latest backup onto the server. This " +
|
22
|
+
"command is REPOSITORY SENSITIVE, to restore a repo other than default, you must use the -R REPOSITORY flag.",
|
22
23
|
|
23
24
|
" 6. `status` will display the current state of the backups",
|
24
25
|
|
@@ -30,7 +31,7 @@ class Cheftacular
|
|
30
31
|
end
|
31
32
|
end
|
32
33
|
|
33
|
-
class
|
34
|
+
class Action
|
34
35
|
def backups command=''
|
35
36
|
command = ARGV[1] if command.blank?
|
36
37
|
|
@@ -74,8 +75,9 @@ class Cheftacular
|
|
74
75
|
end
|
75
76
|
|
76
77
|
target_db_primary, nodes = @config['getter'].get_db_primary_node_and_nodes
|
77
|
-
applications_as_string = @config['getter'].get_repo_names_for_repositories({ database: @config['getter'].get_current_database }).keys.join(',')
|
78
|
+
applications_as_string = @config['getter'].get_repo_names_for_repositories([{ database: @config['getter'].get_current_database }, { restore_backup_file_name: 'NOT NIL' , ignore_val: true}]).keys.join(',')
|
78
79
|
env_db_pass = @config[@options['env']]['chef_passwords_bag_hash']["#{ backup_mode }_pass"]
|
80
|
+
env_db_user = @config['getter'].get_current_repo_config['application_database_user']
|
79
81
|
env_db_mode = @config['getter'].get_current_database
|
80
82
|
|
81
83
|
options, locs, ridley, logs_bag_hash, pass_bag_hash, bundle_command, cheftacular, passwords = @config['helper'].set_local_instance_vars
|
@@ -87,7 +89,7 @@ class Cheftacular
|
|
87
89
|
|
88
90
|
puts("Beginning db_backup_run for #{ n.name } (#{ n.public_ipaddress }) for env #{ options['env'] }") unless options['quiet']
|
89
91
|
|
90
|
-
start_db_backup_restore( n.name, n.public_ipaddress, options, locs, cheftacular, passwords, applications_as_string, env_db_pass, ruby_command, env_db_mode )
|
92
|
+
start_db_backup_restore( n.name, n.public_ipaddress, options, locs, cheftacular, passwords, applications_as_string, env_db_pass, ruby_command, env_db_mode, env_db_user )
|
91
93
|
end
|
92
94
|
end
|
93
95
|
|
@@ -235,7 +237,7 @@ module SSHKit
|
|
235
237
|
puts "Finished transferring #{ full_backup_path } to #{ name }(#{ ip_address })..."
|
236
238
|
end
|
237
239
|
|
238
|
-
def start_db_backup_restore name, ip_address, options, locs, cheftacular, passwords, applications_as_string, env_db_pass, ruby_command, env_db_mode, out=''
|
240
|
+
def start_db_backup_restore name, ip_address, options, locs, cheftacular, passwords, applications_as_string, env_db_pass, ruby_command, env_db_mode, env_db_user, out=''
|
239
241
|
log_loc, timestamp = set_log_loc_and_timestamp(locs)
|
240
242
|
|
241
243
|
puts "Beginning backup run on #{ name } (#{ ip_address }), this command may take a while to complete..."
|
@@ -244,7 +246,7 @@ module SSHKit
|
|
244
246
|
when 'backup_gem'
|
245
247
|
command = cheftacular['backup_config']['backup_load_command']
|
246
248
|
command = command.gsub('ENVIRONMENT', options['env']).gsub('APPLICATIONS', applications_as_string).gsub('DB_PASS', env_db_pass)
|
247
|
-
command = command.gsub('RUBY_COMMAND', ruby_command ).gsub('MODE', env_db_mode)
|
249
|
+
command = command.gsub('RUBY_COMMAND', ruby_command ).gsub('MODE', env_db_mode).gsub('DATABASE_USER', env_db_user)
|
248
250
|
|
249
251
|
out << sudo_capture( passwords[ip_address], command )
|
250
252
|
when 'raw'
|
@@ -11,7 +11,7 @@ class Cheftacular
|
|
11
11
|
|
12
12
|
" 2. If the all argument is provided, all repositories will be checked for the current environment",
|
13
13
|
|
14
|
-
" 3. If the verify argument is provided, cft will attempt to see if the servers are using the latest commits",
|
14
|
+
" 3. If the verify argument is provided, cft will attempt to see if the servers are using the latest commits. This is also aliased to `cft ch ve`",
|
15
15
|
|
16
16
|
" 4. Aliased to `cft ch`"
|
17
17
|
]
|
@@ -25,7 +25,7 @@ class Cheftacular
|
|
25
25
|
@config['filesystem'].cleanup_file_caches('current-nodes')
|
26
26
|
|
27
27
|
fetch_all_repository_data = ARGV[1] == 'all'
|
28
|
-
verify_state_is_latest = ARGV[1] == 'verify'
|
28
|
+
verify_state_is_latest = ARGV[1] == 'verify' || ARGV[1] == 've'
|
29
29
|
verify_state_is_latest = mode == 'verify' if ARGV[1] != 'verify'
|
30
30
|
|
31
31
|
nodes = @config['getter'].get_true_node_objects(fetch_all_repository_data)
|
@@ -37,6 +37,8 @@ class Cheftacular
|
|
37
37
|
|
38
38
|
start_console_postgresql(n.public_ipaddress, private_database_host_address )
|
39
39
|
end
|
40
|
+
|
41
|
+
@config['auditor'].notify_slack_on_completion("psql run completed on #{ nodes.first.name } (#{ nodes.first.public_ipaddress })\n") if @config['cheftacular']['auditing']
|
40
42
|
end
|
41
43
|
|
42
44
|
def db_console_mongodb private_database_host_address=nil
|
@@ -56,6 +58,8 @@ class Cheftacular
|
|
56
58
|
|
57
59
|
start_console_mongodb(n.public_ipaddress, private_database_host_address)
|
58
60
|
end
|
61
|
+
|
62
|
+
@config['auditor'].notify_slack_on_completion("mongo run completed on #{ nodes.first.name } (#{ nodes.first.public_ipaddress })\n") if @config['cheftacular']['auditing']
|
59
63
|
end
|
60
64
|
|
61
65
|
def db_console_mysql
|
@@ -19,9 +19,9 @@ class Cheftacular
|
|
19
19
|
|
20
20
|
" 5. The `-v|--verbose` option will cause failed deploys to output to the terminal window and to their normal log file. Useful for debugging.",
|
21
21
|
|
22
|
-
" 6. The `cft deploy check` argument will force a check run under the same environment as the initial deploy.",
|
22
|
+
" 6. The `cft deploy check` argument will force a check run under the same environment as the initial deploy. This is also aliased to `cft d ch`",
|
23
23
|
|
24
|
-
" 7. The `cft deploy verify` argument will force a check AND verify run under the same environment as the initial deploy",
|
24
|
+
" 7. The `cft deploy verify` argument will force a check AND verify run under the same environment as the initial deploy. This is also aliased to `cft d ve`",
|
25
25
|
|
26
26
|
" 8. Aliased to `cft d`"
|
27
27
|
]
|
@@ -33,8 +33,8 @@ class Cheftacular
|
|
33
33
|
|
34
34
|
class Action
|
35
35
|
def deploy deployment_args={ in: :groups, limit: 6, wait: 5 }
|
36
|
-
run_check = ARGV[1] == 'check'
|
37
|
-
run_verify = ARGV[1] == 'verify'
|
36
|
+
run_check = ARGV[1] == 'check' || ARGV[1] == 'ch'
|
37
|
+
run_verify = ARGV[1] == 'verify' || ARGV[1] == 've'
|
38
38
|
|
39
39
|
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
|
40
40
|
|
@@ -66,6 +66,8 @@ class Cheftacular
|
|
66
66
|
|
67
67
|
@config['action'].check('verify') if run_verify && !@options['run_migration_already']
|
68
68
|
|
69
|
+
@config['auditor'].notify_slack_on_completion("deploy run completed on #{ nodes.map {|n| n.name }.join(', ') }\n") if @config['cheftacular']['auditing'] && !@options['run_migration_already']
|
70
|
+
|
69
71
|
@config['action'].migrate(nodes) if @config['getter'].get_current_repo_config['database'] != 'none' && !@options['run_migration_already']
|
70
72
|
|
71
73
|
split_nodes_hash = {}
|
@@ -5,7 +5,9 @@ class Cheftacular
|
|
5
5
|
@config['documentation']['action'][__method__]['long_description'] = [
|
6
6
|
"`cft verify` Checks to see if the servers for the current state are running the latest commits. ",
|
7
7
|
[
|
8
|
-
" 1. This command is functionally the same as `cft check verify`."
|
8
|
+
" 1. This command is functionally the same as `cft check verify`.",
|
9
|
+
|
10
|
+
" 2. This command is aliased to `cft ve`"
|
9
11
|
]
|
10
12
|
]
|
11
13
|
@config['documentation']['action'][__method__]['short_description'] = "Checks the commits currently deployed to an env for your repo"
|
@@ -16,5 +18,7 @@ class Cheftacular
|
|
16
18
|
def verify
|
17
19
|
@config['action'].check('verify')
|
18
20
|
end
|
21
|
+
|
22
|
+
alias_method :ve, :verify
|
19
23
|
end
|
20
24
|
end
|
data/lib/cheftacular/auditor.rb
CHANGED
@@ -85,22 +85,25 @@ class Cheftacular
|
|
85
85
|
|
86
86
|
def aliased_command_hash
|
87
87
|
{
|
88
|
-
check:
|
89
|
-
console:
|
90
|
-
deploy:
|
91
|
-
cheftacular_config:
|
92
|
-
cheftacular_yml_help:
|
93
|
-
client_list:
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
88
|
+
check: ['ch'],
|
89
|
+
console: ['co'],
|
90
|
+
deploy: ['d'],
|
91
|
+
cheftacular_config: ['cc'],
|
92
|
+
cheftacular_yml_help: ['yml_help'],
|
93
|
+
client_list: ['cl'],
|
94
|
+
cloud_bootstrap: ['cb'],
|
95
|
+
environment: ['e'],
|
96
|
+
fix_known_hosts: ['fkh'],
|
97
|
+
knife_upload: ['ku'],
|
98
|
+
location_aliases: ['la'],
|
99
|
+
remove_client: ['rc'],
|
100
|
+
role_toggle: ['rt'],
|
101
|
+
update_cookbook: ['uc'],
|
102
|
+
update_the_cheftacular_cookbook_and_knife_upload: ['utcc', 'utccaku'],
|
103
|
+
upload_nodes: ['un'],
|
104
|
+
upload_roles: ['ur'],
|
105
|
+
verify: ['ve'],
|
106
|
+
version: ['v']
|
104
107
|
}
|
105
108
|
end
|
106
109
|
end
|
data/lib/cheftacular/getter.rb
CHANGED
@@ -161,12 +161,17 @@ class Cheftacular
|
|
161
161
|
ret
|
162
162
|
end
|
163
163
|
|
164
|
-
def get_repo_names_for_repositories restrict_to={}, ret={}
|
164
|
+
def get_repo_names_for_repositories restrict_to=[{}], ret={}
|
165
165
|
@config['cheftacular']['repositories'].each_pair do |name, repo_hash|
|
166
166
|
unless restrict_to.empty?
|
167
167
|
skip = false
|
168
|
-
restrict_to.
|
169
|
-
|
168
|
+
restrict_to.each do |restrict_hash|
|
169
|
+
restrict_hash.each_pair do |key, val|
|
170
|
+
skip = true if repo_hash[key.to_s] != val && restrict_hash.has_key?(:ignore_value)
|
171
|
+
skip = true if val == 'NOT NIL' && repo_hash[key.to_s].nil?
|
172
|
+
skip = true if val == 'NIL' && !repo_hash[key.to_s].nil?
|
173
|
+
puts "#{ name } => k:#{ key }::v:#{ val }:::#{ skip }:[#{ repo_hash[key.to_s] }]"
|
174
|
+
end
|
170
175
|
end
|
171
176
|
|
172
177
|
next if skip
|
data/lib/cheftacular/helper.rb
CHANGED
@@ -303,6 +303,12 @@ class Cheftacular
|
|
303
303
|
if git_output.blank?
|
304
304
|
puts "! The remote organization #{ org_name_to_check } does not have the repository: #{ @options['repository'] }! Please verify your repositories and try again"
|
305
305
|
|
306
|
+
exit
|
307
|
+
elsif !git_output.include?(revision_to_check) && output_mode == 'display_for_check'
|
308
|
+
puts "WARNING! The commit #{ repo_state_hash['revision'] } is NOT the latest for the branch #{ repo_state_hash['branch'] } in organization #{ repo_state_hash['deploy_organization'] }!"
|
309
|
+
|
310
|
+
puts "Please re-run your deploy again and if this continues to not work, check with your DevOps personel!"
|
311
|
+
|
306
312
|
exit
|
307
313
|
elsif !git_output.include?(revision_to_check)
|
308
314
|
puts "! The remote organization #{ org_name_to_check } does not have a revision / branch #{ revision_to_check } for repository: #{ @options['repository'] } !"
|
@@ -330,6 +330,7 @@ class Cheftacular
|
|
330
330
|
end
|
331
331
|
|
332
332
|
locs['chef-repo'] = Dir.getwd
|
333
|
+
locs['true-root'] = File.expand_path("#{ locs['chef-repo'] }/..")
|
333
334
|
locs['roles'] = File.expand_path("#{ locs['chef-repo'] }/roles")
|
334
335
|
locs['nodes'] = File.expand_path("#{ locs['chef-repo'] }/nodes_dir") #DO NOT RENAME THIS TO NODES
|
335
336
|
locs['root'] = locs['chef-repo'] unless locs['root']
|
@@ -48,7 +48,7 @@ class Cheftacular
|
|
48
48
|
|
49
49
|
log_data, timestamp = start_apt_updater( n.name, n.public_ipaddress, options, locs, passwords)
|
50
50
|
|
51
|
-
logs_bag_hash["#{ n.name }-upgrade"] = { text: log_data.scrub_pretty_text, timestamp: timestamp }
|
51
|
+
#logs_bag_hash["#{ n.name }-upgrade"] = { text: log_data.scrub_pretty_text, timestamp: timestamp }
|
52
52
|
end
|
53
53
|
|
54
54
|
on ( nodes.map { |n| @config['cheftacular']['deploy_user'] + "@" + n.public_ipaddress } ), in: :groups, limit: 5, wait: 120 do |host|
|
@@ -59,7 +59,7 @@ class Cheftacular
|
|
59
59
|
start_sys_restarter( n.name, n.public_ipaddress, options, locs, passwords)
|
60
60
|
end if @options['rolling_restart']
|
61
61
|
|
62
|
-
|
62
|
+
#@config['ChefDataBag'].save_logs_bag
|
63
63
|
end
|
64
64
|
end
|
65
65
|
end
|
@@ -4,12 +4,14 @@ class Cheftacular
|
|
4
4
|
def update_cookbook
|
5
5
|
@config['documentation']['stateless_action'][__method__] ||= {}
|
6
6
|
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
7
|
-
"`cft update_cookbook [COOKBOOK_NAME] [INSTALL_VERSION]` allows you to specifically update a single cookbook",
|
7
|
+
"`cft update_cookbook [COOKBOOK_NAME] [INSTALL_VERSION|local]` allows you to specifically update a single cookbook",
|
8
8
|
|
9
9
|
[
|
10
10
|
" 1. This command passed with no arguments will update TheCheftacularCookbook",
|
11
11
|
|
12
|
-
" 2.
|
12
|
+
" 2. If the 2nd argument is local, the command will drop a local version of the cookbook onto your chef-repo",
|
13
|
+
|
14
|
+
" 3. Aliased to `cft uc`"
|
13
15
|
]
|
14
16
|
]
|
15
17
|
|
@@ -17,6 +19,12 @@ class Cheftacular
|
|
17
19
|
end
|
18
20
|
end
|
19
21
|
|
22
|
+
class InitializationAction
|
23
|
+
def update_cookbook
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
20
28
|
class StatelessAction
|
21
29
|
def update_cookbook cookbook='TheCheftacularCookbook', version='latest'
|
22
30
|
raise "This action can only be performed if the mode is set to devops" unless @config['helper'].running_in_mode?('devops')
|
@@ -24,23 +32,34 @@ class Cheftacular
|
|
24
32
|
cookbook = ARGV[1] if ARGV[1]
|
25
33
|
version = ARGV[2] if ARGV[2]
|
26
34
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
+
if version == 'local'
|
36
|
+
if File.exists?(File.expand_path("#{ @config['locs']['true-root'] }/#{ cookbook }"))
|
37
|
+
`rm -Rf #{ @config['locs']['cookbooks'] }/#{ cookbook }` if File.exists?(File.expand_path("#{ @config['locs']['cookbooks'] }/#{ cookbook }"))
|
38
|
+
`cp -Rf #{ @config['locs']['true-root'] }/#{ cookbook } #{ @config['locs']['cookbooks'] }/#{ cookbook }`
|
39
|
+
|
40
|
+
`rm -Rf #{ @config['locs']['true-root'] }/#{ cookbook }/.git`
|
41
|
+
else
|
42
|
+
puts "You do not have #{ cookbook } under the #{ @config['locs']['true-root'] } directory!"
|
43
|
+
end
|
44
|
+
else
|
45
|
+
@config['cheftacular']['wrapper_cookbooks'].split(',').each do |wrapper_cookbook|
|
46
|
+
wrapper_cookbook_loc = "#{ @config['locs']['cookbooks'] }/#{ wrapper_cookbook }"
|
47
|
+
FileUtils.rm_rf(File.expand_path("#{ @config['locs']['berks'] }/cookbooks")) if File.exists?(File.expand_path("#{ @config['locs']['berks'] }/cookbooks"))
|
48
|
+
|
49
|
+
Dir.chdir wrapper_cookbook_loc
|
50
|
+
puts "Installing new cookbooks..."
|
51
|
+
out = `berks install`
|
52
|
+
puts "#{out}\nFinished fetching cookbooks, moving #{ cookbook } into local chef repo"
|
35
53
|
|
36
|
-
|
54
|
+
specific_cookbook = @config['filesystem'].parse_berkshelf_cookbook_versions(version).select {|key| key.include?(cookbook)}[cookbook]
|
37
55
|
|
38
|
-
|
56
|
+
puts "Moving #{ cookbook } (#{ specific_cookbook['version'] })[#{ specific_cookbook['mtime'] }] to your chef-repo!"
|
39
57
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
58
|
+
`rm -Rf #{ @config['locs']['cookbooks'] }/#{ cookbook }` if File.exists?(File.expand_path("#{ @config['locs']['cookbooks'] }/#{ cookbook }"))
|
59
|
+
`cp -Rf #{ @config['locs']['berks'] }/#{ specific_cookbook['location'] } #{ @config['locs']['cookbooks'] }/#{ cookbook }`
|
60
|
+
|
61
|
+
break
|
62
|
+
end
|
44
63
|
end
|
45
64
|
end
|
46
65
|
|
@@ -0,0 +1,31 @@
|
|
1
|
+
|
2
|
+
class Cheftacular
|
3
|
+
class StatelessActionDocumentation
|
4
|
+
def update_the_cheftacular_cookbook_and_knife_upload
|
5
|
+
@config['documentation']['stateless_action'][__method__] ||= {}
|
6
|
+
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
7
|
+
"`cft update_the_cheftacular_cookbook_and_knife_upload` update your local cheftacular cookbook with your local (out of chef-repo) cheftacular " +
|
8
|
+
"cookbook and knife_upload afterwards.",
|
9
|
+
|
10
|
+
[
|
11
|
+
" 1. This method is aliased to `cft utccaku` and `cft utcc`."
|
12
|
+
]
|
13
|
+
]
|
14
|
+
|
15
|
+
@config['documentation']['stateless_action']['utccaku']['short_description'] = 'Runs `update_cookbook` and `knife_upload` for the cheftacular cookbook'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class StatelessAction
|
20
|
+
def update_the_cheftacular_cookbook_and_knife_upload
|
21
|
+
raise "This action can only be performed if the mode is set to devops" unless @config['helper'].running_in_mode?('devops')
|
22
|
+
|
23
|
+
@config['stateless_action'].update_cookbook('TheCheftacularCookbook', 'local')
|
24
|
+
|
25
|
+
@config['stateless_action'].knife_upload
|
26
|
+
end
|
27
|
+
|
28
|
+
alias_method :utccaku, :update_the_cheftacular_cookbook_and_knife_upload
|
29
|
+
alias_method :utcc, :update_the_cheftacular_cookbook_and_knife_upload
|
30
|
+
end
|
31
|
+
end
|
data/lib/cheftacular/version.rb
CHANGED
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.14.
|
4
|
+
version: 2.14.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Louis Alridge
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hashie
|
@@ -338,6 +338,7 @@ files:
|
|
338
338
|
- lib/cheftacular/stateless_actions/update_cloudflare_dns_from_cloud.rb
|
339
339
|
- lib/cheftacular/stateless_actions/update_cookbook.rb
|
340
340
|
- lib/cheftacular/stateless_actions/update_split_branches.rb
|
341
|
+
- lib/cheftacular/stateless_actions/update_the_cheftacular_cookbook_and_knife_upload.rb
|
341
342
|
- lib/cheftacular/stateless_actions/update_tld.rb
|
342
343
|
- lib/cheftacular/stateless_actions/upload_nodes.rb
|
343
344
|
- lib/cheftacular/stateless_actions/upload_roles.rb
|