skyed 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d4681aeb911a86e19ff48c5728d0a96d85896d76
4
+ data.tar.gz: b0753c54b56e424066bf53cdce98f34c2c8eea9c
5
+ SHA512:
6
+ metadata.gz: f6ac335374e0d6550126002c93a388f6b0e758ad58a03929b92770d55a6e2474a058eb56685cc5a3a49d0ad835b52683663900d6314c1a2e1d6c643b60ab58eb
7
+ data.tar.gz: 494946d8482f9d70a99297ee46815ece8e882aa045a8adb61cf281182123baefc555633978d92cfee916819b04db6be3cc69100ae61dee367fdeeac6f21f436e
data/bin/skyed ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ project_path = File.dirname(File.dirname(__FILE__))
3
+ $LOAD_PATH.unshift project_path + '/lib'
4
+
5
+ require 'gli'
6
+ require 'skyed'
7
+
8
+ include GLI::App
9
+
10
+ program_desc 'Are you surrounded by sky?'
11
+ Skyed::Settings.load!
12
+
13
+ switch [:q, :quiet]
14
+
15
+ require 'skyed/commands'
16
+
17
+ exit run(ARGV)
data/lib/skyed.rb ADDED
@@ -0,0 +1,10 @@
1
+ require 'skyed/destroy'
2
+ require 'skyed/run'
3
+ require 'skyed/deploy'
4
+ require 'skyed/init'
5
+ require 'skyed/settings'
6
+
7
+ # Skyed is a set of tools for cloud computing
8
+ module Skyed
9
+ VERSION = '0.1.1'
10
+ end
@@ -0,0 +1,49 @@
1
+ desc 'Initialize skyed'
2
+ long_desc 'Sets up skyed configuration for a repository'
3
+
4
+ command :init do |cmd|
5
+ cmd.flag :remote, default_value: nil,
6
+ type: String,
7
+ desc: 'Remote to use in OpsWorks'
8
+ cmd.action do |global_options, options|
9
+ Skyed::Init.execute(global_options, options)
10
+ end
11
+ end
12
+
13
+ desc 'Deploy current setup'
14
+ long_desc 'Deploys from current repository'
15
+
16
+ command :deploy do |cmd|
17
+ cmd.action do |global_options|
18
+ Skyed::Deploy.execute(global_options)
19
+ end
20
+ end
21
+
22
+ desc 'Run specific recipes on instance'
23
+ long_desc 'Runs specified recipes on all running instances'
24
+
25
+ stack_desc = 'Stack to which the run affects.'
26
+ layer_desc = 'Layer to which the run affects.'
27
+ command :run do |cmd|
28
+ cmd.flag [:s, :stack], default_value: nil,
29
+ type: String,
30
+ desc: stack_desc
31
+ cmd.flag [:l, :layer], default_value: nil,
32
+ type: String,
33
+ desc: layer_desc
34
+ cmd.flag [:w, :wait_interval], default_value: 30,
35
+ type: Integer,
36
+ desc: 'Time to wait for AWS responses'
37
+ cmd.action do |global_options, options, args|
38
+ Skyed::Run.execute(global_options, options, args)
39
+ end
40
+ end
41
+
42
+ desc 'Destroy instance'
43
+ long_desc 'Destroy instance'
44
+
45
+ command :destroy do |cmd|
46
+ cmd.action do |global_options, options, args|
47
+ Skyed::Destroy.execute(global_options, options, args)
48
+ end
49
+ end
@@ -0,0 +1,19 @@
1
+ module Skyed
2
+ # This module encapsulates all the deploy command steps.
3
+ module Deploy
4
+ class << self
5
+ def execute(global_options)
6
+ fail 'Not initialized, please run skyed init' if Skyed::Settings.empty?
7
+ push_devel_branch(global_options)
8
+ output = `cd #{Skyed::Settings.repo} && vagrant up`
9
+ fail output unless $CHILD_STATUS.success?
10
+ $CHILD_STATUS.success?
11
+ end
12
+
13
+ def push_devel_branch(_global_options)
14
+ repo = Git.open(Skyed::Settings.repo)
15
+ repo.push(Skyed::Settings.remote_name, Skyed::Settings.branch)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module Skyed
2
+ # This module encapsulates all the destroy command steps.
3
+ module Destroy
4
+ class << self
5
+ def execute(_global_options, _options, _args)
6
+ repo_path = Skyed::Settings.repo
7
+ hostname = `cd #{repo_path} && vagrant ssh -c hostname`.strip
8
+ `cd #{repo_path} && vagrant destroy -f`
9
+ ow = Skyed::Init.ow_client
10
+ instances = ow.describe_instances(stack_id: Skyed::Settings.stack_id)
11
+ instances[:instances].each do |instance|
12
+ if instance[:hostname] == hostname
13
+ ow.deregister_instance(instance_id: instance[:instance_id])
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
data/lib/skyed/init.rb ADDED
@@ -0,0 +1,285 @@
1
+ require 'English'
2
+ require 'fileutils'
3
+ require 'erb'
4
+ require 'git'
5
+ require 'aws-sdk'
6
+ require 'highline/import'
7
+ require 'digest/sha1'
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
+ module Skyed
30
+ # This module encapsulates all the init command steps.
31
+ module Init
32
+ class << self
33
+ def execute(global_options, options)
34
+ fail 'Already initialized' unless Skyed::Settings.empty?
35
+ Skyed::Settings.repo = repo_path(get_repo).to_s
36
+ branch global_options, options
37
+ credentials
38
+ opsworks_git_key
39
+ opsworks
40
+ vagrant
41
+ Skyed::Settings.save
42
+ end
43
+
44
+ def opsworks
45
+ opsworks = ow_client
46
+ params = stack_params
47
+ 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]
52
+ end
53
+
54
+ 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])
68
+ File.delete(vagrantfile) if File.exist?(vagrantfile)
69
+ end
70
+
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
+ def vagrantfile
120
+ File.join(Skyed::Settings.repo, 'Vagrantfile')
121
+ end
122
+
123
+ def create_vagrant_files
124
+ provisioning_path = File.join(Skyed::Settings.repo, '.provisioning')
125
+ tasks_path = File.join(provisioning_path, 'tasks')
126
+ aws_path = File.join(provisioning_path, 'templates', 'aws')
127
+ create_template(Skyed::Settings.repo, 'Vagrantfile',
128
+ 'templates/Vagrantfile.erb')
129
+ create_template(tasks_path, 'ow-on-premise.yml',
130
+ 'templates/ow-on-premise.yml.erb')
131
+ create_template(aws_path, 'config.j2', 'templates/config.j2.erb')
132
+ create_template(aws_path, 'credentials.j2',
133
+ 'templates/credentials.j2.erb')
134
+ end
135
+
136
+ def vagrant
137
+ return if File.exist?(vagrantfile)
138
+ pip_install 'ansible'
139
+ create_directory(Skyed::Settings.repo, '.provisioning/templates/aws')
140
+ create_directory(Skyed::Settings.repo, '.provisioning/tasks')
141
+ create_vagrant_files
142
+ end
143
+
144
+ def create_template(base, subpath, template_file)
145
+ b = binding
146
+ folders = subpath.split('/')
147
+ template = ERB.new(
148
+ File.read(
149
+ File.join(
150
+ File.dirname(File.dirname(File.dirname(__FILE__))),
151
+ template_file)))
152
+ File.open(File.join(base, folders), 'w') do |f|
153
+ f.write(template.result b)
154
+ end
155
+ end
156
+
157
+ def create_directory(base, subpath)
158
+ folders = subpath.split('/')
159
+ new_dir = File.join(base, folders)
160
+ FileUtils.mkdir_p(new_dir)
161
+ end
162
+
163
+ def pip_install(package)
164
+ `pip list | grep #{package}`
165
+ return if $CHILD_STATUS.success?
166
+ `which pip`
167
+ easy_install 'pip' unless $CHILD_STATUS.success?
168
+ `sudo pip install #{package}`
169
+ fail "Can't install #{package}" unless $CHILD_STATUS.success?
170
+ end
171
+
172
+ def easy_install(package)
173
+ `easy_install #{package}`
174
+ fail "Can't install #{package}" unless $CHILD_STATUS.success?
175
+ end
176
+
177
+ def branch(global_options, options)
178
+ branch = "devel-#{Digest::SHA1.hexdigest Skyed::Settings.repo}"
179
+ repo = repo?(Skyed::Settings.repo)
180
+ repo.branch(branch).checkout
181
+ Skyed::Settings.branch = branch
182
+ remote_data = git_remote_data(repo, global_options, options)
183
+ Skyed::Settings.remote_name = remote_data[:name]
184
+ Skyed::Settings.remote_url = remote_data[:url]
185
+ end
186
+
187
+ def git_remote_data(repo, _global_options, options = {})
188
+ name ||= options[:remote]
189
+ name = ask_remote_name(
190
+ repo.remotes.map(&:name)) if repo.remotes.length > 1 && name.nil?
191
+ name = repo.remotes[0].name if name.nil?
192
+ select_remote(name, repo.remotes)
193
+ end
194
+
195
+ def select_remote(name, remotes)
196
+ url = nil
197
+ remotes.each do |remote|
198
+ url = remote.url if remote.name == name
199
+ end
200
+ if url.nil?
201
+ { name: remotes[0].name, url: remotes[0].url }
202
+ else
203
+ { name: name, url: url }
204
+ end
205
+ end
206
+
207
+ def ask_remote_name(remotes_names)
208
+ question = 'Which remote should be used for the git repository? '
209
+ ask(question + remotes_names.to_s)
210
+ end
211
+
212
+ def opsworks_git_key
213
+ question = 'Which ssh key should be used for the git repository? '
214
+ Skyed::Settings.opsworks_git_key = ask(question)
215
+ end
216
+
217
+ def credentials(
218
+ access = ENV['AWS_ACCESS_KEY'],
219
+ secret = ENV['AWS_SECRET_KEY'],
220
+ role_arn = ENV['OW_SERVICE_ROLE'],
221
+ profile_arn = ENV['OW_INSTANCE_PROFILE'],
222
+ aws_key_name = ENV['AWS_SSH_KEY_NAME'])
223
+ iam = aws_access_key(access, secret)
224
+ set_arns(iam, profile_arn, role_arn)
225
+ Skyed::Settings.aws_key_name = aws_key_name
226
+ end
227
+
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
+ def repo_path(repo)
262
+ Pathname.new(repo.repo.path).dirname
263
+ end
264
+
265
+ def get_repo(path = '.', ask = true)
266
+ question = 'Which is your CM repository? '
267
+ repo = repo?(path)
268
+ if !repo
269
+ say("ERROR: #{path} is not a repository")
270
+ repo = get_repo(ask(question), false)
271
+ elsif ask
272
+ repo = get_repo(
273
+ ask(question) { |q| q.default = repo_path(repo).to_s }, false)
274
+ end
275
+ repo
276
+ end
277
+
278
+ def repo?(path)
279
+ Git.open(path)
280
+ rescue ArgumentError
281
+ return false
282
+ end
283
+ end
284
+ end
285
+ end
data/lib/skyed/run.rb ADDED
@@ -0,0 +1,126 @@
1
+ module Skyed
2
+ # This module encapsulates all the run command steps.
3
+ module Run
4
+ class << self
5
+ def execute(global_options, options, args)
6
+ if !options.nil? && options.key?(:stack) && !options[:stack].nil?
7
+ run(global_options, options, args)
8
+ else
9
+ recipes = check_recipes_exist(args)
10
+ check_vagrant
11
+ execute_recipes(Skyed::Init.ow_client, recipes)
12
+ end
13
+ end
14
+
15
+ def run(_global_options, options, args)
16
+ check_run_options(options)
17
+ ow = login
18
+ Skyed::Settings.stack_id = stack(ow, options)
19
+ Skyed::Settings.layer_id = layer(ow, options)
20
+ instances = running_instances(ow, Skyed::Settings.layer_id)
21
+ update_custom_cookbooks(ow, Skyed::Settings.stack_id, instances,
22
+ options[:wait_interval])
23
+ execute_recipes(ow, args, instances, options[:wait_interval])
24
+ end
25
+
26
+ def deploy_status(ow, id)
27
+ deploy = ow.describe_deployments(deployment_ids: [id[:deployment_id]])
28
+ deploy[:deployments].map do |s|
29
+ s[:status]
30
+ end.compact
31
+ end
32
+
33
+ def wait_for_deploy(ow, deploy_id, wait = 0)
34
+ status = deploy_status(ow, deploy_id)
35
+ while status[0] == 'running'
36
+ sleep(wait)
37
+ status = deploy_status(ow, deploy_id)
38
+ end
39
+ status
40
+ end
41
+
42
+ def update_custom_cookbooks(ow, stack_id, instances, wait = 0)
43
+ command = { name: 'update_custom_cookbooks' }
44
+ wait_for_deploy(ow, ow.create_deployment(
45
+ stack_id: stack_id,
46
+ instance_ids: instances,
47
+ command: command), wait)
48
+ end
49
+
50
+ def running_instances(ow, layer_id)
51
+ instances = ow.describe_instances(layer_id: layer_id)
52
+ instances[:instances].map do |instance|
53
+ instance[:instance_id] if instance[:status] != 'stopped'
54
+ end.compact
55
+ end
56
+
57
+ def layer(ow, options)
58
+ layers = ow.describe_layers(stack_id: options[:stack])[:layers]
59
+ layer = nil
60
+ layers.each do |layer_reply|
61
+ id = layer_reply[:layer_id]
62
+ layer = id if id == options[:layer]
63
+ end
64
+ msg = "There's no such layer with id #{options[:layer]}"
65
+ fail msg unless layer
66
+ layer
67
+ end
68
+
69
+ def stack(ow, options)
70
+ stacks = ow.describe_stacks[:stacks]
71
+ stack = nil
72
+ stacks.each do |stack_reply|
73
+ id = stack_reply[:stack_id]
74
+ stack = id if id == options[:stack]
75
+ end
76
+ msg = "There's no such stack with id #{options[:stack]}"
77
+ fail msg unless stack
78
+ stack
79
+ end
80
+
81
+ def login
82
+ Skyed::Init.credentials if Skyed::Settings.empty?
83
+ Skyed::Init.ow_client
84
+ end
85
+
86
+ def check_run_options(options)
87
+ msg = 'Specify stack and layer or initialize for local management'
88
+ fail msg unless options[:stack] && options[:layer]
89
+ end
90
+
91
+ def check_vagrant
92
+ output = `cd #{Skyed::Settings.repo} && vagrant status`
93
+ msg = 'Vagrant failed'
94
+ fail msg unless $CHILD_STATUS.success?
95
+ msg = 'Vagrant machine is not running'
96
+ fail msg unless output =~ /running/
97
+ end
98
+
99
+ def check_recipes_exist(args)
100
+ recipes = args.select { |recipe| recipe_in_cookbook(recipe) }
101
+ msg = "Couldn't found #{args - recipes} recipes in repository"
102
+ fail msg unless recipes == args
103
+ recipes
104
+ end
105
+
106
+ def execute_recipes(ow, recipes, instances = nil, wait = 0)
107
+ command = { name: 'execute_recipes', args: { recipes: recipes } }
108
+ deploy_params = { stack_id: Skyed::Settings.stack_id, command: command }
109
+ deploy_params[:instance_ids] = instances unless instances.nil?
110
+ deploy_id = ow.create_deployment(deploy_params)
111
+ wait_for_deploy(ow, deploy_id, wait)
112
+ end
113
+
114
+ def recipe_in_cookbook(recipe)
115
+ cookbook, recipe = recipe.split('::')
116
+ recipe = 'default' if recipe.nil?
117
+ File.exist?(
118
+ File.join(
119
+ Skyed::Settings.repo,
120
+ cookbook,
121
+ 'recipes',
122
+ "#{recipe}.rb"))
123
+ end
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,40 @@
1
+ module Skyed
2
+ # This module encapsulates settings for Skyed
3
+ module Settings
4
+ CONFIG_FILE = "#{ENV['HOME']}/.skyed"
5
+ @_settings = {}
6
+ attr_accessor :_settings
7
+
8
+ class << self
9
+ def load!(filename = CONFIG_FILE)
10
+ newsets = {}
11
+ newsets = YAML.load_file(filename) if File.file? filename
12
+ deep_merge!(@_settings, newsets)
13
+ end
14
+
15
+ def empty?
16
+ @_settings.empty?
17
+ end
18
+
19
+ def deep_merge!(target, data)
20
+ merger = proc do |_, v1, v2|
21
+ v1.is_a?(Hash) && v2.is_a?(Hash) ? v1.merge(v2, &merger) : v2
22
+ end
23
+ target.merge! data, &merger
24
+ end
25
+
26
+ def method_missing(name, *args)
27
+ if name.match(/.*=/)
28
+ @_settings[name.to_s.split('=')[0]] = args[0]
29
+ else
30
+ @_settings[name.to_s] ||
31
+ fail(NoMethodError, "unknown configuration root #{name}", caller)
32
+ end
33
+ end
34
+
35
+ def save(filename = CONFIG_FILE)
36
+ File.open(filename, 'w') { |f| YAML.dump @_settings, f }
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ # -*- mode: ruby -*-
2
+ # vi: set ft=ruby :
3
+
4
+ ram = ENV['VAGRANT_RAM'] || '2048'
5
+ aws_access_key_id = ENV['AWS_ACCESS_KEY_ID'] || ENV['AWS_ACCESS_KEY']
6
+ aws_access_key_id ||= 'AAAAAA'
7
+ aws_secret_access_key = ENV['AWS_SECRET_ACCESS_KEY'] || ENV['AWS_SECRET_KEY']
8
+ aws_secret_access_key ||= 'AAAAAA'
9
+ aws_session_token = ENV['AWS_SESSION_TOKEN'] || ''
10
+ aws_default_region = ENV['AWS_DEFAULT_REGION'] || 'us-east-1'
11
+ aws_opsworks_stack_id = '<%= Skyed::Settings.stack_id %>'
12
+ aws_opsworks_layer_id = '<%= Skyed::Settings.layer_id %>'
13
+
14
+ # Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
15
+ VAGRANTFILE_API_VERSION = '2'
16
+
17
+ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
18
+ config.vm.hostname = "test-#{ENV['USER']}"
19
+
20
+ config.vm.provider :virtualbox do |virtualbox, override|
21
+ override.vm.box = 'trusty-cloudimg-64'
22
+ override.vm.box_url = 'https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box'
23
+ override.vm.network :forwarded_port, host: 9200, guest: 9200
24
+ override.vm.network :forwarded_port, host: 9300, guest: 9300
25
+ virtualbox.memory = ram.to_i
26
+ virtualbox.cpus = 2
27
+ end
28
+
29
+ config.vm.provision :ansible do |ansible|
30
+ ansible.playbook = '.provisioning/tasks/ow-on-premise.yml'
31
+ ansible.extra_vars = {
32
+ aws_access_key_id: aws_access_key_id,
33
+ aws_secret_access_key: aws_secret_access_key,
34
+ aws_session_token: aws_session_token,
35
+ aws_default_region: aws_default_region,
36
+ aws_opsworks_stack_id: aws_opsworks_stack_id,
37
+ aws_opsworks_layer_id: aws_opsworks_layer_id
38
+ }
39
+ end
40
+ end
@@ -0,0 +1,2 @@
1
+ [default]
2
+ region = {{ aws_default_region }}
@@ -0,0 +1,6 @@
1
+ [default]
2
+ aws_access_key_id = {{ aws_access_key_id }}
3
+ aws_secret_access_key = {{ aws_secret_access_key }}
4
+ {% if aws_session_token -%}
5
+ aws_session_token = {{ aws_session_token }}
6
+ {%- endif %}
@@ -0,0 +1,52 @@
1
+ - hosts: all
2
+ sudo: true
3
+ vars:
4
+ aws_access_key_id: ´{{ aws_access_key_id }}´
5
+ aws_secret_access_key: ´{{ aws_secret_access_key }}´
6
+ aws_session_token: ´{{ aws_session_token }}´
7
+ aws_default_region: ´{{ aws_default_region }}´
8
+ aws_opsworks_stack_id: ´{{ aws_opsworks_stack_id }}´
9
+ aws_opsworks_layer_id: ´{{ aws_opsworks_layer_id }}´
10
+ tasks:
11
+ - name: Install pip
12
+ apt: name=python-pip
13
+ - name: Install AWS CLI
14
+ pip: name=awscli
15
+ - name: Prepare directory for AWS credentials
16
+ file: path=/home/vagrant/.aws state=directory owner=vagrant group=vagrant mode=0700
17
+ - name: Setup AWS credentials
18
+ template: src=../templates/aws/credentials.j2 dest=/home/vagrant/.aws/credentials owner=vagrant group=vagrant mode=0600
19
+ - name: Setup AWS config
20
+ template: src=../templates/aws/config.j2 dest=/home/vagrant/.aws/config owner=vagrant group=vagrant mode=0644
21
+ - name: Register into opsworks
22
+ shell: aws opsworks register --infrastructure-class on-premises --local --stack-id {{ aws_opsworks_stack_id }}
23
+ args:
24
+ creates: /opt/aws/opsworks
25
+ sudo: false
26
+ register: ow_register
27
+ - name: Debug OW registration
28
+ debug: var=ow_register
29
+ - name: Save the instance ID
30
+ set_fact: ow_instance_id={{ ow_register.stderr.split()[-1] }}
31
+ when: ow_register|success
32
+ - name: Debug OW registration
33
+ debug: var=ow_instance_id
34
+ - name: Wait for the instance to be registered
35
+ shell: aws opsworks describe-instances --instance-id {{ ow_instance_id }} | grep -c registered
36
+ sudo: false
37
+ ignore_errors: true
38
+ register: result
39
+ until: result.stdout == "1"
40
+ retries: 30
41
+ delay: 10
42
+ - name: Debug registration
43
+ debug: var=result
44
+ when: result|failed
45
+ - name: Assign layer in opsworks
46
+ shell: aws opsworks assign-instance --instance-id {{ ow_instance_id }} --layer-id {{ aws_opsworks_layer_id}}
47
+ sudo: false
48
+ register: ow_assign
49
+ ignore_errors: true
50
+ - name: Debug OW layer assign
51
+ debug: var=ow_assign
52
+ when: ow_assign|failed
metadata ADDED
@@ -0,0 +1,112 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: skyed
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Ignasi Fosch
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-04-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: git
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 1.2.8
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 1.2.8
27
+ - !ruby/object:Gem::Dependency
28
+ name: aws-sdk
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 2.0.33
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 2.0.33
41
+ - !ruby/object:Gem::Dependency
42
+ name: gli
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 2.12.2
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 2.12.2
55
+ - !ruby/object:Gem::Dependency
56
+ name: highline
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 1.6.21
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 1.6.21
69
+ description: A cloudy gem
70
+ email: natx@y10k.ws
71
+ executables:
72
+ - skyed
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - bin/skyed
77
+ - lib/skyed.rb
78
+ - lib/skyed/commands.rb
79
+ - lib/skyed/deploy.rb
80
+ - lib/skyed/destroy.rb
81
+ - lib/skyed/init.rb
82
+ - lib/skyed/run.rb
83
+ - lib/skyed/settings.rb
84
+ - templates/Vagrantfile.erb
85
+ - templates/config.j2.erb
86
+ - templates/credentials.j2.erb
87
+ - templates/ow-on-premise.yml.erb
88
+ homepage: http://rubygems.org/gems/skyed
89
+ licenses:
90
+ - MIT
91
+ metadata: {}
92
+ post_install_message:
93
+ rdoc_options: []
94
+ require_paths:
95
+ - lib
96
+ required_ruby_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ required_rubygems_version: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ requirements: []
107
+ rubyforge_project:
108
+ rubygems_version: 2.4.3
109
+ signing_key:
110
+ specification_version: 4
111
+ summary: Are you surrounded by sky?
112
+ test_files: []