vpsb 1.0.0
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 +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
|