avst-cloud 0.1.7
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 +15 -0
- data/.gitignore +36 -0
- data/.travis.yml +16 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +191 -0
- data/README.md +201 -0
- data/Rakefile +4 -0
- data/avst-cloud.gemspec +28 -0
- data/bin/avst-cloud +99 -0
- data/bin/avst-cloud-puppet +173 -0
- data/bin/avst-cloud-rackspace +87 -0
- data/config/custom_system_config/hiera-configs/defaults/example.yaml +1 -0
- data/config/custom_system_config/hiera-configs/hostname1.yaml +12 -0
- data/config/custom_system_config/hiera-configs/hostname1_facts.yaml +53 -0
- data/config/custom_system_config/hiera-configs/templates/example.yaml +137 -0
- data/config/deploy.rb +79 -0
- data/config/deploy/production.rb +48 -0
- data/lib/avst-cloud.rb +28 -0
- data/lib/avst-cloud/aws_connection.rb +203 -0
- data/lib/avst-cloud/aws_server.rb +56 -0
- data/lib/avst-cloud/cloud_connection.rb +39 -0
- data/lib/avst-cloud/cloud_server.rb +89 -0
- data/lib/avst-cloud/logging.rb +36 -0
- data/lib/avst-cloud/rackspace_connection.rb +141 -0
- data/lib/avst-cloud/rackspace_server.rb +58 -0
- data/lib/avst-cloud/task.rb +288 -0
- data/lib/capistrano/tasks/prepare_puppet_and_execute.rake +90 -0
- metadata +188 -0
@@ -0,0 +1,137 @@
|
|
1
|
+
---
|
2
|
+
|
3
|
+
prefixes:
|
4
|
+
- "example_"
|
5
|
+
|
6
|
+
classes:
|
7
|
+
- baseusers
|
8
|
+
- packages_repos
|
9
|
+
- noconfigpkgs
|
10
|
+
- noconfigpkgs::git
|
11
|
+
|
12
|
+
dependencies:
|
13
|
+
- baseusers
|
14
|
+
- packages_repos
|
15
|
+
- noconfigpkgs
|
16
|
+
- apt
|
17
|
+
- yum
|
18
|
+
- puppi
|
19
|
+
- stdlib
|
20
|
+
|
21
|
+
|
22
|
+
# install packages
|
23
|
+
noconfigpkgs::default_packages:
|
24
|
+
RedHat:
|
25
|
+
- 'passwd'
|
26
|
+
- 'acl'
|
27
|
+
- 'diffutils'
|
28
|
+
- 'traceroute'
|
29
|
+
- 'sysstat'
|
30
|
+
- 'mailx'
|
31
|
+
- 'mtr'
|
32
|
+
- 'vim-enhanced'
|
33
|
+
- 'screen'
|
34
|
+
- 'wget'
|
35
|
+
- 'curl'
|
36
|
+
- 'unzip'
|
37
|
+
- 'tar'
|
38
|
+
- 'cyrus-sasl-plain'
|
39
|
+
- 'zsh'
|
40
|
+
Debian:
|
41
|
+
- 'zsh'
|
42
|
+
- 'sysstat'
|
43
|
+
- 'atop'
|
44
|
+
- 'at'
|
45
|
+
- 'vim'
|
46
|
+
- 'screen'
|
47
|
+
- 'wget'
|
48
|
+
- 'curl'
|
49
|
+
- 'unzip'
|
50
|
+
- 'tar'
|
51
|
+
|
52
|
+
# Create users
|
53
|
+
baseusers::users :
|
54
|
+
atlassian :
|
55
|
+
name : 'atlassian'
|
56
|
+
home : '/home/atlassian'
|
57
|
+
shell : '/bin/bash'
|
58
|
+
gid : 1010
|
59
|
+
uid : 1010
|
60
|
+
comment : 'atlassian User'
|
61
|
+
password : '*'
|
62
|
+
|
63
|
+
# create groups
|
64
|
+
baseusers::groups:
|
65
|
+
hosting :
|
66
|
+
name : 'atlassian'
|
67
|
+
gid : 1010
|
68
|
+
|
69
|
+
# create apt/yum repositories
|
70
|
+
packages_repos::repos:
|
71
|
+
Debian:
|
72
|
+
bintraybintray-adaptavist-deb:
|
73
|
+
location: 'https://dl.bintray.com/adaptavist/ubuntu/'
|
74
|
+
repos: '/dists/ubuntu/main/binary-amd64/'
|
75
|
+
include_src: false
|
76
|
+
release: ''
|
77
|
+
key: '8756C4F765C9AC3CB6B85D62379CE192D401AB61'
|
78
|
+
key_content: |
|
79
|
+
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
80
|
+
Version: GnuPG v1
|
81
|
+
|
82
|
+
mQINBFTi8JIBEACcN1ucQ1uCOZ1owTELQV/6i4q7NbYdJ5wf7yPYfEugSo3yfbo3
|
83
|
+
Pw/XEvlnpDZmT155sGNOkteZtZMdcm5XhFbdtquLlrkjAcUGatq5rAt3eLAlvU7u
|
84
|
+
CBCDJg3ZaqpZti5ti2TfiaXHeawTpxaTb3V5tT4NYhY0aJqe0MGoVl2yZyoKMWsL
|
85
|
+
8XcUiJkUYnpu98BvnzO9ORSnKWHk60YxzZuHh5buMNiV4aI331ogiTxqISzTwEdQ
|
86
|
+
ygtlp4IeqE6w4x4RUOqQg/mu0xhqnP375KksPtKALLEr9vgqsJXfWVa5UmNl+rZP
|
87
|
+
gMiNEt+Abwewa6IQGgSU8GuxMp3qHxZtJQRNwIPx/yb7FngtWrUKIoQXs9xJwdJB
|
88
|
+
z4vhfFVeQlyPkEycQNcRfHVzK62oF8L5Jj/D8BIGAD+dj3x10Cy+qVK6BTY/F1zv
|
89
|
+
5iL12LjSlz8DtmTbqjit0WGoULjXFZALAU36q6FmE/nMcFuLaTUIinGV4fMvLgf9
|
90
|
+
Zn44juAhZMweOt63Pn4n/K0W+uOdrLSmGxJDhoxztabUdIpIMsw44wZ8gnSmPAef
|
91
|
+
IDTCjJO2x9s2YuaZbgstpJldooxGJ+FTe52QXFphti+tkiGOg6Tpj8Xq3+ZEM3L9
|
92
|
+
Js38SSdys0XBCHYiCv3/4Fk4jspTsCFrDzJ9HqNjsiktxPm9szmUZ72RjwARAQAB
|
93
|
+
tChCaW50cmF5IChieSBKRnJvZykgPGJpbnRyYXlAYmludHJheS5jb20+iQI4BBMB
|
94
|
+
AgAiBQJU4vCSAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRA3nOGS1AGr
|
95
|
+
YTe6D/9lwml8fFJxfF2dI8GNPMmRAwnewu85JSWE/Yc3adlWL+NqXhUotDbSgUXl
|
96
|
+
RmC22fxBFaWipiCMjDm5R+dthOFmaBnnIdWmTvrTyupJlsYHCj1FN/5izgYpband
|
97
|
+
qFYbpdX34fOiH+kFVKOQI5WlMGvgYRTusk5pfORK87/e9zXFFuuc4OmgKgW0JX3c
|
98
|
+
faFp8HnJFVl6j7us384U/m06BBUbJb/az7IZNZXu0FPfL9jUIcWbGRWjmIdySE9b
|
99
|
+
yMOB95QPNlTrnGcjVuWa1gTN5uEbMRa5sVq6SAxmph5eGspJrJ05Bjwk5rS3LkLE
|
100
|
+
1tv31Bpeb+2jIoIXUJj8ESS/6bLK6/d7TbjMrdcRvSIZggf1u0JnjnsT6eYmfY1m
|
101
|
+
iVhKy4FFTyofDOlyt1k7lEYH+iJ4Z5ij/b6wpoUViKv+zqDRrSSbwun111f8rH7W
|
102
|
+
WldC3rEsH5R8J+jm54P5pwC/LnBg53GvofpntARLNUPvcFVp7Hjue3kbTVx51pxx
|
103
|
+
BBf593UnAXs+pZMyhl/synSngjpebufQHPeX1jJyGdXkDnavEp8M7yqf61zj8+sj
|
104
|
+
dFPP4Sdf3sv35zJmals9L33Bjsmhvs5LtNFDJQDea/NVGcgfMHzwrMJ9GcfVPkLk
|
105
|
+
31c0+OaK11hkDZFZYrBWU6FWsj8lICJPHlmFsU/zirfkvFYJ3rkCDQRU4vCSARAA
|
106
|
+
qvnUkerHq1Fq3ptYrYsNDLJSLbBch7jldPivGVDi0YHv2qwUnxo5O2GTxcyDFW8V
|
107
|
+
6Oy2InIhwsnWfSux3agqsoAuJNiFfvOS5dO2X62jx2tr34F7IbtN/lWXDHKeicbP
|
108
|
+
lD5VR1e0hNkd6NsPiryqsyy0S2+mgURKCQrCOtB01sj47B4h62iflxTZdC09trSD
|
109
|
+
yRYzk3lSlP/DjAbNzuapd84HTBtwxRgEtgC4gm9cIfmICfXPEwOOEediadM9V1GF
|
110
|
+
71dvfBcxw+p+3o8In9jDVJCxe6BX0pJ0C5AMNVrqpMGJ90GKHH6fGlubt9d/b1lk
|
111
|
+
eVdsi1nhiNfv7KUyaj/HlwZxfoz1rooPxpBxq1gp/jE+17/E09sEeK3YXrZGD5zz
|
112
|
+
V9K2vo1EWW4nurTvwuTlk2I7q00swQ4j8TS3McVDY6zjMyG3Cy4UkUNA0xS4gueg
|
113
|
+
/uVLzyFGPxol+Tu8eIhdZMEj3KF89cPsc8wsHxWYPaBOb6BwMm6xpExQiG+TqPli
|
114
|
+
lgwmOeiu8hyyFE+FJohdi4ms+4HrE3OchUhSYT9FqZFV+hcQ7qAq8kMdC9/Kg/uH
|
115
|
+
OOOTe2lH1ZqmzgQaeDkaSf8NLPEW/eOskPE01AdOqLaL8iM9YmbLo9MlPZM2WKL6
|
116
|
+
2aSiS3gxGNk4cXVPzt2ZAKMBHk41visnXU0/a1LoIAMAEQEAAYkCHwQYAQIACQUC
|
117
|
+
VOLwkgIbDAAKCRA3nOGS1AGrYcySEACZIe/xvLjEPhiVtUqcACPyXL4U7uA+V5Ob
|
118
|
+
ZVRmKKlkuoq3AQGQs/LAyCSYIGRw13hAn1X6tnireTv+vEoMDaX0sB1qUw49WOuB
|
119
|
+
8h71NaF/UYaPehjRWyNNq5Ul+icNwc8I8tgfkUUFCm/a5nJh8pZWfo+404ujEJzI
|
120
|
+
I2Qk6SoZqhbq2xrTgCrrKHxG5Gp+a35Y2v+TC8OkAN3Gu9LBg39t058xArBikk8I
|
121
|
+
jneCbIpDV5Fv5O9J1GuFEHFH2NIolaGppEOswd0ALs3zOmQ8KOZxLa4Gnn59gkQ6
|
122
|
+
/8Db1zXTW1QUQWiylvFte0q+fcSwhKEgJKyyN0ptk4Y27rclZxLMvPAjW19bqnVR
|
123
|
+
tigjWHJlxmBzX2bodLWbx1eRiS5QIeOk32CZlQN7EE0lniKLVNHReCrBmiBVRH9k
|
124
|
+
sKFbFafs2sI97FP2QySQuugcM30qDutA2Coo58SoAYAYM+0JlKSwwFRH0mGDPCiw
|
125
|
+
xSzOu4BNlIoxQh3EzrsmiyiB4hWPn9qzX5VM2IXvtL1Wzv8rUtpANkso9MPjsMAf
|
126
|
+
1Y/KBBaUm0QehoMwCWF/1KwsF9ENu6xon4l+GfkPhuCsEHEdqWIVGXrDLSshMGZ7
|
127
|
+
HdyAtUHPXXFV0FCT3KqV4UiJrjAzv7jqfSSUsXT8Qf4H+hC8lTfSBbFNfxP14T+E
|
128
|
+
JESa2SNRfw==
|
129
|
+
=EI0Z
|
130
|
+
-----END PGP PUBLIC KEY BLOCK-----
|
131
|
+
RedHat:
|
132
|
+
bintraybintray-adaptavist-rpm:
|
133
|
+
baseurl: 'https://dl.bintray.com/adaptavist/rpm'
|
134
|
+
descr: "adaptavist avst-app repository"
|
135
|
+
enabled: 1
|
136
|
+
gpgcheck: 0
|
137
|
+
priority: 1
|
data/config/deploy.rb
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
|
2
|
+
lock '3.2.1'
|
3
|
+
|
4
|
+
set :application, 'my_app_name'
|
5
|
+
set :repo_url, ENV["cap_git_repo_url"]
|
6
|
+
set :branch, ENV["cap_reference_name"] || ENV["cap_branch_name"] || "master"
|
7
|
+
|
8
|
+
# Default branch is :master
|
9
|
+
# ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }.call
|
10
|
+
|
11
|
+
# Default deploy_to directory is /var/www/my_app
|
12
|
+
set :deploy_to, ENV["destination_folder"]
|
13
|
+
|
14
|
+
# Default value for :scm is :git
|
15
|
+
set :scm, :git
|
16
|
+
|
17
|
+
# Default value for :format is :pretty
|
18
|
+
set :format, :pretty
|
19
|
+
|
20
|
+
# Default value for :log_level is :debug
|
21
|
+
# set :log_level, :debug
|
22
|
+
|
23
|
+
# Default value for :pty is false
|
24
|
+
set :pty, true
|
25
|
+
|
26
|
+
# Default value for :linked_files is []
|
27
|
+
# set :linked_files, %w{config/database.yml}
|
28
|
+
|
29
|
+
# Default value for linked_dirs is []
|
30
|
+
# set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system}
|
31
|
+
# set :use_sudo, true
|
32
|
+
# set :pty, true
|
33
|
+
# default_run_options[:pty] = true
|
34
|
+
|
35
|
+
set :ssh_options, {
|
36
|
+
forward_agent: false,
|
37
|
+
keys: [ENV["cap_access_password"]]
|
38
|
+
}
|
39
|
+
|
40
|
+
server ENV["cap_ip_address"], user: ENV["cap_access_user"], port: 22, password: ENV["cap_access_password"], roles: %w{app}
|
41
|
+
|
42
|
+
# Default value for default_env is {}
|
43
|
+
# set :default_env, { path: "/usr/local/rvm/rubies/ruby-2.1.2/bin/:/usr/local/rvm/gems/ruby-2.1.2/bin/:$PATH" }
|
44
|
+
|
45
|
+
# Default value for keep_releases is 5
|
46
|
+
set :keep_releases, 50000
|
47
|
+
|
48
|
+
after 'deploy', 'prepare_puppet_and_execute'
|
49
|
+
|
50
|
+
set :default_env, {
|
51
|
+
'PATH' => "/usr/local/rvm/gems/ruby-2.0.0-p481/bin:/usr/local/rvm/gems/ruby-2.0.0-p481@global/bin:/usr/local/rvm/rubies/ruby-2.0.0-p481/bin:/usr/local/rvm/bin:$PATH",
|
52
|
+
'RUBY_VERSION' => '2.0.0',
|
53
|
+
'GEM_HOME' => '/usr/local/rvm/gems/ruby-2.0.0-p481',
|
54
|
+
'GEM_PATH' => '/usr/local/rvm/gems/ruby-2.0.0-p481',
|
55
|
+
# 'BUNDLE_PATH' => '/path/to/.rvm/gems/ree-1.8.7-2010.01' # If you are using bundler.
|
56
|
+
}
|
57
|
+
|
58
|
+
namespace :deploy do
|
59
|
+
|
60
|
+
desc 'Restart application'
|
61
|
+
task :restart do
|
62
|
+
on roles(:app), in: :sequence, wait: 5 do
|
63
|
+
# Your restart mechanism here, for example:
|
64
|
+
# execute :touch, release_path.join('tmp/restart.txt')
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
after :publishing, :restart
|
69
|
+
|
70
|
+
after :restart, :clear_cache do
|
71
|
+
on roles(:web), in: :groups, limit: 3, wait: 10 do
|
72
|
+
# Here we can do anything such as:
|
73
|
+
# within release_path do
|
74
|
+
# execute :rake, 'cache:clear'
|
75
|
+
# end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# Simple Role Syntax
|
2
|
+
# ==================
|
3
|
+
# Supports bulk-adding hosts to roles, the primary server in each group
|
4
|
+
# is considered to be the first unless any hosts have the primary
|
5
|
+
# property set. Don't declare `role :all`, it's a meta role.
|
6
|
+
|
7
|
+
# role :app, %w{example.com}
|
8
|
+
|
9
|
+
|
10
|
+
# Extended Server Syntax
|
11
|
+
# ======================
|
12
|
+
# This can be used to drop a more detailed server definition into the
|
13
|
+
# server list. The second argument is a, or duck-types, Hash and is
|
14
|
+
# used to set extended properties on the server.
|
15
|
+
|
16
|
+
# server '178.250.52.77', user: 'root', roles: %w{app}, my_property: :my_value
|
17
|
+
# set :password, ask('Server password', nil)
|
18
|
+
# # fetch(:password)
|
19
|
+
# server '178.250.53.87', user: 'root', port: 22, password: '***REMOVED***', roles: %w{app}
|
20
|
+
|
21
|
+
# set :rvm_type, :system # Defaults to: :auto
|
22
|
+
# set :rvm_ruby_version, '2.1.2p95' # Defaults to: 'default'
|
23
|
+
|
24
|
+
# Custom SSH Options
|
25
|
+
# ==================
|
26
|
+
# You may pass any option but keep in mind that net/ssh understands a
|
27
|
+
# limited set of options, consult[net/ssh documentation](http://net-ssh.github.io/net-ssh/classes/Net/SSH.html#method-c-start).
|
28
|
+
#
|
29
|
+
# Global options
|
30
|
+
# --------------
|
31
|
+
# set :ssh_options, {
|
32
|
+
# keys: %w(/home/rlisowski/.ssh/id_rsa),
|
33
|
+
# forward_agent: false,
|
34
|
+
# auth_methods: %w(password)
|
35
|
+
# }
|
36
|
+
#
|
37
|
+
# And/or per server (overrides global)
|
38
|
+
# ------------------------------------
|
39
|
+
# server 'example.com',
|
40
|
+
# user: 'user_name',
|
41
|
+
# roles: %w{web app},
|
42
|
+
# ssh_options: {
|
43
|
+
# user: 'user_name', # overrides user setting above
|
44
|
+
# keys: %w(/home/user_name/.ssh/id_rsa),
|
45
|
+
# forward_agent: false,
|
46
|
+
# auth_methods: %w(publickey password)
|
47
|
+
# # password: 'please use keys'
|
48
|
+
# }
|
data/lib/avst-cloud.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# Copyright 2015 Adaptavist.com Ltd.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require_relative './avst-cloud/aws_connection.rb'
|
16
|
+
require_relative './avst-cloud/aws_server.rb'
|
17
|
+
require_relative './avst-cloud/rackspace_connection.rb'
|
18
|
+
require_relative './avst-cloud/rackspace_server.rb'
|
19
|
+
require_relative './avst-cloud/logging.rb'
|
20
|
+
require 'fog'
|
21
|
+
require 'net/ssh'
|
22
|
+
require 'net/scp'
|
23
|
+
require 'uri'
|
24
|
+
require 'colorize'
|
25
|
+
|
26
|
+
module AvstCloud
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,203 @@
|
|
1
|
+
# Copyright 2015 Adaptavist.com Ltd.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require_relative './cloud_connection.rb'
|
16
|
+
|
17
|
+
module AvstCloud
|
18
|
+
|
19
|
+
class AwsConnection < AvstCloud::CloudConnection
|
20
|
+
|
21
|
+
attr_accessor :region
|
22
|
+
|
23
|
+
def initialize(provider_user, provider_pass, region)
|
24
|
+
super('aws', provider_user, provider_pass)
|
25
|
+
@region = region
|
26
|
+
end
|
27
|
+
|
28
|
+
def server(server_name, root_user, root_password, os=nil)
|
29
|
+
server = find_fog_server(server_name)
|
30
|
+
if !root_user and os
|
31
|
+
root_user = user_from_os(os)
|
32
|
+
end
|
33
|
+
AvstCloud::AwsServer.new(server, server_name, server.public_ip_address, root_user, root_password)
|
34
|
+
end
|
35
|
+
|
36
|
+
def create_server(server_name, flavour, os, key_name, ssh_key, subnet_id, security_group_ids, ebs_size, hdd_device_path, ami_image_id, availability_zone)
|
37
|
+
|
38
|
+
# Permit named instances from DEFAULT_FLAVOURS
|
39
|
+
flavour = flavour || "t2.micro"
|
40
|
+
os = os || "ubuntu-14"
|
41
|
+
ami_image_id = ami_image_id || "ami-f0b11187"
|
42
|
+
device_name = hdd_device_path || '/dev/sda1'
|
43
|
+
|
44
|
+
root_user = user_from_os(os)
|
45
|
+
unless File.file?(ssh_key)
|
46
|
+
logger.error "Could not find local SSH key '#{ssh_key}'".red
|
47
|
+
raise "Could not find local SSH key '#{ssh_key}'"
|
48
|
+
end
|
49
|
+
|
50
|
+
existing_servers = all_named_servers(server_name)
|
51
|
+
restartable_servers = existing_servers.select{ |serv| serv.state == 'stopped' }
|
52
|
+
running_servers = existing_servers.select{ |serv| serv.state != 'stopped' && serv.state != 'terminated' }
|
53
|
+
|
54
|
+
if running_servers.length > 0
|
55
|
+
running_servers.each do |server|
|
56
|
+
logger.error "Server #{server_name} with id #{server.id} found in state: #{server.state}".yellow
|
57
|
+
end
|
58
|
+
raise "Server with the same name found!"
|
59
|
+
|
60
|
+
elsif restartable_servers.length > 0
|
61
|
+
if restartable_servers.length > 1
|
62
|
+
running_servers.each do |server|
|
63
|
+
logger.error "Server #{server_name} with id #{server.id} found in state: #{server.state}. Can not restart".yellow
|
64
|
+
end
|
65
|
+
raise "Too many servers can be restarted."
|
66
|
+
end
|
67
|
+
server = restartable_servers.first
|
68
|
+
server.start
|
69
|
+
result_server = AvstCloud::AwsServer.new(server, server_name, server.public_ip_address, root_user, ssh_key)
|
70
|
+
result_server.wait_for_state() {|serv| serv.ready?}
|
71
|
+
logger.debug "[DONE]\n\n"
|
72
|
+
logger.debug "The server was successfully re-started.\n\n"
|
73
|
+
result_server
|
74
|
+
else
|
75
|
+
logger.debug "Creating EC2 server:"
|
76
|
+
logger.debug "Server name - #{server_name}"
|
77
|
+
logger.debug "Operating system - #{os}"
|
78
|
+
logger.debug "image_template_id - #{ami_image_id}"
|
79
|
+
logger.debug "flavour - #{flavour}"
|
80
|
+
logger.debug "key_name - #{key_name}"
|
81
|
+
logger.debug "ssh_key - #{ssh_key}"
|
82
|
+
logger.debug "subnet_id - #{subnet_id}"
|
83
|
+
logger.debug "security_group_ids - #{security_group_ids}"
|
84
|
+
logger.debug "region - #{@region}"
|
85
|
+
logger.debug "availability_zone - #{availability_zone}"
|
86
|
+
logger.debug "ebs_size - #{ebs_size}"
|
87
|
+
logger.debug "hdd_device_path - #{device_name}"
|
88
|
+
|
89
|
+
create_ebs_volume = nil
|
90
|
+
if ebs_size
|
91
|
+
# in case of centos ami we need to use /dev/xvda this is ami dependent
|
92
|
+
create_ebs_volume = [
|
93
|
+
{
|
94
|
+
:DeviceName => device_name,
|
95
|
+
'Ebs.VolumeType' => 'gp2',
|
96
|
+
'Ebs.VolumeSize' => ebs_size,
|
97
|
+
}
|
98
|
+
]
|
99
|
+
end
|
100
|
+
|
101
|
+
# create server
|
102
|
+
server = connect.servers.create :tags => {
|
103
|
+
'Name' => server_name,
|
104
|
+
'os' => os
|
105
|
+
},
|
106
|
+
:flavor_id => flavour,
|
107
|
+
:image_id => ami_image_id,
|
108
|
+
:key_name => key_name,
|
109
|
+
:subnet_id => subnet_id,
|
110
|
+
:associate_public_ip => true,
|
111
|
+
:security_group_ids => security_group_ids,
|
112
|
+
:availability_zone => availability_zone,
|
113
|
+
:block_device_mapping => create_ebs_volume
|
114
|
+
|
115
|
+
result_server = AvstCloud::AwsServer.new(server, server_name, nil, root_user, ssh_key)
|
116
|
+
# result_server.logger = logger
|
117
|
+
# Check every 5 seconds to see if server is in the active state (ready?).
|
118
|
+
# If the server has not been built in 5 minutes (600 seconds) an exception will be raised.
|
119
|
+
result_server.wait_for_state() {|serv| serv.ready?}
|
120
|
+
|
121
|
+
logger.debug "[DONE]\n\n"
|
122
|
+
|
123
|
+
logger.debug "The server has been successfully created, to login onto the server:\n"
|
124
|
+
logger.debug "\t ssh -i #{ssh_key} #{root_user}@#{server.public_ip_address}\n"
|
125
|
+
|
126
|
+
result_server.ip_address = server.public_ip_address
|
127
|
+
result_server
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def server_status(server_name)
|
132
|
+
servers = all_named_servers(server_name).select{|serv| serv.state != 'terminated'}
|
133
|
+
if servers.length > 0
|
134
|
+
servers.each do |server|
|
135
|
+
logger.debug "Server #{server.id} with name '#{server_name}' exists and has state: #{server.state}"
|
136
|
+
end
|
137
|
+
else
|
138
|
+
logger.debug "Server not found for name: #{server_name}"
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def list_flavours
|
143
|
+
connect.flavors.each do |fl|
|
144
|
+
logger.debug fl.inspect
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def list_images
|
149
|
+
connect.images.each do |im|
|
150
|
+
logger.debug im.inspect
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
# Returns list of servers from fog
|
155
|
+
def list_known_servers
|
156
|
+
connect.servers.all
|
157
|
+
end
|
158
|
+
|
159
|
+
def find_fog_server(server_name, should_fail=true)
|
160
|
+
servers = all_named_servers(server_name).select{|serv| serv.state != 'terminated'}
|
161
|
+
unless servers.length == 1
|
162
|
+
logger.debug "Found #{servers.length} servers for name: #{server_name}".yellow
|
163
|
+
if should_fail
|
164
|
+
raise "Found #{servers.length} servers for name: #{server_name}"
|
165
|
+
end
|
166
|
+
end
|
167
|
+
servers.first
|
168
|
+
end
|
169
|
+
|
170
|
+
private
|
171
|
+
def user_from_os(os)
|
172
|
+
case os.to_s
|
173
|
+
when /^ubuntu/
|
174
|
+
user = "ubuntu"
|
175
|
+
when /^debian/
|
176
|
+
user = "admin"
|
177
|
+
when /^centos/
|
178
|
+
user = "ec2-user"
|
179
|
+
when /^redhat/
|
180
|
+
user = "ec2-user"
|
181
|
+
else
|
182
|
+
user = "root"
|
183
|
+
end
|
184
|
+
user
|
185
|
+
end
|
186
|
+
def connect
|
187
|
+
unless @connection
|
188
|
+
logger.debug "Creating new connection to AWS"
|
189
|
+
@connection = Fog::Compute.new({
|
190
|
+
:provider => 'AWS',
|
191
|
+
:region => @region,
|
192
|
+
:aws_access_key_id => @provider_access_user,
|
193
|
+
:aws_secret_access_key => @provider_access_pass
|
194
|
+
})
|
195
|
+
end
|
196
|
+
@connection
|
197
|
+
end
|
198
|
+
|
199
|
+
def all_named_servers(server_name)
|
200
|
+
connect.servers.all({'tag:Name' => server_name})
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|