cheftacular 2.1.2 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/lib/cheftacular/README.md +40 -28
  3. data/lib/cheftacular/{actions.rb → action.rb} +0 -0
  4. data/lib/cheftacular/actions/deploy.rb +2 -1
  5. data/lib/cheftacular/actions/migrate.rb +3 -1
  6. data/lib/cheftacular/{decryptors.rb → decryptor.rb} +0 -0
  7. data/lib/cheftacular/dns.rb +283 -0
  8. data/lib/cheftacular/{encryptors.rb → encryptor.rb} +0 -0
  9. data/lib/cheftacular/{getters.rb → getter.rb} +2 -2
  10. data/lib/cheftacular/{helpers.rb → helper.rb} +6 -14
  11. data/lib/cheftacular/{initializers.rb → initializer.rb} +3 -2
  12. data/lib/cheftacular/{parsers.rb → parser.rb} +6 -0
  13. data/lib/cheftacular/stateless_actions/arguments.rb +2 -4
  14. data/lib/cheftacular/stateless_actions/client_list.rb +6 -6
  15. data/lib/cheftacular/stateless_actions/cloud.rb +1 -1
  16. data/lib/cheftacular/stateless_actions/cloud_bootstrap.rb +8 -34
  17. data/lib/cheftacular/stateless_actions/compile_readme.rb +4 -2
  18. data/lib/cheftacular/stateless_actions/get_pg_pass.rb +0 -2
  19. data/lib/cheftacular/stateless_actions/get_shorewall_allowed_connections.rb +65 -0
  20. data/lib/cheftacular/stateless_actions/help.rb +1 -1
  21. data/lib/cheftacular/stateless_actions/initialize_data_bag_contents.rb +6 -0
  22. data/lib/cheftacular/stateless_actions/remove_client.rb +6 -20
  23. data/lib/cheftacular/stateless_actions/replication_status.rb +0 -1
  24. data/lib/cheftacular/stateless_actions/slack.rb +8 -1
  25. data/lib/cheftacular/stateless_actions/update_cloudflare.rb +16 -51
  26. data/lib/cheftacular/stateless_actions/update_tld.rb +22 -19
  27. data/lib/cheftacular/stateless_actions/upload_nodes.rb +3 -1
  28. data/lib/cheftacular/version.rb +1 -1
  29. data/lib/cloud_interactor/domain/create_record.rb +7 -5
  30. data/lib/cloud_interactor/domain/list_records.rb +3 -1
  31. data/lib/cloud_interactor/domain/update_record.rb +4 -2
  32. data/lib/cloudflare/monkeypatches.rb +24 -0
  33. metadata +12 -10
  34. data/lib/cheftacular/remote_helpers.rb +0 -30
@@ -1,67 +1,32 @@
1
1
  class Cheftacular
2
2
  class StatelessActionDocumentation
3
- def update_cloudflare
3
+ def update_cloudflare_dns_from_cloud
4
4
  @config['documentation']['stateless_action'] << [
5
- "`cft update_cloudflare` command will force a full dns update for clouflare. " +
6
- "It will ensure all the subdomain entries are correct (based on the contents of the addresses data bag) " +
7
- "and update them if they are not. It will also create the local subdomain for the entry as well if it " +
8
- "does exist and point it to the correct private address for an environment."
5
+ "`cft update_cloudflare_dns_from_cloud` command will force a full dns update for cloudflare. ",
6
+
7
+ [
8
+ " 1. It will ensure all the subdomain entries are correct (based on the contents of the addresses data bag) " +
9
+ "and update them if they are not. It will also create the local subdomain for the entry as well if it " +
10
+ "does exist and point it to the correct private address for an environment.",
11
+
12
+ " 2. This command will also ensure any dns records on your cloud are also migrated over to cloudflare as well. " +
13
+ "This also includes the reverse in the event you would like to turn off cloudflare."
14
+ ]
9
15
  ]
10
16
  end
11
17
  end
12
18
 
13
19
  class StatelessAction
14
- def update_cloudflare
20
+ def update_cloudflare_dns_from_cloud
15
21
  raise "This action can only be performed if the mode is set to devops" unless @config['helper'].running_in_mode?('devops')
16
22
 
17
- nodes = @config['getter'].get_true_node_objects(true)
18
-
19
- nodes = @config['parser'].exclude_nodes( nodes, [{ unless: { env: @options['env'] }}] )
20
-
21
- addr_data = @config['getter'].get_addresses_hash @options['env']
22
-
23
- unless @config['helper'].does_cheftacular_config_have?(['cloudflare_api_key', 'cloudflare_user_email'])
24
- puts "Critical! You tried to run #{ __method__ } but have not set a cloudflare_api_key or cloudflare_user_email! Please set these keys and run this method again!"
25
-
26
- exit
27
- end
28
-
29
- exit
30
-
31
- cloudflare = CloudFlare::connection(@config['cheftacular']['cloudflare_api_key'], @config['cheftacular']['cloudflare_user_email'])
32
-
33
- nodes.each do |n|
34
-
35
- @options['node_name'] = n.name
36
-
37
- domain_obj = PublicSuffix.parse addr_data[n.public_ipaddress]['dn']
38
-
39
- next unless domain_obj.domain == @config[@options['env']]['config_bag_hash'][@options['sub_env']]['tld'] #we can't create records for domains we dont manage in rax
40
-
41
- @config['stateless_action'].cloud "domain", "create:#{ tld }:#{ domain_obj.trd }:#{ n.public_ipaddress }"
42
-
43
- sleep 5 #don't want to to push updates to rax too fast
44
-
45
- @config['stateless_action'].cloud "domain", "create:#{ tld }:local.#{ domain_obj.trd }:#{ addr_data[n.public_ipaddress]['priv'] }"
46
-
47
- full_domain = "#{ domain_obj.trd }.#{ tld }"
48
-
49
- target_serv_index = @config[@options['env']]['addresses_bag_hash']['addresses'].count
50
-
51
- @config[@options['env']]['addresses_bag_hash']['addresses'].each do |serv_hash|
52
- target_serv_index = @config[@options['env']]['addresses_bag_hash']['addresses'].index(serv_hash) if serv_hash['name'] == n.name
53
- end
54
-
55
- @config[@options['env']]['addresses_bag_hash']['addresses'][target_serv_hash] ||= {}
56
- @config[@options['env']]['addresses_bag_hash']['addresses'][target_serv_hash]['dn'] = full_domain
23
+ target_domain = @config[@options['env']]['config_bag_hash'][@options['sub_env']]['tld']
57
24
 
58
- sleep 5 #prepare for next domain
59
- end
25
+ @config['stateless_action'].update_tld 'self'
60
26
 
61
- @config[@options['env']]['config_bag_hash'][@options['sub_env']]['tld'] = tld
27
+ target_domain_records = @config['stateless_action'].cloud('domain', "read:#{ target_domain }")["records_for_#{ target_domain }"]
62
28
 
63
- @config['ChefDataBag'].save_config_bag
64
- @config['ChefDataBag'].save_addresses_bag
29
+ @config['DNS'].update_cloudflare_from_array_of_domain_hashes target_domain, target_domain_records
65
30
  end
66
31
  end
67
32
  end
@@ -11,49 +11,52 @@ class Cheftacular
11
11
  end
12
12
 
13
13
  class StatelessAction
14
- def update_tld
14
+ def update_tld target_tld=""
15
15
  raise "This action can only be performed if the mode is set to devops" unless @config['helper'].running_in_mode?('devops')
16
16
 
17
- raise "Undefined new tld to migrate to" if ARGV.length <= 1
17
+ raise "Undefined new tld to migrate to" if ARGV.length <= 1 && target_tld.blank?
18
18
 
19
19
  nodes = @config['getter'].get_true_node_objects(true)
20
20
 
21
21
  #We need to manually update beta nodes as they share the same env space as their non-beta counterparts TODO Refactor?
22
22
  nodes = @config['parser'].exclude_nodes( nodes, [{ unless: { env: @options['env'] }}] )
23
23
 
24
- addr_data = @config['getter'].get_addresses_hash @options['env']
24
+ address_hash = @config['getter'].get_addresses_hash @options['env']
25
25
 
26
- tld = ARGV[1]
26
+ target_tld = ARGV[1] if target_tld.blank?
27
27
 
28
- nodes.each do |n|
28
+ old_tld = @config[@options['env']]['config_bag_hash'][@options['sub_env']]['tld']
29
29
 
30
- @options['node_name'] = n.name
31
-
32
- domain_obj = PublicSuffix.parse addr_data[n.public_ipaddress]['dn']
30
+ if target_tld == 'self'
31
+ target_tld = old_tld
32
+ end
33
33
 
34
- next unless domain_obj.domain == @config[@options['env']]['config_bag_hash'][@options['sub_env']]['tld'] #we can't create records for domains we dont manage in rax
34
+ nodes.each do |n|
35
35
 
36
- @config['stateless_action'].cloud "domain", "create:#{ tld }:#{ domain_obj.trd }:#{ n.public_ipaddress }"
36
+ @options['node_name'] = n.name
37
37
 
38
- sleep 5 #don't want to to push updates to rax too fast
38
+ domain_obj = PublicSuffix.parse address_hash[n.public_ipaddress]['dn']
39
39
 
40
- @config['stateless_action'].cloud "domain", "create:#{ tld }:local.#{ domain_obj.trd }:#{ addr_data[n.public_ipaddress]['priv'] }"
40
+ next unless domain_obj.domain == old_tld #we can't create records for domains not managed under the environment's tld
41
41
 
42
- full_domain = "#{ domain_obj.trd }.#{ tld }"
42
+ #TODO CHECK CLOUD IF TLD EXISTS
43
43
 
44
- target_serv_index = @config[@options['env']]['addresses_bag_hash']['addresses'].count
44
+ specific_domain = "#{ domain_obj.trd }.#{ target_tld }"
45
45
 
46
- @config[@options['env']]['addresses_bag_hash']['addresses'].each do |serv_hash|
47
- target_serv_index = @config[@options['env']]['addresses_bag_hash']['addresses'].index(serv_hash) if serv_hash['name'] == n.name
46
+ if specific_domain != "#{ @options['node_name'] }.#{ target_tld }"
47
+ @config['DNS'].create_dns_record_for_domain_from_address_hash(specific_domain, address_hash[n.public_ipaddress], "specific_domain_mode")
48
48
  end
49
49
 
50
- @config[@options['env']]['addresses_bag_hash']['addresses'][target_serv_hash] ||= {}
51
- @config[@options['env']]['addresses_bag_hash']['addresses'][target_serv_hash]['dn'] = full_domain
50
+ @config['DNS'].create_dns_record_for_domain_from_address_hash(target_tld, address_hash[n.public_ipaddress])
51
+
52
+ @config['DNS'].compile_address_hash_for_server_from_options("set_specific_domain_name:#{ specific_domain }")
52
53
 
53
54
  sleep 5 #prepare for next domain
54
55
  end
55
56
 
56
- @config[@options['env']]['config_bag_hash'][@options['sub_env']]['tld'] = tld
57
+ @config[@options['env']]['config_bag_hash'][@options['sub_env']]['tld'] = target_tld
58
+
59
+ puts "BAG TLD::#{ @config[@options['env']]['config_bag_hash'][@options['sub_env']]['tld'] }"
57
60
 
58
61
  @config['ChefDataBag'].save_config_bag
59
62
  @config['ChefDataBag'].save_addresses_bag
@@ -57,7 +57,7 @@ class Cheftacular
57
57
  node_roles_hash.each_pair do |role_name, role_hash|
58
58
  overwrite = false
59
59
  if bag_hash[role_name] != role_hash
60
- puts "Detected difference between saved roles hash and updated node_roles json hash."
60
+ puts "Detected difference between saved roles hash and updated node_roles json hash for #{ role_name }."
61
61
 
62
62
  puts "Saved roles hash:"
63
63
  ap(bag_hash[role_name])
@@ -90,6 +90,7 @@ class Cheftacular
90
90
  allowed_changes_hash[node.name].each_pair do |node_key, node_val|
91
91
  if (node_key =~ /name/) != 0 && node.send(node_key) != node_val
92
92
  puts("Updating #{ node.name } with attribute #{ node_key } = #{ node_val } from #{ node.name }.json") unless @options['quiet']
93
+
93
94
  node.send("#{ node_key }=", node_val)
94
95
 
95
96
  changes_for_current_node, invalidate_file_node_cache = true, true
@@ -100,6 +101,7 @@ class Cheftacular
100
101
  allowed_changes_hash[node.name.gsub(/\d/,'')].each_pair do |node_key, node_val|
101
102
  if (node_key =~ /name/) != 0 && node.send(node_key) != node_val
102
103
  puts("Updating #{ node.name } with attribute #{ node_key } = #{ node_val } from template json file") unless @options['quiet']
104
+
103
105
  node.send("#{ node_key }=", node_val)
104
106
 
105
107
  changes_for_current_node, invalidate_file_node_cache = true, true
@@ -1,5 +1,5 @@
1
1
  class Cheftacular
2
2
  #major_version.minor_version.bugfixes
3
- VERSION = "2.1.2"
3
+ VERSION = "2.2.0"
4
4
  RUBY_VERSION = "2.2.2"
5
5
  end
@@ -1,13 +1,15 @@
1
1
  class CloudInteractor
2
2
  class Domain
3
3
  def create_record args, already_created=false
4
- args['type'] ||= 'A'
5
- args['ttl'] ||= 300
4
+ args['type'] ||= 'A'
5
+ args['ttl'] ||= 300
6
+ args['target_domain'] ||= "#{ args['subdomain'] }.#{ args[IDENTITY.singularize] }"
7
+ args['target_domain'] = args[IDENTITY.singularize] if args['subdomain'].blank?
6
8
 
7
9
  read args, false
8
10
 
9
11
  @main_obj['specific_records'][args[IDENTITY.singularize]].each do |record_hash|
10
- already_created = true if record_hash['name'] == "#{ args['subdomain'] }.#{ args[IDENTITY.singularize] }"
12
+ already_created = true if record_hash['name'] == args['target_domain'] && record_hash['type'] == args['type']
11
13
 
12
14
  break if already_created
13
15
  end
@@ -18,9 +20,9 @@ class CloudInteractor
18
20
  else
19
21
  specific_fog_object = @classes['auth'].auth_service(RESOURCE).instance_eval('zones').get @main_obj["specific_#{ IDENTITY }"].last['id']
20
22
 
21
- specific_fog_object.records.create(name: "#{ args['subdomain'] }.#{ args[IDENTITY.singularize] }", value: args['target_ip'], type: args['type'], ttl: args['ttl'])
23
+ specific_fog_object.records.create(name: args['target_domain'], value: args['target_ip'], type: args['type'], ttl: args['ttl'])
22
24
 
23
- puts "Attached #{ args['subdomain'] } (#{ args['target_ip'] }) to #{ args[IDENTITY.singularize] }..."
25
+ puts "Attached #{ args['subdomain'] } (#{ args['target_ip'] }) to #{ args[IDENTITY.singularize] } (#{ args['target_domain'] })..."
24
26
  end
25
27
  end
26
28
  end
@@ -13,9 +13,11 @@ class CloudInteractor
13
13
  record_obj = JSON.parse(record.to_json)
14
14
 
15
15
  @main_obj["specific_#{ IDENTITY }"].last['records'] << record_obj
16
- @main_obj['specific_records'][args[IDENTITY.singularize]] << record_obj
16
+ @main_obj['specific_records'][args[IDENTITY.singularize]] << record_obj
17
17
  end
18
18
 
19
+ @main_obj['output']["records_for_#{ @main_obj["specific_#{ IDENTITY }"].last['domain'] }"] = @main_obj["specific_#{ IDENTITY }"].last['records']
20
+
19
21
  ap(@main_obj["specific_#{ IDENTITY }"].last['records']) if output
20
22
  end
21
23
  end
@@ -3,13 +3,15 @@ class CloudInteractor
3
3
  def update_record args, already_created=false
4
4
  args['type'] ||= 'A'
5
5
  args['ttl'] ||= 300
6
+ args['target_domain'] ||= "#{ args['subdomain'] }.#{ args[IDENTITY.singularize] }"
7
+ args['target_domain'] = args[IDENTITY.singularize] if args['subdomain'].blank?
6
8
 
7
9
  read args, false
8
10
 
9
11
  puts "Updating #{ args['subdomain'] } for #{ args[IDENTITY.singularize] }..."
10
12
 
11
13
  @main_obj['specific_records'][args[IDENTITY.singularize]].each do |record_hash|
12
- already_created = true if record_hash['name'] == "#{ args['subdomain'] }.#{ args[IDENTITY.singularize] }"
14
+ already_created = true if record_hash['name'] == args['target_domain'] && record_hash['type'] == args['type']
13
15
 
14
16
  args['id'] = record_hash['id']
15
17
 
@@ -33,7 +35,7 @@ class CloudInteractor
33
35
  raise "Unsupported action #{ __method__ } for #{ @options['preferred_cloud'] }. Please create an issue on github or submit a PR to fix this issue."
34
36
  end
35
37
 
36
- puts "Updated #{ args['subdomain'] } (#{ args['target_ip'] }) to #{ args[IDENTITY.singularize] }..."
38
+ puts "Updated #{ args['subdomain'] } (#{ args['target_ip'] }) to #{ args[IDENTITY.singularize] } (#{ args['target_domain'] })..."
37
39
  else
38
40
  create_record [ args ]
39
41
  end
@@ -0,0 +1,24 @@
1
+ #https://github.com/b4k3r/cloudflare/blob/master/lib/cloudflare/connection.rb
2
+ #TODO this is fixed on master but not in the latest version of the gem, allowing service_mode to be set on creates
3
+ module CloudFlare
4
+ class Connection
5
+ def rec_new(zone, type, name, content, ttl, prio = nil, service = nil, srvname = nil, protocol = nil, weight = nil, port = nil, target = nil, service_mode = '1')
6
+ send_req({
7
+ a: :rec_new,
8
+ z: zone,
9
+ type: type,
10
+ name: name,
11
+ content: content,
12
+ ttl: ttl,
13
+ prio: prio,
14
+ service: service,
15
+ srvname: srvname,
16
+ protocol: protocol,
17
+ weight: weight,
18
+ port: port,
19
+ target: target,
20
+ service_mode: service_mode
21
+ })
22
+ end
23
+ end
24
+ 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.1.2
4
+ version: 2.2.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-04-28 00:00:00.000000000 Z
11
+ date: 2015-05-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hashie
@@ -239,7 +239,7 @@ files:
239
239
  - bin/client-list
240
240
  - lib/cheftacular.rb
241
241
  - lib/cheftacular/README.md
242
- - lib/cheftacular/actions.rb
242
+ - lib/cheftacular/action.rb
243
243
  - lib/cheftacular/actions/check.rb
244
244
  - lib/cheftacular/actions/console.rb
245
245
  - lib/cheftacular/actions/database.rb
@@ -253,13 +253,13 @@ files:
253
253
  - lib/cheftacular/auditor.rb
254
254
  - lib/cheftacular/chef/data_bag.rb
255
255
  - lib/cheftacular/cheftacular.rb
256
- - lib/cheftacular/decryptors.rb
257
- - lib/cheftacular/encryptors.rb
258
- - lib/cheftacular/getters.rb
259
- - lib/cheftacular/helpers.rb
260
- - lib/cheftacular/initializers.rb
261
- - lib/cheftacular/parsers.rb
262
- - lib/cheftacular/remote_helpers.rb
256
+ - lib/cheftacular/decryptor.rb
257
+ - lib/cheftacular/dns.rb
258
+ - lib/cheftacular/encryptor.rb
259
+ - lib/cheftacular/getter.rb
260
+ - lib/cheftacular/helper.rb
261
+ - lib/cheftacular/initializer.rb
262
+ - lib/cheftacular/parser.rb
263
263
  - lib/cheftacular/stateless_action.rb
264
264
  - lib/cheftacular/stateless_actions/add_ssh_key_to_bag.rb
265
265
  - lib/cheftacular/stateless_actions/arguments.rb
@@ -292,6 +292,7 @@ files:
292
292
  - lib/cheftacular/stateless_actions/get_haproxy_log.rb
293
293
  - lib/cheftacular/stateless_actions/get_log_from_bag.rb
294
294
  - lib/cheftacular/stateless_actions/get_pg_pass.rb
295
+ - lib/cheftacular/stateless_actions/get_shorewall_allowed_connections.rb
295
296
  - lib/cheftacular/stateless_actions/help.rb
296
297
  - lib/cheftacular/stateless_actions/initialize_data_bag_contents.rb
297
298
  - lib/cheftacular/stateless_actions/knife_upload.rb
@@ -344,6 +345,7 @@ files:
344
345
  - lib/cloud_interactor/volume/destroy.rb
345
346
  - lib/cloud_interactor/volume/list.rb
346
347
  - lib/cloud_interactor/volume/read.rb
348
+ - lib/cloudflare/monkeypatches.rb
347
349
  - lib/ridley/monkeypatches.rb
348
350
  - lib/sshkit/actions/start_task.rb
349
351
  - lib/sshkit/getters.rb
@@ -1,30 +0,0 @@
1
-
2
- class Cheftacular
3
- module RemoteHelpers
4
- def set_log_loc_and_timestamp
5
- @dummy_sshkit.set_log_loc_and_timestamp( @locs )
6
- end
7
-
8
- def start_tail_log ip_address, run_list
9
- true_env = @config['dummy_sshkit'].get_true_environment run_list, @config['cheftacular']['run_list_environments'], @options['env']
10
-
11
- #special servers should be listed first as most of them will have web role
12
- log_loc = case
13
- when run_list.include?('role[sensu_server]')
14
- "/var/log/sensu/sensu-server.log"
15
- when run_list.include?('role[graphite_server]')
16
- "/var/log/carbon-cache/current"
17
- when run_list.include?('role[web]') && !run_list.include?('nodejs')
18
- "/var/www/vhosts/#{ get_codebase_from_role_name( @options['role']) }/current/log/#{ true_env }.log"
19
- when run_list.include?('role[worker]') || run_list.include?('nodejs')
20
- "/var/log/syslog"
21
- else
22
- puts "This gem is not currently configured to handle tailing this case"
23
- return 0
24
- end
25
-
26
-
27
- `ssh -oStrictHostKeyChecking=no -tt deploy@#{ ip_address } "#{ sudo(ip_address) } tail -f #{ log_loc }" > /dev/tty`
28
- end
29
- end
30
- end