capitate 0.2.5 → 0.2.6
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +7 -0
- data/Manifest.txt +1 -0
- data/docs/recipes/index.txt +2 -1
- data/docs/recipes/mongrel-cluster-monit.txt +1 -0
- data/docs/recipes/monit-centos.txt +0 -11
- data/docs/recipes/monit.txt +38 -1
- data/docs/recipes/nginx-mongrel.txt +1 -1
- data/lib/capitate/cap_ext/connections.rb +100 -73
- data/lib/capitate/version.rb +1 -1
- data/lib/capitate.rb +3 -0
- data/lib/deployment/install-centos-rubyweb.rb +1 -0
- data/lib/recipes/centos/mongrel_cluster.rb +3 -0
- data/lib/recipes/centos/monit.rb +0 -14
- data/lib/recipes/mongrel_cluster.rb +5 -3
- data/lib/recipes/monit.rb +39 -0
- data/lib/recipes/mysql.rb +8 -4
- data/lib/recipes/nginx.rb +1 -1
- data/lib/templates/mongrel/mongrel_cluster.yml.erb +2 -2
- data/lib/templates/mysql/install_db.sql.erb +1 -2
- data/website/index.html +1 -1
- metadata +2 -1
data/History.txt
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
== 0.2.6 2008-02-29
|
2
|
+
|
3
|
+
* Fix SSH connect debug when connecting to more than 1 server.
|
4
|
+
* Added monit restart (hup) recipe.
|
5
|
+
* Mysql setup task, showing sql. Setting to :db role only.
|
6
|
+
* Capistrano patch: execute_on_servers_without_capitate(options, &block) to rescue Capistrano::NoMatchingServersError, and ignore as non-fatal
|
7
|
+
|
1
8
|
== 0.2.5 2008-02-28
|
2
9
|
|
3
10
|
* Adding application configuration for mongrel cluster monit setup.
|
data/Manifest.txt
CHANGED
data/docs/recipes/index.txt
CHANGED
@@ -15,7 +15,8 @@ h2. Namespaces
|
|
15
15
|
* "memcached:monit":memcached-monit.html (1)
|
16
16
|
* "mongrel-cluster:centos":mongrel-cluster-centos.html (1)
|
17
17
|
* "mongrel-cluster:monit":mongrel-cluster-monit.html (1)
|
18
|
-
* "monit
|
18
|
+
* "monit":monit.html (3)
|
19
|
+
* "monit:centos":monit-centos.html (1)
|
19
20
|
* "mysql":mysql.html (1)
|
20
21
|
* "mysql:centos":mysql-centos.html (1)
|
21
22
|
* "mysql:monit":mysql-monit.html (1)
|
@@ -15,6 +15,7 @@ h3(#mongrel:cluster:monit:setup). mongrel:cluster:monit:setup
|
|
15
15
|
Create monit configuration for mongrel cluster.
|
16
16
|
|
17
17
|
*mongrel_application*: Name of application (monit group). _Defaults to <tt>"mongrel_cluster_#{fetch(:application)}"</tt>_
|
18
|
+
*mongrel_bin_path*: Path to mongrel command. _Defaults to <tt>/usr/bin/mongrel_rails</tt>_
|
18
19
|
*mongrel_size*: Number of mongrels.
|
19
20
|
|
20
21
|
@set :mongrel_size, 3@
|
@@ -6,7 +6,6 @@ h1. monit:centos
|
|
6
6
|
h2. Tasks
|
7
7
|
|
8
8
|
* "monit:centos:install":#monit:centos:install
|
9
|
-
* "monit:centos:restart":#monit:centos:restart
|
10
9
|
|
11
10
|
|
12
11
|
h2. Task documentation
|
@@ -37,13 +36,3 @@ Install monit.
|
|
37
36
|
|
38
37
|
|
39
38
|
|
40
|
-
h3(#monit:centos:restart). monit:centos:restart
|
41
|
-
|
42
|
-
Monit HUP.
|
43
|
-
|
44
|
-
*monit_pid_path*: Path to monit pid.
|
45
|
-
|
46
|
-
@set :monit_pid_path, "/var/run/monit.pid"@
|
47
|
-
|
48
|
-
|
49
|
-
|
data/docs/recipes/monit.txt
CHANGED
@@ -5,4 +5,41 @@ h1. monit
|
|
5
5
|
|
6
6
|
h2. Namespaces
|
7
7
|
|
8
|
-
* "monit:centos":monit-centos.html (
|
8
|
+
* "monit:centos":monit-centos.html (1)
|
9
|
+
|
10
|
+
|
11
|
+
h2. Tasks
|
12
|
+
|
13
|
+
* "monit:monitor_all":#monit:monitor_all
|
14
|
+
* "monit:restart":#monit:restart
|
15
|
+
* "monit:unmonitor_all":#monit:unmonitor_all
|
16
|
+
|
17
|
+
|
18
|
+
h2. Task documentation
|
19
|
+
|
20
|
+
h3(#monit:monitor_all). monit:monitor_all
|
21
|
+
|
22
|
+
Monitor all.
|
23
|
+
|
24
|
+
*monit_bin_path*: Path to monit bin. _Defaults to <tt>monit</tt>_
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
h3(#monit:restart). monit:restart
|
29
|
+
|
30
|
+
Restart (HUP) monit process.
|
31
|
+
|
32
|
+
HUP's the process from the pid file, if it exists.
|
33
|
+
|
34
|
+
*monit_pid_path*: Path to monit pid file. _Defaults to <tt>/var/run/monit.pid</tt>_
|
35
|
+
|
36
|
+
|
37
|
+
|
38
|
+
h3(#monit:unmonitor_all). monit:unmonitor_all
|
39
|
+
|
40
|
+
Unmonitor all.
|
41
|
+
|
42
|
+
*monit_bin_path*: Path to monit bin. _Defaults to <tt>monit</tt>_
|
43
|
+
|
44
|
+
|
45
|
+
|
@@ -12,7 +12,7 @@ h2. Task documentation
|
|
12
12
|
|
13
13
|
h3(#nginx:mongrel:setup). nginx:mongrel:setup
|
14
14
|
|
15
|
-
|
15
|
+
Generate the nginx vhost include (for a mongrel setup).
|
16
16
|
|
17
17
|
*mongrel_application*: Mongrel application. _Defaults to <tt>:application</tt>_
|
18
18
|
*mongrel_size*: Number of mongrels.
|
@@ -1,84 +1,107 @@
|
|
1
1
|
# Patch to add ability to clear sessions/connections.
|
2
|
-
module
|
2
|
+
module Capitate
|
3
|
+
module CapExt
|
4
|
+
module Connections
|
3
5
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
6
|
+
def self.included(base) #:nodoc:
|
7
|
+
base.send :alias_method, :execute_on_servers_without_capitate, :execute_on_servers
|
8
|
+
base.send :alias_method, :execute_on_servers, :execute_on_servers_with_capitate
|
9
|
+
end
|
10
|
+
|
11
|
+
# Determines the set of servers within the current task's scope and
|
12
|
+
# establishes connections to them, and then yields that list of
|
13
|
+
# servers.
|
14
|
+
#
|
15
|
+
# Overriden to handle NoMatchingServersError as NON-FATAL
|
16
|
+
#
|
17
|
+
def execute_on_servers_with_capitate(options={}, &block)
|
18
|
+
begin
|
19
|
+
execute_on_servers_without_capitate(options, &block)
|
20
|
+
rescue Capistrano::NoMatchingServersError => e
|
21
|
+
logger.important "`#{current_task.fully_qualified_name}' is only run for servers matching #{current_task.options.inspect}, but no servers matched"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Set the user to something new (but save the old user; reset_user will set it back).
|
26
|
+
# Takes care of invalidating current connections. Will force a re-login.
|
27
|
+
#
|
28
|
+
# ==== Options
|
29
|
+
# +new_user+:: User to become
|
30
|
+
#
|
31
|
+
# ==== Examples
|
32
|
+
# set_user("nginx")
|
33
|
+
# # Do something as user nginx
|
34
|
+
#
|
35
|
+
def set_user(new_user)
|
36
|
+
previous_user = fetch(:user)
|
16
37
|
|
17
|
-
|
18
|
-
|
38
|
+
return if previous_user == new_user
|
39
|
+
set :previous_user, previous_user
|
19
40
|
|
20
|
-
|
21
|
-
|
22
|
-
|
41
|
+
set :user, new_user
|
42
|
+
clear_sessions
|
43
|
+
end
|
23
44
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
45
|
+
# Reset to the old user.
|
46
|
+
# Takes care of invalidating current connections. Will force a re-login.
|
47
|
+
#
|
48
|
+
# ==== Examples
|
49
|
+
# # User is "root"
|
50
|
+
# set_user("nginx")
|
51
|
+
# # Do something as user nginx
|
52
|
+
# reset_user
|
53
|
+
# # User is now root
|
54
|
+
#
|
55
|
+
def reset_user
|
56
|
+
return unless exists?(:previous_user)
|
57
|
+
set :user, fetch(:previous_user)
|
58
|
+
unset :previous_user
|
59
|
+
clear_sessions
|
60
|
+
end
|
40
61
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
62
|
+
# Yields the previous user.
|
63
|
+
#
|
64
|
+
# ==== Options
|
65
|
+
# +new_user+:: User to become
|
66
|
+
#
|
67
|
+
# ==== Examples
|
68
|
+
# new_user("nginx") do |old_user|
|
69
|
+
# # Do something as user nginx
|
70
|
+
# end
|
71
|
+
# # Now as user old_user
|
72
|
+
#
|
73
|
+
def with_user(new_user, &block)
|
74
|
+
begin
|
75
|
+
set_user(new_user)
|
76
|
+
yield exists?(:previous_user) ? fetch(:previous_user) : nil
|
77
|
+
ensure
|
78
|
+
reset_user
|
79
|
+
end
|
59
80
|
|
60
|
-
|
61
|
-
|
81
|
+
clear_sessions
|
82
|
+
end
|
62
83
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
84
|
+
# Close all open sessions.
|
85
|
+
# Will force user to re-login.
|
86
|
+
def clear_sessions
|
87
|
+
sessions.each do |key, session|
|
88
|
+
logger.info "Closing: #{key}"
|
89
|
+
session.close
|
90
|
+
end
|
91
|
+
sessions.clear
|
92
|
+
reset_password
|
93
|
+
end
|
73
94
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
95
|
+
# Reset the password.
|
96
|
+
# Display the current user that is asking for the password.
|
97
|
+
def reset_password
|
98
|
+
set :password, Proc.new {
|
99
|
+
Capistrano::CLI.password_prompt("Password (for user: #{user}): ")
|
100
|
+
}
|
101
|
+
end
|
81
102
|
|
103
|
+
end
|
104
|
+
end
|
82
105
|
end
|
83
106
|
|
84
107
|
# Debug connections
|
@@ -87,9 +110,13 @@ class Capistrano::SSH
|
|
87
110
|
class << self
|
88
111
|
|
89
112
|
def connect_with_logging(server, options={}, &block)
|
90
|
-
|
113
|
+
@connect_mutex ||= Mutex.new
|
91
114
|
|
92
|
-
|
115
|
+
@connect_mutex.synchronize do
|
116
|
+
puts "=== Connecting to #{server} with user: #{server.user || options[:user]}"
|
117
|
+
end
|
118
|
+
|
119
|
+
connect_without_logging(server, options, &block)
|
93
120
|
end
|
94
121
|
|
95
122
|
alias_method_chain :connect, :logging
|
data/lib/capitate/version.rb
CHANGED
data/lib/capitate.rb
CHANGED
@@ -32,7 +32,10 @@ class Capistrano::Configuration
|
|
32
32
|
include Capitate::CapExt::Variables
|
33
33
|
include Capitate::CapExt::RunVia
|
34
34
|
include Capitate::CapExt::Roles
|
35
|
+
include Capitate::CapExt::Connections
|
35
36
|
end
|
36
37
|
|
38
|
+
#module Capistrano::Configuration::Connections; end
|
39
|
+
|
37
40
|
require 'capitate/task_node'
|
38
41
|
|
@@ -38,6 +38,9 @@ namespace :mongrel do
|
|
38
38
|
end
|
39
39
|
|
40
40
|
run "mkdir -p #{mongrel_config_dir}"
|
41
|
+
|
42
|
+
set :mongrel_pid_path, "#{mongrel_pid_dir}/#{mongrel_application}.pid"
|
43
|
+
set :mongrel_log_path, "log/#{mongrel_application}.log"
|
41
44
|
|
42
45
|
put template.load("mongrel/mongrel_cluster.initd.erb"), "/tmp/#{mongrel_initscript_name}.initd"
|
43
46
|
put template.load("mongrel/mongrel_cluster.yml.erb"), "#{mongrel_config_dir}/mongrel_cluster.yml"
|
data/lib/recipes/centos/monit.rb
CHANGED
@@ -47,20 +47,6 @@ namespace :monit do
|
|
47
47
|
script.sh("monit/cert.sh")
|
48
48
|
end
|
49
49
|
|
50
|
-
desc <<-DESC
|
51
|
-
Monit HUP.
|
52
|
-
|
53
|
-
*monit_pid_path*: Path to monit pid.\n
|
54
|
-
@set :monit_pid_path, "/var/run/monit.pid"@\n
|
55
|
-
DESC
|
56
|
-
task :restart do
|
57
|
-
|
58
|
-
# Settings
|
59
|
-
fetch_or_default(:monit_pid_path, "/var/run/monit.pid")
|
60
|
-
|
61
|
-
sudo "kill -HUP `cat #{monit_pid_path}`"
|
62
|
-
end
|
63
|
-
|
64
50
|
end
|
65
51
|
|
66
52
|
end
|
@@ -9,6 +9,7 @@ namespace :mongrel do
|
|
9
9
|
Create monit configuration for mongrel cluster.
|
10
10
|
|
11
11
|
*mongrel_application*: Name of application (monit group). _Defaults to <tt>"mongrel_cluster_\#{fetch(:application)}"</tt>_
|
12
|
+
*mongrel_bin_path*: Path to mongrel command. _Defaults to <tt>/usr/bin/mongrel_rails</tt>_
|
12
13
|
*mongrel_size*: Number of mongrels.\n
|
13
14
|
@set :mongrel_size, 3@\n
|
14
15
|
*mongrel_port*: Starting port for mongrels. If there are 3 mongrels with port 9000, then instances
|
@@ -30,6 +31,7 @@ namespace :mongrel do
|
|
30
31
|
fetch(:mongrel_size)
|
31
32
|
fetch(:mongrel_port)
|
32
33
|
fetch_or_default(:mongrel_application, Proc.new { "mongrel_cluster_#{fetch(:application)}" })
|
34
|
+
fetch_or_default(:mongrel_bin_path, "/usr/bin/mongrel_rails")
|
33
35
|
fetch_or_default(:mongrel_config_script, nil)
|
34
36
|
fetch_or_default(:monit_conf_dir, "/etc/monit")
|
35
37
|
|
@@ -37,7 +39,7 @@ namespace :mongrel do
|
|
37
39
|
ports = (0...mongrel_size).collect { |i| mongrel_port + i }
|
38
40
|
ports.each do |port|
|
39
41
|
|
40
|
-
pid_path = "#{shared_path}/pids
|
42
|
+
pid_path = "#{shared_path}/pids/#{mongrel_application}.#{port}.pid"
|
41
43
|
|
42
44
|
default_options = [
|
43
45
|
[ "-d" ],
|
@@ -48,7 +50,7 @@ namespace :mongrel do
|
|
48
50
|
[ "--group", user ],
|
49
51
|
[ "-p", port ],
|
50
52
|
[ "-P", pid_path ],
|
51
|
-
[ "-l", "log
|
53
|
+
[ "-l", "log/#{mongrel_application}.#{port}.log" ]
|
52
54
|
]
|
53
55
|
|
54
56
|
default_options << [ "-S", mongrel_config_script ] if mongrel_config_script
|
@@ -57,7 +59,7 @@ namespace :mongrel do
|
|
57
59
|
#start_options = "-d -e production -a 127.0.0.1 -c #{current_path} --user #{user} --group #{user} -p #{port} -P #{pid_path} -l log/mongrel.#{port}.log"
|
58
60
|
stop_options = "-p #{port} -P #{pid_path}"
|
59
61
|
|
60
|
-
processes << { :port => port, :start_options => start_options, :stop_options => stop_options, :name =>
|
62
|
+
processes << { :port => port, :start_options => start_options, :stop_options => stop_options, :name => mongrel_bin_path, :pid_path => pid_path }
|
61
63
|
end
|
62
64
|
|
63
65
|
set :processes, processes
|
@@ -0,0 +1,39 @@
|
|
1
|
+
namespace :monit do
|
2
|
+
|
3
|
+
desc <<-DESC
|
4
|
+
Restart (HUP) monit process.
|
5
|
+
|
6
|
+
HUP's the process from the pid file, if it exists.
|
7
|
+
|
8
|
+
*monit_pid_path*: Path to monit pid file. _Defaults to <tt>/var/run/monit.pid</tt>_
|
9
|
+
DESC
|
10
|
+
task :restart do
|
11
|
+
fetch_or_default(:monit_pid_path, "/var/run/monit.pid")
|
12
|
+
|
13
|
+
run_via %{sh -c "[ ! -e '#{monit_pid_path}' ] || kill -HUP `cat #{monit_pid_path}`"}
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
desc <<-DESC
|
18
|
+
Unmonitor all.
|
19
|
+
|
20
|
+
*monit_bin_path*: Path to monit bin. _Defaults to <tt>monit</tt>_
|
21
|
+
DESC
|
22
|
+
task :unmonitor_all do
|
23
|
+
fetch_or_default(:monit_bin_path, "monit")
|
24
|
+
|
25
|
+
run_via "#{monit_bin_path} unmonitor all"
|
26
|
+
end
|
27
|
+
|
28
|
+
desc <<-DESC
|
29
|
+
Monitor all.
|
30
|
+
|
31
|
+
*monit_bin_path*: Path to monit bin. _Defaults to <tt>monit</tt>_
|
32
|
+
DESC
|
33
|
+
task :monitor_all do
|
34
|
+
fetch_or_default(:monit_bin_path, "monit")
|
35
|
+
|
36
|
+
run_via "#{monit_bin_path} monitor all"
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
data/lib/recipes/mysql.rb
CHANGED
@@ -38,7 +38,7 @@ namespace :mysql do
|
|
38
38
|
*mysql_admin_password*: Mysql admin password (to use to connect). Defaults to password prompt.\n
|
39
39
|
@set :mysql_admin_password, prompt.password('Mysql admin password: '))@
|
40
40
|
DESC
|
41
|
-
task :setup do
|
41
|
+
task :setup, :roles => :db do
|
42
42
|
|
43
43
|
# Settings
|
44
44
|
fetch(:db_name)
|
@@ -56,10 +56,14 @@ namespace :mysql do
|
|
56
56
|
mysql_grant_locations << role.host
|
57
57
|
end unless roles[role_name].blank?
|
58
58
|
end
|
59
|
-
set :mysql_grant_locations, mysql_grant_locations
|
60
|
-
end
|
59
|
+
set :mysql_grant_locations, mysql_grant_locations.uniq!
|
60
|
+
end
|
61
|
+
|
62
|
+
sql = template.load("mysql/install_db.sql.erb")
|
63
|
+
|
64
|
+
logger.trace "Running sql:\n#{sql}"
|
61
65
|
|
62
|
-
put
|
66
|
+
put sql, "/tmp/install_db_#{application}.sql"
|
63
67
|
run "mysql -u root -p#{mysql_admin_password} < /tmp/install_db_#{application}.sql"
|
64
68
|
end
|
65
69
|
|
data/lib/recipes/nginx.rb
CHANGED
@@ -25,7 +25,7 @@ namespace :nginx do
|
|
25
25
|
|
26
26
|
namespace :mongrel do
|
27
27
|
desc <<-DESC
|
28
|
-
|
28
|
+
Generate the nginx vhost include (for a mongrel setup).
|
29
29
|
|
30
30
|
*mongrel_application*: Mongrel application. _Defaults to <tt>:application</tt>_
|
31
31
|
*mongrel_size*: Number of mongrels.\n
|
@@ -1,10 +1,10 @@
|
|
1
1
|
---
|
2
2
|
cwd: <%= current_path %>
|
3
|
-
log_file:
|
3
|
+
log_file: <%= mongrel_log_path %>
|
4
4
|
port: "<%= mongrel_port %>"
|
5
5
|
environment: production
|
6
6
|
address: 127.0.0.1
|
7
|
-
pid_file: <%=
|
7
|
+
pid_file: <%= mongrel_pid_path %>
|
8
8
|
servers: <%= mongrel_size %>
|
9
9
|
user: <%= user %>
|
10
10
|
group: <%= user %>
|
@@ -1,5 +1,4 @@
|
|
1
|
-
<% mysql_grant_locations.each do |location| %>
|
2
|
-
GRANT <%= mysql_grant_priv_type %> ON <%= db_name %>.* TO '<%= db_user %>'@'<%= location %>' IDENTIFIED BY '<%= db_pass %>';
|
1
|
+
<% mysql_grant_locations.each do |location| %>GRANT <%= mysql_grant_priv_type %> ON <%= db_name %>.* TO '<%= db_user %>'@'<%= location %>' IDENTIFIED BY '<%= db_pass %>';
|
3
2
|
<% end %>
|
4
3
|
|
5
4
|
CREATE DATABASE IF NOT EXISTS <%= db_name %>;
|
data/website/index.html
CHANGED
@@ -38,7 +38,7 @@
|
|
38
38
|
|
39
39
|
<div id="version" class="clickable box" onclick='document.location = "http://rubyforge.org/projects/capitate"; return false'>
|
40
40
|
<p>Get Version</p>
|
41
|
-
<a href="http://rubyforge.org/projects/capitate" class="numbers">0.2.
|
41
|
+
<a href="http://rubyforge.org/projects/capitate" class="numbers">0.2.6</a>
|
42
42
|
</div>
|
43
43
|
|
44
44
|
<div id="recipes">
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capitate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.6
|
5
5
|
platform: ""
|
6
6
|
authors:
|
7
7
|
- Gabriel Handford
|
@@ -135,6 +135,7 @@ files:
|
|
135
135
|
- lib/recipes/docs.rb
|
136
136
|
- lib/recipes/memcached.rb
|
137
137
|
- lib/recipes/mongrel_cluster.rb
|
138
|
+
- lib/recipes/monit.rb
|
138
139
|
- lib/recipes/mysql.rb
|
139
140
|
- lib/recipes/nginx.rb
|
140
141
|
- lib/recipes/rails.rb
|