skyed 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fdc2aafbb0979d101620f458cbd8f17d9b06b240
4
- data.tar.gz: 92c11933e258486e5a232535454bd55350c8c0ba
3
+ metadata.gz: 2c46e5e72681a7be284fd66a907566388b020efa
4
+ data.tar.gz: 8ef8a62b6fb7dcb24252f74d514244c1299a4fe2
5
5
  SHA512:
6
- metadata.gz: c2bd1237fc72ad8c25c7969ea2bf69d6fda97e307311ba4b30c05437e1794760aaf83406e922f2e1af83b674bc50edfc296ba627f76a1391952e0c0a57ed5a61
7
- data.tar.gz: 7098f09576a42add8f0ce5391f420eff038e4d7331d030b23a0b5506c2a65e3a22a1cc999b0946a75453f0331f54a7fb035f18f179bc454ec17ff0fab8576653
6
+ metadata.gz: e1d94f210a7f91c6844e876c45f7b7650cde0b53f85483555f691f981ff9932b4a9d57a3e34909f91d1603d773457fdacf8a0d97f7181f6b65c9ca18eea875c8
7
+ data.tar.gz: 2623193f4441a5d00d29ad7a691fed3291b69eb9e42fa7f56c745dd3b8048818903c960530ee2335ecdb8e1b2dac9fcd4e04efa18a697fc06501b5b4cf979bed
@@ -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.2'
11
+ VERSION = '0.1.5'
10
12
  end
@@ -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
@@ -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
@@ -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::Init.ow_client
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
@@ -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 = ow_client
46
- params = stack_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
- stack = opsworks.create_stack(params).data[:stack_id]
49
- Skyed::Settings.stack_id = stack
50
- Skyed::Settings.layer_id = opsworks.create_layer(
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
- stacks = ow.describe_stacks[:stacks]
56
- stack = stacks.select { |x| x[:name] == name }[0] || return
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
- iam = aws_access_key(access, secret)
224
- set_arns(iam, profile_arn, role_arn)
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
@@ -8,7 +8,7 @@ module Skyed
8
8
  else
9
9
  recipes = check_recipes_exist(args)
10
10
  check_vagrant
11
- execute_recipes(Skyed::Init.ow_client, recipes)
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::Init.ow_client
83
+ Skyed::AWS::OpsWorks.login
84
84
  end
85
85
 
86
86
  def check_run_options(options)
@@ -0,0 +1,10 @@
1
+ module Skyed
2
+ # This module encapsulates some generic utility functions.
3
+ module Utils
4
+ class << self
5
+ def read_key_file(key_file)
6
+ File.open(key_file, 'rb').read
7
+ end
8
+ end
9
+ end
10
+ end
@@ -9,7 +9,7 @@
9
9
  aws_opsworks_layer_id: ´{{ aws_opsworks_layer_id }}´
10
10
  tasks:
11
11
  - name: Install pip
12
- apt: name=python-pip
12
+ apt: name=python-pip update_cache=yes
13
13
  - name: Install AWS CLI
14
14
  pip: name=awscli
15
15
  - name: Prepare directory for AWS credentials
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
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-15 00:00:00.000000000 Z
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