cheftacular 2.8.0 → 2.9.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|