cheftacular 2.5.0 → 2.6.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 +155 -63
- data/lib/cheftacular/actions/db_console.rb +3 -3
- data/lib/cheftacular/actions/deploy.rb +18 -12
- data/lib/cheftacular/actions/migrate.rb +1 -1
- data/lib/cheftacular/actions/tail.rb +1 -1
- data/lib/cheftacular/auditor.rb +14 -6
- data/lib/cheftacular/chef/data_bag.rb +1 -4
- data/lib/cheftacular/cheftacular.rb +19 -15
- data/lib/cheftacular/cloud_provider.rb +32 -0
- data/lib/cheftacular/dns.rb +1 -1
- data/lib/cheftacular/error.rb +13 -2
- data/lib/cheftacular/file_system.rb +122 -0
- data/lib/cheftacular/files/rvm.sh +55 -0
- data/lib/cheftacular/getter.rb +10 -3
- data/lib/cheftacular/helper.rb +31 -127
- data/lib/cheftacular/initialization_action.rb +8 -0
- data/lib/cheftacular/initializer.rb +104 -44
- data/lib/cheftacular/parser.rb +6 -0
- data/lib/cheftacular/stateless_actions/add_ssh_key_to_bag.rb +2 -2
- data/lib/cheftacular/stateless_actions/arguments.rb +9 -2
- data/lib/cheftacular/stateless_actions/backups.rb +1 -1
- data/lib/cheftacular/stateless_actions/bootstrappers/ubuntu_bootstrap.rb +16 -5
- data/lib/cheftacular/stateless_actions/check_cheftacular_yml_keys.rb +79 -0
- data/lib/cheftacular/stateless_actions/chef_bootstrap.rb +20 -4
- data/lib/cheftacular/stateless_actions/chef_server.rb +78 -0
- data/lib/cheftacular/stateless_actions/clean_cookbooks.rb +3 -3
- data/lib/cheftacular/stateless_actions/clean_server_passwords.rb +3 -1
- data/lib/cheftacular/stateless_actions/cleanup_log_files.rb +1 -0
- data/lib/cheftacular/stateless_actions/client_list.rb +2 -2
- data/lib/cheftacular/stateless_actions/cloud.rb +30 -2
- data/lib/cheftacular/stateless_actions/cloud_bootstrap.rb +7 -13
- data/lib/cheftacular/stateless_actions/compile_audit_log.rb +1 -1
- data/lib/cheftacular/stateless_actions/create_git_key.rb +3 -1
- data/lib/cheftacular/stateless_actions/environment.rb +2 -0
- data/lib/cheftacular/stateless_actions/file.rb +4 -2
- data/lib/cheftacular/stateless_actions/fix_known_hosts.rb +2 -1
- data/lib/cheftacular/stateless_actions/full_bootstrap.rb +2 -0
- data/lib/cheftacular/stateless_actions/get_active_ssh_connections.rb +1 -1
- data/lib/cheftacular/stateless_actions/help.rb +9 -7
- data/lib/cheftacular/stateless_actions/initialize_cheftacular_yml.rb +29 -0
- data/lib/cheftacular/stateless_actions/initialize_data_bag_contents.rb +5 -36
- data/lib/cheftacular/stateless_actions/list_toggleable_roles.rb +45 -0
- data/lib/cheftacular/stateless_actions/location_aliases.rb +24 -0
- data/lib/cheftacular/stateless_actions/pass.rb +4 -4
- data/lib/cheftacular/stateless_actions/reinitialize.rb +0 -6
- data/lib/cheftacular/stateless_actions/remove_client.rb +12 -7
- data/lib/cheftacular/stateless_actions/role_toggle.rb +141 -0
- data/lib/cheftacular/stateless_actions/server_update.rb +2 -2
- data/lib/cheftacular/stateless_actions/update_chef_client.rb +18 -0
- data/lib/cheftacular/stateless_actions/upload_nodes.rb +5 -3
- data/lib/cheftacular/stateless_actions/upload_roles.rb +1 -1
- data/lib/cheftacular/version.rb +1 -1
- data/lib/cloud_interactor/authentication.rb +78 -40
- data/lib/cloud_interactor/cloud_interactor.rb +4 -1
- data/lib/cloud_interactor/cloud_provider.rb +19 -0
- data/lib/cloud_interactor/domain/create.rb +1 -1
- data/lib/cloud_interactor/domain/create_record.rb +1 -1
- data/lib/cloud_interactor/domain/destroy_record.rb +1 -1
- data/lib/cloud_interactor/domain/list_records.rb +1 -1
- data/lib/cloud_interactor/domain/update.rb +1 -1
- data/lib/cloud_interactor/domain/update_record.rb +6 -6
- data/lib/cloud_interactor/helpers.rb +1 -1
- data/lib/cloud_interactor/parser.rb +3 -2
- data/lib/cloud_interactor/region.rb +27 -0
- data/lib/cloud_interactor/server/create.rb +9 -0
- data/lib/cloud_interactor/sshkey.rb +59 -0
- data/lib/ridley/monkeypatches.rb +12 -0
- data/lib/sshkit/actions/start_task.rb +8 -2
- metadata +16 -2
@@ -25,6 +25,8 @@ class Cheftacular
|
|
25
25
|
|
26
26
|
class StatelessAction
|
27
27
|
def upload_nodes invalidate_file_node_cache=false
|
28
|
+
@config['filesystem'].cleanup_file_caches('current') if invalidate_file_node_cache
|
29
|
+
|
28
30
|
raise "This action can only be performed if the mode is set to devops" if !@config['helper'].running_in_mode?('devops') && !@options['in_scaling']
|
29
31
|
|
30
32
|
@config['chef_environments'].each do |env|
|
@@ -38,10 +40,10 @@ class Cheftacular
|
|
38
40
|
node_roles_hash, bag_hash, allowed_changes_hash = {},{},{}
|
39
41
|
|
40
42
|
Dir.foreach(@config['locs']['nodes']) do |fr|
|
41
|
-
next if @config['
|
43
|
+
next if @config['filesystem'].is_junk_filename?(fr)
|
42
44
|
|
43
45
|
Dir.foreach("#{ @config['locs']['nodes'] }/#{ fr }") do |f|
|
44
|
-
next if @config['
|
46
|
+
next if @config['filesystem'].is_junk_filename?(f)
|
45
47
|
|
46
48
|
node_roles_hash[f.split('.json').first] = JSON.parse(File.read("#{ @config['locs']['nodes'] }/#{ fr }/#{ f }"))
|
47
49
|
end
|
@@ -126,7 +128,7 @@ class Cheftacular
|
|
126
128
|
@config['ChefDataBag'].save_node_roles_bag env
|
127
129
|
end if !@options['force_yes'] && @config['helper'].running_in_mode?('devops')
|
128
130
|
|
129
|
-
@config['
|
131
|
+
@config['filesystem'].cleanup_file_caches('current') if invalidate_file_node_cache
|
130
132
|
end
|
131
133
|
end
|
132
134
|
end
|
@@ -13,7 +13,7 @@ class Cheftacular
|
|
13
13
|
raise "This action can only be performed if the mode is set to devops" if !@config['helper'].running_in_mode?('devops') && !@options['in_scaling']
|
14
14
|
|
15
15
|
Dir.foreach(@config['locs']['roles']) do |rd|
|
16
|
-
next if @config['
|
16
|
+
next if @config['filesystem'].is_junk_filename?(rd)
|
17
17
|
|
18
18
|
puts("Loading in role from file #{ rd }") if @options['verbose']
|
19
19
|
|
data/lib/cheftacular/version.rb
CHANGED
@@ -7,50 +7,88 @@ class CloudInteractor
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def auth_service interaction_class
|
10
|
-
except_keys =
|
11
|
-
|
12
|
-
interaction_class = case interaction_class.downcase
|
13
|
-
when 'volume'
|
14
|
-
case @options['preferred_cloud']
|
15
|
-
when 'rackspace'
|
16
|
-
except_keys = [:provider, :version]
|
17
|
-
|
18
|
-
'Rackspace::BlockStorage'
|
19
|
-
else
|
20
|
-
raise "CloudInteractor Does not currently support this #{ options['preferred_cloud'] }'s' volume creation at this time"
|
21
|
-
end
|
22
|
-
when 'dns'
|
23
|
-
case @options['preferred_cloud']
|
24
|
-
when 'rackspace'
|
25
|
-
except_keys = [:version, :rackspace_region]
|
26
|
-
|
27
|
-
interaction_class
|
28
|
-
else
|
29
|
-
except_keys = [:version]
|
30
|
-
|
31
|
-
interaction_class
|
32
|
-
end
|
33
|
-
else
|
34
|
-
interaction_class
|
35
|
-
end
|
10
|
+
interaction_class, except_keys = parse_interaction_class(interaction_class)
|
36
11
|
|
37
12
|
classes_to_inject = interaction_class.split('::')
|
38
13
|
classes_to_inject = classes_to_inject.map { |str| str.camelcase }
|
39
14
|
|
40
|
-
cloud_hash =
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
15
|
+
cloud_hash = parse_cloud_hash
|
16
|
+
|
17
|
+
if interaction_class == 'DNS'
|
18
|
+
cloud_hash = parse_dns_cloud_hash cloud_hash
|
19
|
+
end
|
20
|
+
|
21
|
+
Fog.class_eval(classes_to_inject.join('::')).new(cloud_hash.delete_if { |key, value| except_keys.flatten.include?(key) })
|
22
|
+
end
|
23
|
+
|
24
|
+
def parse_interaction_class interaction_class, except_keys = []
|
25
|
+
return_class = case interaction_class.downcase
|
26
|
+
when 'volume'
|
27
|
+
case @options['preferred_cloud']
|
28
|
+
when 'rackspace'
|
29
|
+
except_keys << [:provider, :version]
|
30
|
+
|
31
|
+
'Rackspace::BlockStorage'
|
32
|
+
else
|
33
|
+
raise "CloudInteractor Does not currently support this #{ @options['preferred_cloud'] }'s' volume creation at this time"
|
34
|
+
end
|
35
|
+
when 'dns'
|
36
|
+
case @options['route_dns_changes_via']
|
37
|
+
when 'rackspace'
|
38
|
+
except_keys << [:version, :rackspace_region]
|
39
|
+
|
40
|
+
interaction_class
|
41
|
+
else
|
42
|
+
except_keys << [:version]
|
43
|
+
|
44
|
+
interaction_class
|
45
|
+
end
|
46
|
+
else
|
47
|
+
interaction_class
|
48
|
+
end
|
49
|
+
|
50
|
+
[return_class, except_keys.flatten]
|
51
|
+
end
|
52
|
+
|
53
|
+
def parse_cloud_hash
|
54
|
+
case @options['preferred_cloud']
|
55
|
+
when 'rackspace'
|
56
|
+
{
|
57
|
+
provider: 'Rackspace',
|
58
|
+
rackspace_username: @auth_hash['cloud_authentication'][@options['preferred_cloud']]['username'],
|
59
|
+
rackspace_api_key: @auth_hash['cloud_authentication'][@options['preferred_cloud']]['api_key'],
|
60
|
+
version: :v2,
|
61
|
+
rackspace_region: @options['preferred_cloud_region'].to_sym,
|
62
|
+
connection_options: {}
|
63
|
+
}
|
64
|
+
when 'digitalocean'
|
65
|
+
{
|
66
|
+
provider: 'DigitalOcean',
|
67
|
+
digitalocean_api_key: @auth_hash['cloud_authentication'][@options['preferred_cloud']]['api_key'],
|
68
|
+
digitalocean_client_id: @auth_hash['cloud_authentication'][@options['preferred_cloud']]['client_id']
|
69
|
+
#version: :v1
|
70
|
+
}
|
71
|
+
else raise "CloudInteractor Does not currently support #{ @options['preferred_cloud'] } at this time"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def parse_dns_cloud_hash cloud_hash
|
76
|
+
if @options['route_dns_changes_via'] == @options['preferred_cloud']
|
77
|
+
cloud_hash
|
78
|
+
else
|
79
|
+
case @options['route_dns_changes_via']
|
80
|
+
when 'rackspace'
|
81
|
+
cloud_hash
|
82
|
+
when 'dnsimple'
|
83
|
+
{
|
84
|
+
provider: 'dnsimple',
|
85
|
+
dnsimple_email: @auth_hash['cloud_authentication'][@options['route_dns_changes_via']]['email'],
|
86
|
+
dnsimple_password: @auth_hash['cloud_authentication'][@options['route_dns_changes_via']]['password'],
|
87
|
+
dnsimple_token: @auth_hash['cloud_authentication'][@options['route_dns_changes_via']]['token']
|
88
|
+
}
|
89
|
+
else raise "CloudInteractor does not currently support #{ @options['route_dns_changes_via'] } as a DNS creation provider at this time"
|
90
|
+
end
|
91
|
+
end
|
54
92
|
end
|
55
93
|
end
|
56
94
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
class CloudInteractor
|
2
|
-
ALLOWED_HLMS = ['domain', 'flavor', 'image', 'server', 'volume']
|
2
|
+
ALLOWED_HLMS = ['domain', 'flavor', 'image', 'region', 'server', 'sshkey', 'volume']
|
3
3
|
|
4
4
|
def initialize auth_hash, options
|
5
5
|
@main_obj, @classes = {},{}
|
@@ -7,10 +7,13 @@ class CloudInteractor
|
|
7
7
|
@main_obj['output'] = {}
|
8
8
|
@auth_hash = auth_hash
|
9
9
|
@classes['helper'] = Helper.new(@main_obj, @classes, @options)
|
10
|
+
@classes['clouds'] = CloudProvider.new(@options)
|
10
11
|
@classes['domain'] = Domain.new(@main_obj, @auth_hash, @classes, @options)
|
11
12
|
@classes['flavor'] = Flavor.new(@main_obj, @classes, @options)
|
12
13
|
@classes['image'] = Image.new(@main_obj, @classes, @options)
|
14
|
+
@classes['region'] = Region.new(@main_obj, @classes, @options)
|
13
15
|
@classes['server'] = Server.new(@main_obj, @classes, @options)
|
16
|
+
@classes['sshkey'] = SSHKey.new(@main_obj, @classes, @options)
|
14
17
|
@classes['volume'] = Volume.new(@main_obj, @classes, @options)
|
15
18
|
@classes['auth'] = Authentication.new(@auth_hash, @options)
|
16
19
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class CloudInteractor
|
2
|
+
class CloudProvider
|
3
|
+
def initialize options={}
|
4
|
+
@options = options
|
5
|
+
end
|
6
|
+
|
7
|
+
#args will always be a hash
|
8
|
+
def parse_provider_domain_record_name args
|
9
|
+
case @options['route_dns_changes_via']
|
10
|
+
when 'rackspace'
|
11
|
+
"#{ args['subdomain'] }.#{ args['domain'] }"
|
12
|
+
when 'dnsimple'
|
13
|
+
args['subdomain']
|
14
|
+
else
|
15
|
+
"#{ args['subdomain'] }.#{ args['domain'] }"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -9,7 +9,7 @@ class CloudInteractor
|
|
9
9
|
return false
|
10
10
|
end
|
11
11
|
|
12
|
-
@classes['auth'].auth_service(RESOURCE).instance_eval('zones').create(domain: args[IDENTITY.singularize], email: @auth_hash['
|
12
|
+
@classes['auth'].auth_service(RESOURCE).instance_eval('zones').create(domain: args[IDENTITY.singularize], email: @auth_hash['cloud_authentication'][@options['preferred_cloud']]['email'])
|
13
13
|
|
14
14
|
puts "Created #{ IDENTITY } #{ args[IDENTITY.singularize] }..."
|
15
15
|
end
|
@@ -3,7 +3,7 @@ class CloudInteractor
|
|
3
3
|
def create_record args, already_created=false
|
4
4
|
args['type'] ||= 'A'
|
5
5
|
args['ttl'] ||= 300
|
6
|
-
args['target_domain'] ||=
|
6
|
+
args['target_domain'] ||= @classes['clouds'].parse_provider_domain_record_name(args)
|
7
7
|
args['target_domain'] = args[IDENTITY.singularize] if args['subdomain'].blank?
|
8
8
|
|
9
9
|
read args, false
|
@@ -4,7 +4,7 @@ class CloudInteractor
|
|
4
4
|
read args, false
|
5
5
|
|
6
6
|
@main_obj['specific_records'][args[IDENTITY.singularize]].each do |record_hash|
|
7
|
-
already_exists = true if record_hash['name'] ==
|
7
|
+
already_exists = true if record_hash['name'] == @classes['clouds'].parse_provider_domain_record_name(args)
|
8
8
|
|
9
9
|
args['id'] = record_hash['id']
|
10
10
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class CloudInteractor
|
2
2
|
class Domain
|
3
3
|
def list_records args, output=false
|
4
|
-
puts "Querying #{ args["domain"] } for
|
4
|
+
puts "Querying #{ args["domain"] } for records..."
|
5
5
|
|
6
6
|
specific_fog_object = @classes['auth'].auth_service(RESOURCE).instance_eval('zones').get @main_obj["specific_#{ IDENTITY }"].last['id']
|
7
7
|
|
@@ -10,7 +10,7 @@ class CloudInteractor
|
|
10
10
|
return false
|
11
11
|
end
|
12
12
|
|
13
|
-
@classes['auth'].auth_service(resource).instance_eval('zones').get(@main_obj["specific_#{ IDENTITY }"].last['id']).update(ttl: 5, email: @auth_hash['
|
13
|
+
@classes['auth'].auth_service(resource).instance_eval('zones').get(@main_obj["specific_#{ IDENTITY }"].last['id']).update(ttl: 5, email: @auth_hash['cloud_authentication'][@options['preferred_cloud']]['email'])
|
14
14
|
|
15
15
|
puts "Updated #{ IDENTITY } #{ args[IDENTITY.singularize] }..."
|
16
16
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
class CloudInteractor
|
2
2
|
class Domain
|
3
3
|
def update_record args, already_created=false
|
4
|
-
args['type']
|
5
|
-
args['ttl']
|
6
|
-
args['target_domain'] ||=
|
4
|
+
args['type'] ||= 'A'
|
5
|
+
args['ttl'] ||= 300
|
6
|
+
args['target_domain'] ||= @classes['clouds'].parse_provider_domain_record_name(args)
|
7
7
|
args['target_domain'] = args[IDENTITY.singularize] if args['subdomain'].blank?
|
8
8
|
|
9
9
|
read args, false
|
@@ -24,8 +24,8 @@ class CloudInteractor
|
|
24
24
|
#the fact that there is no public update method is silly
|
25
25
|
specific_record = specific_fog_object.records.get(args['id'])
|
26
26
|
|
27
|
-
case @options['
|
28
|
-
when
|
27
|
+
case @options['route_dns_changes_via']
|
28
|
+
when /rackspace|dnsimple/
|
29
29
|
specific_record.type = args['type']
|
30
30
|
specific_record.value = args['target_ip']
|
31
31
|
specific_record.ttl = args['ttl']
|
@@ -41,4 +41,4 @@ class CloudInteractor
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
end
|
44
|
-
end
|
44
|
+
end
|
@@ -14,7 +14,7 @@ class CloudInteractor
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def generic_list_call identity, resource, output=true
|
17
|
-
puts "Returning list of #{ identity } for #{ @options['preferred_cloud'] }..."
|
17
|
+
puts "Returning list of #{ identity } for #{ resource == 'DNS' ? @options['route_dns_changes_via'] : @options['preferred_cloud'] }..."
|
18
18
|
|
19
19
|
@main_obj[identity] = JSON.parse(@classes['auth'].auth_service(resource).instance_eval(identity).to_json)
|
20
20
|
|
@@ -1,5 +1,6 @@
|
|
1
1
|
class CloudInteractor
|
2
2
|
def parse_args args, final_args={}
|
3
|
+
args[0] = args[0].singularize
|
3
4
|
#example args: domain "create:mydomain.us:23.253.44.192:my"
|
4
5
|
|
5
6
|
raise "This class does not support #{ args[0] } at this time" unless ALLOWED_HLMS.include?(args[0])
|
@@ -27,8 +28,8 @@ class CloudInteractor
|
|
27
28
|
when args[0] =~ /domain/ then { 1 => "domain", 2 => "subdomain", 3 => "target_ip", 4 => 'type' }
|
28
29
|
when args[0] =~ /server/ then { 1 => "name", 2 => "flavor" }
|
29
30
|
when args[0] =~ /volume/ then { 1 => "display_name", 2 => "size", 3 => 'volume_type' }
|
30
|
-
when args[0] =~ /
|
31
|
-
when args[0] =~ /image/
|
31
|
+
when args[0] =~ /sshkey/ then { 1 => "name", 2 => :ssh_pub_key }
|
32
|
+
when args[0] =~ /flavor|image|region/ then { 1 => "name" }
|
32
33
|
else raise "FATAL! Unsupported High Level Class #{ args[0] } for CloudInteractor! Please raise an issue on github with this stacktrace! args:#{ args }"
|
33
34
|
end
|
34
35
|
|
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
class CloudInteractor
|
3
|
+
class Region
|
4
|
+
IDENTITY = 'regions'
|
5
|
+
RESOURCE = 'compute'
|
6
|
+
|
7
|
+
def initialize main_obj, classes, options={}
|
8
|
+
@main_obj = main_obj
|
9
|
+
@options = options
|
10
|
+
@classes = classes
|
11
|
+
end
|
12
|
+
|
13
|
+
def run method, args
|
14
|
+
self.send(method, args)
|
15
|
+
end
|
16
|
+
|
17
|
+
def list args, output=true
|
18
|
+
@classes['helper'].generic_list_call IDENTITY, RESOURCE, output
|
19
|
+
end
|
20
|
+
|
21
|
+
def read args, output=true
|
22
|
+
list [], false
|
23
|
+
|
24
|
+
@classes['helper'].generic_read_parse args, IDENTITY, output
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -7,6 +7,9 @@ class CloudInteractor
|
|
7
7
|
#Note, if no flavor is passed it defaults to a 512MB standard!
|
8
8
|
@classes['flavor'].read args['flavor']
|
9
9
|
|
10
|
+
@classes['region'].read(@options['preferred_cloud_region'], false) if @options['preferred_cloud'] == 'digitalocean'
|
11
|
+
@classes['sshkey'].bootstrap if @options['preferred_cloud'] == 'digitalocean'
|
12
|
+
|
10
13
|
read args, false
|
11
14
|
|
12
15
|
unless @main_obj["specific_#{ IDENTITY }"].empty?
|
@@ -23,6 +26,12 @@ class CloudInteractor
|
|
23
26
|
image_id: @main_obj['specific_images'].first['id']
|
24
27
|
}
|
25
28
|
|
29
|
+
if @options['preferred_cloud'] == 'digitalocean'
|
30
|
+
final_create_args[:region_id] = @main_obj['specific_regions'].first['id']
|
31
|
+
final_create_args[:ssh_key_ids] = @main_obj['specific_ssh_keys'].first['id']
|
32
|
+
final_create_args[:private_networking] = true
|
33
|
+
end
|
34
|
+
|
26
35
|
@main_obj["#{ IDENTITY }_create_request"] = JSON.parse(@classes['auth'].auth_service(RESOURCE).instance_eval(IDENTITY).create(final_create_args).to_json)
|
27
36
|
|
28
37
|
@main_obj["#{ IDENTITY }_created_passwords"] ||= {}
|
@@ -0,0 +1,59 @@
|
|
1
|
+
|
2
|
+
class CloudInteractor
|
3
|
+
class SSHKey
|
4
|
+
IDENTITY = 'ssh_keys'
|
5
|
+
RESOURCE = 'compute'
|
6
|
+
|
7
|
+
def initialize main_obj, classes, options={}
|
8
|
+
@main_obj = main_obj
|
9
|
+
@options = options
|
10
|
+
@classes = classes
|
11
|
+
end
|
12
|
+
|
13
|
+
def run method, args
|
14
|
+
self.send(method, args)
|
15
|
+
end
|
16
|
+
|
17
|
+
def list args={}, output=true
|
18
|
+
@classes['helper'].generic_list_call IDENTITY, RESOURCE, output
|
19
|
+
end
|
20
|
+
|
21
|
+
def read args, output=true
|
22
|
+
list [], false
|
23
|
+
|
24
|
+
@classes['helper'].generic_read_parse args, IDENTITY, output
|
25
|
+
end
|
26
|
+
|
27
|
+
def create args
|
28
|
+
puts "Creating #{ args['name'] } in #{ IDENTITY }..."
|
29
|
+
|
30
|
+
puts("Creating #{ IDENTITY.singularize } with args #{ ap(args) }") if @options['verbose']
|
31
|
+
|
32
|
+
@main_obj["#{ IDENTITY }_create_request"] = JSON.parse(@classes['auth'].auth_service(RESOURCE).instance_eval(IDENTITY).create(args).to_json)
|
33
|
+
end
|
34
|
+
|
35
|
+
def destroy args
|
36
|
+
read args, false
|
37
|
+
|
38
|
+
@classes['helper'].generic_destroy_parse args, IDENTITY, RESOURCE
|
39
|
+
end
|
40
|
+
|
41
|
+
#special method for digitalocean api, will attempt to create the sshkeyid on DO if one matching the user's hostname is not found
|
42
|
+
def bootstrap output=true
|
43
|
+
read Socket.gethostname, false
|
44
|
+
|
45
|
+
if @main_obj["specific_#{ IDENTITY }"].empty?
|
46
|
+
puts "Did not detect an SSHKey on DigitalOcean for the system #{ Socket.gethostname }, creating..."
|
47
|
+
create_hash = {}
|
48
|
+
create_hash['name'] = Socket.gethostname
|
49
|
+
create_hash['ssh_pub_key'] = File.read(File.expand_path('~/.ssh/id_rsa.pub'))
|
50
|
+
|
51
|
+
create create_hash
|
52
|
+
|
53
|
+
sleep 5
|
54
|
+
|
55
|
+
read Socket.gethostname, false
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
data/lib/ridley/monkeypatches.rb
CHANGED
@@ -9,3 +9,15 @@ module Ridley
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
end
|
12
|
+
|
13
|
+
module Ridley
|
14
|
+
class NodeObject < Ridley::ChefObject
|
15
|
+
def public_ipv4
|
16
|
+
address = self.cloud? ? self.automatic[:cloud][:public_ipv4] || self.automatic[:ipaddress] : self.automatic[:ipaddress]
|
17
|
+
|
18
|
+
address.is_a?(Hash) ? address['ip_address'] : address
|
19
|
+
end
|
20
|
+
|
21
|
+
alias_method :public_ipaddress, :public_ipv4
|
22
|
+
end
|
23
|
+
end
|
@@ -7,12 +7,18 @@ module SSHKit
|
|
7
7
|
|
8
8
|
puts "Running #{ command } for #{ name } (#{ ip_address }) (Run with with --debug to generate a log as well)"
|
9
9
|
|
10
|
-
|
10
|
+
target_loc = "/var/www/vhosts/#{ options['repository'] }/current"
|
11
|
+
|
12
|
+
if test( target_loc )
|
13
|
+
puts "#{ name } (#{ ip_address }) cannot run #{ command } as there is no directory at #{ target_loc }!"
|
14
|
+
|
15
|
+
return ['', timestamp]
|
16
|
+
end
|
11
17
|
|
12
18
|
capture_args = ["RAILS_ENV=#{ true_env }"]
|
13
19
|
capture_args << command.split(' ')
|
14
20
|
|
15
|
-
within
|
21
|
+
within target_loc do
|
16
22
|
out << capture( *capture_args.flatten )
|
17
23
|
end
|
18
24
|
|
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.6.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-06
|
11
|
+
date: 2015-08-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hashie
|
@@ -238,12 +238,16 @@ files:
|
|
238
238
|
- lib/cheftacular/auditor.rb
|
239
239
|
- lib/cheftacular/chef/data_bag.rb
|
240
240
|
- lib/cheftacular/cheftacular.rb
|
241
|
+
- lib/cheftacular/cloud_provider.rb
|
241
242
|
- lib/cheftacular/decryptor.rb
|
242
243
|
- lib/cheftacular/dns.rb
|
243
244
|
- lib/cheftacular/encryptor.rb
|
244
245
|
- lib/cheftacular/error.rb
|
246
|
+
- lib/cheftacular/file_system.rb
|
247
|
+
- lib/cheftacular/files/rvm.sh
|
245
248
|
- lib/cheftacular/getter.rb
|
246
249
|
- lib/cheftacular/helper.rb
|
250
|
+
- lib/cheftacular/initialization_action.rb
|
247
251
|
- lib/cheftacular/initializer.rb
|
248
252
|
- lib/cheftacular/parser.rb
|
249
253
|
- lib/cheftacular/stateless_action.rb
|
@@ -256,7 +260,9 @@ files:
|
|
256
260
|
- lib/cheftacular/stateless_actions/bootstrappers/redhat_bootstrap.rb
|
257
261
|
- lib/cheftacular/stateless_actions/bootstrappers/ubuntu_bootstrap.rb
|
258
262
|
- lib/cheftacular/stateless_actions/bootstrappers/vyatta_bootstrap.rb
|
263
|
+
- lib/cheftacular/stateless_actions/check_cheftacular_yml_keys.rb
|
259
264
|
- lib/cheftacular/stateless_actions/chef_bootstrap.rb
|
265
|
+
- lib/cheftacular/stateless_actions/chef_server.rb
|
260
266
|
- lib/cheftacular/stateless_actions/clean_cookbooks.rb
|
261
267
|
- lib/cheftacular/stateless_actions/clean_sensu_plugins.rb
|
262
268
|
- lib/cheftacular/stateless_actions/clean_server_passwords.rb
|
@@ -278,18 +284,23 @@ files:
|
|
278
284
|
- lib/cheftacular/stateless_actions/get_pg_pass.rb
|
279
285
|
- lib/cheftacular/stateless_actions/get_shorewall_allowed_connections.rb
|
280
286
|
- lib/cheftacular/stateless_actions/help.rb
|
287
|
+
- lib/cheftacular/stateless_actions/initialize_cheftacular_yml.rb
|
281
288
|
- lib/cheftacular/stateless_actions/initialize_data_bag_contents.rb
|
282
289
|
- lib/cheftacular/stateless_actions/knife_upload.rb
|
290
|
+
- lib/cheftacular/stateless_actions/list_toggleable_roles.rb
|
291
|
+
- lib/cheftacular/stateless_actions/location_aliases.rb
|
283
292
|
- lib/cheftacular/stateless_actions/pass.rb
|
284
293
|
- lib/cheftacular/stateless_actions/reinitialize.rb
|
285
294
|
- lib/cheftacular/stateless_actions/remove_client.rb
|
286
295
|
- lib/cheftacular/stateless_actions/replication_status.rb
|
287
296
|
- lib/cheftacular/stateless_actions/restart_swap.rb
|
297
|
+
- lib/cheftacular/stateless_actions/role_toggle.rb
|
288
298
|
- lib/cheftacular/stateless_actions/rvm.rb
|
289
299
|
- lib/cheftacular/stateless_actions/server_update.rb
|
290
300
|
- lib/cheftacular/stateless_actions/service.rb
|
291
301
|
- lib/cheftacular/stateless_actions/slack.rb
|
292
302
|
- lib/cheftacular/stateless_actions/test_env.rb
|
303
|
+
- lib/cheftacular/stateless_actions/update_chef_client.rb
|
293
304
|
- lib/cheftacular/stateless_actions/update_cloudflare_dns_from_cloud.rb
|
294
305
|
- lib/cheftacular/stateless_actions/update_split_branches.rb
|
295
306
|
- lib/cheftacular/stateless_actions/update_tld.rb
|
@@ -298,6 +309,7 @@ files:
|
|
298
309
|
- lib/cheftacular/version.rb
|
299
310
|
- lib/cloud_interactor/authentication.rb
|
300
311
|
- lib/cloud_interactor/cloud_interactor.rb
|
312
|
+
- lib/cloud_interactor/cloud_provider.rb
|
301
313
|
- lib/cloud_interactor/domain.rb
|
302
314
|
- lib/cloud_interactor/domain/create.rb
|
303
315
|
- lib/cloud_interactor/domain/create_record.rb
|
@@ -313,6 +325,7 @@ files:
|
|
313
325
|
- lib/cloud_interactor/helpers.rb
|
314
326
|
- lib/cloud_interactor/image.rb
|
315
327
|
- lib/cloud_interactor/parser.rb
|
328
|
+
- lib/cloud_interactor/region.rb
|
316
329
|
- lib/cloud_interactor/server.rb
|
317
330
|
- lib/cloud_interactor/server/attach_volume.rb
|
318
331
|
- lib/cloud_interactor/server/create.rb
|
@@ -323,6 +336,7 @@ files:
|
|
323
336
|
- lib/cloud_interactor/server/poll.rb
|
324
337
|
- lib/cloud_interactor/server/read.rb
|
325
338
|
- lib/cloud_interactor/server/read_volume.rb
|
339
|
+
- lib/cloud_interactor/sshkey.rb
|
326
340
|
- lib/cloud_interactor/version.rb
|
327
341
|
- lib/cloud_interactor/volume.rb
|
328
342
|
- lib/cloud_interactor/volume/create.rb
|