vpsb 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +21 -0
- data/Gemfile +20 -0
- data/Gemfile.lock +175 -0
- data/LICENSE.txt +22 -0
- data/README.md +62 -0
- data/Rakefile +2 -0
- data/bin/vpsb +10 -0
- data/lib/vpsb/ask_support.rb +27 -0
- data/lib/vpsb/base_ask_resource.rb +40 -0
- data/lib/vpsb/base_resource.rb +13 -0
- data/lib/vpsb/base_task.rb +32 -0
- data/lib/vpsb/commands/base.rb +68 -0
- data/lib/vpsb/commands/build.rb +61 -0
- data/lib/vpsb/commands/cook.rb +27 -0
- data/lib/vpsb/commands/deploy.rb +25 -0
- data/lib/vpsb/commands/help_messages.rb +23 -0
- data/lib/vpsb/commands/init.rb +52 -0
- data/lib/vpsb/commands/setup.rb +23 -0
- data/lib/vpsb/core.rb +41 -0
- data/lib/vpsb/helpers/file_replace.rb +20 -0
- data/lib/vpsb/helpers/ssh.rb +117 -0
- data/lib/vpsb/resources/app_bags_json.rb +38 -0
- data/lib/vpsb/resources/app_env_variables.rb +24 -0
- data/lib/vpsb/resources/app_host.rb +12 -0
- data/lib/vpsb/resources/app_name.rb +11 -0
- data/lib/vpsb/resources/app_nginx_use_ssl.rb +12 -0
- data/lib/vpsb/resources/base_path.rb +10 -0
- data/lib/vpsb/resources/db_postgres_json.rb +62 -0
- data/lib/vpsb/resources/db_postgres_pass.rb +11 -0
- data/lib/vpsb/resources/db_postgres_version.rb +21 -0
- data/lib/vpsb/resources/db_postgresql_bags_json.rb +20 -0
- data/lib/vpsb/resources/deploy_bags_json.rb +36 -0
- data/lib/vpsb/resources/deploy_config.rb +32 -0
- data/lib/vpsb/resources/deploy_keychain.rb +19 -0
- data/lib/vpsb/resources/deploy_pass.rb +11 -0
- data/lib/vpsb/resources/deploy_ssh_keys.rb +20 -0
- data/lib/vpsb/resources/deploy_to_known_hosts.rb +13 -0
- data/lib/vpsb/resources/do_api_key.rb +14 -0
- data/lib/vpsb/resources/do_client_id.rb +8 -0
- data/lib/vpsb/resources/do_droplet_ssh_key.rb +15 -0
- data/lib/vpsb/resources/do_host.rb +8 -0
- data/lib/vpsb/resources/do_host_ip.rb +8 -0
- data/lib/vpsb/resources/do_image.rb +16 -0
- data/lib/vpsb/resources/do_region.rb +16 -0
- data/lib/vpsb/resources/do_size.rb +16 -0
- data/lib/vpsb/resources/do_ssh_path.rb +15 -0
- data/lib/vpsb/resources/do_ssh_pub_path.rb +15 -0
- data/lib/vpsb/resources/es_cluster_name.rb +9 -0
- data/lib/vpsb/resources/es_json.rb +50 -0
- data/lib/vpsb/resources/es_memlock.rb +18 -0
- data/lib/vpsb/resources/es_node_name.rb +8 -0
- data/lib/vpsb/resources/es_nofile.rb +18 -0
- data/lib/vpsb/resources/es_version.rb +21 -0
- data/lib/vpsb/resources/has_do_account.rb +19 -0
- data/lib/vpsb/resources/hostname.rb +12 -0
- data/lib/vpsb/resources/knife_rb_path.rb +10 -0
- data/lib/vpsb/resources/local_ssh_path.rb +15 -0
- data/lib/vpsb/resources/local_ssh_pub.rb +13 -0
- data/lib/vpsb/resources/monit_role_json.rb +33 -0
- data/lib/vpsb/resources/newrelic_lic.rb +8 -0
- data/lib/vpsb/resources/node_json.rb +31 -0
- data/lib/vpsb/resources/packages_bags_json.rb +20 -0
- data/lib/vpsb/resources/packages_list.rb +18 -0
- data/lib/vpsb/resources/rails_app_path.rb +11 -0
- data/lib/vpsb/resources/read_do_api_access.rb +21 -0
- data/lib/vpsb/resources/ruby_version.rb +21 -0
- data/lib/vpsb/resources/server_app_path.rb +11 -0
- data/lib/vpsb/resources/ssh_helper.rb +10 -0
- data/lib/vpsb/resources/unicorn_worker_processes.rb +18 -0
- data/lib/vpsb/resources/unicorn_worker_timeout.rb +18 -0
- data/lib/vpsb/resources/web_role_json.rb +92 -0
- data/lib/vpsb/resources.rb +4 -0
- data/lib/vpsb/shell_support.rb +7 -0
- data/lib/vpsb/tasks/apps_bags.rb +33 -0
- data/lib/vpsb/tasks/create_droplet.rb +51 -0
- data/lib/vpsb/tasks/db_postgres_bags.rb +32 -0
- data/lib/vpsb/tasks/db_postgres_role.rb +32 -0
- data/lib/vpsb/tasks/deploy_bags.rb +32 -0
- data/lib/vpsb/tasks/deploy_config.rb +19 -0
- data/lib/vpsb/tasks/do_api_access.rb +52 -0
- data/lib/vpsb/tasks/droplet_ssh_keys.rb +22 -0
- data/lib/vpsb/tasks/droplet_ssh_update_config.rb +20 -0
- data/lib/vpsb/tasks/es_role.rb +32 -0
- data/lib/vpsb/tasks/monit_role.rb +32 -0
- data/lib/vpsb/tasks/node.rb +32 -0
- data/lib/vpsb/tasks/packages_bags.rb +32 -0
- data/lib/vpsb/tasks/web_role.rb +32 -0
- data/lib/vpsb/version.rb +3 -0
- data/lib/vpsb.rb +16 -0
- data/spec/spec_helper.rb +22 -0
- data/vpsb.gemspec +30 -0
- metadata +263 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1bb4cc65e110c6625d772d44d78315f14b92a39d
|
4
|
+
data.tar.gz: 60f5711c62d7b2a34080482e8e0da91317c49b11
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: daae50c8e175e3e730b703c9aa315e9267d673602421c4a7458f5e17911a790f40b7c1a990f44edeec8b356c303c73bba958e877579378f20a79385ec8d0e94c
|
7
|
+
data.tar.gz: d7ec8e60c53120845a486dfcd2d267125c3f8906a4af0253c2963821ebc6e61adcf30e4ce6456400195193d4f771597d78c08702fcd274736581d0a7516e8304
|
data/.gitignore
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# Specify your gem's dependencies in vpsb.gemspec
|
4
|
+
gemspec
|
5
|
+
|
6
|
+
gem 'librarian-chef'
|
7
|
+
gem 'knife-solo'
|
8
|
+
gem 'knife-digital_ocean'
|
9
|
+
gem 'chef', '>= 10.4'
|
10
|
+
gem "activesupport"
|
11
|
+
gem "awesome_print"
|
12
|
+
gem "hashie"
|
13
|
+
gem "executable"
|
14
|
+
gem "json"
|
15
|
+
gem "rendering_engine"
|
16
|
+
gem 'capistrano'
|
17
|
+
gem 'capistrano-rvm'
|
18
|
+
gem 'capistrano-rails'
|
19
|
+
gem 'capistrano-bundler'
|
20
|
+
gem 'capistrano-rsync'
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,175 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
vpsb (1.0.0)
|
5
|
+
activesupport (~> 4.0)
|
6
|
+
awesome_print (~> 1.2)
|
7
|
+
executable (~> 1.2)
|
8
|
+
hashie (~> 2.1)
|
9
|
+
json (~> 1.7)
|
10
|
+
rendering_engine (= 0.1)
|
11
|
+
|
12
|
+
GEM
|
13
|
+
remote: https://rubygems.org/
|
14
|
+
specs:
|
15
|
+
activesupport (4.1.1)
|
16
|
+
i18n (~> 0.6, >= 0.6.9)
|
17
|
+
json (~> 1.7, >= 1.7.7)
|
18
|
+
minitest (~> 5.1)
|
19
|
+
thread_safe (~> 0.1)
|
20
|
+
tzinfo (~> 1.1)
|
21
|
+
archive-tar-minitar (0.5.2)
|
22
|
+
awesome_print (1.2.0)
|
23
|
+
capistrano (3.1.0)
|
24
|
+
i18n
|
25
|
+
rake (>= 10.0.0)
|
26
|
+
sshkit (~> 1.3)
|
27
|
+
capistrano-bundler (1.1.2)
|
28
|
+
capistrano (~> 3.0)
|
29
|
+
sshkit (~> 1.2)
|
30
|
+
capistrano-rails (1.1.1)
|
31
|
+
capistrano (~> 3.1)
|
32
|
+
capistrano-bundler (~> 1.1)
|
33
|
+
capistrano-rsync (1.0.2)
|
34
|
+
capistrano (>= 3.0.0.pre14, < 4)
|
35
|
+
capistrano-rvm (0.1.1)
|
36
|
+
capistrano (~> 3.0)
|
37
|
+
sshkit (~> 1.2)
|
38
|
+
chef (11.14.0.alpha.2)
|
39
|
+
chef-zero (~> 2.0, >= 2.0.2)
|
40
|
+
diff-lcs (~> 1.2, >= 1.2.4)
|
41
|
+
erubis (~> 2.7)
|
42
|
+
highline (~> 1.6, >= 1.6.9)
|
43
|
+
json (>= 1.4.4, <= 1.8.1)
|
44
|
+
mime-types (~> 1.16)
|
45
|
+
mixlib-authentication (~> 1.3)
|
46
|
+
mixlib-cli (~> 1.4)
|
47
|
+
mixlib-config (~> 2.0)
|
48
|
+
mixlib-log (~> 1.3)
|
49
|
+
mixlib-shellout (~> 1.4)
|
50
|
+
net-ssh (~> 2.6)
|
51
|
+
net-ssh-multi (~> 1.1)
|
52
|
+
ohai (~> 7.0)
|
53
|
+
pry (~> 0.9)
|
54
|
+
rest-client (>= 1.0.4, < 1.7.0)
|
55
|
+
yajl-ruby (~> 1.1)
|
56
|
+
chef-zero (2.1.4)
|
57
|
+
hashie (~> 2.0)
|
58
|
+
json
|
59
|
+
mixlib-log (~> 1.3)
|
60
|
+
rack
|
61
|
+
coderay (1.1.0)
|
62
|
+
diff-lcs (1.2.5)
|
63
|
+
digital_ocean (1.5.0)
|
64
|
+
faraday (~> 0.9.0)
|
65
|
+
faraday_middleware (~> 0.9.0)
|
66
|
+
hashie (~> 2.1.1)
|
67
|
+
json
|
68
|
+
erubis (2.7.0)
|
69
|
+
executable (1.2.1)
|
70
|
+
faraday (0.9.0)
|
71
|
+
multipart-post (>= 1.2, < 3)
|
72
|
+
faraday_middleware (0.9.1)
|
73
|
+
faraday (>= 0.7.4, < 0.10)
|
74
|
+
hashie (2.1.1)
|
75
|
+
highline (1.6.21)
|
76
|
+
i18n (0.6.9)
|
77
|
+
ipaddress (0.8.0)
|
78
|
+
json (1.8.1)
|
79
|
+
knife-digital_ocean (0.7.0)
|
80
|
+
chef (>= 10.18)
|
81
|
+
digital_ocean (~> 1.5.0)
|
82
|
+
highline
|
83
|
+
knife-solo (0.4.1)
|
84
|
+
chef (>= 10.12)
|
85
|
+
erubis (~> 2.7.0)
|
86
|
+
net-ssh (>= 2.2.2, < 3.0)
|
87
|
+
librarian (0.1.2)
|
88
|
+
highline
|
89
|
+
thor (~> 0.15)
|
90
|
+
librarian-chef (0.0.2)
|
91
|
+
archive-tar-minitar (>= 0.5.2)
|
92
|
+
chef (>= 0.10)
|
93
|
+
librarian (~> 0.1.0)
|
94
|
+
method_source (0.8.2)
|
95
|
+
mime-types (1.25.1)
|
96
|
+
minitest (5.3.4)
|
97
|
+
mixlib-authentication (1.3.0)
|
98
|
+
mixlib-log
|
99
|
+
mixlib-cli (1.5.0)
|
100
|
+
mixlib-config (2.1.0)
|
101
|
+
mixlib-log (1.6.0)
|
102
|
+
mixlib-shellout (1.4.0)
|
103
|
+
multipart-post (2.0.0)
|
104
|
+
net-scp (1.1.2)
|
105
|
+
net-ssh (>= 2.6.5)
|
106
|
+
net-ssh (2.9.1)
|
107
|
+
net-ssh-gateway (1.2.0)
|
108
|
+
net-ssh (>= 2.6.5)
|
109
|
+
net-ssh-multi (1.2.0)
|
110
|
+
net-ssh (>= 2.6.5)
|
111
|
+
net-ssh-gateway (>= 1.2.0)
|
112
|
+
ohai (7.0.4)
|
113
|
+
ipaddress
|
114
|
+
mime-types (~> 1.16)
|
115
|
+
mixlib-cli
|
116
|
+
mixlib-config (~> 2.0)
|
117
|
+
mixlib-log
|
118
|
+
mixlib-shellout (~> 1.2)
|
119
|
+
systemu (~> 2.5.2)
|
120
|
+
yajl-ruby
|
121
|
+
pry (0.9.12.6)
|
122
|
+
coderay (~> 1.0)
|
123
|
+
method_source (~> 0.8)
|
124
|
+
slop (~> 3.4)
|
125
|
+
rack (1.5.2)
|
126
|
+
rake (10.3.2)
|
127
|
+
rendering_engine (0.1.0)
|
128
|
+
rest-client (1.6.7)
|
129
|
+
mime-types (>= 1.16)
|
130
|
+
rspec (2.14.1)
|
131
|
+
rspec-core (~> 2.14.0)
|
132
|
+
rspec-expectations (~> 2.14.0)
|
133
|
+
rspec-mocks (~> 2.14.0)
|
134
|
+
rspec-core (2.14.8)
|
135
|
+
rspec-expectations (2.14.5)
|
136
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
137
|
+
rspec-mocks (2.14.6)
|
138
|
+
slop (3.5.0)
|
139
|
+
sshkit (1.3.0)
|
140
|
+
net-scp (>= 1.1.2)
|
141
|
+
net-ssh
|
142
|
+
term-ansicolor
|
143
|
+
systemu (2.5.2)
|
144
|
+
term-ansicolor (1.3.0)
|
145
|
+
tins (~> 1.0)
|
146
|
+
thor (0.19.1)
|
147
|
+
thread_safe (0.3.3)
|
148
|
+
tins (1.0.1)
|
149
|
+
tzinfo (1.1.0)
|
150
|
+
thread_safe (~> 0.1)
|
151
|
+
yajl-ruby (1.2.0)
|
152
|
+
|
153
|
+
PLATFORMS
|
154
|
+
ruby
|
155
|
+
|
156
|
+
DEPENDENCIES
|
157
|
+
activesupport
|
158
|
+
awesome_print
|
159
|
+
bundler (~> 1.6)
|
160
|
+
capistrano
|
161
|
+
capistrano-bundler
|
162
|
+
capistrano-rails
|
163
|
+
capistrano-rsync
|
164
|
+
capistrano-rvm
|
165
|
+
chef (>= 10.4)
|
166
|
+
executable
|
167
|
+
hashie
|
168
|
+
json
|
169
|
+
knife-digital_ocean
|
170
|
+
knife-solo
|
171
|
+
librarian-chef
|
172
|
+
rake
|
173
|
+
rendering_engine
|
174
|
+
rspec
|
175
|
+
vpsb!
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Pawel Niemczyk
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
## Bootstraping DigitalOcean server with nginx, and working rails application
|
2
|
+
---
|
3
|
+
### Where to start?
|
4
|
+
|
5
|
+
Create account on DigitalOcean through [link](https://www.digitalocean.com/?refcode=71281f14ac3c).
|
6
|
+
*(Using it you appreciate our efforts into releasing this tutorial with [vpsb gem](gem))*
|
7
|
+
|
8
|
+
- start by installing our gem
|
9
|
+
|
10
|
+
```
|
11
|
+
gem install vpsb
|
12
|
+
|
13
|
+
```
|
14
|
+
|
15
|
+
- then run gem by
|
16
|
+
|
17
|
+
```
|
18
|
+
vpsb i <directory_name_to_create> # f.e. vpsb i my_first_app
|
19
|
+
cd <directory_name_to_create> # cd my_first_app
|
20
|
+
vpsb g
|
21
|
+
|
22
|
+
```
|
23
|
+
|
24
|
+
In the last step you will be asked for several questions to provide base configuration
|
25
|
+
|
26
|
+
At the end you will have working rails app.
|
27
|
+
|
28
|
+
---
|
29
|
+
ALTERNATIVELY, you may want to build server manually. If so, then
|
30
|
+
|
31
|
+
- create DigitalOcean droplet manually (https://cloud.digitalocean.com/droplets/new)
|
32
|
+
|
33
|
+
- clone server app repo from github
|
34
|
+
|
35
|
+
`git clone https://github.com/pniemczyk/bootstrap_server_app_in_do.git`
|
36
|
+
|
37
|
+
- install all dependencies by script
|
38
|
+
|
39
|
+
`./init_env.sh #installs all gems and downloads all coookbooks`
|
40
|
+
|
41
|
+
- update configuration (read README to know the meaning of files in repo)
|
42
|
+
|
43
|
+
- run bootstrap script `./bootstrap.sh`
|
44
|
+
|
45
|
+
- clone our sample rails app
|
46
|
+
|
47
|
+
`git clone https://github.com/pniemczyk/bootstrap_rails_app_in_do.git`
|
48
|
+
|
49
|
+
- run `bundle install`
|
50
|
+
|
51
|
+
- reconfigure app (enter domain in production deploy files)
|
52
|
+
|
53
|
+
- run `cap production deploy`
|
54
|
+
|
55
|
+
## Contributing
|
56
|
+
|
57
|
+
1. Fork it ( https://github.com/[my-github-username]/vpsb/fork )
|
58
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
59
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
60
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
61
|
+
5. Create a new Pull Request
|
62
|
+
|
data/Rakefile
ADDED
data/bin/vpsb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
module Vpsb
|
2
|
+
module AskSupport
|
3
|
+
def ask(&block)
|
4
|
+
yield if block
|
5
|
+
STDIN.gets.chomp
|
6
|
+
end
|
7
|
+
|
8
|
+
def ask_to_confirm(question, &block)
|
9
|
+
answer = ask { puts "#{question} y[es]/n[o]?" }
|
10
|
+
cond = (answer[0].to_s.downcase == 'y')
|
11
|
+
|
12
|
+
yield cond if block
|
13
|
+
|
14
|
+
cond
|
15
|
+
end
|
16
|
+
|
17
|
+
def ask_loop(condition = nil, &block)
|
18
|
+
condition ||= proc { |res| !res.strip.empty? }
|
19
|
+
|
20
|
+
begin
|
21
|
+
yield if block
|
22
|
+
res = STDIN.gets.chomp
|
23
|
+
end until condition.call(res)
|
24
|
+
res
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Vpsb
|
2
|
+
class BaseAskResource < BaseResource
|
3
|
+
include AskSupport
|
4
|
+
|
5
|
+
def self.question(text)
|
6
|
+
@question = text
|
7
|
+
end
|
8
|
+
|
9
|
+
def question
|
10
|
+
self.class.instance_variable_get(:@question)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.default(text)
|
14
|
+
@default = text
|
15
|
+
end
|
16
|
+
|
17
|
+
def default
|
18
|
+
self.class.instance_variable_get(:@default)
|
19
|
+
end
|
20
|
+
|
21
|
+
def call(data)
|
22
|
+
answer = ask_loop(validate) do
|
23
|
+
puts question
|
24
|
+
end
|
25
|
+
finalize(answer.strip)
|
26
|
+
end
|
27
|
+
|
28
|
+
protected
|
29
|
+
|
30
|
+
def finalize(answer)
|
31
|
+
return default if answer.empty? && !default.nil?
|
32
|
+
answer
|
33
|
+
end
|
34
|
+
|
35
|
+
def validate
|
36
|
+
return Proc.new { true } if !default.nil?
|
37
|
+
nil
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Vpsb
|
2
|
+
class BaseTask
|
3
|
+
@prepare_squence = []
|
4
|
+
attr_reader :core, :prepare_squence
|
5
|
+
|
6
|
+
def initialize(core)
|
7
|
+
@core = core
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.prepare_squence(*resource)
|
11
|
+
(@prepare_squence ||= []).push(*resource)
|
12
|
+
end
|
13
|
+
|
14
|
+
def prepare_squence
|
15
|
+
self.class.instance_variable_get(:@prepare_squence)
|
16
|
+
end
|
17
|
+
|
18
|
+
protected
|
19
|
+
|
20
|
+
def prepare
|
21
|
+
(prepare_squence || []).each{ |r| core.get(r) }
|
22
|
+
end
|
23
|
+
|
24
|
+
def reprepare
|
25
|
+
(prepare_squence || []).each{ |r| core.get(r, force:true) }
|
26
|
+
end
|
27
|
+
|
28
|
+
def preparation_results
|
29
|
+
(prepare_squence || []).inject({}){ |h, r| h[r] = core.get(r); h }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require "vpsb/version"
|
2
|
+
require 'executable'
|
3
|
+
require 'awesome_print'
|
4
|
+
|
5
|
+
module Vpsb
|
6
|
+
module Commands
|
7
|
+
class Base
|
8
|
+
include Executable
|
9
|
+
|
10
|
+
def go(*params)
|
11
|
+
setup(*params)
|
12
|
+
build(*params)
|
13
|
+
cook(*params)
|
14
|
+
deploy(*params)
|
15
|
+
end
|
16
|
+
|
17
|
+
def init(*params)
|
18
|
+
Init.new.execute(*params)
|
19
|
+
end
|
20
|
+
|
21
|
+
def setup(*params)
|
22
|
+
Setup.new(core).execute(*params)
|
23
|
+
end
|
24
|
+
|
25
|
+
def build(*params)
|
26
|
+
Build.new(core).execute(*params)
|
27
|
+
end
|
28
|
+
|
29
|
+
def cook(*params)
|
30
|
+
Cook.new(core).execute(*params)
|
31
|
+
end
|
32
|
+
|
33
|
+
def deploy(*params)
|
34
|
+
Deploy.new(core).execute(*params)
|
35
|
+
end
|
36
|
+
|
37
|
+
def help!
|
38
|
+
puts Vpsb::Commands::HelpMessages.show
|
39
|
+
exit
|
40
|
+
end
|
41
|
+
alias :h! :help!
|
42
|
+
|
43
|
+
def core
|
44
|
+
@core ||= (
|
45
|
+
c = Core.new
|
46
|
+
Vpsb::Resources.constants.each do |k|
|
47
|
+
klass = Vpsb::Resources.const_get(k)
|
48
|
+
c.register_resource klass.new if klass.is_a?(Class)
|
49
|
+
end
|
50
|
+
c
|
51
|
+
)
|
52
|
+
end
|
53
|
+
|
54
|
+
def call(name=nil, *params)
|
55
|
+
puts Vpsb::Commands::HelpMessages.intro
|
56
|
+
case name.to_s.strip
|
57
|
+
when 'go', 'g' then go(params)
|
58
|
+
when 'init', 'i' then init(params)
|
59
|
+
when 'setup', 's' then setup(params)
|
60
|
+
when 'build', 'b' then build(params)
|
61
|
+
when 'cook', 'c' then cook(params)
|
62
|
+
when 'deploy', 'd' then deploy(params)
|
63
|
+
else puts Vpsb::Commands::HelpMessages.unknown_command
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Vpsb
|
2
|
+
module Commands
|
3
|
+
class Build
|
4
|
+
include AskSupport
|
5
|
+
def initialize(core)
|
6
|
+
@core = core
|
7
|
+
end
|
8
|
+
|
9
|
+
def execute(params)
|
10
|
+
web_role.call
|
11
|
+
deploy_bags.call
|
12
|
+
apps_bags.call
|
13
|
+
db_postgres_role.call
|
14
|
+
db_postgres_bags.call if core.present?(:db_postgres_json)
|
15
|
+
es_role.call if ask_to_confirm("Do you want configure elasticsearch")
|
16
|
+
monit_role.call if ask_to_confirm("Do you want configure monit(newrelic)")
|
17
|
+
packages_bags.call if ask_to_confirm("Do you want to install additional apt-get apps")
|
18
|
+
node.call
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
attr_reader :core
|
23
|
+
|
24
|
+
def node
|
25
|
+
Vpsb::Tasks::Node.new(core)
|
26
|
+
end
|
27
|
+
|
28
|
+
def apps_bags
|
29
|
+
Vpsb::Tasks::AppsBags.new(core)
|
30
|
+
end
|
31
|
+
|
32
|
+
def deploy_bags
|
33
|
+
Vpsb::Tasks::DeployBags.new(core)
|
34
|
+
end
|
35
|
+
|
36
|
+
def packages_bags
|
37
|
+
Vpsb::Tasks::PackagesBags.new(core)
|
38
|
+
end
|
39
|
+
|
40
|
+
def db_postgres_bags
|
41
|
+
Vpsb::Tasks::DbPostgresBags.new(core)
|
42
|
+
end
|
43
|
+
|
44
|
+
def db_postgres_role
|
45
|
+
Vpsb::Tasks::DbPostgresRole.new(core)
|
46
|
+
end
|
47
|
+
|
48
|
+
def es_role
|
49
|
+
Vpsb::Tasks::EsRole.new(core)
|
50
|
+
end
|
51
|
+
|
52
|
+
def monit_role
|
53
|
+
Vpsb::Tasks::MonitRole.new(core)
|
54
|
+
end
|
55
|
+
|
56
|
+
def web_role
|
57
|
+
Vpsb::Tasks::WebRole.new(core)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Vpsb
|
2
|
+
module Commands
|
3
|
+
class Cook
|
4
|
+
include AskSupport
|
5
|
+
include ShellSupport
|
6
|
+
def initialize(core)
|
7
|
+
@core = core
|
8
|
+
end
|
9
|
+
|
10
|
+
def execute(params)
|
11
|
+
# ip = ask { puts "What is ip address server node to cook (example: 22.11.3.11)?" }
|
12
|
+
ip = core.get(:do_host_ip)
|
13
|
+
run("librarian-chef install")
|
14
|
+
run("knife solo prepare root@#{ip} --bootstrap-version 11.12.4")
|
15
|
+
run("knife solo bootstrap root@#{ip}")
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
attr_reader :core
|
20
|
+
|
21
|
+
def run(what)
|
22
|
+
in_dir('bootstrap_server_app_in_do', what)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Vpsb
|
2
|
+
module Commands
|
3
|
+
class Deploy
|
4
|
+
include AskSupport
|
5
|
+
def initialize(core)
|
6
|
+
@core = core
|
7
|
+
end
|
8
|
+
|
9
|
+
def execute(params)
|
10
|
+
|
11
|
+
Vpsb::Tasks::DeployConfig.new(core).call
|
12
|
+
puts "Start deploying app."
|
13
|
+
run(core.get(:rails_app_path), 'bundle exec cap production deploy')
|
14
|
+
puts "app is ready! Visit #{core.get(:do_host_ip)}"
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
attr_reader :core
|
19
|
+
|
20
|
+
def run(where, what)
|
21
|
+
%x{cd #{where} && #{what}}
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Vpsb
|
2
|
+
module Commands
|
3
|
+
class HelpMessages
|
4
|
+
def self.intro
|
5
|
+
"Vpsb ver: #{VERSION}"
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.unknown_command
|
9
|
+
"Command unknown"
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.show
|
13
|
+
%{
|
14
|
+
Need help :D
|
15
|
+
|
16
|
+
commands:
|
17
|
+
init <name> #name is optional when is present all files will be created in in folder that name
|
18
|
+
|
19
|
+
}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Vpsb
|
2
|
+
module Commands
|
3
|
+
class Init
|
4
|
+
|
5
|
+
def execute(params)
|
6
|
+
unless params.empty?
|
7
|
+
name = params[0]
|
8
|
+
p "creating directory #{name}"
|
9
|
+
make_dir(name)
|
10
|
+
enter_to_the_dir(name)
|
11
|
+
end
|
12
|
+
|
13
|
+
p 'installing all gems'
|
14
|
+
install_all_gems
|
15
|
+
p 'clone all repos'
|
16
|
+
clone_all_repos
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
GEMS = %w{ knife-solo knife-digital_ocean librarian-chef knife-solo_data_bag }
|
22
|
+
REPOS = %w{
|
23
|
+
https://github.com/pniemczyk/bootstrap_rails_app_in_do.git
|
24
|
+
https://github.com/pniemczyk/bootstrap_server_app_in_do.git
|
25
|
+
}
|
26
|
+
|
27
|
+
def install_all_gems
|
28
|
+
GEMS.each{ |gem_name| gem_install(gem_name) }
|
29
|
+
end
|
30
|
+
|
31
|
+
def clone_all_repos
|
32
|
+
REPOS.each { |source| git_clone(source) }
|
33
|
+
end
|
34
|
+
|
35
|
+
def enter_to_the_dir(name)
|
36
|
+
Dir.chdir(name)
|
37
|
+
end
|
38
|
+
|
39
|
+
def make_dir(name)
|
40
|
+
Dir.mkdir name
|
41
|
+
end
|
42
|
+
|
43
|
+
def gem_install(name)
|
44
|
+
system("gem install #{name} --no-ri --no-rdoc")
|
45
|
+
end
|
46
|
+
|
47
|
+
def git_clone(source)
|
48
|
+
system("git clone #{source}")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|