subspace 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +2 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +5 -0
  7. data/CODE_OF_CONDUCT.md +49 -0
  8. data/Gemfile +4 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +54 -0
  11. data/Rakefile +6 -0
  12. data/ansible/roles/apache/defaults/main.yml +7 -0
  13. data/ansible/roles/apache/handlers/main.yml +4 -0
  14. data/ansible/roles/apache/tasks/main.yml +30 -0
  15. data/ansible/roles/apache/templates/project.conf +25 -0
  16. data/ansible/roles/aws/tasks/main.yml +46 -0
  17. data/ansible/roles/common/defaults/main.yml +3 -0
  18. data/ansible/roles/common/handlers/main.yml +3 -0
  19. data/ansible/roles/common/tasks/main.yml +58 -0
  20. data/ansible/roles/common/tasks/swap.yml +41 -0
  21. data/ansible/roles/delayed_job/README.md +9 -0
  22. data/ansible/roles/delayed_job/defaults/main.yml +4 -0
  23. data/ansible/roles/delayed_job/files/deploy-service +2 -0
  24. data/ansible/roles/delayed_job/files/monit-http.conf +3 -0
  25. data/ansible/roles/delayed_job/handlers/main.yml +4 -0
  26. data/ansible/roles/delayed_job/tasks/main.yml +34 -0
  27. data/ansible/roles/delayed_job/templates/delayed-job-monit-rc +16 -0
  28. data/ansible/roles/letsencrypt/defaults/main.yml +2 -0
  29. data/ansible/roles/letsencrypt/tasks/main.yml +93 -0
  30. data/ansible/roles/letsencrypt/templates/project-le-ssl.conf +31 -0
  31. data/ansible/roles/memcache/tasks/main.yml +6 -0
  32. data/ansible/roles/mysql/meta/main.yml +6 -0
  33. data/ansible/roles/mysql/tasks/main.yml +12 -0
  34. data/ansible/roles/mysql/templates/mysql_database.yml +7 -0
  35. data/ansible/roles/mysql2_gem/meta/main.yml +8 -0
  36. data/ansible/roles/mysql2_gem/tasks/main.yml +5 -0
  37. data/ansible/roles/newrelic/handlers/main.yml +5 -0
  38. data/ansible/roles/newrelic/tasks/main.yml +20 -0
  39. data/ansible/roles/nginx/tasks/main.yml +20 -0
  40. data/ansible/roles/nginx/templates/nginx-project +27 -0
  41. data/ansible/roles/papertrail/tasks/main.yml +12 -0
  42. data/ansible/roles/papertrail/templates/log_files.yml +7 -0
  43. data/ansible/roles/postgresql/defaults/main.yml +2 -0
  44. data/ansible/roles/postgresql/handlers/main.yml +4 -0
  45. data/ansible/roles/postgresql/meta/main.yml +7 -0
  46. data/ansible/roles/postgresql/tasks/backups.yml +33 -0
  47. data/ansible/roles/postgresql/tasks/main.yml +37 -0
  48. data/ansible/roles/postgresql/templates/backup.sh +50 -0
  49. data/ansible/roles/puma/tasks/main.yml +29 -0
  50. data/ansible/roles/puma/templates/etc-init-puma-manager.conf +31 -0
  51. data/ansible/roles/puma/templates/etc-init-puma.conf +69 -0
  52. data/ansible/roles/puma/templates/etc-puma.conf +1 -0
  53. data/ansible/roles/puma/templates/puma.rb +29 -0
  54. data/ansible/roles/rails/defaults/main.yml +4 -0
  55. data/ansible/roles/rails/tasks/main.yml +36 -0
  56. data/ansible/roles/rails/templates/application.yml +3 -0
  57. data/ansible/roles/rails/templates/database.yml +19 -0
  58. data/ansible/roles/redis/tasks/main.yml +6 -0
  59. data/ansible/roles/ruby-common/README.md +74 -0
  60. data/ansible/roles/ruby-common/defaults/main.yml +6 -0
  61. data/ansible/roles/ruby-common/meta/main.yml +22 -0
  62. data/ansible/roles/ruby-common/tasks/main.yml +69 -0
  63. data/ansible/roles/ruby-common/templates/install-ruby.j2 +8 -0
  64. data/ansible/roles/ruby-common/templates/rake-env.j2 +3 -0
  65. data/ansible/roles/ruby-common/templates/ruby-gc-wrapper.j2 +5 -0
  66. data/ansible/roles/ruby-common/vars/main.yml +26 -0
  67. data/bin/console +14 -0
  68. data/bin/setup +8 -0
  69. data/exe/subspace +85 -0
  70. data/lib/subspace/railtie.rb +9 -0
  71. data/lib/subspace/version.rb +3 -0
  72. data/lib/subspace.rb +5 -0
  73. data/lib/tasks/provision.rake +12 -0
  74. data/subspace.gemspec +33 -0
  75. data/template/provision/.gitignore +1 -0
  76. data/template/provision/ansible.cfg.erb +5 -0
  77. data/template/provision/group_vars/all.erb +12 -0
  78. data/template/provision/group_vars/template.erb +14 -0
  79. data/template/provision/host_vars/template.erb +4 -0
  80. data/template/provision/hosts.erb +11 -0
  81. data/template/provision/playbook.yml.erb +26 -0
  82. data/template/provision/vars/template.erb +4 -0
  83. metadata +169 -0
@@ -0,0 +1,8 @@
1
+ #!/bin/bash
2
+
3
+ cd /usr/local/src/
4
+ tar xvfz {{ ruby_version }}.tar.gz
5
+ cd {{ ruby_version }}
6
+ ./configure --prefix={{ ruby_location }} --disable-install-doc
7
+ make --jobs {{ cores.stdout }}
8
+ make install
@@ -0,0 +1,3 @@
1
+ #!/bin/bash
2
+ export RAILS_ENV={{ rails_env }}
3
+ exec "{{ ruby_location }}/bin/bundle" "exec" "rake" "$@"
@@ -0,0 +1,5 @@
1
+ #!/bin/bash
2
+ export RUBY_FREE_MIN={{ ruby_free_min }}
3
+ export RUBY_GC_MALLOC_LIMIT={{ ruby_gc_malloc_limit }}
4
+ export RUBY_HEAP_MIN_SLOTS={{ ruby_heap_min_slots }}
5
+ exec "{{ ruby_location }}/bin/ruby" "$@"
@@ -0,0 +1,26 @@
1
+ ---
2
+ ruby_apt_dependencies:
3
+ - libreadline-dev
4
+ - libssl-dev
5
+ - libyaml-dev
6
+ - zlib1g-dev
7
+
8
+ ruby_yum_dependencies:
9
+ - readline-devel
10
+ - openssl-devel
11
+ - libyaml-devel
12
+ - zlib-devel
13
+
14
+ ruby_symlinks:
15
+ - bundle
16
+ - erb
17
+ - gem
18
+ - irb
19
+ - rake
20
+ - rdoc
21
+ - ri
22
+ - ruby
23
+
24
+ ruby_location: "/opt/{{ ruby_version }}"
25
+
26
+ ruby_executable: "{{ ruby_location }}/bin/ruby"
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "subspace"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/exe/subspace ADDED
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'fileutils'
4
+ require 'erb'
5
+
6
+ @provision_templatedir = File.join(File.dirname(__FILE__), '..', 'template', 'provision')
7
+ @dest_dir = "config/provision"
8
+
9
+ def gem_path
10
+ File.expand_path '../..', __FILE__
11
+ end
12
+
13
+ def project_name
14
+ File.basename(Dir.pwd)
15
+ end
16
+
17
+ def template(src, dest = nil)
18
+ dest ||= src
19
+ template = ERB.new File.read(File.join(@provision_templatedir, "#{src}.erb")), nil, '-'
20
+ File.write File.join(@dest_dir, dest), template.result(binding)
21
+ end
22
+
23
+ def copy(src, dest = nil)
24
+ dest ||= src
25
+ FileUtils.cp File.join(@provision_templatedir, src), File.join(@dest_dir, dest)
26
+ end
27
+
28
+ def environments
29
+ %w(production dev)
30
+ end
31
+
32
+ def hostname(env)
33
+ "#{project_name.gsub('_', '-')}-#{env}"
34
+ end
35
+
36
+ def create_vault_pass
37
+ File.write File.join(@dest_dir, ".vault_pass"), SecureRandom.base64
38
+ end
39
+
40
+ def create_vars_file_for_env(env)
41
+ template "vars/template", "vars/#{env}.yml"
42
+ Dir.chdir @dest_dir do
43
+ `ansible-vault encrypt vars/#{env}.yml`
44
+ end
45
+ end
46
+
47
+ if ARGV[0] == "init"
48
+ FileUtils.mkdir_p File.join @dest_dir, "group_vars"
49
+ FileUtils.mkdir_p File.join @dest_dir, "host_vars"
50
+ FileUtils.mkdir_p File.join @dest_dir, "vars"
51
+
52
+ copy ".gitignore"
53
+ template "ansible.cfg"
54
+ template "hosts"
55
+ template "group_vars/all"
56
+ create_vault_pass
57
+ environments.each do |env|
58
+ @env = env
59
+ @hostname = hostname(env)
60
+ template "group_vars/template", "group_vars/#{env}"
61
+ template "host_vars/template", "host_vars/#{env}"
62
+ create_vars_file_for_env env
63
+ template "playbook.yml", "#{env}.yml"
64
+ end
65
+
66
+ puts """
67
+ 1. Create a server.
68
+
69
+ 2. Set your server's location:
70
+
71
+ vim config/provision/host_vars/production
72
+ vim config/provision/host_vars/dev
73
+
74
+ 3. Set up your authorized_keys:
75
+
76
+ vim config/provision/authorized_keys
77
+
78
+ 4. Then provision your server:
79
+
80
+ cd config/provision && ansible-playbook dev.yml
81
+
82
+ """
83
+ else
84
+ puts "usage: subspace init"
85
+ end
@@ -0,0 +1,9 @@
1
+ module Subspace
2
+ class Railtie < ::Rails::Railtie
3
+ railtie_name :subspace
4
+
5
+ rake_tasks do
6
+ Dir[File.join(File.dirname(__FILE__),'../tasks/*.rake')].each { |f| load f }
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ module Subspace
2
+ VERSION = "0.1.1"
3
+ end
data/lib/subspace.rb ADDED
@@ -0,0 +1,5 @@
1
+ require "subspace/version"
2
+ require "subspace/railtie"
3
+
4
+ module Subspace
5
+ end
@@ -0,0 +1,12 @@
1
+ namespace :provision do
2
+ # Using staging as an environment is deprecated,
3
+ # but some older projects still use it.
4
+ [:production, :qa, :dev, :staging].each do |env|
5
+ desc "Provision #{env} server"
6
+ task env do
7
+ Dir.chdir "config/provision" do
8
+ system "ansible-playbook #{env}.yml"
9
+ end
10
+ end
11
+ end
12
+ end
data/subspace.gemspec ADDED
@@ -0,0 +1,33 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'subspace/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "subspace"
8
+ spec.version = Subspace::VERSION
9
+ spec.authors = ["Brian Samson"]
10
+ spec.email = ["brian@tenforwardconsulting.com"]
11
+
12
+ spec.summary = %q{Ansible-based server provisioning for rails projects}
13
+ spec.description = %q{WIP -- don't use this :)}
14
+ spec.homepage = "https://github.com/tenforwardconsulting/subspace"
15
+ spec.license = "MIT"
16
+
17
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
19
+ if spec.respond_to?(:metadata)
20
+ spec.metadata['allowed_push_host'] = "https://rubygems.org"
21
+ else
22
+ raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
23
+ end
24
+
25
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
26
+ spec.bindir = "exe"
27
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
+ spec.require_paths = ["lib"]
29
+
30
+ spec.add_development_dependency "bundler", "~> 1.12"
31
+ spec.add_development_dependency "rake", "~> 10.0"
32
+ spec.add_development_dependency "rspec", "~> 3.0"
33
+ end
@@ -0,0 +1 @@
1
+ .vault_pass
@@ -0,0 +1,5 @@
1
+ [defaults]
2
+ inventory = hosts
3
+ forks = 10
4
+ roles_path = <%= File.join(gem_path, 'ansible', 'roles') %>:/etc/ansible/roles
5
+ vault_password_file = .vault_pass
@@ -0,0 +1,12 @@
1
+ # Conventions and defaults are defined here
2
+ project_name: <%= project_name %>
3
+
4
+ # ruby-common
5
+ # pull the checksum/url from https://www.ruby-lang.org/en/downloads/
6
+ ruby_version: ruby-2.2.5
7
+ ruby_checksum: 30c4b31697a4ca4ea0c8db8ad30cf45e6690a0f09687e5d483c933c03ca335e3
8
+ ruby_download_location: 'http://cache.ruby-lang.org/pub/ruby/ruby-2.2.5.tar.gz'
9
+
10
+ # passenger
11
+ passenger_webserver: apache
12
+ passenger_pkgs_state: installed
@@ -0,0 +1,14 @@
1
+ # rails
2
+ rails_env: <%= @env %>
3
+ database_host: localhost
4
+ use_sudo: true
5
+
6
+ # apache
7
+ server_name: "{{ansible_ssh_host}}"
8
+
9
+ # postgresql
10
+ postgresql_authentication:
11
+ - type: local
12
+ user: "{{database_user}}"
13
+ database: 'all'
14
+ method: trust
@@ -0,0 +1,4 @@
1
+ ---
2
+ ansible_ssh_host: <%= @hostname %>.10fw.net
3
+ ansible_ssh_user: ubuntu
4
+ hostname: <%= @hostname %>
@@ -0,0 +1,11 @@
1
+ # Hosts that we are aware of -- correspond to hosts/<host>
2
+ <% environments.each do |env| -%>
3
+ <%= env %>
4
+ <% end -%>
5
+
6
+ # Create a group for each environment which just contains that single host by default
7
+ <% environments.each do |env| -%>
8
+ [<%= env %>]
9
+ <%= env %>
10
+
11
+ <% end -%>
@@ -0,0 +1,26 @@
1
+ ---
2
+ - hosts: localhost
3
+ connection: local
4
+ gather_facts: False
5
+
6
+ vars_files:
7
+ - vars/aws.yml
8
+
9
+ roles:
10
+ - { role: aws, hostname: <%= @hostname %> }
11
+
12
+ - hosts: <%= @env %>
13
+ sudo: yes
14
+
15
+ vars_files:
16
+ - ./vars/<%= @env %>.yml
17
+
18
+ roles:
19
+ - common
20
+ - ruby-common
21
+ - rails
22
+ - apache
23
+ - letsencrypt
24
+ - mtpereira.passenger
25
+ - postgresql
26
+ - delayed_job
@@ -0,0 +1,4 @@
1
+ database_password: <%= SecureRandom.base64 %>
2
+
3
+ appyml:
4
+ SECRET_KEY_BASE: <%= `rake secret` %>
metadata ADDED
@@ -0,0 +1,169 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: subspace
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Brian Samson
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-08-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.12'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.12'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ description: WIP -- don't use this :)
56
+ email:
57
+ - brian@tenforwardconsulting.com
58
+ executables:
59
+ - subspace
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - ".gitignore"
64
+ - ".rspec"
65
+ - ".ruby-gemset"
66
+ - ".ruby-version"
67
+ - ".travis.yml"
68
+ - CODE_OF_CONDUCT.md
69
+ - Gemfile
70
+ - LICENSE.txt
71
+ - README.md
72
+ - Rakefile
73
+ - ansible/roles/apache/defaults/main.yml
74
+ - ansible/roles/apache/handlers/main.yml
75
+ - ansible/roles/apache/tasks/main.yml
76
+ - ansible/roles/apache/templates/project.conf
77
+ - ansible/roles/aws/tasks/main.yml
78
+ - ansible/roles/common/defaults/main.yml
79
+ - ansible/roles/common/handlers/main.yml
80
+ - ansible/roles/common/tasks/main.yml
81
+ - ansible/roles/common/tasks/swap.yml
82
+ - ansible/roles/delayed_job/README.md
83
+ - ansible/roles/delayed_job/defaults/main.yml
84
+ - ansible/roles/delayed_job/files/deploy-service
85
+ - ansible/roles/delayed_job/files/monit-http.conf
86
+ - ansible/roles/delayed_job/handlers/main.yml
87
+ - ansible/roles/delayed_job/tasks/main.yml
88
+ - ansible/roles/delayed_job/templates/delayed-job-monit-rc
89
+ - ansible/roles/letsencrypt/defaults/main.yml
90
+ - ansible/roles/letsencrypt/tasks/main.yml
91
+ - ansible/roles/letsencrypt/templates/project-le-ssl.conf
92
+ - ansible/roles/memcache/tasks/main.yml
93
+ - ansible/roles/mysql/meta/main.yml
94
+ - ansible/roles/mysql/tasks/main.yml
95
+ - ansible/roles/mysql/templates/mysql_database.yml
96
+ - ansible/roles/mysql2_gem/meta/main.yml
97
+ - ansible/roles/mysql2_gem/tasks/main.yml
98
+ - ansible/roles/newrelic/handlers/main.yml
99
+ - ansible/roles/newrelic/tasks/main.yml
100
+ - ansible/roles/nginx/tasks/main.yml
101
+ - ansible/roles/nginx/templates/nginx-project
102
+ - ansible/roles/papertrail/tasks/main.yml
103
+ - ansible/roles/papertrail/templates/log_files.yml
104
+ - ansible/roles/postgresql/defaults/main.yml
105
+ - ansible/roles/postgresql/handlers/main.yml
106
+ - ansible/roles/postgresql/meta/main.yml
107
+ - ansible/roles/postgresql/tasks/backups.yml
108
+ - ansible/roles/postgresql/tasks/main.yml
109
+ - ansible/roles/postgresql/templates/backup.sh
110
+ - ansible/roles/puma/tasks/main.yml
111
+ - ansible/roles/puma/templates/etc-init-puma-manager.conf
112
+ - ansible/roles/puma/templates/etc-init-puma.conf
113
+ - ansible/roles/puma/templates/etc-puma.conf
114
+ - ansible/roles/puma/templates/puma.rb
115
+ - ansible/roles/rails/defaults/main.yml
116
+ - ansible/roles/rails/tasks/main.yml
117
+ - ansible/roles/rails/templates/application.yml
118
+ - ansible/roles/rails/templates/database.yml
119
+ - ansible/roles/redis/tasks/main.yml
120
+ - ansible/roles/ruby-common/README.md
121
+ - ansible/roles/ruby-common/defaults/main.yml
122
+ - ansible/roles/ruby-common/meta/main.yml
123
+ - ansible/roles/ruby-common/tasks/main.yml
124
+ - ansible/roles/ruby-common/templates/install-ruby.j2
125
+ - ansible/roles/ruby-common/templates/rake-env.j2
126
+ - ansible/roles/ruby-common/templates/ruby-gc-wrapper.j2
127
+ - ansible/roles/ruby-common/vars/main.yml
128
+ - bin/console
129
+ - bin/setup
130
+ - exe/subspace
131
+ - lib/subspace.rb
132
+ - lib/subspace/railtie.rb
133
+ - lib/subspace/version.rb
134
+ - lib/tasks/provision.rake
135
+ - subspace.gemspec
136
+ - template/provision/.gitignore
137
+ - template/provision/ansible.cfg.erb
138
+ - template/provision/group_vars/all.erb
139
+ - template/provision/group_vars/template.erb
140
+ - template/provision/host_vars/template.erb
141
+ - template/provision/hosts.erb
142
+ - template/provision/playbook.yml.erb
143
+ - template/provision/vars/template.erb
144
+ homepage: https://github.com/tenforwardconsulting/subspace
145
+ licenses:
146
+ - MIT
147
+ metadata:
148
+ allowed_push_host: https://rubygems.org
149
+ post_install_message:
150
+ rdoc_options: []
151
+ require_paths:
152
+ - lib
153
+ required_ruby_version: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ required_rubygems_version: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ version: '0'
163
+ requirements: []
164
+ rubyforge_project:
165
+ rubygems_version: 2.4.5.1
166
+ signing_key:
167
+ specification_version: 4
168
+ summary: Ansible-based server provisioning for rails projects
169
+ test_files: []