pvcglue 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +91 -0
  6. data/Rakefile +1 -0
  7. data/bin/pvc +13 -0
  8. data/lib/pvcglue.rb +43 -0
  9. data/lib/pvcglue/all_the_things.rb +7 -0
  10. data/lib/pvcglue/bootstrap.rb +8 -0
  11. data/lib/pvcglue/capistrano.rb +35 -0
  12. data/lib/pvcglue/cli.rb +150 -0
  13. data/lib/pvcglue/cloud.rb +278 -0
  14. data/lib/pvcglue/configuration.rb +157 -0
  15. data/lib/pvcglue/db.rb +145 -0
  16. data/lib/pvcglue/deploy.rb +4 -0
  17. data/lib/pvcglue/env.rb +141 -0
  18. data/lib/pvcglue/manager.rb +137 -0
  19. data/lib/pvcglue/nodes.rb +29 -0
  20. data/lib/pvcglue/packages.rb +47 -0
  21. data/lib/pvcglue/packages/bootstrap.rb +92 -0
  22. data/lib/pvcglue/packages/env.rb +80 -0
  23. data/lib/pvcglue/packages/firewall.rb +48 -0
  24. data/lib/pvcglue/packages/manager.rb +102 -0
  25. data/lib/pvcglue/packages/nginx.rb +10 -0
  26. data/lib/pvcglue/packages/nodejs.rb +17 -0
  27. data/lib/pvcglue/packages/passenger.rb +28 -0
  28. data/lib/pvcglue/packages/postgresql.rb +10 -0
  29. data/lib/pvcglue/packages/role_db.rb +47 -0
  30. data/lib/pvcglue/packages/role_lb.rb +64 -0
  31. data/lib/pvcglue/packages/role_memcached.rb +14 -0
  32. data/lib/pvcglue/packages/role_web.rb +60 -0
  33. data/lib/pvcglue/packages/rvm.rb +75 -0
  34. data/lib/pvcglue/packages/timezone.rb +17 -0
  35. data/lib/pvcglue/packages/ubuntu.rb +100 -0
  36. data/lib/pvcglue/railtie.rb +11 -0
  37. data/lib/pvcglue/ssl.rb +37 -0
  38. data/lib/pvcglue/templates/20auto-upgrades.erb +2 -0
  39. data/lib/pvcglue/templates/authorized_keys.erb +3 -0
  40. data/lib/pvcglue/templates/capfile.erb +20 -0
  41. data/lib/pvcglue/templates/database.yml.erb +57 -0
  42. data/lib/pvcglue/templates/denial_of_service.erb +3 -0
  43. data/lib/pvcglue/templates/deploy.rb.erb +81 -0
  44. data/lib/pvcglue/templates/gemrc.erb +1 -0
  45. data/lib/pvcglue/templates/hosts.erb +9 -0
  46. data/lib/pvcglue/templates/lb.nginx.conf.erb +88 -0
  47. data/lib/pvcglue/templates/lb.sites-enabled.erb +74 -0
  48. data/lib/pvcglue/templates/maintenance_mode.erb +46 -0
  49. data/lib/pvcglue/templates/memcached.conf.erb +55 -0
  50. data/lib/pvcglue/templates/passenger.list.erb +2 -0
  51. data/lib/pvcglue/templates/pg_hba.conf.erb +101 -0
  52. data/lib/pvcglue/templates/postgresql.conf.erb +557 -0
  53. data/lib/pvcglue/templates/sshd_config.erb +91 -0
  54. data/lib/pvcglue/templates/stage-deploy.rb.erb +33 -0
  55. data/lib/pvcglue/templates/timezone.erb +1 -0
  56. data/lib/pvcglue/templates/ufw.rules.erb +42 -0
  57. data/lib/pvcglue/templates/ufw.rules6.erb +25 -0
  58. data/lib/pvcglue/templates/web.bashrc.erb +120 -0
  59. data/lib/pvcglue/templates/web.env.erb +3 -0
  60. data/lib/pvcglue/templates/web.nginx.conf.erb +82 -0
  61. data/lib/pvcglue/templates/web.sites-enabled.erb +8 -0
  62. data/lib/pvcglue/toml_pvc_dumper.rb +53 -0
  63. data/lib/pvcglue/version.rb +3 -0
  64. data/pvcglue.gemspec +33 -0
  65. metadata +296 -0
@@ -0,0 +1,10 @@
1
+ # Reference http://www.modrails.com/documentation/Users%20guide%20Nginx.html
2
+ # 'nginx-extras' is the "everything" install, https://wiki.debian.org/Nginx
3
+ apt_package 'nginx', 'nginx-extras' do
4
+ depends_on 'phusion-repository' # Must use nginx from phusion repo to automatically get passenger integration and the latest version
5
+ action('start') { sudo 'service nginx start' }
6
+ action('stop') { sudo 'service nginx stop' }
7
+ action('restart') { trigger('nginx:running') ? sudo('service nginx restart') : trigger('nginx:start') }
8
+ action('running') { run('ps aux | grep [n]ginx') =~ /nginx: master process/ }
9
+ action('reload') { sudo 'pkill -HUP nginx' }
10
+ end
@@ -0,0 +1,17 @@
1
+ package 'nodejs' do
2
+ depends_on 'apt'
3
+ validate do
4
+ trigger('apt:exists', 'nodejs') &&
5
+ binary_exists?('node') &&
6
+ binary_exists?('npm')
7
+ end
8
+ apply do
9
+ trigger 'apt:ppa', 'ppa:chris-lea/node.js'
10
+ trigger 'apt:update'
11
+ trigger 'apt:install', 'nodejs'
12
+ end
13
+ remove do
14
+ trigger 'apt:remove', 'nodejs'
15
+ end
16
+ end
17
+
@@ -0,0 +1,28 @@
1
+ apt_package 'apt-transport-https'
2
+ apt_package 'passenger'
3
+
4
+ package 'phusion-sources-list' do
5
+ file({
6
+ :template => Pvcglue.template_file_name('passenger.list.erb'),
7
+ :destination => '/etc/apt/sources.list.d/passenger.list',
8
+ :permissions => 644,
9
+ :user => 'root',
10
+ :group => 'root'
11
+ }) { trigger 'apt:update', true
12
+ }
13
+
14
+ end
15
+
16
+ package 'phusion-apt-key' do
17
+ apply do
18
+ sudo "apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 561F9B9CAC40B2F7"
19
+ end
20
+ end
21
+
22
+ package 'phusion-repository' do
23
+ # http://www.modrails.com/documentation/Users%20guide%20Nginx.html#install_on_debian_ubuntu
24
+ depends_on 'apt-transport-https'
25
+ depends_on 'phusion-apt-key'
26
+ depends_on 'phusion-sources-list'
27
+ end
28
+
@@ -0,0 +1,10 @@
1
+ apt_package 'postgresql' do
2
+ action('start') { sudo 'service postgresql start' }
3
+ action('stop') { sudo 'service postgresql stop' }
4
+ action('restart') { sudo('service postgresql restart') }
5
+ end
6
+
7
+ package 'postgres' do
8
+ depends_on 'postgresql', 'libpq-dev'
9
+ end
10
+
@@ -0,0 +1,47 @@
1
+ package 'db' do
2
+ depends_on 'env-initialized'
3
+ depends_on 'postgresql'
4
+ depends_on 'postgresql-conf'
5
+ depends_on 'postgresql-app-stage-conf'
6
+ end
7
+
8
+ package 'postgresql-conf' do
9
+ file({
10
+ :template => Pvcglue.template_file_name('postgresql.conf.erb'),
11
+ :destination => '/etc/postgresql/9.1/main/postgresql.conf',
12
+ :create_dirs => false,
13
+ :permissions => 0644,
14
+ :user => 'postgres',
15
+ :group => 'postgres'
16
+ }) { trigger 'postgresql:restart' }
17
+
18
+ file({
19
+ :template => Pvcglue.template_file_name('pg_hba.conf.erb'),
20
+ :destination => '/etc/postgresql/9.1/main/pg_hba.conf',
21
+ :create_dirs => false,
22
+ :permissions => 0644,
23
+ :user => 'postgres',
24
+ :group => 'postgres'
25
+ }) { trigger 'postgresql:restart' }
26
+ end
27
+
28
+ package 'postgresql-app-stage-conf' do
29
+ # TODO: Add `verify` method so it will be faster, and won't display errors
30
+ apply do
31
+ username = Pvcglue.cloud.stage_env['DB_USER_POSTGRES_USERNAME']
32
+ password = Pvcglue.cloud.stage_env['DB_USER_POSTGRES_PASSWORD']
33
+ db_name = username # just for clarity in later statements. This also must match database.yml.
34
+ run(%Q[sudo -u postgres psql -c "CREATE ROLE #{username} LOGIN CREATEDB PASSWORD '#{password}'"])
35
+ run(%Q[sudo -u postgres psql -c "ALTER ROLE #{username} PASSWORD '#{password}' CREATEDB LOGIN"])
36
+ run(%Q[sudo -u postgres psql -c "CREATE DATABASE #{db_name} WITH OWNER #{username}"])
37
+ run(%Q[sudo -u postgres psql #{db_name} -c "ALTER SCHEMA public OWNER TO #{username}"])
38
+ end
39
+ end
40
+
41
+ package 'postgresql-root-password' do
42
+ apply do
43
+ # TODO: Use this to implement setting of the root password
44
+ # sudo(%q[sudo -u postgres psql -c "ALTER ROLE postgres WITH PASSWORD 'zzz';"])
45
+ end
46
+ end
47
+
@@ -0,0 +1,64 @@
1
+ package 'lb' do
2
+ depends_on 'nginx'
3
+ depends_on 'ssl-cert'
4
+ depends_on 'lb-config'
5
+ depends_on 'lb-maintenance-files'
6
+
7
+ validate do
8
+ trigger('nginx:running')
9
+ end
10
+
11
+ end
12
+
13
+ package 'lb-config' do
14
+ file({
15
+ :template => Pvcglue.template_file_name('lb.nginx.conf.erb'),
16
+ :destination => '/etc/./nginx/nginx.conf', # !!! Yes the extra '.' is important !!! It makes this nginx.conf a 'different' nginx.conf than the web server. Seems to be a "feature" of the orca gem.
17
+ :create_dirs => false,
18
+ :permissions => 0644,
19
+ :user => 'root',
20
+ :group => 'root'
21
+ }) { sudo('service nginx restart') }
22
+
23
+ file({
24
+ :template => Pvcglue.template_file_name('lb.sites-enabled.erb'),
25
+ :destination => "/etc/./nginx/sites-enabled/#{Pvcglue.cloud.app_and_stage_name}", # !!! Yes the extra '.' is important !!! It makes this nginx.conf a 'different' nginx.conf than the web server. Seems to be a "feature" of the orca gem.
26
+ :create_dirs => false,
27
+ :permissions => 0644,
28
+ :user => 'root',
29
+ :group => 'root'
30
+ }) { sudo('service nginx restart') }
31
+ end
32
+
33
+ package 'lb-maintenance-files' do
34
+ apply do
35
+ source_dir = Pvcglue.configuration.app_maintenance_files_dir
36
+ dest_dir = Pvcglue.cloud.maintenance_files_dir
37
+ # run on remote
38
+ run(%(mkdir -p #{dest_dir}))
39
+ # run rsync from local machine (and it will connect to remote)
40
+ cmd = (%(rsync -rzv --exclude=maintenance.on --delete -e 'ssh -p #{Pvcglue.cloud.port_in_node_context}' #{source_dir}/ #{node.get(:user)}@#{node.host}:#{dest_dir}/))
41
+ raise $?.to_s unless system(cmd)
42
+ end
43
+ end
44
+
45
+ package 'maintenance_mode' do
46
+ apply do
47
+ if Pvcglue.cloud.maintenance_mode == 'on'
48
+ run "touch #{Pvcglue.cloud.maintenance_mode_file_name}"
49
+ else
50
+ run "rm #{Pvcglue.cloud.maintenance_mode_file_name}"
51
+ end
52
+ end
53
+ end
54
+
55
+ package 'ssl-cert' do
56
+ apply do
57
+ if Pvcglue.cloud.ssl_mode == :load_balancer_force_ssl
58
+ sudo(%(mkdir -p #{Pvcglue.cloud.nginx_config_ssl_path}))
59
+ sudo(%Q[echo '#{Pvcglue.cloud.ssl_crt}' | sudo tee #{Pvcglue.cloud.nginx_ssl_crt_file_name} && sudo chmod 600 #{Pvcglue.cloud.nginx_ssl_crt_file_name}])
60
+ sudo(%Q[echo '#{Pvcglue.cloud.ssl_key}' | sudo tee #{Pvcglue.cloud.nginx_ssl_key_file_name} && sudo chmod 600 #{Pvcglue.cloud.nginx_ssl_key_file_name}])
61
+ # TODO: Restart nginx!!!
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,14 @@
1
+ apt_package 'memcached'
2
+
3
+ package 'caching' do
4
+ depends_on 'memcached'
5
+ file({
6
+ :template => Pvcglue.template_file_name('memcached.conf.erb'),
7
+ :destination => '/etc/memcached.conf',
8
+ :create_dirs => false,
9
+ :permissions => 0644,
10
+ :user => 'root',
11
+ :group => 'root'
12
+ }) { sudo('service memcached restart') }
13
+ end
14
+
@@ -0,0 +1,60 @@
1
+ package 'web' do
2
+ # rvm/ruby install based on http://ryanbigg.com/2010/12/ubuntu-ruby-rvm-rails-and-you/
3
+ depends_on 'swap' # needed for deployment/asset building on < 1GB machines
4
+ depends_on 'build-essential'
5
+ depends_on 'git'
6
+ depends_on 'rvm'
7
+ depends_on 'no-rdoc'
8
+
9
+
10
+ depends_on 'rvm-ruby'
11
+ depends_on 'bundler'
12
+ depends_on 'nginx'
13
+ depends_on 'phusion-passenger'
14
+ depends_on 'app-env'
15
+ depends_on 'web-site-config'
16
+
17
+ depends_on 'imagemagick' # TODO: app specific--will need to make system to include extra packages
18
+ depends_on 'libpq-dev' # for pg gem
19
+ depends_on 'nodejs'
20
+ end
21
+
22
+
23
+ package 'web-site-config' do
24
+ depends_on 'web-get-passenger-ruby'
25
+ file({
26
+ :template => Pvcglue.template_file_name('web.sites-enabled.erb'),
27
+ :destination => "/etc/nginx/sites-enabled/#{Pvcglue.cloud.app_and_stage_name}",
28
+ :create_dirs => false,
29
+ :permissions => 0644,
30
+ :user => 'root',
31
+ :group => 'root'
32
+ }) { sudo('service nginx restart') }
33
+ end
34
+
35
+ package 'web-get-passenger-ruby' do
36
+ apply do
37
+ info = run("rvm use #{Pvcglue.configuration.ruby_version} && $(which passenger-config) --ruby-command")
38
+ if info =~ /passenger_ruby (.*)/
39
+ Pvcglue.cloud.passenger_ruby = $1
40
+ else
41
+ raise "'passenger_ruby' not found." unless Pvcglue.cloud.passenger_ruby
42
+ end
43
+ end
44
+ end
45
+
46
+ package 'phusion-passenger' do
47
+ depends_on 'phusion-repository'
48
+ depends_on 'passenger'
49
+ validate do
50
+ run('passenger -v') =~ /Phusion Passenger version 4/
51
+ end
52
+
53
+ file({
54
+ :template => Pvcglue.template_file_name('web.nginx.conf.erb'),
55
+ :destination => '/etc/nginx/nginx.conf',
56
+ :permissions => 0644,
57
+ :user => 'root',
58
+ :group => 'root'
59
+ }) { trigger 'nginx:restart' }
60
+ end
@@ -0,0 +1,75 @@
1
+ package 'rvm' do
2
+ depends_on 'curl'
3
+ depends_on 'rvm-bashrc'
4
+
5
+ validate do
6
+ run('type rvm | head -n 1') =~ /rvm is a function/
7
+ end
8
+
9
+ apply do
10
+ run '\curl -sSL https://get.rvm.io | bash -s stable'
11
+ run "rvm requirements"
12
+ end
13
+
14
+ remove do
15
+ run 'yes "yes" | rvm implode'
16
+ end
17
+ end
18
+
19
+ package 'rvm-bashrc' do
20
+ file({
21
+ :template => Pvcglue.template_file_name('web.bashrc.erb'),
22
+ :destination => '/home/deploy/.bashrc',
23
+ :create_dirs => false,
24
+ :permissions => 0644,
25
+ :user => 'deploy',
26
+ :group => 'deploy'
27
+ })
28
+ end
29
+
30
+ package 'gem' do
31
+ depends_on 'rvm-ruby'
32
+ action 'exists' do |gem_name|
33
+ run("gem list -i #{gem_name}") =~ /true/
34
+ end
35
+ action 'install' do |gem_name|
36
+ sudo "gem install #{gem_name} --no-ri --no-rdoc"
37
+ end
38
+ action 'uninstall' do |gem_name|
39
+ sudo "gem uninstall #{gem_name} -x -a"
40
+ end
41
+ end
42
+
43
+ package 'bundler' do
44
+ depends_on 'gem'
45
+ apply { trigger 'gem:install', 'bundler' }
46
+ remove { trigger 'gem:remove', 'bundler' }
47
+ validate { trigger 'gem:exists', 'bundler' }
48
+ end
49
+
50
+ package 'rvm-ruby' do
51
+ depends_on 'rvm'
52
+
53
+ validate do
54
+ run('rvm list strings') =~ /#{Pvcglue.configuration.ruby_version.gsub('.', '\.')}/
55
+ end
56
+
57
+ apply do
58
+ run "rvm install #{Pvcglue.configuration.ruby_version}"
59
+ # run "rvm --default use 2.0.0"
60
+ end
61
+
62
+ remove do
63
+ run "rvm remove --archive --gems #{Pvcglue.configuration.ruby_version}"
64
+ end
65
+
66
+ end
67
+
68
+ package 'no-rdoc' do
69
+ file({
70
+ :template => Pvcglue.template_file_name('gemrc.erb'),
71
+ :destination => '/home/deploy/.gemrc',
72
+ :create_dirs => false
73
+ })
74
+ end
75
+
@@ -0,0 +1,17 @@
1
+ package 'time-zone' do
2
+ # http://hacksforge.com/How-to-change-time-zone-in-Ubuntu-Linux.html
3
+
4
+ file({
5
+ :template => Pvcglue.template_file_name('timezone.erb'),
6
+ :destination => '/etc/timezone',
7
+ :create_dirs => false,
8
+ :permissions => 0644,
9
+ :user => 'root',
10
+ :group => 'root'
11
+ }) do
12
+ sudo %Q[dpkg-reconfigure --frontend noninteractive tzdata]
13
+ sudo %Q[service cron restart]
14
+ end
15
+
16
+ end
17
+
@@ -0,0 +1,100 @@
1
+ # apt_package 'htop' # moved to manager
2
+ # apt_package 'ufw' # moved to manager
3
+ apt_package 'build-essential'
4
+ apt_package 'git', 'git-core'
5
+ apt_package 'libpq-dev'
6
+ apt_package 'libxml2', 'libxml2-dev'
7
+ apt_package 'libxslt', 'libxslt1-dev'
8
+ apt_package 'imagemagick'
9
+ apt_package 'curl'
10
+
11
+ package 'swap' do
12
+ # https://www.digitalocean.com/community/articles/how-to-add-swap-on-ubuntu-12-04
13
+ depends_on 'swap-fstab'
14
+
15
+ validate do
16
+ # TODO: This may be brittle
17
+ # Ex: "Filename\t\t\t\tType\t\tSize\tUsed\tPriority\n/swapfile file\t\t524284\t306372\t-1\n"
18
+ result = sudo("swapon -s")
19
+ data = result.split("\n").last.split("\t")[2]
20
+ # sudo("swapon -s") =~ /\/swapfile file #{Pvcglue.cloud.swapfile_size} 0 -1/
21
+ megs = (data.to_f / 1024).round
22
+ puts megs.inspect
23
+ puts Pvcglue.cloud.swapfile_size.inspect
24
+ megs == Pvcglue.cloud.swapfile_size
25
+ end
26
+
27
+ apply do
28
+ sudo("swapoff -a")
29
+ sudo("rm /swapfile")
30
+ sudo("fallocate -l #{Pvcglue.cloud.swapfile_size}M /swapfile")
31
+ # sudo("dd if=/dev/zero of=/swapfile bs=1024 count=#{Pvcglue.cloud.swapfile_size}k")
32
+ sudo("sudo chown root:root /swapfile && sudo chmod 0600 /swapfile")
33
+ sudo("echo 10 | sudo tee /proc/sys/vm/swappiness")
34
+ sudo("echo vm.swappiness = 10 | sudo tee -a /etc/sysctl.conf")
35
+ sudo("mkswap /swapfile")
36
+ sudo("swapon /swapfile")
37
+ end
38
+ end
39
+
40
+ package 'swap-fstab' do
41
+ validate do
42
+ sudo("cat /etc/fstab") =~ /\/swapfile/
43
+ end
44
+
45
+ apply do
46
+ sudo(%Q[echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab])
47
+ end
48
+ end
49
+
50
+ package 'apt-get-upgrade' do
51
+ apply do
52
+ sudo "DEBIAN_FRONTEND=noninteractive apt-get update -y -qq"
53
+ sudo "DEBIAN_FRONTEND=noninteractive apt-get upgrade -y"
54
+ end
55
+ end
56
+ =begin
57
+ # /etc/fstab: static file system information.
58
+ #
59
+ # Use 'blkid' to print the universally unique identifier for a
60
+ # device; this may be used with UUID= as a more robust way to name devices
61
+ # that works even if disks are added and removed. See fstab(5).
62
+ #
63
+ # <file system> <mount point> <type> <options> <dump> <pass>
64
+ proc /proc proc nodev,noexec,nosuid 0 0
65
+ # / was on /dev/vda1 during installation
66
+ UUID=b96601ba-7d51-4c5f-bfe2-63815708aabd / ext4 noatime,errors=remount-ro 0 1
67
+ =end
68
+ package 'reboot' do
69
+ apply do
70
+ sudo "reboot"
71
+ end
72
+ end
73
+
74
+ package 'get-hostname' do
75
+ apply do
76
+ Pvcglue.cloud.current_hostname = run('hostname')
77
+ end
78
+
79
+ end
80
+
81
+ package 'hostname' do
82
+ depends_on 'get-hostname'
83
+
84
+ file({
85
+ :template => Pvcglue.template_file_name('hosts.erb'),
86
+ :destination => '/etc/hosts',
87
+ :create_dirs => false,
88
+ :permissions => 0644,
89
+ :user => 'root',
90
+ :group => 'root'
91
+ }) do
92
+ sudo('service hostname restart')
93
+ hostname_f = run 'hostname -f'
94
+ if Pvcglue.cloud.current_hostname != hostname_f
95
+ raise "Hostname mismatch: #{Pvcglue.cloud.current_hostname} != #{hostname_f}"
96
+ end
97
+ end
98
+
99
+ end
100
+