Commit 1afdcc0b by Andrew Babichev

Add sneakers_monit_templates_path

parent 2a0b7e85
namespace :load do namespace :load do
task :defaults do task :defaults do
set :sneakers_monit_conf_dir, -> { "/etc/monit/conf.d/#{sneakers_monit_service_name}.conf" } set :sneakers_monit_conf_dir, -> { '/etc/monit/conf.d' }
set :sneakers_monit_use_sudo, true set :sneakers_monit_use_sudo, true
set :sneakers_monit_bin, '/usr/bin/monit' set :sneakers_monit_bin, '/usr/bin/monit'
set :sneakers_monit_templates_path, 'config/deploy/templates'
end end
end end
...@@ -12,8 +13,11 @@ namespace :sneakers do ...@@ -12,8 +13,11 @@ namespace :sneakers do
task :config do task :config do
on roles(fetch(:sneakers_role)) do |role| on roles(fetch(:sneakers_role)) do |role|
@role = role @role = role
template_sneakers 'sneakers_monit.conf', "#{fetch(:tmp_dir)}/monit.conf", @role upload_sneakers_template 'sneakers_monit', "#{fetch(:tmp_dir)}/monit.conf", @role
sudo_if_needed "mv #{fetch(:tmp_dir)}/monit.conf #{fetch(:sneakers_monit_conf_dir)}"
mv_command = "mv #{fetch(:tmp_dir)}/monit.conf #{fetch(:sneakers_monit_conf_dir)}/#{sneakers_service_name}.conf"
sudo_if_needed mv_command
sudo_if_needed "#{fetch(:sneakers_monit_bin)} reload" sudo_if_needed "#{fetch(:sneakers_monit_bin)} reload"
end end
end end
...@@ -21,66 +25,73 @@ namespace :sneakers do ...@@ -21,66 +25,73 @@ namespace :sneakers do
desc 'Enable Sneakers monit' desc 'Enable Sneakers monit'
task :monitor do task :monitor do
on roles(fetch(:sneakers_role)) do on roles(fetch(:sneakers_role)) do
sudo_if_needed "#{fetch(:sneakers_monit_bin)} monitor #{sneakers_monit_service_name}" sudo_if_needed "#{fetch(:sneakers_monit_bin)} monitor #{sneakers_service_name}"
end end
end end
desc 'Disable Sneakers monit' desc 'Disable Sneakers monit'
task :unmonitor do task :unmonitor do
on roles(fetch(:sneakers_role)) do on roles(fetch(:sneakers_role)) do
sudo_if_needed "#{fetch(:sneakers_monit_bin)} unmonitor #{sneakers_monit_service_name}" sudo_if_needed "#{fetch(:sneakers_monit_bin)} unmonitor #{sneakers_service_name}"
end end
end end
desc 'Start Sneakers through monit' desc 'Start Sneakers through monit'
task :start do task :start do
on roles(fetch(:sneakers_role)) do on roles(fetch(:sneakers_role)) do
sudo_if_needed "#{fetch(:sneakers_monit_bin)} start #{sneakers_monit_service_name}" sudo_if_needed "#{fetch(:sneakers_monit_bin)} start #{sneakers_service_name}"
end end
end end
desc 'Stop Sneakers through monit' desc 'Stop Sneakers through monit'
task :stop do task :stop do
on roles(fetch(:sneakers_role)) do on roles(fetch(:sneakers_role)) do
sudo_if_needed "#{fetch(:sneakers_monit_bin)} stop #{sneakers_monit_service_name}" sudo_if_needed "#{fetch(:sneakers_monit_bin)} stop #{sneakers_service_name}"
end end
end end
desc 'Restart Sneakers through monit' desc 'Restart Sneakers through monit'
task :restart do task :restart do
on roles(fetch(:sneakers_role)) do on roles(fetch(:sneakers_role)) do
sudo_if_needed "#{fetch(:sneakers_monit_bin)} restart #{sneakers_monit_service_name}" sudo_if_needed "#{fetch(:sneakers_monit_bin)} restart #{sneakers_service_name}"
end end
end end
before 'deploy:updating', 'sneakers:monit:unmonitor' before 'deploy:updating', 'sneakers:monit:unmonitor'
after 'deploy:published', 'sneakers:monit:monitor' after 'deploy:published', 'sneakers:monit:monitor'
def sneakers_monit_service_name def sneakers_service_name
fetch(:sneakers_monit_service_name, "sneakers_#{fetch(:application)}_#{fetch(:stage)}") fetch(:sneakers_service_name, "sneakers_#{fetch(:application)}_#{fetch(:sneakers_env)}")
end end
def sudo_if_needed(command) def sudo_if_needed(command)
fetch(:sneakers_monit_use_sudo) ? sudo(command) : execute(command) fetch(:sneakers_monit_use_sudo) ? sudo(command) : execute(command)
end end
def template_sneakers(from, to, role) def upload_sneakers_template(from, to, role)
[ template = sneakers_template(from, role)
File.join('lib', 'capistrano', 'templates', "#{from}-#{role.hostname}-#{fetch(:stage)}.rb"), upload!(StringIO.new(ERB.new(template).result(binding)), to)
File.join('lib', 'capistrano', 'templates', "#{from}-#{role.hostname}.rb"), end
File.join('lib', 'capistrano', 'templates', "#{from}-#{fetch(:stage)}.rb"),
File.join('lib', 'capistrano', 'templates', "#{from}.rb.erb"), def sneakers_template(name, role)
File.join('lib', 'capistrano', 'templates', "#{from}.rb"), local_template_directory = fetch(:sneakers_monit_templates_path)
File.join('lib', 'capistrano', 'templates', "#{from}.erb"),
File.expand_path("../../templates/#{from}.rb.erb", __FILE__), search_paths = [
File.expand_path("../../templates/#{from}.erb", __FILE__) "#{name}-#{role.hostname}-#{fetch(:stage)}.erb",
].each do |path| "#{name}-#{role.hostname}.erb",
if File.file?(path) "#{name}-#{fetch(:stage)}.erb",
erb = File.read(path) "#{name}.erb"
upload! StringIO.new(ERB.new(erb).result(binding)), to ].map { |filename| File.join(local_template_directory, filename) }
break
end global_search_path = File.expand_path(
end File.join(*%w[.. .. .. generators capistrano sneakers monit templates], "#{name}.conf.erb"),
__FILE__
)
search_paths << global_search_path
template_path = search_paths.detect { |path| File.file?(path) }
File.read(template_path)
end end
end end
end end
...@@ -5,12 +5,13 @@ namespace :load do ...@@ -5,12 +5,13 @@ namespace :load do
set :sneakers_pid, -> { File.join(shared_path, 'tmp', 'pids', 'sneakers.pid') } set :sneakers_pid, -> { File.join(shared_path, 'tmp', 'pids', 'sneakers.pid') }
set :sneakers_env, -> { fetch(:rack_env, fetch(:rails_env, fetch(:stage))) } set :sneakers_env, -> { fetch(:rack_env, fetch(:rails_env, fetch(:stage))) }
set :sneakers_log, -> { File.join(shared_path, 'log', 'sneakers.log') } set :sneakers_log, -> { File.join(shared_path, 'log', 'sneakers.log') }
# set :sneakers_timeout, -> { 10 } # set :sneakers_timeout, -> 10
set :sneakers_role, -> { :app } # TODO: Rename to plural
set :sneakers_processes, -> { 1 } set :sneakers_role, [:app]
set :sneakers_workers, -> { false } # if this is false it will cause Capistrano to exit set :sneakers_processes, 1
set :sneakers_run_config, -> { false } # if this is true sneakers will run with preconfigured /config/initializers/sneakers.rb set :sneakers_workers, false # if this is false it will cause Capistrano to exit
set :sneakers_boot_file, -> { false } # Needed for booting daemons dynamically # rename to sneakers_config
set :sneakers_run_config, true # if this is true sneakers will run with preconfigured /config/initializers/sneakers.rb
# Rbenv and RVM integration # Rbenv and RVM integration
set :rbenv_map_bins, fetch(:rbenv_map_bins).to_a.concat(%w(sneakers)) set :rbenv_map_bins, fetch(:rbenv_map_bins).to_a.concat(%w(sneakers))
set :rvm_map_bins, fetch(:rvm_map_bins).to_a.concat(%w(sneakers)) set :rvm_map_bins, fetch(:rvm_map_bins).to_a.concat(%w(sneakers))
...@@ -94,43 +95,11 @@ namespace :sneakers do ...@@ -94,43 +95,11 @@ namespace :sneakers do
workers = fetch(:sneakers_workers).compact.join(',') workers = fetch(:sneakers_workers).compact.join(',')
#run "cmd", env: { 'WORKERS' => workers } #export this to environmental variable
info "Starting the sneakers processes" info "Starting the sneakers processes"
#workers.each do |worker|
with rails_env: fetch(:sneakers_env), workers: workers do with rails_env: fetch(:sneakers_env), workers: workers do
rake 'sneakers:run' rake 'sneakers:run'
end end
#execute :bundle, :exec, :sneakers, args.compact.join(' ')
else
args = []
# Using custom sneakers setup
args.push "--index #{idx}"
args.push "--pidfile #{pid_file}"
args.push "--environment #{fetch(:sneakers_env)}"
args.push "--logfile #{fetch(:sneakers_log)}" if fetch(:sneakers_log)
args.push "--require #{fetch(:sneakers_require)}" if fetch(:sneakers_require)
args.push "--tag #{fetch(:sneakers_tag)}" if fetch(:sneakers_tag)
Array(fetch(:sneakers_queue)).each do |queue|
args.push "--queue #{queue}"
end
args.push "--config #{fetch(:sneakers_config)}" if fetch(:sneakers_config)
args.push "--concurrency #{fetch(:sneakers_concurrency)}" if fetch(:sneakers_concurrency)
# use sneakers_options for special options
args.push fetch(:sneakers_options) if fetch(:sneakers_options)
if defined?(JRUBY_VERSION)
args.push '>/dev/null 2>&1 &'
warn 'Since JRuby doesn\'t support Process.daemon, sneakers will not be running as a daemon.'
else
args.push '--daemon'
end
if fetch(:start_sneakers_in_background, fetch(:sneakers_run_in_background))
background :bundle, :exec, :sneakers, args.compact.join(' ')
else
execute :bundle, :exec, :sneakers, args.compact.join(' ')
end
end end
end end
......
require 'rails/generators/base'
module Capistrano
module Sneakers
module Monit
module Generators
class TemplateGenerator < Rails::Generators::Base
namespace "capistrano:sneakers:monit:template"
desc "Create local monitrc.erb, and erb files for monitored processes for customization"
source_root File.expand_path('../templates', __FILE__)
argument :templates_path, type: :string,
default: "config/deploy/templates",
banner: "path to templates"
def copy_template
copy_file "sneakers_monit.conf.erb", "#{templates_path}/sidekiq_monit.erb"
end
end
end
end
end
end
# Monit configuration for Sneakers # Monit configuration for Sneakers
# Service name: <%= sneakers_monit_service_name %> # Service name: <%= sneakers_service_name %>
# #
check process <%= sneakers_monit_service_name %> check process <%= sneakers_service_name %>
with pidfile "<%= fetch(:sneakers_pid) %>" with pidfile "<%= fetch(:sneakers_pid) %>"
start program = "/usr/bin/sudo -iu <%= sneakers_user(@role) %> /bin/bash -c 'cd <%= current_path %> && RAILS_ENV=<%= fetch(:sneakers_env) %> WORKERS=<%= fetch(:sneakers_workers).join(',') %> <%= SSHKit.config.command_map[:rake] %> sneakers:run'" start program = "/usr/bin/sudo -iu <%= sneakers_user(@role) %> /bin/bash -c 'cd <%= current_path %> && RAILS_ENV=<%= fetch(:sneakers_env) %> WORKERS=<%= fetch(:sneakers_workers).join(',') %> <%= SSHKit.config.command_map[:rake] %> sneakers:run'"
stop program = "/usr/bin/sudo -iu <%= sneakers_user(@role) %> /bin/bash -c 'kill -SIGTERM `cat <%= fetch(:sneakers_pid) %>`'" stop program = "/usr/bin/sudo -iu <%= sneakers_user(@role) %> /bin/bash -c 'kill -SIGTERM `cat <%= fetch(:sneakers_pid) %>`'"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment