skyed 0.1.4 → 0.1.5
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/skyed.rb +3 -1
- data/lib/skyed/aws.rb +195 -0
- data/lib/skyed/commands.rb +3 -0
- data/lib/skyed/destroy.rb +1 -1
- data/lib/skyed/init.rb +11 -124
- data/lib/skyed/run.rb +2 -2
- data/lib/skyed/utils.rb +10 -0
- data/templates/ow-on-premise.yml.erb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2c46e5e72681a7be284fd66a907566388b020efa
|
4
|
+
data.tar.gz: 8ef8a62b6fb7dcb24252f74d514244c1299a4fe2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e1d94f210a7f91c6844e876c45f7b7650cde0b53f85483555f691f981ff9932b4a9d57a3e34909f91d1603d773457fdacf8a0d97f7181f6b65c9ca18eea875c8
|
7
|
+
data.tar.gz: 2623193f4441a5d00d29ad7a691fed3291b69eb9e42fa7f56c745dd3b8048818903c960530ee2335ecdb8e1b2dac9fcd4e04efa18a697fc06501b5b4cf979bed
|
data/lib/skyed.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'skyed/utils'
|
2
|
+
require 'skyed/aws'
|
1
3
|
require 'skyed/destroy'
|
2
4
|
require 'skyed/run'
|
3
5
|
require 'skyed/deploy'
|
@@ -6,5 +8,5 @@ require 'skyed/settings'
|
|
6
8
|
|
7
9
|
# Skyed is a set of tools for cloud computing
|
8
10
|
module Skyed
|
9
|
-
VERSION = '0.1.
|
11
|
+
VERSION = '0.1.5'
|
10
12
|
end
|
data/lib/skyed/aws.rb
ADDED
@@ -0,0 +1,195 @@
|
|
1
|
+
require 'aws-sdk'
|
2
|
+
require 'highline/import'
|
3
|
+
|
4
|
+
ACCESS_QUESTION = 'What is your AWS Access Key? '
|
5
|
+
SECRET_QUESTION = 'What is your AWS Secret Key? '
|
6
|
+
|
7
|
+
module Skyed
|
8
|
+
# This module encapsulates all the AWS related functions.
|
9
|
+
module AWS
|
10
|
+
class << self
|
11
|
+
def region
|
12
|
+
ENV['AWS_DEFAULT_REGION'] || 'us-east-1'
|
13
|
+
end
|
14
|
+
|
15
|
+
def set_credentials(access, secret, skip_question = true)
|
16
|
+
access = ask(ACCESS_QUESTION) unless Skyed::AWS.valid_credential?(
|
17
|
+
'AWS_ACCESS_KEY') && skip_question
|
18
|
+
secret = ask(SECRET_QUESTION) unless Skyed::AWS.valid_credential?(
|
19
|
+
'AWS_SECRET_KEY') && skip_question
|
20
|
+
if Skyed::AWS.confirm_credentials?(access, secret)
|
21
|
+
Skyed::Settings.access_key = access
|
22
|
+
Skyed::Settings.secret_key = secret
|
23
|
+
else
|
24
|
+
set_credentials(access, secret, false)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def valid_credential?(env_var_name)
|
29
|
+
ENV[env_var_name] != '' && !ENV[env_var_name].nil?
|
30
|
+
end
|
31
|
+
|
32
|
+
def confirm_credentials?(access, secret)
|
33
|
+
client = Skyed::AWS::IAM.login(access, secret)
|
34
|
+
client.get_account_summary
|
35
|
+
true
|
36
|
+
rescue Aws::IAM::Errors::InvalidClientTokenId
|
37
|
+
false
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# This module encapsulates all the OpsWorks related functions.
|
42
|
+
module OpsWorks
|
43
|
+
STACK = {
|
44
|
+
name: '',
|
45
|
+
region: '',
|
46
|
+
service_role_arn: '',
|
47
|
+
default_instance_profile_arn: '',
|
48
|
+
default_os: 'Ubuntu 12.04 LTS',
|
49
|
+
default_ssh_key_name: '',
|
50
|
+
custom_cookbooks_source: {
|
51
|
+
type: 'git'
|
52
|
+
},
|
53
|
+
configuration_manager: {
|
54
|
+
name: 'Chef',
|
55
|
+
version: '11.10'
|
56
|
+
},
|
57
|
+
use_custom_cookbooks: true,
|
58
|
+
use_opsworks_security_groups: false
|
59
|
+
}
|
60
|
+
LAYER = {
|
61
|
+
stack_id: nil,
|
62
|
+
type: 'custom',
|
63
|
+
name: '',
|
64
|
+
shortname: '',
|
65
|
+
custom_security_group_ids: []
|
66
|
+
}
|
67
|
+
|
68
|
+
class << self
|
69
|
+
def create_layer(layer_params, opsworks)
|
70
|
+
layer = opsworks.create_layer(layer_params)
|
71
|
+
Skyed::Settings.layer_id = layer.data[:layer_id]
|
72
|
+
end
|
73
|
+
|
74
|
+
def create_stack(stack_params, opsworks)
|
75
|
+
stack = opsworks.create_stack(stack_params)
|
76
|
+
Skyed::Settings.stack_id = stack.data[:stack_id]
|
77
|
+
end
|
78
|
+
|
79
|
+
def delete_stack(stack_name, opsworks)
|
80
|
+
total = count_instances(stack_name, opsworks)
|
81
|
+
error_msg = "Stack with name #{stack_name}"
|
82
|
+
error_msg += ' exists and contains instances'
|
83
|
+
fail error_msg unless total == 0
|
84
|
+
stack = stack_by_name(stack_name, opsworks)
|
85
|
+
opsworks.delete_stack(stack_id: stack[:stack_id])
|
86
|
+
end
|
87
|
+
|
88
|
+
def count_instances(stack_name, opsworks)
|
89
|
+
stack_summary = stack_summary_by_name(stack_name, opsworks)
|
90
|
+
return nil if stack_summary.nil?
|
91
|
+
total = stack_summary[:instances_count].values.compact.inject(:+) || 0
|
92
|
+
total
|
93
|
+
end
|
94
|
+
|
95
|
+
def stack_summary_by_name(stack_name, opsworks)
|
96
|
+
stack = stack_by_name(stack_name, opsworks)
|
97
|
+
opsworks.describe_stack_summary(
|
98
|
+
stack_id: stack[:stack_id])[:stack_summary] unless stack.nil?
|
99
|
+
end
|
100
|
+
|
101
|
+
def stack_by_name(stack_name, opsworks)
|
102
|
+
stacks(opsworks).select { |x| x[:name] == stack_name }[0] || nil
|
103
|
+
end
|
104
|
+
|
105
|
+
def stacks(opsworks)
|
106
|
+
opsworks.describe_stacks[:stacks]
|
107
|
+
end
|
108
|
+
|
109
|
+
def basic_stack_params
|
110
|
+
params = STACK
|
111
|
+
params[:name] = ENV['USER']
|
112
|
+
params[:region] = Skyed::AWS.region
|
113
|
+
params[:service_role_arn] = Skyed::Settings.role_arn
|
114
|
+
params[:default_instance_profile_arn] = Skyed::Settings.profile_arn
|
115
|
+
params[:default_ssh_key_name] = Skyed::Settings.aws_key_name
|
116
|
+
params
|
117
|
+
end
|
118
|
+
|
119
|
+
def custom_cookbooks_source(base_source)
|
120
|
+
base_source[:url] = Skyed::Settings.remote_url
|
121
|
+
base_source[:revision] = Skyed::Settings.branch
|
122
|
+
base_source[:ssh_key] = Skyed::Utils.read_key_file(
|
123
|
+
Skyed::Settings.opsworks_git_key)
|
124
|
+
base_source
|
125
|
+
end
|
126
|
+
|
127
|
+
def configuration_manager(base_config, options)
|
128
|
+
base_config[:name] = 'Chef'
|
129
|
+
base_config[:version] = options[:chef_version] || '11.10'
|
130
|
+
base_config
|
131
|
+
end
|
132
|
+
|
133
|
+
def generate_params(stack_id = nil, options = {})
|
134
|
+
params = generate_layer_params(stack_id) unless stack_id.nil?
|
135
|
+
params = generate_stack_params(options) if stack_id.nil?
|
136
|
+
params
|
137
|
+
end
|
138
|
+
|
139
|
+
def generate_layer_params(stack_id)
|
140
|
+
params = LAYER
|
141
|
+
params[:stack_id] = stack_id
|
142
|
+
params[:name] = "test-#{ENV['USER']}"
|
143
|
+
params[:shortname] = "test-#{ENV['USER']}"
|
144
|
+
params[:custom_security_group_ids] = ['sg-f1cc2498']
|
145
|
+
params
|
146
|
+
end
|
147
|
+
|
148
|
+
def generate_stack_params(options)
|
149
|
+
params = basic_stack_params
|
150
|
+
params[:custom_cookbooks_source] = custom_cookbooks_source(
|
151
|
+
STACK[:custom_cookbooks_source])
|
152
|
+
params[:configuration_manager] = configuration_manager(
|
153
|
+
STACK[:configuration_manager], options)
|
154
|
+
puts params
|
155
|
+
params
|
156
|
+
end
|
157
|
+
|
158
|
+
def login(
|
159
|
+
access = Skyed::Settings.access_key,
|
160
|
+
secret = Skyed::Settings.secret_key,
|
161
|
+
region = Skyed::AWS.region)
|
162
|
+
Aws::OpsWorks::Client.new(
|
163
|
+
access_key_id: access,
|
164
|
+
secret_access_key: secret,
|
165
|
+
region: region)
|
166
|
+
end
|
167
|
+
|
168
|
+
def set_arns(service_role = nil, instance_profile = nil)
|
169
|
+
iam = Skyed::AWS::IAM.login
|
170
|
+
Skyed::Settings.role_arn = service_role || iam.get_role(
|
171
|
+
role_name: 'aws-opsworks-service-role')[:role][:arn]
|
172
|
+
Skyed::Settings.profile_arn = instance_profile || iam
|
173
|
+
.get_instance_profile(
|
174
|
+
instance_profile_name: 'aws-opsworks-ec2-role'
|
175
|
+
)[:instance_profile][:arn]
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
# This module encapsulates all the IAM related functions.
|
181
|
+
module IAM
|
182
|
+
class << self
|
183
|
+
def login(
|
184
|
+
access = Skyed::Settings.access_key,
|
185
|
+
secret = Skyed::Settings.secret_key,
|
186
|
+
region = Skyed::AWS.region)
|
187
|
+
Aws::IAM::Client.new(
|
188
|
+
access_key_id: access,
|
189
|
+
secret_access_key: secret,
|
190
|
+
region: region)
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
data/lib/skyed/commands.rb
CHANGED
@@ -5,6 +5,9 @@ command :init do |cmd|
|
|
5
5
|
cmd.flag :remote, default_value: nil,
|
6
6
|
type: String,
|
7
7
|
desc: 'Remote to use in OpsWorks'
|
8
|
+
cmd.flag :chef_version, default_value: '11.10',
|
9
|
+
type: String,
|
10
|
+
desc: 'Chef version to use in OpsWorks'
|
8
11
|
cmd.action do |global_options, options|
|
9
12
|
Skyed::Init.execute(global_options, options)
|
10
13
|
end
|
data/lib/skyed/destroy.rb
CHANGED
@@ -6,7 +6,7 @@ module Skyed
|
|
6
6
|
repo_path = Skyed::Settings.repo
|
7
7
|
hostname = `cd #{repo_path} && vagrant ssh -c hostname`.strip
|
8
8
|
`cd #{repo_path} && vagrant destroy -f`
|
9
|
-
ow = Skyed::
|
9
|
+
ow = Skyed::AWS::OpsWorks.login
|
10
10
|
instances = ow.describe_instances(stack_id: Skyed::Settings.stack_id)
|
11
11
|
instances[:instances].each do |instance|
|
12
12
|
if instance[:hostname] == hostname
|
data/lib/skyed/init.rb
CHANGED
@@ -6,26 +6,6 @@ require 'aws-sdk'
|
|
6
6
|
require 'highline/import'
|
7
7
|
require 'digest/sha1'
|
8
8
|
|
9
|
-
ACCESS_QUESTION = 'What is your AWS Access Key? '
|
10
|
-
SECRET_QUESTION = 'What is your AWS Secret Key? '
|
11
|
-
|
12
|
-
STACK = { name: '',
|
13
|
-
region: '',
|
14
|
-
service_role_arn: '',
|
15
|
-
default_instance_profile_arn: '',
|
16
|
-
default_os: 'Ubuntu 12.04 LTS',
|
17
|
-
default_ssh_key_name: '',
|
18
|
-
custom_cookbooks_source: {
|
19
|
-
type: 'git'
|
20
|
-
},
|
21
|
-
configuration_manager: {
|
22
|
-
name: 'Chef',
|
23
|
-
version: '11.10'
|
24
|
-
},
|
25
|
-
use_custom_cookbooks: true,
|
26
|
-
use_opsworks_security_groups: false
|
27
|
-
}
|
28
|
-
|
29
9
|
module Skyed
|
30
10
|
# This module encapsulates all the init command steps.
|
31
11
|
module Init
|
@@ -36,86 +16,26 @@ module Skyed
|
|
36
16
|
branch global_options, options
|
37
17
|
credentials
|
38
18
|
opsworks_git_key
|
39
|
-
opsworks
|
19
|
+
opsworks options
|
40
20
|
vagrant
|
41
21
|
Skyed::Settings.save
|
42
22
|
end
|
43
23
|
|
44
|
-
def opsworks
|
45
|
-
opsworks =
|
46
|
-
params =
|
24
|
+
def opsworks(options = {})
|
25
|
+
opsworks = Skyed::AWS::OpsWorks.login
|
26
|
+
params = Skyed::AWS::OpsWorks.generate_params nil, options
|
47
27
|
check_stack(opsworks, params[:name])
|
48
|
-
|
49
|
-
Skyed::Settings.stack_id
|
50
|
-
Skyed::
|
51
|
-
layer_params(stack)).data[:layer_id]
|
28
|
+
Skyed::AWS::OpsWorks.create_stack(params, opsworks)
|
29
|
+
params = Skyed::AWS::OpsWorks.generate_params(Skyed::Settings.stack_id)
|
30
|
+
Skyed::AWS::OpsWorks.create_layer(params, opsworks)
|
52
31
|
end
|
53
32
|
|
54
33
|
def check_stack(ow, name)
|
55
|
-
|
56
|
-
stack
|
57
|
-
stack_summ = ow.describe_stack_summary(stack_id: stack[:stack_id])
|
58
|
-
delete_stack(ow, stack_summ[:stack_summary])
|
59
|
-
end
|
60
|
-
|
61
|
-
def delete_stack(ow, stack_summ)
|
62
|
-
total = stack_summ[:instances_count].values.compact.inject(:+)
|
63
|
-
total ||= 0
|
64
|
-
error_msg = "Stack with name #{stack_summ[:name]}"
|
65
|
-
error_msg += ' exists and contains instances'
|
66
|
-
fail error_msg unless total == 0
|
67
|
-
ow.delete_stack(stack_id: stack_summ[:stack_id])
|
34
|
+
stack = Skyed::AWS::OpsWorks.stack_summary_by_name(name, ow)
|
35
|
+
Skyed::AWS::OpsWorks.delete_stack(stack[:name], ow) unless stack.nil?
|
68
36
|
File.delete(vagrantfile) if File.exist?(vagrantfile)
|
69
37
|
end
|
70
38
|
|
71
|
-
def layer_params(stack_id)
|
72
|
-
# TODO: Include extra layer parameters
|
73
|
-
{ stack_id: stack_id,
|
74
|
-
type: 'custom',
|
75
|
-
name: "test-#{ENV['USER']}",
|
76
|
-
shortname: "test-#{ENV['USER']}",
|
77
|
-
custom_security_group_ids: ['sg-f1cc2498'] }
|
78
|
-
end
|
79
|
-
|
80
|
-
def stack_params
|
81
|
-
# TODO: Include extra stack parameters
|
82
|
-
result = STACK
|
83
|
-
result[:name] = ENV['USER']
|
84
|
-
result[:region] = region
|
85
|
-
result[:service_role_arn] = Skyed::Settings.role_arn
|
86
|
-
result[:default_instance_profile_arn] = Skyed::Settings.profile_arn
|
87
|
-
result[:default_ssh_key_name] = Skyed::Settings.aws_key_name
|
88
|
-
result[:custom_cookbooks_source] = custom_cookbooks_source(
|
89
|
-
STACK[:custom_cookbooks_source])
|
90
|
-
result
|
91
|
-
end
|
92
|
-
|
93
|
-
def custom_cookbooks_source(base_source)
|
94
|
-
base_source[:url] = Skyed::Settings.remote_url
|
95
|
-
base_source[:revision] = Skyed::Settings.branch
|
96
|
-
base_source[:ssh_key] = read_key_file(Skyed::Settings.opsworks_git_key)
|
97
|
-
base_source
|
98
|
-
end
|
99
|
-
|
100
|
-
def read_key_file(key_file)
|
101
|
-
File.open(key_file, 'rb').read
|
102
|
-
end
|
103
|
-
|
104
|
-
def region
|
105
|
-
ENV['DEFAULT_REGION'] || 'us-east-1'
|
106
|
-
end
|
107
|
-
|
108
|
-
def ow_client(
|
109
|
-
access = Skyed::Settings.access_key,
|
110
|
-
secret = Skyed::Settings.secret_key,
|
111
|
-
region = ENV['AWS_REGION'])
|
112
|
-
region ||= 'us-east-1'
|
113
|
-
Aws::OpsWorks::Client.new(
|
114
|
-
access_key_id: access,
|
115
|
-
secret_access_key: secret,
|
116
|
-
region: region)
|
117
|
-
end
|
118
|
-
|
119
39
|
def vagrantfile
|
120
40
|
File.join(Skyed::Settings.repo, 'Vagrantfile')
|
121
41
|
end
|
@@ -220,44 +140,11 @@ module Skyed
|
|
220
140
|
role_arn = ENV['OW_SERVICE_ROLE'],
|
221
141
|
profile_arn = ENV['OW_INSTANCE_PROFILE'],
|
222
142
|
aws_key_name = ENV['AWS_SSH_KEY_NAME'])
|
223
|
-
|
224
|
-
set_arns(
|
143
|
+
Skyed::AWS.set_credentials(access, secret)
|
144
|
+
Skyed::AWS::OpsWorks.set_arns(profile_arn, role_arn)
|
225
145
|
Skyed::Settings.aws_key_name = aws_key_name
|
226
146
|
end
|
227
147
|
|
228
|
-
def set_arns(iam, profile_arn, role_arn)
|
229
|
-
Skyed::Settings.role_arn = role_arn || iam
|
230
|
-
.get_role(role_name: 'aws-opsworks-service-role')[:role][:arn]
|
231
|
-
key = :instance_profile
|
232
|
-
Skyed::Settings.profile_arn = profile_arn || iam
|
233
|
-
.get_instance_profile(
|
234
|
-
instance_profile_name: 'aws-opsworks-ec2-role')[key][:arn]
|
235
|
-
end
|
236
|
-
|
237
|
-
def aws_access_key(access, secret)
|
238
|
-
access = ask(ACCESS_QUESTION) unless valid_credential?('AWS_ACCESS_KEY')
|
239
|
-
secret = ask(SECRET_QUESTION) unless valid_credential?('AWS_SECRET_KEY')
|
240
|
-
iam = iam_client(access, secret)
|
241
|
-
Skyed::Settings.access_key = access
|
242
|
-
Skyed::Settings.secret_key = secret
|
243
|
-
iam
|
244
|
-
end
|
245
|
-
|
246
|
-
def iam_client(
|
247
|
-
access = Skyed::Settings.access_key,
|
248
|
-
secret = Skyed::Settings.secret_key,
|
249
|
-
region = ENV['AWS_REGION'])
|
250
|
-
region ||= 'us-east-1'
|
251
|
-
Aws::IAM::Client.new(
|
252
|
-
access_key_id: access,
|
253
|
-
secret_access_key: secret,
|
254
|
-
region: region)
|
255
|
-
end
|
256
|
-
|
257
|
-
def valid_credential?(env_name)
|
258
|
-
ENV[env_name] != '' && !ENV[env_name].nil?
|
259
|
-
end
|
260
|
-
|
261
148
|
def repo_path(repo)
|
262
149
|
Pathname.new(repo.repo.path).dirname
|
263
150
|
end
|
data/lib/skyed/run.rb
CHANGED
@@ -8,7 +8,7 @@ module Skyed
|
|
8
8
|
else
|
9
9
|
recipes = check_recipes_exist(args)
|
10
10
|
check_vagrant
|
11
|
-
execute_recipes(Skyed::
|
11
|
+
execute_recipes(Skyed::AWS::OpsWorks.login, recipes)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
@@ -80,7 +80,7 @@ module Skyed
|
|
80
80
|
|
81
81
|
def login
|
82
82
|
Skyed::Init.credentials if Skyed::Settings.empty?
|
83
|
-
Skyed::
|
83
|
+
Skyed::AWS::OpsWorks.login
|
84
84
|
end
|
85
85
|
|
86
86
|
def check_run_options(options)
|
data/lib/skyed/utils.rb
ADDED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: skyed
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ignasi Fosch
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04
|
11
|
+
date: 2015-05-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: git
|
@@ -75,12 +75,14 @@ extra_rdoc_files: []
|
|
75
75
|
files:
|
76
76
|
- bin/skyed
|
77
77
|
- lib/skyed.rb
|
78
|
+
- lib/skyed/aws.rb
|
78
79
|
- lib/skyed/commands.rb
|
79
80
|
- lib/skyed/deploy.rb
|
80
81
|
- lib/skyed/destroy.rb
|
81
82
|
- lib/skyed/init.rb
|
82
83
|
- lib/skyed/run.rb
|
83
84
|
- lib/skyed/settings.rb
|
85
|
+
- lib/skyed/utils.rb
|
84
86
|
- templates/Vagrantfile.erb
|
85
87
|
- templates/config.j2.erb
|
86
88
|
- templates/credentials.j2.erb
|