subspace 0.1.1

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.
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: []