taperole 1.6.0 → 1.7.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 +4 -4
- data/.travis.yml +3 -0
- data/CONTRIBUTING.md +8 -0
- data/README.md +33 -4
- data/Rakefile +6 -0
- data/Vagrantfile +6 -7
- data/bin/tape +2 -89
- data/lib/taperole/commands/ansible.rb +56 -0
- data/lib/taperole/commands/installer.rb +19 -0
- data/lib/taperole/commands/tape.rb +32 -0
- data/lib/taperole/core/ansible_runner.rb +86 -0
- data/lib/taperole/core/installer.rb +87 -0
- data/lib/taperole/core/notifier.rb +47 -0
- data/lib/taperole/helpers/files.rb +76 -0
- data/lib/taperole/helpers/logging.rb +37 -0
- data/lib/taperole/notifiers/slack.rb +83 -0
- data/lib/taperole/version.rb +3 -0
- data/lib/taperole.rb +24 -0
- data/requirements.yml +1 -1
- data/roles/backend_checkout/tasks/main.yml +1 -0
- data/roles/delayed_job/tasks/main.yml +0 -15
- data/roles/deployer_user/tasks/keys.yml +6 -6
- data/roles/deployer_user/tasks/main.yml +0 -3
- data/roles/monit_install/tasks/main.yml +6 -0
- data/roles/monit_install/templates/monitrc.j2 +290 -0
- data/roles/nginx/tasks/main.yml +3 -4
- data/roles/nginx/templates/nginx_unicorn.j2 +1 -0
- data/roles/node/tasks/main.yml +2 -1
- data/roles/ruby/tasks/main.yml +3 -11
- data/roles/unicorn_install/tasks/main.yml +0 -3
- data/roles/unicorn_install/templates/unicorn.rb.j2 +1 -1
- data/roles/unicorn_install/templates/unicorn_init.j2 +1 -1
- data/roles/unicorn_install/templates/unicorn_monit.j2 +1 -1
- data/spec/commands/installer_spec.rb +117 -0
- data/spec/spec_helper.rb +24 -0
- data/taperole.gemspec +8 -1
- data/templates/base/deploy.example.yml +1 -0
- data/templates/base/hosts.example +1 -1
- data/templates/base/omnibox.example.yml +15 -0
- data/templates/base/rake.example.yml +18 -0
- data/templates/base/tape_vars.example.yml +9 -8
- data/templates/static_html/omnibox.example.yml +13 -0
- data/test/base_docker_box/Dockerfile +1 -1
- data/test/rails/Dockerfile +3 -3
- data/test/rails/start_rails.sh +1 -0
- data/test/rails/tape_vars.yml +2 -2
- data/vendor/ANXS.postgresql/.travis.yml +27 -12
- data/vendor/ANXS.postgresql/README.md +1 -1
- data/vendor/ANXS.postgresql/Vagrantfile +7 -2
- data/vendor/ANXS.postgresql/meta/.galaxy_install_info +1 -1
- data/vendor/ANXS.postgresql/meta/main.yml +1 -1
- data/vendor/ANXS.postgresql/tasks/configure.yml +10 -10
- data/vendor/ANXS.postgresql/tasks/databases.yml +27 -27
- data/vendor/ANXS.postgresql/tasks/install_yum.yml +2 -2
- data/vendor/ANXS.postgresql/tasks/users.yml +4 -4
- data/vendor/ANXS.postgresql/tasks/users_privileges.yml +3 -3
- data/vendor/ANXS.postgresql/tests/Dockerfile-centos6 +20 -0
- data/vendor/ANXS.postgresql/tests/Dockerfile-ubuntu14.04 +17 -0
- data/vendor/ANXS.postgresql/tests/playbook.yml +1 -1
- data/vendor/ANXS.postgresql/tests/vars.yml +2 -0
- data/vendor/Stouts.backup/.bumpversion.cfg +1 -1
- data/vendor/Stouts.backup/.travis.yml +0 -1
- data/vendor/Stouts.backup/CONTRIBUTORS +2 -0
- data/vendor/Stouts.backup/README.md +1 -0
- data/vendor/Stouts.backup/defaults/main.yml +3 -3
- data/vendor/Stouts.backup/meta/.galaxy_install_info +1 -1
- data/vendor/Stouts.backup/runtests.sh +65 -0
- data/vendor/Stouts.backup/tasks/backup.yml +3 -0
- data/vendor/Stouts.backup/tasks/configure.yml +13 -12
- data/vendor/Stouts.backup/tasks/install.deb.yml +6 -8
- data/vendor/Stouts.backup/tasks/install.red.yml +28 -0
- data/vendor/Stouts.backup/tasks/remove.yml +3 -3
- data/vendor/Stouts.backup/templates/cron.j2 +1 -1
- data/vendor/Stouts.backup/templates/duply.sh.j2 +219 -218
- data/vendor/Stouts.backup/templates/pre.j2 +6 -0
- data/vendor/Stouts.backup/templates/restore.j2 +6 -0
- data/vendor/Stouts.backup/vars/Debian.yml +3 -0
- data/vendor/Stouts.backup/vars/Ubuntu.yml +1 -0
- metadata +67 -10
- data/lib/tape/ansible_runner.rb +0 -130
- data/lib/tape/info.rb +0 -9
- data/lib/tape/installer.rb +0 -160
- data/lib/tape/notifiers/slack.rb +0 -79
- data/lib/tape/overwriter.rb +0 -14
- data/lib/tape/qemu_provisioner.rb +0 -167
- data/lib/tape.rb +0 -127
@@ -1,167 +0,0 @@
|
|
1
|
-
require 'fileutils'
|
2
|
-
module TapeBoxer
|
3
|
-
class QemuProvisioner < ExecutionModule
|
4
|
-
BASE_IMG = File.realpath(File.join(__dir__, ''))
|
5
|
-
HOSTED_IMG_PATH = 'http://d.pr/f/17cOG/434tIaDx+'
|
6
|
-
PIDFILE_DIR = "/tmp/tape"
|
7
|
-
BOXIMG_DIR = File.join(ENV['HOME'], '.tape', 'boxes')
|
8
|
-
BOXLOG_DIR = '/tmp/tape'
|
9
|
-
DEFAULT_PORT = 2255
|
10
|
-
|
11
|
-
TapeBoxer.register_module :qemu, self
|
12
|
-
|
13
|
-
action :create,
|
14
|
-
proc {create_img},
|
15
|
-
'Creates a new qemu box with the given name'
|
16
|
-
action :start,
|
17
|
-
proc {start_box},
|
18
|
-
'Ensures the qemu box by the given name is running'
|
19
|
-
action :ssh,
|
20
|
-
proc {ssh_to_box},
|
21
|
-
'SSHes to the box by the given name. Requires id_rsa_sb_basebox
|
22
|
-
key to be added to the current SSH agent'
|
23
|
-
action :reset,
|
24
|
-
proc {reset_box},
|
25
|
-
'Destroys and re-creates the box by the given name'
|
26
|
-
|
27
|
-
protected
|
28
|
-
|
29
|
-
def ssh_to_box
|
30
|
-
require_opt :name
|
31
|
-
ensure_box_running
|
32
|
-
Kernel.exec("ssh root@127.0.0.1 -p #{port}")
|
33
|
-
end
|
34
|
-
|
35
|
-
def create_img
|
36
|
-
require_opt :name
|
37
|
-
img_name = opts[:name] + '.img'
|
38
|
-
|
39
|
-
if File.exists?(image_path)
|
40
|
-
STDERR.puts "That image already exists!"
|
41
|
-
exit 1
|
42
|
-
else
|
43
|
-
Kernel.exec "qemu-img create -b '#{base_image_path}' -fqcow2 '#{image_path}'"
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def start_box
|
48
|
-
require_opt :name
|
49
|
-
ensure_box_created
|
50
|
-
ensure_box_not_running
|
51
|
-
|
52
|
-
cmd = "qemu-system-x86_64 -m 512 "\
|
53
|
-
"-netdev user,hostfwd=tcp:127.0.0.1:#{qemu_port}-:22,id=net.0 "\
|
54
|
-
"-device e1000,netdev=net.0 "\
|
55
|
-
"-nographic -enable-kvm #{image_path}"
|
56
|
-
|
57
|
-
pid = Process.spawn(cmd, out: boxlog_path)
|
58
|
-
|
59
|
-
write_pidfile(pid)
|
60
|
-
Process.detach(pid)
|
61
|
-
end
|
62
|
-
|
63
|
-
def qemu_port
|
64
|
-
opts.port || DEFAULT_PORT
|
65
|
-
end
|
66
|
-
|
67
|
-
def reset_box
|
68
|
-
require_opt :name
|
69
|
-
ensure_box_created
|
70
|
-
|
71
|
-
File.delete(image_path)
|
72
|
-
create_img
|
73
|
-
end
|
74
|
-
|
75
|
-
def ensure_box_created
|
76
|
-
unless File.exists?(image_path)
|
77
|
-
raise ActionError, "The machine (#{opts.name}) has not yet been created!"
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
def ensure_box_running
|
82
|
-
unless pidfile_present? and process_alive?(read_pidfile)
|
83
|
-
raise ActionError, "The machine(#{opts.name}) needs to be "\
|
84
|
-
"running before you can do this!"
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
def port
|
89
|
-
opts.port or 2255
|
90
|
-
end
|
91
|
-
|
92
|
-
def ensure_box_not_running
|
93
|
-
if pidfile_present? and process_alive?(read_pidfile)
|
94
|
-
raise ActionError, "The machine (#{opts.name}) is already running!"
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
def process_alive?(pid)
|
99
|
-
Process.kill(0, pid)
|
100
|
-
rescue Errno::ESRCH
|
101
|
-
return false
|
102
|
-
end
|
103
|
-
|
104
|
-
def base_image_path
|
105
|
-
img = "sb_ubuntu_12.04_x64_base.img"
|
106
|
-
path = File.join(image_dir, img)
|
107
|
-
unless File.exists?(path)
|
108
|
-
print 'base image #{path} not found. Dow you want to download (y/n) '
|
109
|
-
if STDOUT.flush and gets.chomp.downcase == 'y'
|
110
|
-
%x[curl -0L #{HOSTED_IMG_PATH} > #{image_dir}/#{img}]
|
111
|
-
path = File.join(image_dir, img)
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
return path
|
116
|
-
end
|
117
|
-
|
118
|
-
def pidfile_present?
|
119
|
-
File.exists? pidfile_path
|
120
|
-
end
|
121
|
-
|
122
|
-
def image_path
|
123
|
-
File.expand_path(File.join(image_dir, "qemu-#{opts.name}.img"))
|
124
|
-
end
|
125
|
-
|
126
|
-
def delete_pidfile
|
127
|
-
File.delete(pidfile_path)
|
128
|
-
end
|
129
|
-
|
130
|
-
def write_pidfile(pid)
|
131
|
-
File.open(pidfile_path, 'w').write(pid.to_s)
|
132
|
-
end
|
133
|
-
|
134
|
-
def read_pidfile
|
135
|
-
STDERR.puts "Reading pidfile #{pidfile_path}" if opts.verbose
|
136
|
-
pid = File.open(pidfile_path, 'r').read.to_i
|
137
|
-
|
138
|
-
unless pid > 0
|
139
|
-
raise ActionError, "Pidfile (#{pidfile_path}) does not appear to be numeric!"
|
140
|
-
end
|
141
|
-
|
142
|
-
return pid
|
143
|
-
end
|
144
|
-
|
145
|
-
def boxlog_path
|
146
|
-
@boxlog_path ||=
|
147
|
-
File.expand_path(File.join(boxlog_dir, "qemu-#{opts.name}.log"))
|
148
|
-
end
|
149
|
-
|
150
|
-
def pidfile_path
|
151
|
-
@pidfile_path ||=
|
152
|
-
File.expand_path(File.join(pidfile_dir, "qemu-#{opts[:name]}.pid"))
|
153
|
-
end
|
154
|
-
|
155
|
-
def boxlog_dir
|
156
|
-
FileUtils.mkdir_p(PIDFILE_DIR) && PIDFILE_DIR
|
157
|
-
end
|
158
|
-
|
159
|
-
def pidfile_dir
|
160
|
-
FileUtils.mkdir_p(PIDFILE_DIR) && PIDFILE_DIR
|
161
|
-
end
|
162
|
-
|
163
|
-
def image_dir
|
164
|
-
FileUtils.mkdir_p(BOXIMG_DIR) && BOXIMG_DIR
|
165
|
-
end
|
166
|
-
end
|
167
|
-
end
|
data/lib/tape.rb
DELETED
@@ -1,127 +0,0 @@
|
|
1
|
-
require 'erb'
|
2
|
-
require 'fileutils'
|
3
|
-
require 'yaml'
|
4
|
-
require_relative 'tape/notifiers/slack.rb'
|
5
|
-
|
6
|
-
module TapeBoxer
|
7
|
-
class InvalidAction < StandardError; end
|
8
|
-
class ActionError < StandardError; end
|
9
|
-
class UnspecifiedOption < StandardError; end
|
10
|
-
|
11
|
-
class Action < Struct.new(:name, :proc, :description); end
|
12
|
-
class RegisteredModule < Struct.new(:name, :klass); end
|
13
|
-
|
14
|
-
def self.register_module(name, klass)
|
15
|
-
self.registered_modules[name] = RegisteredModule.new(name, klass)
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.registered_modules
|
19
|
-
@modules ||= Hash.new
|
20
|
-
end
|
21
|
-
|
22
|
-
class ExecutionModule
|
23
|
-
attr_reader :opts
|
24
|
-
def initialize(opts)
|
25
|
-
@opts = opts || {}
|
26
|
-
@observers = []
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.actions
|
30
|
-
@actions
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.action(name, opts = '', doc = '')
|
34
|
-
@actions ||= Hash.new
|
35
|
-
@actions[name.to_sym] = Action.new(name, opts, doc)
|
36
|
-
end
|
37
|
-
|
38
|
-
# Set or return module_name
|
39
|
-
def self.module_name(name = nil)
|
40
|
-
@module_name = (name || @module_name)
|
41
|
-
end
|
42
|
-
|
43
|
-
def actions
|
44
|
-
self.class.actions
|
45
|
-
end
|
46
|
-
|
47
|
-
def fe_app?
|
48
|
-
!Dir["#{local_dir}/package.json"].empty?
|
49
|
-
end
|
50
|
-
|
51
|
-
def rails_app?
|
52
|
-
!Dir["#{local_dir}/config.ru"].empty?
|
53
|
-
end
|
54
|
-
|
55
|
-
def execute_action(action)
|
56
|
-
action = action.to_sym
|
57
|
-
unless actions.include?(action)
|
58
|
-
raise InvalidAction, "#{action} is not a valid action!"
|
59
|
-
end
|
60
|
-
|
61
|
-
unless system("ansible-playbook --version >/dev/null")
|
62
|
-
raise InvalidAction, "ansible-playbook must be on your PATH to use this tool"
|
63
|
-
end
|
64
|
-
|
65
|
-
self.instance_eval &actions[action].proc
|
66
|
-
end
|
67
|
-
|
68
|
-
def config
|
69
|
-
@config ||= YAML.load_file("#{tapefiles_dir}/tape_vars.yml")
|
70
|
-
end
|
71
|
-
|
72
|
-
def deploy_info
|
73
|
-
{
|
74
|
-
app_name: config["app_name"],
|
75
|
-
user: `whoami`.chomp,
|
76
|
-
# FIXME: get host information corectly
|
77
|
-
# hosts: opts.host_pattern || 'default',
|
78
|
-
hosts: opts.host_pattern || 'default',
|
79
|
-
repo: config["be_app_repo"] || ''
|
80
|
-
}
|
81
|
-
end
|
82
|
-
|
83
|
-
protected
|
84
|
-
|
85
|
-
def require_opt(name)
|
86
|
-
unless opts[name.to_sym]
|
87
|
-
raise UnspecifiedOption, "Option --#{name} must be specified to do this!"
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
private
|
92
|
-
|
93
|
-
def register_notifiers
|
94
|
-
if config["slack_webhook_url"]
|
95
|
-
add_observer(::SlackNotifier.new(config["slack_webhook_url"], deploy_info))
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
def add_observer(observer)
|
100
|
-
@observers.push(observer)
|
101
|
-
end
|
102
|
-
|
103
|
-
def notify_observers(state)
|
104
|
-
@observers.each do |observer|
|
105
|
-
observer.update(state)
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
def tape_dir
|
110
|
-
File.realpath(File.join(__dir__, '../'))
|
111
|
-
end
|
112
|
-
|
113
|
-
def local_dir
|
114
|
-
Dir.pwd
|
115
|
-
end
|
116
|
-
|
117
|
-
def tapefiles_dir
|
118
|
-
local_dir + '/taperole'
|
119
|
-
end
|
120
|
-
|
121
|
-
def tapecfg_dir
|
122
|
-
local_dir + '/.tape'
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
Dir[File.dirname(__FILE__) + "/tape/*.rb"].each {|file| require file }
|