linux_provision 0.9.3 → 0.9.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.linux_provision.json +3 -3
  3. data/CHANGES +4 -0
  4. data/Gemfile +8 -5
  5. data/Gemfile.lock +57 -9
  6. data/README.md +129 -35
  7. data/Vagrantfile +1 -1
  8. data/demo/.ruby-gemset +1 -0
  9. data/demo/.ruby-version +1 -0
  10. data/demo/Dockerfile +107 -0
  11. data/demo/Gemfile +7 -0
  12. data/demo/Gemfile.lock +45 -0
  13. data/demo/Rakefile +7 -0
  14. data/demo/app.rb +29 -0
  15. data/demo/bin/start-server.sh +7 -0
  16. data/demo/config.ru +3 -0
  17. data/demo/db/migrate/20140610203958_create_notes.rb +14 -0
  18. data/demo/db/migrate/20140610204302_add_notes.rb +7 -0
  19. data/demo/db/schema.rb +26 -0
  20. data/demo/db_setup.rb +11 -0
  21. data/demo/note.rb +2 -0
  22. data/demo/supervisord.conf +8 -0
  23. data/demo/views/index.erb +10 -0
  24. data/demo/views/layout.erb +8 -0
  25. data/demo/views/new.erb +12 -0
  26. data/demo/views/note.erb +3 -0
  27. data/docker/postgres/Dockerfile +61 -0
  28. data/docker/postgres/bin/create_db.sh +14 -0
  29. data/docker/sshd/Dockerfile +28 -0
  30. data/docker/supervisord/Dockerfile +28 -0
  31. data/docker/supervisord/supervisord.conf +8 -0
  32. data/lib/linux_provision/generic_provision.rb +28 -19
  33. data/lib/linux_provision/linux_provision.rb +7 -165
  34. data/lib/linux_provision/linux_provision_scripts.sh +65 -21
  35. data/lib/linux_provision/version.rb +1 -1
  36. data/presentation/virtualization/01-vagrant/slides.md +381 -0
  37. data/presentation/virtualization/02-provision/slides.md +400 -0
  38. data/presentation/virtualization/03-docker/slides.md +208 -0
  39. data/presentation/virtualization/04-conclusion/slides.md +36 -0
  40. data/presentation/virtualization/default.css +59 -0
  41. data/presentation/virtualization/default.tpl +2 -0
  42. data/presentation/virtualization/images/chef.jpg +0 -0
  43. data/presentation/virtualization/images/provisioning.jpg +0 -0
  44. data/presentation/virtualization/images/vagrant.jpg +0 -0
  45. data/presentation/virtualization/showoff.json +23 -0
  46. data/presentation/virtualization/simple.tpl +2 -0
  47. data/spec/linux_install_spec.rb +9 -2
  48. data/spec/linux_provision_spec.rb +1 -1
  49. data/stats/viewstats.json +1 -0
  50. data/thor/demo_scripts.sh +34 -0
  51. data/thor/docker.thor +31 -0
  52. data/thor/linux_install.thor +17 -115
  53. metadata +40 -2
@@ -4,7 +4,7 @@ class LinuxProvision < GenericProvision
4
4
 
5
5
  USER_LOCAL_BIN = "/usr/local/bin"
6
6
 
7
- def initialize config_file_name=".linux_provision.json", scripts_file_names=[]
7
+ def initialize parent_class, config_file_name=".linux_provision.json", scripts_file_names=[]
8
8
  scripts_file_names.unshift(File.expand_path("linux_provision_scripts.sh", File.dirname(__FILE__))) # make it first
9
9
 
10
10
  super
@@ -16,174 +16,16 @@ class LinuxProvision < GenericProvision
16
16
  end
17
17
  end
18
18
 
19
+ def postgres_drop_schemas
20
+ env[:postgres][:app_schemas].each do |schema|
21
+ run(server_info, "postgres_drop_schema", env.merge(schema: schema))
22
+ end
23
+ end
24
+
19
25
  def mysql_create_schemas
20
26
  env[:mysql][:app_schemas].each do |schema|
21
27
  run(server_info, "mysql_create_schema", env.merge(schema: schema))
22
28
  end
23
29
  end
24
30
 
25
- def create_postgres_user app_user, schema
26
- run("create_postgres_user", binding)
27
- end
28
-
29
- # execute(server_info) { "/usr/local/bin/dropuser #{app_user}" }
30
- # execute(server_info) { "/usr/local/bin/dropdb #{schema}" }
31
-
32
- private
33
-
34
- def method_missing(method, *args, &block)
35
- run(server_info, method.to_s, env)
36
- end
37
-
38
- # def test
39
- # run(server_info, "test", env)
40
- # end
41
-
42
- # def prepare
43
- # env['password'] = ask_password("Enter password for #{env[:node][:user]}: ")
44
- #
45
- # run(server_info.merge(capture_output: false), "prepare", env)
46
- # end
47
- #
48
- # def rvm_install
49
- # installed = package_installed '#{ENV[\'HOME\']}/.rvm/bin/rvm'
50
- #
51
- # if installed
52
- # puts "rvm already installed."
53
- # else
54
- # run(server_info, "rvm", env)
55
- # end
56
- # end
57
- #
58
- # def npm_install
59
- # installed = package_installed "#{USER_LOCAL_BIN}/npm"
60
- #
61
- # if installed
62
- # puts "npm already installed."
63
- # else
64
- # run(server_info, "npm", env)
65
- # end
66
- # end
67
-
68
- # def qt_install
69
- # installed = package_installed "#{USER_LOCAL_BIN}/qmake"
70
- #
71
- # if installed
72
- # puts "qt already installed."
73
- # else
74
- # run(server_info, "qt", env)
75
- # end
76
- # end
77
- #
78
- # def mysql_install
79
- # installed = package_installed "#{USER_LOCAL_BIN}/mysql"
80
- #
81
- # if installed
82
- # puts "mysql already installed."
83
- # else
84
- # run(server_info, "mysql", env)
85
- # end
86
- # end
87
- #
88
- # def mysql_restart
89
- # started = service_started("homebrew.mxcl.mysql")
90
- #
91
- # run(server_info, "mysql_restart", env.merge({started: started}))
92
- # end
93
- #
94
- # def postgres_install
95
- # installed = package_installed "#{USER_LOCAL_BIN}/postgres"
96
- #
97
- # if installed
98
- # puts "postgres already installed."
99
- # else
100
- # run(server_info, "postgres", env)
101
- # end
102
- # end
103
- #
104
- # def postgres_restart
105
- # started = service_started("homebrew.mxcl.postgres")
106
- #
107
- # run(server_info, "postgres_restart", env.merge({started: started}))
108
- # end
109
- #
110
- # def postgres_stop
111
- # run server_info, "postgres_stop", env
112
- # end
113
- #
114
- # def postgres_start
115
- # run server_info, "postgres_start", env
116
- # end
117
- #
118
- # def ruby_install
119
- # installed = package_installed "#{ENV['HOME']}/.rvm/rubies/ruby-1.9.3-p429/bin/ruby"
120
- #
121
- # if installed
122
- # puts "ruby already installed."
123
- # else
124
- # run(server_info, "ruby", env)
125
- # end
126
- # end
127
- #
128
- # def jenkins_install
129
- # installed = package_installed "/usr/local/opt/jenkins/libexec/jenkins.war"
130
- #
131
- # if installed
132
- # puts "jenkins already installed."
133
- # else
134
- # run(server_info, "jenkins", env)
135
- # end
136
- # end
137
- #
138
- # def jenkins_restart
139
- # started = service_started("homebrew.mxcl.jenkins")
140
- #
141
- # run(server_info, "jenkins_restart", env.merge({started: started}))
142
- # end
143
- #
144
- # def selenium_install
145
- # installed = package_installed "/usr/local/opt/selenium-server-standalone/selenium-server-standalone*.jar"
146
- #
147
- # if installed
148
- # puts "selenium already installed."
149
- # else
150
- # run(server_info, "selenium", env)
151
- # end
152
- # end
153
- #
154
- # def selenium_restart
155
- # started = service_started("homebrew.mxcl.selenium-server-standalone")
156
- #
157
- # run(server_info, "selenium_restart", env.merge({started: started}))
158
- # end
159
- #
160
- # def postgres_create user, schemas
161
- # create_postgres_user user, schemas.first
162
- #
163
- # schemas.each do |schema|
164
- # create_postgres_schema user, schema
165
- # end
166
- # end
167
- #
168
- # def postgres_drop user, schemas
169
- # schemas.each do |schema|
170
- # drop_postgres_schema schema
171
- # end
172
- #
173
- # drop_postgres_user user, schemas.first
174
- # end
175
- #
176
- # def postgres_test schema
177
- # result = get_postgres_schemas schema
178
- #
179
- # puts result
180
- # end
181
- #
182
- # def package_installed package_path
183
- # result = run server_info.merge(:suppress_output => true, :capture_output => true),
184
- # "package_installed", env.merge({package_path: package_path})
185
- #
186
- # result.chomp == package_path
187
- # end
188
-
189
31
  end
@@ -8,29 +8,28 @@ echo "test"
8
8
 
9
9
  ##############################
10
10
  [prepare]
11
+ # Updates linux core packages
11
12
 
12
13
  sudo apt-get update
13
14
 
14
15
  sudo apt-get install -y curl
15
16
  sudo apt-get install -y g++
16
17
  sudo apt-get install -y subversion
18
+ sudo apt-get install -y git
17
19
 
18
20
 
19
21
  ##############################
20
22
  [rvm]
21
- #PATH=$PATH:/usr/local/bin
22
-
23
- USER_HOME="#{node.home}"
23
+ # Installs rvm
24
24
 
25
25
  curl -L https://get.rvm.io | bash
26
26
 
27
27
  sudo chown -R vagrant /opt/vagrant_ruby
28
28
 
29
- source $USER_HOME/.rvm/scripts/rvm
30
-
31
29
 
32
30
  ##############################
33
31
  [ruby]
32
+ # Installs ruby
34
33
 
35
34
  USER_HOME="#{node.home}"
36
35
 
@@ -39,25 +38,23 @@ source $USER_HOME/.rvm/scripts/rvm
39
38
  rvm install ruby-1.9.3
40
39
 
41
40
 
42
- ##############################
43
- [git]
44
-
45
- sudo apt-get install -y git
46
-
47
-
48
41
  ##############################
49
42
  [node]
43
+ # Installs node
50
44
 
51
45
  sudo apt-get install -y node
52
46
 
53
47
 
54
48
  ##############################
55
49
  [jenkins]
50
+ # Installs jenkins
51
+
56
52
  sudo apt-get install -y jenkins
57
53
 
58
54
 
59
55
  ##############################
60
56
  [postgres]
57
+ # Installs postgres server
61
58
 
62
59
  sudo apt-get install -y postgresql-client
63
60
  sudo apt-get install -y libpq-dev
@@ -66,6 +63,7 @@ sudo apt-get install -y postgresql
66
63
 
67
64
  ##############################
68
65
  [mysql]
66
+ # Installs mysql server
69
67
 
70
68
  MYSQL_PASSWORD='#{mysql.password}'
71
69
 
@@ -88,13 +86,20 @@ sudo apt-get -y install mysql-server
88
86
  PATH=$PATH:/usr/local/bin
89
87
 
90
88
  APP_USER='#{postgres.app_user}'
89
+ APP_PASSWORD='#{postgres.app_password}'
91
90
 
92
91
  sudo -u postgres psql -c "CREATE USER $APP_USER WITH PASSWORD '$APP_USER'"
93
- #createuser -s -d -r $APP_USER
94
92
 
95
93
  ##############################
96
94
  [postgres_drop_user]
97
95
 
96
+ PATH=$PATH:/usr/local/bin
97
+
98
+ APP_USER='#{postgres.app_user}'
99
+
100
+ sudo -u postgres psql -c "DROP USER $APP_USER"
101
+
102
+
98
103
  ##############################
99
104
  [postgres_create_schema]
100
105
 
@@ -113,6 +118,12 @@ sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $SCHEMA to $APP_USER"
113
118
  ##############################
114
119
  [postgres_drop_schema]
115
120
 
121
+ PATH=$PATH:/usr/local/bin
122
+
123
+ SCHEMA='#{schema}'
124
+
125
+ sudo -u postgres psql -c "DROP DATABASE $SCHEMA"
126
+
116
127
 
117
128
  ##############################
118
129
  [mysql_create_user]
@@ -158,19 +169,52 @@ mysql -h $HOST_NAME -u $MYSQL_USER -p"$MYSQL_PASSWORD" -e "create database $SCHE
158
169
 
159
170
 
160
171
  ##############################
161
- [project]
172
+ # http://www.labelmedia.co.uk/blog/setting-up-selenium-server-on-a-headless-jenkins-ci-build-machine.html
173
+ [selenium]
174
+ # Installs selenium server
162
175
 
163
- USER_HOME="#{node.home}"
176
+ wget http://selenium-release.storage.googleapis.com/2.42/selenium-server-standalone-2.42.2.jar
164
177
 
165
- APP_HOME="#{project.home}"
178
+ sudo mkdir /var/lib/selenium
166
179
 
167
- cd $APP_HOME
180
+ sudo mv selenium-server-standalone-2.42.2.jar /var/lib/selenium
168
181
 
169
- source $USER_HOME/.rvm/scripts/rvm
182
+ cd /var/lib/selenium
183
+
184
+ sudo ln -s selenium-server-standalone-2.42.2.jar selenium-server.jar
185
+
186
+ sudo apt-get install -y xvfb
187
+ sudo update-rc.d xvfb defaults 10
188
+
189
+ sudo apt-get install -y firefox
190
+
191
+ # export DISPLAY=":99" && java -jar /var/lib/selenium/selenium-server.jar
192
+
193
+
194
+ ##############################
195
+ [selenium2]
196
+ cat > xvfb <<END
197
+ #!/bin/bash
198
+
199
+ if [ -z "$1" ]; then
200
+ echo "`basename $0` {start|stop}"
201
+ exit
202
+ fi
203
+
204
+ case "$1" in
205
+ start)
206
+ /usr/bin/Xvfb :99 -ac -screen 0 1024x768x8 &
207
+ ;;
208
+
209
+ stop)
210
+ killall Xvfb
211
+ ;;
212
+ esac
213
+ END
214
+
215
+ #sudo mv xvfb /etc/init.d/xvfb
170
216
 
171
- rvm use #{project.ruby_version}@#{project.gemset}
217
+ #sudo chmod 755 /etc/init.d/xvfb
172
218
 
173
- bundle install --without=production
219
+ /etc/init.d/xvfb start
174
220
 
175
- # rake db:migrate
176
- # rails s
@@ -1,3 +1,3 @@
1
1
  class LinuxProvision
2
- VERSION = "0.9.3"
2
+ VERSION = "0.9.4"
3
3
  end
@@ -0,0 +1,381 @@
1
+ !SLIDE
2
+
3
+ # Boosting developer's productivity: Using Vagrant and Chef
4
+
5
+ * Author: **Alexander Shvets**
6
+ * Year: **2014**
7
+
8
+
9
+ !SLIDE title-and-content transition=fade incremental
10
+ .notes notes for my slide
11
+
12
+ # Why do we need virtualization in development?
13
+
14
+ * We want to have **same environment for all developers**, no matter on what platform they are working now.
15
+
16
+ * We are **working on multiple projects** on same workstation. As a result, suddenly your computer has "hidden",
17
+ hard-to-discover inter-project dependencies or different versions of same library.
18
+
19
+ * To overcome **It "works on my machine!"** syndrome - development environment is different from production environment.
20
+
21
+ * Sometimes required software is **not available** on developer's platform. Example: 64-bit instant client for oracle
22
+ was broken for almost two years on OS/X >= 10.7.
23
+
24
+ * **Development for PAAS**, such as Heroku, Engine Yard etc. You can find/build virtualization that is pretty close to
25
+ your platform.
26
+
27
+
28
+
29
+ !SLIDE content transition=cover
30
+
31
+ # Vagrant
32
+
33
+ >
34
+
35
+ ![vagrant](vagrant.jpg)
36
+
37
+ !SLIDE title-and-content transition=cover
38
+
39
+ # What is it?
40
+
41
+ * It is ruby gem.
42
+ * it helps to provide easy to configure, reproducible, and portable work environments.
43
+
44
+
45
+
46
+ !SLIDE title-and-content transition=cover
47
+
48
+ # Installation
49
+
50
+ * Install [VirtualBox](https://www.virtualbox.org/wiki/Downloads). Download it from dedicated web site and install
51
+ it as native program. You can use it in UI mode, but it's not required.
52
+
53
+ * Install [Vagrant](http://www.vagrantup.com) gem:
54
+
55
+ ```bash
56
+ $ gem install vagrant
57
+ ```
58
+
59
+ * or put it into **Gemfile**:
60
+
61
+ ```ruby
62
+ gem "vagrant"
63
+ ```
64
+
65
+ * Run bundler:
66
+
67
+ ```bash
68
+ bundle install
69
+ ```
70
+
71
+
72
+
73
+ !SLIDE title-and-content transition=cover
74
+
75
+ # Playing with vagrant
76
+
77
+ * Install linux image
78
+
79
+ ```bash
80
+ $ vagrant box add precise64 http://files.vagrantup.com/precise64.box
81
+ ```
82
+
83
+ * Initialize
84
+
85
+ ```bash
86
+ $ vagrant init precise64
87
+ ```
88
+
89
+ * Run or reload
90
+
91
+ ```bash
92
+ $ vagrant up
93
+ $ vagrant reload
94
+ $ vagrant provision
95
+ ```
96
+
97
+
98
+
99
+ !SLIDE title-and-content transition=cover
100
+
101
+ # Playing with vagrant (continued)
102
+
103
+ * Suspend/destroy:
104
+
105
+ ```bash
106
+ $ vagrant suspend
107
+ $ vagrant destroy
108
+ ```
109
+
110
+ * or remove linux image
111
+
112
+ ```bash
113
+ $ vagrant box remove precise64
114
+ ```
115
+
116
+
117
+
118
+ !SLIDE title-and-content transition=cover
119
+
120
+ # Access VM
121
+
122
+ ```bash
123
+ $ vagrant ssh
124
+ ```
125
+
126
+ ```bash
127
+ vagrant> ls /vagrant
128
+ ```
129
+
130
+ * You will see all project's files
131
+
132
+ ```bash
133
+ drwxr-xr-x 48 alex staff 1.6K Apr 21 15:29 ./
134
+ drwxrwxrwx 24 alex staff 816B Apr 21 15:31 ../
135
+ -rw-rw-rw- 1 alex staff 101B Apr 19 10:11 Berksfile
136
+ -rw-rw-rw- 1 alex staff 512B Apr 19 09:57 Berksfile.lock
137
+ -rw-rw-rw- 1 alex staff 188B Apr 17 11:40 Cheffile
138
+ -rw-rw-rw- 1 alex staff 715B Apr 16 11:39 Cheffile.lock
139
+ -rw-rw-rw- 1 alex staff 4.4K Apr 21 14:20 Gemfile
140
+ -rw-r--r-- 1 alex staff 9.7K Apr 21 14:20 Gemfile.lock
141
+ -rw-r--r-- 1 alex staff 106B Mar 23 13:14 Procfile
142
+ -rw-r--r-- 1 alex staff 297B Mar 23 13:14 README.md
143
+ -rw-r--r-- 1 alex staff 5.8K Apr 20 11:54 Rakefile
144
+ -rw-rw-rw- 1 alex staff 5.1K Apr 17 15:19 Vagrantfile
145
+ drwxr-xr-x 9 alex staff 306B Mar 24 13:37 app/
146
+ -rwxrwxrwx@ 1 alex staff 3.1K Apr 18 09:56 bootstrap.sh*
147
+ drwxr-xr-x 8 alex staff 272B Apr 20 07:54 public/
148
+ ```
149
+
150
+
151
+
152
+ !SLIDE title-and-content transition=cover incremental
153
+
154
+ # Available provisioners for Vagrant
155
+
156
+ * Shell
157
+ * Chef Server
158
+ * Chef Solo
159
+ * Puppet Server/Standalone
160
+
161
+
162
+
163
+ !SLIDE title-and-content transition=cover
164
+
165
+
166
+ # Example 1
167
+
168
+ * **Vagrantfile** with **bash** shell provisioning:
169
+
170
+ ```ruby
171
+ Vagrant::Config.run do |config|
172
+ config.vm.box = "precise64"
173
+
174
+ config.vm.network :hostonly, "22.22.22.22"
175
+
176
+ config.vm.provision :shell, :path => "bootstrap.sh"
177
+ end
178
+ ```
179
+
180
+ !SLIDE title-and-content transition=cover
181
+
182
+ # Example 2
183
+
184
+ * **Vagrantfile** with **chef** provisioning
185
+
186
+ ```ruby
187
+ Vagrant::Config.run do |config|
188
+ config.vm.box = "precise64"
189
+ config.vm.network :hostonly, "22.22.22.22"
190
+
191
+ config.vm.provision :chef_solo do |chef|
192
+ chef.cookbooks_path = ["vendored_cookbooks", "cookbooks"]
193
+
194
+ chef.add_recipe 'application'
195
+
196
+ chef.json.merge!({
197
+ application: {app_name: "triton"},
198
+
199
+ rvm: {ruby: {version: '1.9.3', implementation: 'ruby',
200
+ patch_level: 'p392'}},
201
+ postgresql: { username: "postgres", password: "postgres"},
202
+ mysql: { server_debian_password: "root",
203
+ server_root_password: "root",
204
+ server_repl_password: "root"}
205
+ })
206
+ end
207
+ end
208
+ ```
209
+
210
+
211
+
212
+ !SLIDE title-and-content transition=cover
213
+
214
+ # Example 3
215
+
216
+ * **Vagrantfile** with multiple environments:
217
+
218
+ ```ruby
219
+ Vagrant::Config.run do |config|
220
+ config.vm.define :node1 do |node_config|
221
+ node_config.vm.box = "lucid32"
222
+ end
223
+ config.vm.define :node2 do |node_config|
224
+ node_config.vm.box = "precise32"
225
+ end
226
+ end
227
+ ```
228
+
229
+ * Start first node in one tab:
230
+
231
+ ```bash
232
+ vagrant up node1
233
+ vagrant ssh node1
234
+ ```
235
+
236
+ * and second node in another tab:
237
+
238
+ ```bash
239
+ vagrant up node2
240
+ vagrant ssh node2
241
+ ```
242
+
243
+
244
+ !SLIDE title-and-content transition=cover
245
+
246
+ # Packaging
247
+
248
+ * You can create new package based on your vagrant setup.
249
+
250
+ * This new package can be used by other developers for faster installation.
251
+
252
+ * It will have already preinstalled and configured ruby/rvm/mysql/postgres etc.:
253
+
254
+ ```bash
255
+ vagrant package --vagrantfile Vagrantfile --output proteus.box
256
+ ```
257
+
258
+
259
+
260
+ !SLIDE title-and-content transition=cover
261
+
262
+ # What's next?
263
+
264
+ * Once you install Vagrant with some provision (script, chef-solo or puppet), you can use it in same way as your worksation:
265
+
266
+ ```bash
267
+ vagrant ssh
268
+
269
+ cd /vagrant
270
+
271
+ rake db:dev:reset
272
+
273
+ rspec
274
+
275
+ ASSET_HOST=http://22.22.22.22:3000 rails s
276
+ ```
277
+
278
+ * and then access it from the browser within [host computer](http://22.22.22.22:3000/triton):
279
+
280
+ ```
281
+ open http://22.22.22.22:3000/triton
282
+ ```
283
+
284
+
285
+ !SLIDE title-and-content incremental commandline transition=cover
286
+
287
+ # Example of shell script for provisioning:
288
+
289
+ ```bash
290
+ # Install core packages
291
+
292
+ apt-get update
293
+ sudo apt-get install -y curl
294
+ sudo apt-get install -y g++
295
+ sudo apt-get install -y subversion
296
+
297
+ # Install RVM
298
+
299
+ \curl -L https://get.rvm.io | bash -s stable --ruby=$RUBY_VERSION
300
+ source /usr/local/rvm/scripts/rvm
301
+ chown -R vagrant /usr/local/rvm
302
+ /usr/local/rvm/bin/rvm autolibs enable
303
+
304
+ # Install databases
305
+
306
+ sudo apt-get install -y postgresql-client
307
+ sudo apt-get install -y postgresql
308
+ sudo apt-get install -y mysql-client
309
+ apt-get -y install mysql-server
310
+
311
+ cd $APP_HOME
312
+ bundle install --without=production
313
+ rake db:migrate
314
+ ```
315
+
316
+
317
+
318
+ !SLIDE title-and-content transition=cover
319
+
320
+ # Example of **chef** script for provisioning
321
+
322
+ ```ruby
323
+ # cookbooks/application/recipes/default.rb
324
+
325
+ include_recipe "apt"
326
+
327
+ package "curl"
328
+ package "g++"
329
+ package "subversion"
330
+
331
+ include_recipe "rvm"
332
+
333
+ bash "Registering RVM" do
334
+ code "source /etc/profile.d/rvm.sh"
335
+ not_if "test -e /usr/local/rvm/bin/rvm"
336
+ end
337
+
338
+ bash "Configuring RVM" do
339
+ user "root"
340
+
341
+ code <<-CODE
342
+ chown -R vagrant /usr/local/rvm
343
+ /usr/local/rvm/bin/rvm autolibs enable
344
+ CODE
345
+ end
346
+ include_recipe "rvm::install"
347
+ ```
348
+
349
+
350
+
351
+ !SLIDE title-and-content transition=cover
352
+
353
+ # Example of **chef** script for provisioning (continued)
354
+
355
+ ```ruby
356
+ include_recipe "postgresql"
357
+ include_recipe "postgresql::server"
358
+ include_recipe "mysql"
359
+ include_recipe "mysql::server"
360
+
361
+ bash "Installing bundle" do
362
+ user 'vagrant'
363
+ cwd app_home
364
+
365
+ code <<-CODE
366
+ source /etc/profile.d/rvm.sh
367
+ rvm use #{ruby_version}@#{gem_name} --create
368
+ bundle install --without=production
369
+ CODE
370
+ end
371
+
372
+ bash "Project db bootstrap" do
373
+ user 'vagrant'
374
+ cwd app_home
375
+
376
+ code <<-CODE
377
+ source /etc/profile.d/rvm.sh
378
+ rake db:migrate
379
+ CODE
380
+ end
381
+ ```