cheftacular 2.8.0 → 2.9.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 +92 -70
- data/lib/cheftacular/actions/check.rb +3 -2
- data/lib/cheftacular/actions/console.rb +8 -2
- data/lib/cheftacular/actions/db_console.rb +28 -4
- data/lib/cheftacular/actions/deploy.rb +6 -8
- data/lib/cheftacular/actions/log.rb +7 -2
- data/lib/cheftacular/actions/migrate.rb +16 -5
- data/lib/cheftacular/actions/run.rb +10 -3
- data/lib/cheftacular/actions/scale.rb +4 -1
- data/lib/cheftacular/actions/tail.rb +8 -3
- data/lib/cheftacular/cheftacular.rb +1 -1
- data/lib/cheftacular/cloud_provider.rb +5 -1
- data/lib/cheftacular/dns.rb +1 -1
- data/lib/cheftacular/error.rb +2 -2
- data/lib/cheftacular/file_system.rb +50 -0
- data/lib/cheftacular/getter.rb +1 -1
- data/lib/cheftacular/helper.rb +34 -5
- data/lib/cheftacular/initializer.rb +15 -25
- data/lib/cheftacular/parser.rb +2 -0
- data/lib/cheftacular/stateless_actions/add_ssh_key_to_bag.rb +4 -1
- data/lib/cheftacular/stateless_actions/arguments.rb +8 -3
- data/lib/cheftacular/stateless_actions/backups.rb +5 -2
- data/lib/cheftacular/stateless_actions/bootstrappers/ubuntu_bootstrap.rb +8 -5
- data/lib/cheftacular/stateless_actions/check_cheftacular_yml_keys.rb +15 -1
- data/lib/cheftacular/stateless_actions/chef_bootstrap.rb +9 -2
- data/lib/cheftacular/stateless_actions/chef_server.rb +5 -2
- data/lib/cheftacular/stateless_actions/cheftacular_config.rb +26 -4
- data/lib/cheftacular/stateless_actions/cheftacular_yml_help.rb +31 -0
- data/lib/cheftacular/stateless_actions/clean_cookbooks.rb +6 -37
- data/lib/cheftacular/stateless_actions/clear_caches.rb +9 -2
- data/lib/cheftacular/stateless_actions/client_list.rb +5 -2
- data/lib/cheftacular/stateless_actions/cloud.rb +4 -1
- data/lib/cheftacular/stateless_actions/cloud_bootstrap.rb +4 -1
- data/lib/cheftacular/stateless_actions/compile_audit_log.rb +4 -1
- data/lib/cheftacular/stateless_actions/compile_readme.rb +10 -1
- data/lib/cheftacular/stateless_actions/create_git_key.rb +4 -1
- data/lib/cheftacular/stateless_actions/disk_report.rb +5 -2
- data/lib/cheftacular/stateless_actions/environment.rb +5 -2
- data/lib/cheftacular/stateless_actions/file.rb +5 -2
- data/lib/cheftacular/stateless_actions/fix_known_hosts.rb +5 -2
- data/lib/cheftacular/stateless_actions/full_bootstrap.rb +10 -2
- data/lib/cheftacular/stateless_actions/get_active_ssh_connections.rb +3 -2
- data/lib/cheftacular/stateless_actions/get_haproxy_log.rb +5 -2
- data/lib/cheftacular/stateless_actions/get_log_from_bag.rb +5 -2
- data/lib/cheftacular/stateless_actions/get_pg_pass.rb +5 -2
- data/lib/cheftacular/stateless_actions/get_shorewall_allowed_connections.rb +2 -1
- data/lib/cheftacular/stateless_actions/help.rb +28 -16
- data/lib/cheftacular/stateless_actions/initialize_cheftacular_yml.rb +4 -1
- data/lib/cheftacular/stateless_actions/initialize_data_bag_contents.rb +4 -1
- data/lib/cheftacular/stateless_actions/knife_upload.rb +4 -1
- data/lib/cheftacular/stateless_actions/list_toggleable_roles.rb +5 -2
- data/lib/cheftacular/stateless_actions/location_aliases.rb +5 -2
- data/lib/cheftacular/stateless_actions/pass.rb +5 -2
- data/lib/cheftacular/stateless_actions/reinitialize.rb +4 -1
- data/lib/cheftacular/stateless_actions/remove_client.rb +9 -2
- data/lib/cheftacular/stateless_actions/replication_status.rb +4 -1
- data/lib/cheftacular/stateless_actions/reset_bag.rb +4 -1
- data/lib/cheftacular/stateless_actions/restart_swap.rb +4 -1
- data/lib/cheftacular/stateless_actions/role_toggle.rb +7 -4
- data/lib/cheftacular/stateless_actions/rvm.rb +4 -1
- data/lib/cheftacular/stateless_actions/server_update.rb +5 -2
- data/lib/cheftacular/stateless_actions/service.rb +4 -1
- data/lib/cheftacular/stateless_actions/slack.rb +4 -1
- data/lib/cheftacular/stateless_actions/test_env.rb +4 -1
- data/lib/cheftacular/stateless_actions/update_chef_client.rb +2 -1
- data/lib/cheftacular/stateless_actions/update_cloudflare_dns_from_cloud.rb +4 -1
- data/lib/cheftacular/stateless_actions/update_split_branches.rb +4 -1
- data/lib/cheftacular/stateless_actions/update_thecheftacularcookbook.rb +38 -0
- data/lib/cheftacular/stateless_actions/update_tld.rb +4 -1
- data/lib/cheftacular/stateless_actions/upload_nodes.rb +6 -3
- data/lib/cheftacular/stateless_actions/upload_roles.rb +4 -1
- data/lib/cheftacular/version.rb +1 -1
- data/lib/cloud_interactor/authentication.rb +3 -4
- data/lib/cloud_interactor/flavor.rb +7 -2
- data/lib/cloud_interactor/helpers.rb +5 -1
- data/lib/cloud_interactor/server/create.rb +7 -2
- data/lib/sshkit/actions/start_task.rb +9 -1
- metadata +6 -7
- data/bin/client-list +0 -4
- data/lib/cheftacular/stateless_actions/clean_sensu_plugins.rb +0 -19
|
@@ -2,11 +2,14 @@
|
|
|
2
2
|
class Cheftacular
|
|
3
3
|
class StatelessActionDocumentation
|
|
4
4
|
def list_toggleable_roles
|
|
5
|
-
@config['documentation']['stateless_action']
|
|
5
|
+
@config['documentation']['stateless_action'][__method__] ||= {}
|
|
6
|
+
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
|
6
7
|
"`cft list_toggleable_roles NODE_NAME` This command will allow you to see all toggleable roles for a node"
|
|
7
8
|
]
|
|
8
9
|
|
|
9
|
-
@config['documentation']['
|
|
10
|
+
@config['documentation']['stateless_action'][__method__]['short_description'] = 'Lists toggleable roles for a node'
|
|
11
|
+
|
|
12
|
+
@config['documentation']['application'][__method__] = @config['documentation']['stateless_action'][__method__]
|
|
10
13
|
end
|
|
11
14
|
end
|
|
12
15
|
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
class Cheftacular
|
|
2
2
|
class StatelessActionDocumentation
|
|
3
3
|
def location_aliases
|
|
4
|
-
@config['documentation']['stateless_action']
|
|
4
|
+
@config['documentation']['stateless_action'][__method__] ||= {}
|
|
5
|
+
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
|
5
6
|
"`cft location_aliases` will list all location aliases listed in your cheftacular.yml. These aliases can be used " +
|
|
6
7
|
"in the `cft file` command."
|
|
7
8
|
]
|
|
8
9
|
|
|
9
|
-
@config['documentation']['
|
|
10
|
+
@config['documentation']['stateless_action'][__method__]['short_description'] = 'Checks your location aliases that can be used with the cft file command'
|
|
11
|
+
|
|
12
|
+
@config['documentation']['application'][__method__] = @config['documentation']['stateless_action'][__method__]
|
|
10
13
|
end
|
|
11
14
|
end
|
|
12
15
|
|
|
@@ -2,12 +2,15 @@
|
|
|
2
2
|
class Cheftacular
|
|
3
3
|
class StatelessActionDocumentation
|
|
4
4
|
def pass
|
|
5
|
-
@config['documentation']['stateless_action']
|
|
5
|
+
@config['documentation']['stateless_action'][__method__] ||= {}
|
|
6
|
+
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
|
6
7
|
"`cft pass NODE_NAME` will drop the server's sudo password into your clipboard. " +
|
|
7
8
|
"Useful for when you need to ssh into the server itself and try advanced linux commands"
|
|
8
9
|
]
|
|
9
10
|
|
|
10
|
-
@config['documentation']['
|
|
11
|
+
@config['documentation']['stateless_action'][__method__]['short_description'] = 'Retrieves the password for a node regardless of environment'
|
|
12
|
+
|
|
13
|
+
@config['documentation']['application'][__method__] = @config['documentation']['stateless_action'][__method__]
|
|
11
14
|
end
|
|
12
15
|
end
|
|
13
16
|
|
|
@@ -2,10 +2,13 @@
|
|
|
2
2
|
class Cheftacular
|
|
3
3
|
class StatelessActionDocumentation
|
|
4
4
|
def reinitialize
|
|
5
|
-
@config['documentation']['
|
|
5
|
+
@config['documentation']['stateless_action'][__method__] ||= {}
|
|
6
|
+
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
|
6
7
|
"`cft reinitialize IP_ADDRESS NODE_NAME` will reconnect a server previously managed by chef to a new chef server. " +
|
|
7
8
|
"The node name MUST MATCH THE NODE'S ORIGINAL NODE NAME for the roles to be setup correctly."
|
|
8
9
|
]
|
|
10
|
+
|
|
11
|
+
@config['documentation']['stateless_action'][__method__]['short_description'] = 'Attempts to connect a node to a new chef server'
|
|
9
12
|
end
|
|
10
13
|
end
|
|
11
14
|
|
|
@@ -2,16 +2,21 @@
|
|
|
2
2
|
class Cheftacular
|
|
3
3
|
class StatelessActionDocumentation
|
|
4
4
|
def remove_client
|
|
5
|
-
@config['documentation']['stateless_action']
|
|
5
|
+
@config['documentation']['stateless_action'][__method__] ||= {}
|
|
6
|
+
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
|
6
7
|
"`cft remove_client NODE_NAME [destroy]` removes a client (and its node data) from the chef-server. " +
|
|
7
8
|
"It also removes its dns records from the cloud service (if possible). " +
|
|
8
9
|
"This should not be done lightly as you will have to wipe the server and trigger another chef-client " +
|
|
9
10
|
"run to get it to register again. Alternatively, you can run `cft reinitialize IP_ADDRESS NODE_NAME as well.",
|
|
10
11
|
|
|
11
12
|
[
|
|
12
|
-
" 1. `destroy` deletes the server as well as removing it from the chef environment."
|
|
13
|
+
" 1. `destroy` deletes the server as well as removing it from the chef environment.",
|
|
14
|
+
|
|
15
|
+
" 2. This command is aliased to `cft remove_node`"
|
|
13
16
|
]
|
|
14
17
|
]
|
|
18
|
+
|
|
19
|
+
@config['documentation']['stateless_action'][__method__]['short_description'] = 'Removes a node from the chef server'
|
|
15
20
|
end
|
|
16
21
|
end
|
|
17
22
|
|
|
@@ -67,5 +72,7 @@ class Cheftacular
|
|
|
67
72
|
|
|
68
73
|
puts(`client-list`) if @options['verbose']
|
|
69
74
|
end
|
|
75
|
+
|
|
76
|
+
alias_method :remove_node, :remove_client
|
|
70
77
|
end
|
|
71
78
|
end
|
|
@@ -2,10 +2,13 @@
|
|
|
2
2
|
class Cheftacular
|
|
3
3
|
class StatelessActionDocumentation
|
|
4
4
|
def replication_status
|
|
5
|
-
@config['documentation']['stateless_action']
|
|
5
|
+
@config['documentation']['stateless_action'][__method__] ||= {}
|
|
6
|
+
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
|
6
7
|
"`cft replication_status` will check the status of the database master and slaves in every environment. " +
|
|
7
8
|
"Also lists how far behind the slaves are from the master in milliseconds."
|
|
8
9
|
]
|
|
10
|
+
|
|
11
|
+
@config['documentation']['stateless_action'][__method__]['short_description'] = 'Checks the replication status for the current environment (postgres only)'
|
|
9
12
|
end
|
|
10
13
|
end
|
|
11
14
|
|
|
@@ -2,10 +2,13 @@
|
|
|
2
2
|
class Cheftacular
|
|
3
3
|
class StatelessActionDocumentation
|
|
4
4
|
def reset_bag
|
|
5
|
-
@config['documentation']['stateless_action']
|
|
5
|
+
@config['documentation']['stateless_action'][__method__] ||= {}
|
|
6
|
+
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
|
6
7
|
"`cft reset_bag BAG_NAME` this command allows you to reset a data bag item to an empty state. " +
|
|
7
8
|
"Run this on full data bags to clear them out. "
|
|
8
9
|
]
|
|
10
|
+
|
|
11
|
+
@config['documentation']['stateless_action'][__method__]['short_description'] = 'Resets certain data bags to their initial state'
|
|
9
12
|
end
|
|
10
13
|
end
|
|
11
14
|
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
class Cheftacular
|
|
2
2
|
class StatelessActionDocumentation
|
|
3
3
|
def restart_swap
|
|
4
|
-
@config['documentation']['stateless_action']
|
|
4
|
+
@config['documentation']['stateless_action'][__method__] ||= {}
|
|
5
|
+
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
|
5
6
|
"`cft restart_swap` will restart the swap on every server that doesn't have swap currently on. " +
|
|
6
7
|
"Useful if you notice servers with no swap activated from `cft disk_report`",
|
|
7
8
|
|
|
@@ -10,6 +11,8 @@ class Cheftacular
|
|
|
10
11
|
"the server was rebooted and this command fixes that."
|
|
11
12
|
]
|
|
12
13
|
]
|
|
14
|
+
|
|
15
|
+
@config['documentation']['stateless_action'][__method__]['short_description'] = 'Restarts the swap on all servers'
|
|
13
16
|
end
|
|
14
17
|
end
|
|
15
18
|
|
|
@@ -6,7 +6,8 @@ class Cheftacular
|
|
|
6
6
|
@config['cheftacular']['role_toggling'] ||= {}
|
|
7
7
|
@config['cheftacular']['role_toggling']['deactivated_role_suffix'] ||= '_deactivate'
|
|
8
8
|
|
|
9
|
-
@config['documentation']['stateless_action']
|
|
9
|
+
@config['documentation']['stateless_action'][__method__] ||= {}
|
|
10
|
+
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
|
10
11
|
"`cft role_toggle NODE_NAME ROLE_NAME activate|deactivate` This command will allow you to **toggle** roles on nodes without using `cft upload_nodes`",
|
|
11
12
|
|
|
12
13
|
[
|
|
@@ -28,7 +29,9 @@ class Cheftacular
|
|
|
28
29
|
]
|
|
29
30
|
]
|
|
30
31
|
|
|
31
|
-
@config['documentation']['
|
|
32
|
+
@config['documentation']['stateless_action'][__method__]['short_description'] = 'Attempts to toggle the specified role on the specified node'
|
|
33
|
+
|
|
34
|
+
@config['documentation']['application'][__method__] = @config['documentation']['stateless_action'][__method__]
|
|
32
35
|
end
|
|
33
36
|
end
|
|
34
37
|
|
|
@@ -45,7 +48,7 @@ class Cheftacular
|
|
|
45
48
|
|
|
46
49
|
@config['initializer'].initialize_node_roles_bag_contents @options['env']
|
|
47
50
|
|
|
48
|
-
@config['filesystem'].cleanup_file_caches('current')
|
|
51
|
+
@config['filesystem'].cleanup_file_caches('current-nodes')
|
|
49
52
|
|
|
50
53
|
nodes = @config['error'].is_valid_node_name_option?
|
|
51
54
|
|
|
@@ -134,7 +137,7 @@ class Cheftacular
|
|
|
134
137
|
|
|
135
138
|
@config['ChefDataBag'].save_node_roles_bag @options['env']
|
|
136
139
|
|
|
137
|
-
@config['filesystem'].cleanup_file_caches('current')
|
|
140
|
+
@config['filesystem'].cleanup_file_caches('current-nodes')
|
|
138
141
|
|
|
139
142
|
puts "Triggering deploy to set the new role..."
|
|
140
143
|
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
class Cheftacular
|
|
3
3
|
class StatelessActionDocumentation
|
|
4
4
|
def rvm
|
|
5
|
-
@config['documentation']['stateless_action']
|
|
5
|
+
@config['documentation']['stateless_action'][__method__] ||= {}
|
|
6
|
+
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
|
6
7
|
"`cft rvm [COMMAND] [ADDITIONAL_COMMANDS]*` will run rvm commands on the remote servers. " +
|
|
7
8
|
"Output from this command for each server will go into your rvm directory under the log directory. " +
|
|
8
9
|
"Please refer to [the rvm help page](https://rvm.io/rvm) for more information on rvm commands.",
|
|
@@ -31,6 +32,8 @@ class Cheftacular
|
|
|
31
32
|
"It will also check and attempt to upgrade pre 1.25 installations of RVM to 1.26+ (which requires a GPG key)."
|
|
32
33
|
]
|
|
33
34
|
]
|
|
35
|
+
|
|
36
|
+
@config['documentation']['stateless_action'][__method__]['short_description'] = 'Useful wrapper command for various rvm commands'
|
|
34
37
|
end
|
|
35
38
|
end
|
|
36
39
|
|
|
@@ -2,15 +2,18 @@
|
|
|
2
2
|
class Cheftacular
|
|
3
3
|
class StatelessActionDocumentation
|
|
4
4
|
def server_update
|
|
5
|
-
@config['documentation']['stateless_action']
|
|
5
|
+
@config['documentation']['stateless_action'][__method__] ||= {}
|
|
6
|
+
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
|
6
7
|
"`cft server_update [restart]` allows you to force update all nodes' packages for a specific environment. " +
|
|
7
8
|
"This should be done with caution as this *might* break something.",
|
|
8
9
|
|
|
9
10
|
[
|
|
10
|
-
" 1. `cft
|
|
11
|
+
" 1. `cft server_update restart` will prompt to ask if you also want to restart all servers in a rolling restart. " +
|
|
11
12
|
"This should be done with extreme caution and only in a worst-case scenario."
|
|
12
13
|
]
|
|
13
14
|
]
|
|
15
|
+
|
|
16
|
+
@config['documentation']['stateless_action'][__method__]['short_description'] = 'Attempts to update all servers for an env to their latest packages'
|
|
14
17
|
end
|
|
15
18
|
end
|
|
16
19
|
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
class Cheftacular
|
|
3
3
|
class StatelessActionDocumentation
|
|
4
4
|
def service
|
|
5
|
-
@config['documentation']['stateless_action']
|
|
5
|
+
@config['documentation']['stateless_action'][__method__] ||= {}
|
|
6
|
+
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
|
6
7
|
"`cft service [COMMAND] [SERVICE]` will run service commands on remote servers. " +
|
|
7
8
|
"This command only runs on the first server it comes across. Specify others with -n NODE_NAME.",
|
|
8
9
|
|
|
@@ -15,6 +16,8 @@ class Cheftacular
|
|
|
15
16
|
"service if it has a .conf file on the remote server in the /etc/init directory."
|
|
16
17
|
]
|
|
17
18
|
]
|
|
19
|
+
|
|
20
|
+
@config['documentation']['stateless_action'][__method__]['short_description'] = 'Allows you to interact with a service running on a server'
|
|
18
21
|
end
|
|
19
22
|
end
|
|
20
23
|
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
class Cheftacular
|
|
2
2
|
class StatelessActionDocumentation
|
|
3
3
|
def slack
|
|
4
|
-
@config['documentation']['stateless_action']
|
|
4
|
+
@config['documentation']['stateless_action'][__method__] ||= {}
|
|
5
|
+
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
|
5
6
|
"`cft slack \"MESSAGE\" [CHANNEL]` will attempt to post the message to the webhook set in your cheftacular.yml. " +
|
|
6
7
|
"Slack posts to your default channel by default but if the CHANNEL argument is supplied the message will post there.",
|
|
7
8
|
|
|
@@ -12,6 +13,8 @@ class Cheftacular
|
|
|
12
13
|
" 2. Remember, if you have auditing turned on in your cheftacular.yml, you can track who sends what to slack."
|
|
13
14
|
]
|
|
14
15
|
]
|
|
16
|
+
|
|
17
|
+
@config['documentation']['stateless_action'][__method__]['short_description'] = 'Sends slack messages'
|
|
15
18
|
end
|
|
16
19
|
end
|
|
17
20
|
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
class Cheftacular
|
|
3
3
|
class StatelessActionDocumentation
|
|
4
4
|
def test_env
|
|
5
|
-
@config['documentation']['stateless_action']
|
|
5
|
+
@config['documentation']['stateless_action'][__method__] ||= {}
|
|
6
|
+
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
|
6
7
|
"`cft test_env [TARGET_ENV] boot|destroy` will create (or destroy) the test nodes for a particular environment " +
|
|
7
8
|
"(defaults to staging, prod split-envs can be set with `-p`). Please read below for how TARGET_ENV works",
|
|
8
9
|
|
|
@@ -17,6 +18,8 @@ class Cheftacular
|
|
|
17
18
|
"This is set in the environment's config data bag under the tld key"
|
|
18
19
|
]
|
|
19
20
|
]
|
|
21
|
+
|
|
22
|
+
@config['documentation']['stateless_action'][__method__]['short_description'] = 'Allows you to boot split environments'
|
|
20
23
|
end
|
|
21
24
|
end
|
|
22
25
|
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
class Cheftacular
|
|
3
3
|
class StatelessActionDocumentation
|
|
4
4
|
def update_chef_client
|
|
5
|
-
@config['documentation']['stateless_action']
|
|
5
|
+
@config['documentation']['stateless_action'][__method__] ||= {}
|
|
6
|
+
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
|
6
7
|
"[NYI]`cft update_chef_client` attempts to update the chef-client of all nodes to the latest version. " +
|
|
7
8
|
"Should be done with caution and with the chef_server's version in mind."
|
|
8
9
|
]
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
class Cheftacular
|
|
2
2
|
class StatelessActionDocumentation
|
|
3
3
|
def update_cloudflare_dns_from_cloud
|
|
4
|
-
@config['documentation']['stateless_action']
|
|
4
|
+
@config['documentation']['stateless_action'][__method__] ||= {}
|
|
5
|
+
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
|
5
6
|
"`cft update_cloudflare_dns_from_cloud [skip_update_tld]` command will force a full dns update for cloudflare. ",
|
|
6
7
|
|
|
7
8
|
[
|
|
@@ -16,6 +17,8 @@ class Cheftacular
|
|
|
16
17
|
"_before_ cloudflare is updated. Only skip if you believe your domain info on your cloud is accurate."
|
|
17
18
|
]
|
|
18
19
|
]
|
|
20
|
+
|
|
21
|
+
@config['documentation']['stateless_action'][__method__]['short_description'] = 'Forces a refresh / update of all relevant cloudflare records'
|
|
19
22
|
end
|
|
20
23
|
end
|
|
21
24
|
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
class Cheftacular
|
|
3
3
|
class StatelessActionDocumentation
|
|
4
4
|
def update_split_branches
|
|
5
|
-
@config['documentation']['stateless_action']
|
|
5
|
+
@config['documentation']['stateless_action'][__method__] ||= {}
|
|
6
|
+
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
|
6
7
|
"`cft update_split_branches` will perform a series of git commands that will merge all the " +
|
|
7
8
|
"split branches for your split_branch enabled repositories with what is currently on master and push them.",
|
|
8
9
|
|
|
@@ -18,6 +19,8 @@ class Cheftacular
|
|
|
18
19
|
"with changes to your current working directory. You must commit these changes before running this command."
|
|
19
20
|
]
|
|
20
21
|
]
|
|
22
|
+
|
|
23
|
+
@config['documentation']['stateless_action'][__method__]['short_description'] = '(Local) attempts to reset and push all your split branches in your target repo'
|
|
21
24
|
end
|
|
22
25
|
end
|
|
23
26
|
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
|
|
2
|
+
class Cheftacular
|
|
3
|
+
class StatelessActionDocumentation
|
|
4
|
+
def update_thecheftacularcookbook
|
|
5
|
+
@config['documentation']['stateless_action'][__method__] ||= {}
|
|
6
|
+
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
|
7
|
+
"`cft update_thecheftacularcookbook` allows you to update ONLY the internal chef-repo's TheCheftacularCookbook."
|
|
8
|
+
]
|
|
9
|
+
|
|
10
|
+
@config['documentation']['stateless_action'][__method__]['short_description'] = 'Useful for ONLY updating TheCheftacularCookbook'
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
class StatelessAction
|
|
15
|
+
def update_thecheftacularcookbook local_options={'interactive' => true}
|
|
16
|
+
raise "This action can only be performed if the mode is set to devops" unless @config['helper'].running_in_mode?('devops')
|
|
17
|
+
|
|
18
|
+
@config['cheftacular']['wrapper_cookbooks'].split(',').each do |wrapper_cookbook|
|
|
19
|
+
wrapper_cookbook_loc = "#{ @config['locs']['cookbooks'] }/#{ wrapper_cookbook }"
|
|
20
|
+
FileUtils.rm_rf(File.expand_path("#{ @config['locs']['berks'] }/cookbooks")) if File.exists?(File.expand_path("#{ @config['locs']['berks'] }/cookbooks"))
|
|
21
|
+
|
|
22
|
+
Dir.chdir wrapper_cookbook_loc
|
|
23
|
+
puts "Installing new cookbooks..."
|
|
24
|
+
out = `berks install`
|
|
25
|
+
puts "#{out}\nFinished fetching cookbooks, moving TheCheftacularCookbook into local chef repo"
|
|
26
|
+
|
|
27
|
+
cheftacular_cookbook = @config['filesystem'].parse_latest_berkshelf_cookbook_versions.select {|key| key.include?('TheCheftacularCookbook')}['TheCheftacularCookbook']
|
|
28
|
+
|
|
29
|
+
puts "Moving TheCheftacularCookbook (#{ cheftacular_cookbook['version'] })[#{ cheftacular_cookbook['mtime'] }] to your chef-repo!"
|
|
30
|
+
|
|
31
|
+
`rm -Rf #{ @config['locs']['cookbooks'] }/TheCheftacularCookbook` if File.exists?(File.expand_path("#{ @config['locs']['cookbooks'] }/TheCheftacularCookbook"))
|
|
32
|
+
`cp -Rf #{ @config['locs']['berks'] }/#{ cheftacular_cookbook['location'] } #{ @config['locs']['cookbooks'] }/TheCheftacularCookbook`
|
|
33
|
+
|
|
34
|
+
break
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
class Cheftacular
|
|
2
2
|
class StatelessActionDocumentation
|
|
3
3
|
def update_tld
|
|
4
|
-
@config['documentation']['stateless_action']
|
|
4
|
+
@config['documentation']['stateless_action'][__method__] ||= {}
|
|
5
|
+
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
|
5
6
|
"`cft update_tld TLD` command will force a full dns update for a tld in the preferred cloud. " +
|
|
6
7
|
"It will ensure all the subdomain entries are correct (based on the contents of the addresses data bag) " +
|
|
7
8
|
"and update them if they are not. It will also create the local subdomain for the entry as well if it " +
|
|
8
9
|
"does exist and point it to the correct private address."
|
|
9
10
|
]
|
|
11
|
+
|
|
12
|
+
@config['documentation']['stateless_action'][__method__]['short_description'] = 'Forces a full refresh of your specified dns provider'
|
|
10
13
|
end
|
|
11
14
|
end
|
|
12
15
|
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
class Cheftacular
|
|
3
3
|
class StatelessActionDocumentation
|
|
4
4
|
def upload_nodes
|
|
5
|
-
@config['documentation']['stateless_action']
|
|
5
|
+
@config['documentation']['stateless_action'][__method__] ||= {}
|
|
6
|
+
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
|
6
7
|
"`cft upload_nodes` This command will resync the chef server's nodes with the data in our chef-repo/node_roles. ",
|
|
7
8
|
|
|
8
9
|
[
|
|
@@ -20,12 +21,14 @@ class Cheftacular
|
|
|
20
21
|
" 1. Due to this, only users running this against their chef-repo need to worry about having a nodes_dir, the way it should be."
|
|
21
22
|
]
|
|
22
23
|
]
|
|
24
|
+
|
|
25
|
+
@config['documentation']['stateless_action'][__method__]['short_description'] = 'Updates all nodes based on info in your nodes_dir'
|
|
23
26
|
end
|
|
24
27
|
end
|
|
25
28
|
|
|
26
29
|
class StatelessAction
|
|
27
30
|
def upload_nodes invalidate_file_node_cache=false
|
|
28
|
-
@config['filesystem'].cleanup_file_caches('current') if invalidate_file_node_cache
|
|
31
|
+
@config['filesystem'].cleanup_file_caches('current-nodes') if invalidate_file_node_cache
|
|
29
32
|
|
|
30
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']
|
|
31
34
|
|
|
@@ -128,7 +131,7 @@ class Cheftacular
|
|
|
128
131
|
@config['ChefDataBag'].save_node_roles_bag env
|
|
129
132
|
end if !@options['force_yes'] && @config['helper'].running_in_mode?('devops')
|
|
130
133
|
|
|
131
|
-
@config['filesystem'].cleanup_file_caches('current') if invalidate_file_node_cache
|
|
134
|
+
@config['filesystem'].cleanup_file_caches('current-nodes') if invalidate_file_node_cache
|
|
132
135
|
end
|
|
133
136
|
end
|
|
134
137
|
end
|
|
@@ -2,9 +2,12 @@
|
|
|
2
2
|
class Cheftacular
|
|
3
3
|
class StatelessActionDocumentation
|
|
4
4
|
def upload_roles
|
|
5
|
-
@config['documentation']['stateless_action']
|
|
5
|
+
@config['documentation']['stateless_action'][__method__] ||= {}
|
|
6
|
+
@config['documentation']['stateless_action'][__method__]['long_description'] = [
|
|
6
7
|
"`cft upload_roles` This command will resync the chef server's roles with the data in the chef-repo/roles."
|
|
7
8
|
]
|
|
9
|
+
|
|
10
|
+
@config['documentation']['stateless_action'][__method__]['short_description'] = 'Updates all roles based on data in your roles dir'
|
|
8
11
|
end
|
|
9
12
|
end
|
|
10
13
|
|
data/lib/cheftacular/version.rb
CHANGED
|
@@ -63,10 +63,9 @@ class CloudInteractor
|
|
|
63
63
|
}
|
|
64
64
|
when 'digitalocean'
|
|
65
65
|
{
|
|
66
|
-
provider:
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
#version: :v1
|
|
66
|
+
provider: 'DigitalOcean',
|
|
67
|
+
digitalocean_token: @auth_hash['cloud_authentication'][@options['preferred_cloud']]['api_key'],
|
|
68
|
+
version: :v2
|
|
70
69
|
}
|
|
71
70
|
else raise "CloudInteractor Does not currently support #{ @options['preferred_cloud'] } at this time"
|
|
72
71
|
end
|
|
@@ -18,10 +18,15 @@ class CloudInteractor
|
|
|
18
18
|
@classes['helper'].generic_list_call IDENTITY, RESOURCE, output
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
-
def read args, output=true
|
|
21
|
+
def read args, output=true, mode='name'
|
|
22
22
|
list [], false
|
|
23
23
|
|
|
24
|
-
@
|
|
24
|
+
if @options['preferred_cloud'] =~ /digitalocean/
|
|
25
|
+
mode = 'slug'
|
|
26
|
+
args['slug'] = args['name'] if args.class == Hash
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
@classes['helper'].generic_read_parse args, IDENTITY, output, mode
|
|
25
30
|
end
|
|
26
31
|
end
|
|
27
32
|
end
|
|
@@ -62,7 +62,11 @@ class CloudInteractor
|
|
|
62
62
|
|
|
63
63
|
specific_fog_object = @classes['auth'].auth_service(resource).instance_eval(identity).get @main_obj["specific_#{ identity }"].last['id']
|
|
64
64
|
|
|
65
|
-
|
|
65
|
+
if specific_fog_object.respond_to?(:delete)
|
|
66
|
+
@main_obj["#{ identity }_destroy_request"] = specific_fog_object.delete
|
|
67
|
+
else
|
|
68
|
+
@main_obj["#{ identity }_destroy_request"] = specific_fog_object.destroy
|
|
69
|
+
end
|
|
66
70
|
|
|
67
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!"
|
|
68
72
|
end
|
|
@@ -27,9 +27,14 @@ class CloudInteractor
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
if @options['preferred_cloud'] == 'digitalocean'
|
|
30
|
-
final_create_args[:
|
|
31
|
-
final_create_args[:
|
|
30
|
+
final_create_args[:region] = @main_obj['specific_regions'].first['slug']
|
|
31
|
+
final_create_args[:ssh_keys] = [@main_obj['specific_ssh_keys'].first['id']]
|
|
32
|
+
final_create_args[:size] = @main_obj['specific_flavors'].first['slug']
|
|
33
|
+
final_create_args[:image] = @main_obj['specific_images'].first['slug']
|
|
32
34
|
final_create_args[:private_networking] = true
|
|
35
|
+
|
|
36
|
+
final_create_args.delete(:flavor_id)
|
|
37
|
+
final_create_args.delete(:image_id)
|
|
33
38
|
end
|
|
34
39
|
|
|
35
40
|
@main_obj["#{ IDENTITY }_create_request"] = JSON.parse(@classes['auth'].auth_service(RESOURCE).instance_eval(IDENTITY).create(final_create_args).to_json)
|
|
@@ -30,7 +30,15 @@ module SSHKit
|
|
|
30
30
|
puts("Nothing to migrate for #{ options['role'] }...")
|
|
31
31
|
end
|
|
32
32
|
|
|
33
|
-
[out, timestamp] #return out to send to logs_bag
|
|
33
|
+
[out, timestamp, 0] #return out to send to logs_bag
|
|
34
|
+
rescue SSHKit::Command::Failed => e
|
|
35
|
+
puts "@@@@@CRITICAL! #{ command } failed for #{ name } (#{ ip_address })! Please check your #{ log_loc }/failed-deploy for the logs!@@@@@"
|
|
36
|
+
|
|
37
|
+
puts(e.message)
|
|
38
|
+
|
|
39
|
+
::File.open("#{ log_loc }/failed-deploy/#{ name }-task-#{ timestamp }.txt", "w") { |f| f.write(e.message.scrub_pretty_text) }
|
|
40
|
+
|
|
41
|
+
[e.message, timestamp, 1]
|
|
34
42
|
end
|
|
35
43
|
end
|
|
36
44
|
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.
|
|
4
|
+
version: 2.9.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
|
+
date: 2015-11-06 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: hashie
|
|
@@ -170,14 +170,14 @@ dependencies:
|
|
|
170
170
|
requirements:
|
|
171
171
|
- - ">="
|
|
172
172
|
- !ruby/object:Gem::Version
|
|
173
|
-
version: '
|
|
173
|
+
version: '1.35'
|
|
174
174
|
type: :runtime
|
|
175
175
|
prerelease: false
|
|
176
176
|
version_requirements: !ruby/object:Gem::Requirement
|
|
177
177
|
requirements:
|
|
178
178
|
- - ">="
|
|
179
179
|
- !ruby/object:Gem::Version
|
|
180
|
-
version: '
|
|
180
|
+
version: '1.35'
|
|
181
181
|
- !ruby/object:Gem::Dependency
|
|
182
182
|
name: slack-notifier
|
|
183
183
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -212,7 +212,6 @@ email:
|
|
|
212
212
|
- louis@socialcentiv.com
|
|
213
213
|
- loualrid@gmail.com
|
|
214
214
|
executables:
|
|
215
|
-
- client-list
|
|
216
215
|
- cft
|
|
217
216
|
- cheftacular
|
|
218
217
|
- cftclr
|
|
@@ -222,7 +221,6 @@ files:
|
|
|
222
221
|
- bin/cft
|
|
223
222
|
- bin/cftclr
|
|
224
223
|
- bin/cheftacular
|
|
225
|
-
- bin/client-list
|
|
226
224
|
- lib/cheftacular.rb
|
|
227
225
|
- lib/cheftacular/README.md
|
|
228
226
|
- lib/cheftacular/action.rb
|
|
@@ -265,8 +263,8 @@ files:
|
|
|
265
263
|
- lib/cheftacular/stateless_actions/chef_bootstrap.rb
|
|
266
264
|
- lib/cheftacular/stateless_actions/chef_server.rb
|
|
267
265
|
- lib/cheftacular/stateless_actions/cheftacular_config.rb
|
|
266
|
+
- lib/cheftacular/stateless_actions/cheftacular_yml_help.rb
|
|
268
267
|
- lib/cheftacular/stateless_actions/clean_cookbooks.rb
|
|
269
|
-
- lib/cheftacular/stateless_actions/clean_sensu_plugins.rb
|
|
270
268
|
- lib/cheftacular/stateless_actions/clean_server_passwords.rb
|
|
271
269
|
- lib/cheftacular/stateless_actions/cleanup_log_files.rb
|
|
272
270
|
- lib/cheftacular/stateless_actions/clear_caches.rb
|
|
@@ -307,6 +305,7 @@ files:
|
|
|
307
305
|
- lib/cheftacular/stateless_actions/update_chef_client.rb
|
|
308
306
|
- lib/cheftacular/stateless_actions/update_cloudflare_dns_from_cloud.rb
|
|
309
307
|
- lib/cheftacular/stateless_actions/update_split_branches.rb
|
|
308
|
+
- lib/cheftacular/stateless_actions/update_thecheftacularcookbook.rb
|
|
310
309
|
- lib/cheftacular/stateless_actions/update_tld.rb
|
|
311
310
|
- lib/cheftacular/stateless_actions/upload_nodes.rb
|
|
312
311
|
- lib/cheftacular/stateless_actions/upload_roles.rb
|
data/bin/client-list
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
class Cheftacular
|
|
2
|
-
class StatelessActionDocumentation
|
|
3
|
-
def clean_sensu_plugins
|
|
4
|
-
@config['documentation']['stateless_action'] << [
|
|
5
|
-
"[NYI]`cft clean_sensu_plugins` will checkout / update the sensu community plugins github repo on your " +
|
|
6
|
-
"local machine and sync any sensu plugin files in your wrapper cookbook directory with what is in the repo."
|
|
7
|
-
]
|
|
8
|
-
end
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
class StatelessAction
|
|
12
|
-
def clean_sensu_plugins
|
|
13
|
-
raise "This method is not yet implemented"
|
|
14
|
-
raise "This action can only be performed if the mode is set to devops" unless @config['helper'].running_in_mode?('devops')
|
|
15
|
-
|
|
16
|
-
#TODO use this to keep the cookbook files directory up to date with the sensu community plugins repo
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|