capitate 0.2.8 → 0.2.11

Sign up to get free protection for your applications and to get access to all the features.
data/Capfile CHANGED
@@ -11,3 +11,25 @@ require 'lib/capitate/recipes'
11
11
 
12
12
  require 'erb'
13
13
 
14
+ # Test
15
+ task :test_egrep do
16
+ role :test, "10.0.6.118", :user => "root"
17
+
18
+ found = utils.egrep("^mail.\\*", "/etc/syslog.conf")
19
+ puts "Found? #{found}"
20
+
21
+ found = utils.egrep("^fooo", "/etc/syslog.conf")
22
+ puts "Found? #{found}"
23
+ end
24
+
25
+ task :test_app do
26
+ set :application, "sick"
27
+ set :deploy_to, "/var/www/apps/sick"
28
+ role :web, "10.0.6.118", :user => "root"
29
+ role :app, "10.0.6.118", :user => "root"
30
+ end
31
+
32
+ task :test_install do
33
+ load File.dirname(__FILE__) + "/lib/deployment/centos-5.1-64-web/install.rb"
34
+ role :test, "10.0.6.118", :user => "root"
35
+ end
data/History.txt CHANGED
@@ -1,3 +1,21 @@
1
+ == 0.2.11 2008-03-25
2
+
3
+ * Backgroundrb recipes and templates
4
+ * Memcached yml template and recipe
5
+ * Rails update code task
6
+
7
+ == 0.2.9 <never>
8
+
9
+ * SSH keygen and authorize key recipes
10
+ * Updated rails:setup recipe to include option for specifying path to database yml template
11
+ * Logrotate recipes
12
+
13
+ * Plugin adds/changes:
14
+ ** utils.install_template
15
+ ** utils.append_to
16
+ ** utils.egrep
17
+ ** utils.exist?
18
+
1
19
  == 0.2.8 2008-03-13
2
20
 
3
21
  * Recipe, mysql:centos:install, doing restart incase already run
data/Manifest.txt CHANGED
@@ -26,7 +26,8 @@ lib/capitate/recipes.rb
26
26
  lib/capitate/task_node.rb
27
27
  lib/capitate/version.rb
28
28
  lib/deployment/centos-5.1-64-web/install.rb
29
- lib/deployment/deploy.rb
29
+ lib/recipes/backgroundrb.rb
30
+ lib/recipes/centos/backgroundrb.rb
30
31
  lib/recipes/centos/centos.rb
31
32
  lib/recipes/centos/imagemagick.rb
32
33
  lib/recipes/centos/memcached.rb
@@ -37,6 +38,12 @@ lib/recipes/centos/nginx.rb
37
38
  lib/recipes/centos/ruby.rb
38
39
  lib/recipes/centos/sphinx.rb
39
40
  lib/recipes/docs.rb
41
+ lib/recipes/logrotate/mongrel_cluster.rb
42
+ lib/recipes/logrotate/monit.rb
43
+ lib/recipes/logrotate/nginx.rb
44
+ lib/recipes/logrotate/rails.rb
45
+ lib/recipes/logrotate/sphinx.rb
46
+ lib/recipes/logrotated.rb
40
47
  lib/recipes/memcached.rb
41
48
  lib/recipes/mongrel_cluster.rb
42
49
  lib/recipes/monit.rb
@@ -45,17 +52,20 @@ lib/recipes/nginx.rb
45
52
  lib/recipes/rails.rb
46
53
  lib/recipes/sphinx.rb
47
54
  lib/recipes/sshd.rb
55
+ lib/recipes/syslogd.rb
56
+ lib/templates/backgroundrb/backgroundrb.initd.centos.erb
57
+ lib/templates/backgroundrb/backgroundrb.yml.erb
48
58
  lib/templates/capistrano/Capfile
59
+ lib/templates/logrotated/conf.erb
49
60
  lib/templates/memcached/memcached.initd.centos.erb
50
61
  lib/templates/memcached/memcached.monitrc.erb
62
+ lib/templates/memcached/memcached.yml.erb
51
63
  lib/templates/mongrel/mongrel_cluster.initd.erb
52
64
  lib/templates/mongrel/mongrel_cluster.monitrc.erb
53
65
  lib/templates/mongrel/mongrel_cluster.yml.erb
54
- lib/templates/monit/cert.sh
55
66
  lib/templates/monit/monit.cnf
56
67
  lib/templates/monit/monit.initd.centos.erb
57
68
  lib/templates/monit/monitrc.erb
58
- lib/templates/monit/patch_inittab.sh
59
69
  lib/templates/mysql/install_db.sql.erb
60
70
  lib/templates/mysql/mysql.monitrc.erb
61
71
  lib/templates/nginx/nginx.conf.erb
@@ -1,8 +1,14 @@
1
1
  require 'md5'
2
2
 
3
3
  module Capitate::Plugins::Prompt
4
-
5
- def ask(label, &block)
4
+
5
+ # Prompt.
6
+ #
7
+ # ==== Options
8
+ # +label+:: Label
9
+ # +options+:: Options (none yet)
10
+ #
11
+ def ask(label, options = {}, &block)
6
12
  Capistrano::CLI.ui.ask(label, &block)
7
13
  end
8
14
 
@@ -74,6 +74,9 @@ module Capitate::Plugins::Script
74
74
  end
75
75
 
76
76
  # Run all commands (separated by newlines).
77
+ #
78
+ # Uses run_via to execute, so will use <tt>run</tt> or <tt>sudo</tt>
79
+ # depending on the current <tt>:run_method</tt>
77
80
  #
78
81
  # ==== Options
79
82
  # +cmds+:: Commands (separated by newlines)
@@ -84,7 +87,7 @@ module Capitate::Plugins::Script
84
87
  cmd = cmd.gsub(/^\s+/, "")
85
88
  run_via(cmd, options, &block)
86
89
  end
87
- end
90
+ end
88
91
 
89
92
  end
90
93
 
@@ -6,7 +6,8 @@ module Capitate::Plugins::Utils
6
6
  # +args+:: Arguments. If argument is hash, then key is symlinked to value.
7
7
  #
8
8
  # ==== Examples
9
- # ln("src/foo" => "dest/foo") # Run: ln -nfs src/foo dest/foo
9
+ # utils.ln("src/foo" => "dest/foo") # Run: ln -nfs src/foo dest/foo
10
+ # utils.ln("src/foo" => "dest/foo", "src/bar" => "dest/bar") # Links both
10
11
  #
11
12
  def ln(*args)
12
13
  args.each do |arg|
@@ -18,9 +19,98 @@ module Capitate::Plugins::Utils
18
19
  end
19
20
  end
20
21
 
21
- def install_template(template_path, destination)
22
- put template.load("memcached/memcached.monitrc.erb"), "/tmp/memcached.monitrc"
23
- run_via "install -o root /tmp/memcached.monitrc #{monit_conf_dir}/memcached.monitrc"
22
+ # Load template and install it.
23
+ # Removes temporary files during transfer and ensures desination directory is created before install.
24
+ #
25
+ # See template plugin for where template paths are loaded from.
26
+ #
27
+ # ==== Options
28
+ # +template_path+:: Path to template
29
+ # +destination+:: Remote path to evaluated template
30
+ # +options+::
31
+ # - +user+:: User to install (-o)
32
+ # - +mode+:: Mode to install file (-m)
33
+ #
34
+ # ==== Example
35
+ # utils.install_template("monit/memcached.monitrc.erb", "/etc/monit/memcached.monitrc")
36
+ #
37
+ def install_template(template_path, destination, options = {})
38
+ # Truncate extension
39
+ tmp_file_path = template_path.gsub("/", "_").gsub(/.erb$/, "")
40
+ tmp_path = "/tmp/#{tmp_file_path}"
41
+
42
+ options[:user] ||= "root"
43
+
44
+ install_options = []
45
+ install_options << "-o #{options[:user]}"
46
+ install_options << "-m #{options[:mode]}" if options.has_key?(:mode)
47
+
48
+ put template.load(template_path), tmp_path
49
+ # TOOD: Ensure directory exists? mkdir -p #{File.dirname(destination)}
50
+ run_via "install #{install_options.join(" ")} #{tmp_path} #{destination} && rm -f #{tmp_path}"
51
+ end
52
+
53
+ # Grep file for regex. Returns true if found, false otherwise.
54
+ #
55
+ # ==== Options
56
+ # +grep+:: Regular expression
57
+ # +path+:: Path to file
58
+ #
59
+ # ==== Example
60
+ # utils.egrep("^mail.\\*", "/etc/syslog.conf") => true
61
+ #
62
+ def egrep(grep, path)
63
+ found = true
64
+ run_via %{egrep '#{grep}' #{path} || echo $?} do |channel, stream, data|
65
+ if data =~ /^(\d+)/
66
+ if $1.to_i > 0
67
+ logger.trace "Not found"
68
+ found = false
69
+ end
70
+ end
71
+ end
72
+ found
73
+ end
74
+
75
+ # Check if file exists.
76
+ #
77
+ # ==== Options
78
+ # +path+:: Path to file
79
+ #
80
+ def exist?(path)
81
+ found = true
82
+ run_via "head -1 #{path} >/dev/null 2>&1 || echo $?" do |channel, stream, data|
83
+ if data =~ /^(\d+)/
84
+ if $1.to_i > 0
85
+ logger.trace "Not found"
86
+ found = false
87
+ end
88
+ end
89
+ end
90
+ found
91
+ end
92
+
93
+ # Append data to a file.
94
+ # Optionally check that it exists before adding.
95
+ #
96
+ # ==== Options
97
+ # +path+:: Path to file to append to
98
+ # +data+:: String data to append
99
+ # +check+:: If not nil, will check to see if egrep matches "^string_to_check" and will not re-append
100
+ # +left_strip+:: If true (default), remove whitespace before lines
101
+ # +should_exist+:: If true (default), raise error if file does not exist
102
+ #
103
+ def append_to(path, data, check = nil, left_strip = true, should_exist = true)
104
+ # If checking and found expression then abort append
105
+ return if check and egrep(check, path)
106
+
107
+ # If should exist and doesn't then abort append
108
+ raise "Can't append to file. File should exist: #{path}" if should_exist and !exist?(path)
109
+
110
+ data.split("\n").each do |line|
111
+ line = line.gsub(/^\s+/, "") if left_strip
112
+ run_via "echo '#{line}' >> #{path}"
113
+ end
24
114
  end
25
115
 
26
116
  end
@@ -2,7 +2,7 @@ module Capitate #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 2
5
- TINY = 8
5
+ TINY = 11
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -1,25 +1,39 @@
1
- # Centos 5.1 base install
1
+ #
2
+ # Install recipe for Centos 5.1 x86_64 (@base install)
3
+ #
4
+ # To use this script:
5
+ #
6
+ # cap HOSTS=10.0.6.118:2023 -s user=root -f install.rb install
7
+ #
8
+ # Centos 5.1 x86_64 with packages, including:
9
+ # * Ruby
10
+ # * Nginx
11
+ # * Mysql
12
+ # * Sphinx
13
+ # * Monit
14
+ # * ImageMagick
15
+ # * Memcached
16
+ # * Gems: rake, mysql, raspell, rmagick, mongrel, mongrel_cluster, json, mime-types, hpricot
17
+ #
2
18
 
3
19
  load 'deploy' if respond_to?(:namespace) # cap2 differentiator
4
20
 
5
21
  require 'erb'
6
22
 
7
23
  # Load capitate
24
+ gem 'capitate', '>= 0.2.9'
8
25
  require 'capitate'
9
26
  require 'capitate/recipes'
10
27
 
11
28
  # Load more recipes
12
29
  Dir[File.dirname(__FILE__) + "/recipes/*.rb"].each { |recipe| load recipe }
13
30
 
14
- # Add a templates dir
15
- set :templates_dirs, [ File.dirname(__FILE__) + "/templates" ]
16
-
17
- # Install task
18
31
  namespace :install do
19
32
 
20
33
  task :default do
21
34
 
22
- as_root
35
+ set :user, "root"
36
+ set :run_method, :run
23
37
  check_role
24
38
 
25
39
  # NTP Setup
@@ -74,13 +88,15 @@ namespace :install do
74
88
  memcached.monit.install
75
89
 
76
90
  # Install gems
77
- gems.install(fetch(:gems_to_install))
91
+ gems_only
78
92
 
79
- # Install renderer
80
- renderer.install
81
-
82
93
  # Cleanup
83
94
  yum.clean
95
+
96
+ # Log rotate tasks
97
+ monit.logrotate.install
98
+ nginx.logrotate.install
99
+
84
100
  end
85
101
 
86
102
  desc "Install gems only"
@@ -89,15 +105,6 @@ namespace :install do
89
105
  end
90
106
  end
91
107
 
92
- #
93
- # To be root, cap as_root nginx:centos:install
94
- #
95
- desc "Be root"
96
- task :as_root do
97
- set :user, "root"
98
- set :run_method, :run
99
- end
100
-
101
108
  # Prompt for server if host not given
102
109
  task :check_role do
103
110
  # Can use cap HOSTS=192.168.1.111 install
@@ -185,5 +192,5 @@ set :imagemagick_build_options, {
185
192
  }
186
193
 
187
194
  # For sshd:monit:install
188
- set :sshd_pid_path, "/var/run/mysqld/mysqld.pid"
189
- set :sshd_port, 2023
195
+ set :sshd_pid_path, "/var/run/sshd.pid"
196
+ set :sshd_port, 2023
@@ -0,0 +1,30 @@
1
+ namespace :backgroundrb do
2
+
3
+ desc <<-DESC
4
+ Create backgroundrb.yml configuration.
5
+
6
+ For pid path support, change backgroundrb script pid_file line to:
7
+
8
+ pid_file = "\#{CONFIG_FILE[:backgroundrb][:pid_file]}"
9
+
10
+ *backgroundrb_host*: Backgroundrb host. _Defaults to 0.0.0.0_\n
11
+ *backgroundrb_port*: Backgroundrb port. _Defaults to 11006_\n
12
+ *backgroundrb_yml_template*: Backgroundrb yml template. _Defaults to @backgroundrb/backgroundrb.yml.erb@ in this gem.\n
13
+ DESC
14
+ task :setup do
15
+ fetch_or_default(:backgroundrb_host, "0.0.0.0")
16
+ fetch_or_default(:backgroundrb_port, 11006)
17
+ fetch_or_default(:backgroundrb_pid_path, "#{shared_path}/pids/backgroundrb.pid")
18
+ fetch_or_default(:backgroundrb_yml_template, "backgroundrb/backgroundrb.yml.erb")
19
+
20
+ utils.install_template(backgroundrb_yml_template, "#{shared_path}/config/backgroundrb.yml")
21
+ end
22
+
23
+ desc <<-DESC
24
+ Symlink backgroundrb config into release path.
25
+ DESC
26
+ task :update_code do
27
+ run "ln -nfs #{shared_path}/config/backgroundrb.yml #{release_path}/config/backgroundrb.yml"
28
+ end
29
+
30
+ end
@@ -0,0 +1,27 @@
1
+ namespace :backgroundrb do
2
+
3
+ namespace :centos do
4
+
5
+ desc <<-DESC
6
+ Setup backgroundrb for application.
7
+
8
+ *backgroundrb_bin_path*: Path to start. _Defaults to @{current_path}/script/backgroundrb start@_\n
9
+ *backgroundrb_pid_path*: Path to backgroundrb pid file. _Defaults to @{shared_path}/pids/backgroundrb.pid@_\n
10
+ DESC
11
+ task :setup do
12
+
13
+ # Settings
14
+ fetch_or_default(:backgroundrb_bin_path, "#{current_path}/script/backgroundrb -e production")
15
+ fetch_or_default(:backgroundrb_pid_path, "#{shared_path}/pids/backgroundrb.pid")
16
+
17
+ # Install initscript
18
+ utils.install_template("backgroundrb/backgroundrb.initd.centos.erb", "/etc/init.d/backgroundrb_#{application}")
19
+
20
+ # Enable service
21
+ run_via "/sbin/chkconfig --level 345 backgroundrb_#{application} on"
22
+
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -15,6 +15,7 @@ namespace :monit do
15
15
  @set :monit_conf_dir, "/etc/monit"@\n
16
16
  *monit_pid_path*: Path to monit pid.\n
17
17
  @set :monit_pid_path, "/var/run/monit.pid"@\n
18
+ *monit_log_path*: Path to monit log file.\n _Defaults to <tt>/var/log/monit.log</tt>_
18
19
  DESC
19
20
  task :install do
20
21
 
@@ -23,28 +24,42 @@ namespace :monit do
23
24
  fetch_or_default(:monit_password, prompt.password('Monit admin password (to set): ', :verify => true))
24
25
  fetch_or_default(:monit_conf_dir, "/etc/monit")
25
26
  fetch_or_default(:monit_pid_path, "/var/run/monit.pid")
27
+ fetch_or_default(:monit_log_path, "/var/log/monit.log")
26
28
  fetch(:monit_build_options)
27
29
 
28
30
  # Install dependencies
29
31
  yum.install([ "flex", "byacc" ])
30
32
 
31
33
  # Build
32
- build.make_install("monit", monit_build_options)
34
+ #build.make_install("monit", monit_build_options)
33
35
 
34
36
  # Install initscript
35
- put template.load("monit/monit.initd.centos.erb"), "/tmp/monit.initd"
36
- run_via "install -o root /tmp/monit.initd /etc/init.d/monit && rm -f /tmp/monit.initd"
37
+ utils.install_template("monit/monit.initd.centos.erb", "/etc/init.d/monit")
37
38
 
38
39
  # Install monitrc
39
- put template.load("monit/monitrc.erb"), "/tmp/monitrc"
40
- run_via "mkdir -p #{monit_conf_dir} && install -o root -m 700 /tmp/monitrc /etc/monitrc && rm -f /tmp/monitrc"
40
+ run_via "mkdir -p /etc/monit"
41
+ utils.install_template("monit/monitrc.erb", "/etc/monitrc", :user => "root", :mode => "700")
41
42
 
42
43
  # Build cert
43
- put template.load("monit/monit.cnf"), "/tmp/monit.cnf"
44
- script.sh("monit/cert.sh")
44
+ run_via "mkdir -p /var/certs"
45
+ utils.install_template("monit/monit.cnf", "/var/certs/monit.cnf")
45
46
 
46
- # Patch initab
47
- script.sh("monit/patch_inittab.sh")
47
+ script.run_all <<-CMDS
48
+ openssl req -new -x509 -days 365 -nodes -config /var/certs/monit.cnf -out /var/certs/monit.pem -keyout /var/certs/monit.pem -batch > /var/certs/debug_req.log 2>&1
49
+ openssl gendh 512 >> /var/certs/monit.pem 2> /var/certs/debug_gendh.log
50
+ openssl x509 -subject -dates -fingerprint -noout -in /var/certs/monit.pem > /var/certs/debug_x509.log
51
+ chmod 700 /var/certs/monit.pem
52
+ CMDS
53
+
54
+ # Install to inittab
55
+ utils.append_to("/etc/inittab", <<-APPEND, "^mo:345:respawn:/usr/local/bin/monit")
56
+
57
+ # Run monit in standard run-levels
58
+ mo:345:respawn:/usr/local/bin/monit -Ic /etc/monitrc -l #{monit_log_path} -p #{monit_pid_path}
59
+ APPEND
60
+
61
+ # HUP the inittab
62
+ run_via "telinit q"
48
63
  end
49
64
 
50
65
  desc <<-DESC
@@ -0,0 +1,24 @@
1
+ namespace :mongrel do
2
+
3
+ namespace :cluster do
4
+
5
+ namespace :logrotate do
6
+ desc <<-DESC
7
+ Install logrotated conf for mongrel cluster.
8
+
9
+ *mongrel_cluster_logrotate_path*: Mongrel cluster logrotate path. _Defaults to <tt>{shared_path}/log/mongrel_cluster_*.log</tt>_
10
+ DESC
11
+ task :install do
12
+ fetch_or_default(:mongrel_cluster_logrotate_path, "#{shared_path}/log/mongrel_cluster_*.log")
13
+
14
+ set :logrotate_name, "mongrel_cluster_#{application}"
15
+ set :logrotate_log_path, mongrel_cluster_logrotate_path
16
+ set :logrotate_options, [ { :rotate => 7 }, :daily, :missingok, :notifempty, :copytruncate ]
17
+
18
+ logrotated.install_conf
19
+ end
20
+ end
21
+
22
+ end
23
+
24
+ end
@@ -0,0 +1,23 @@
1
+ namespace :monit do
2
+
3
+ namespace :logrotate do
4
+
5
+ desc <<-DESC
6
+ Install logrotated conf for monit.
7
+
8
+ *monit_log_path*: Path to monit log. _Defaults to <tt>/var/log/monit.log</tt>_
9
+ DESC
10
+ task :install do
11
+
12
+ fetch_or_default(:monit_log_path, "/var/log/monit.log")
13
+
14
+ set :logrotate_name, "monit"
15
+ set :logrotate_log_path, monit_log_path
16
+ set :logrotate_options, [ { :rotate => 1, :size => "200k" }, :weekly, :missingok, :notifempty, :copytruncate ]
17
+
18
+ logrotated.install_conf
19
+ end
20
+
21
+ end
22
+
23
+ end
@@ -0,0 +1,37 @@
1
+ namespace :nginx do
2
+
3
+ # Logrotate recipes for nginx
4
+ namespace :logrotate do
5
+
6
+ desc <<-DESC
7
+ Install logrotated conf for nginx.
8
+
9
+ *nginx_logrotate_path*: Nginx logrotate path. _Defaults to <tt>/var/log/nginx_*.log</tt>_
10
+ DESC
11
+ task :install do
12
+ fetch_or_default(:nginx_logrotate_path, "/var/log/nginx_*.log")
13
+
14
+ set :logrotate_name, "nginx_main"
15
+ set :logrotate_log_path, nginx_logrotate_path
16
+ set :logrotate_options, [ { :rotate => 2, :size => "10M" }, :daily, :missingok, :notifempty, :copytruncate ]
17
+
18
+ logrotated.install_conf
19
+ end
20
+
21
+ desc <<-DESC
22
+ Install logrotated conf for vhost.
23
+
24
+ *nginx_vhost_logrotate_path*: Nginx logrotate path (for vhost). _Defaults to <tt>{shared_path}/log/nginx.*.log</tt>_
25
+ DESC
26
+ task :install_vhost do
27
+ fetch_or_default(:nginx_vhost_logrotate_path, "#{shared_path}/log/nginx.*.log")
28
+
29
+ set :logrotate_name, "nginx_#{application}"
30
+ set :logrotate_log_path, nginx_vhost_logrotate_path
31
+ set :logrotate_options, [ { :rotate => 2, :size => "10M" }, :daily, :missingok, :notifempty, :copytruncate ]
32
+
33
+ logrotated.install_conf
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,21 @@
1
+ namespace :rails do
2
+
3
+ # Log rotate tasks
4
+ namespace :logrotate do
5
+ desc <<-DESC
6
+ Install logrotated conf for rails.
7
+
8
+ *rails_logrotate_path*: Rails logrotate path. _Defaults to <tt>{shared_path}/log/production.log</tt>_
9
+ DESC
10
+ task :install do
11
+ fetch_or_default(:rails_logrotate_path, "#{shared_path}/log/production.log")
12
+
13
+ set :logrotate_name, "rails_#{application}"
14
+ set :logrotate_log_path, rails_logrotate_path
15
+ set :logrotate_options, [ { :rotate => 7, :size => "10M" }, :daily, :missingok, :notifempty, :copytruncate ]
16
+
17
+ logrotated.install_conf
18
+ end
19
+ end
20
+
21
+ end
@@ -0,0 +1,21 @@
1
+ namespace :sphinx do
2
+
3
+ # Log rotate tasks
4
+ namespace :logrotate do
5
+ desc <<-DESC
6
+ Install logrotated conf for sphinx.
7
+
8
+ *sphinx_logrotate_path*: Sphinx logrotate paths. _Defaults to <tt>{shared_path}/log/query.log {shared_path}/log/searchd.log</tt>_
9
+ DESC
10
+ task :install do
11
+ fetch_or_default(:sphinx_logrotate_path, "#{shared_path}/log/query.log #{shared_path}/log/searchd.log")
12
+
13
+ set :logrotate_name, "sphinx_#{application}"
14
+ set :logrotate_log_path, sphinx_logrotate_path
15
+ set :logrotate_options, [ { :rotate => 7 }, :daily, :missingok, :notifempty, :copytruncate ]
16
+
17
+ logrotated.install_conf
18
+ end
19
+ end
20
+
21
+ end
@@ -0,0 +1,64 @@
1
+
2
+ namespace :logrotated do
3
+
4
+ desc <<-DESC
5
+ Create logrotated conf. You probably use this in other recipes and not standalone.
6
+
7
+ *logrotate_name*: Name of file in /etc/logrotate.d/\n
8
+ *logrotate_log_path*: Path to log file. Can include wildcards, like /var/log/foo_*.log.\n
9
+
10
+ *logrotate_options*:
11
+ - :rotate (Number of times to rotate before discarding)
12
+ - :size (Rotate when file hits this size)
13
+ - :daily, :weekly, :monthly (How often to perform rotate)
14
+ - :missingok
15
+ - :compress
16
+ - :delaycompress
17
+ - :notifempty
18
+ - :copytruncate
19
+
20
+ See man page for all the options.
21
+
22
+ <pre>
23
+ set :logrotate_options, [ { :rotate => 7, :size => 10MB },
24
+ :daily, :missingok, :compress, :delaycompress, :notifempty, :copytruncate ]
25
+ </pre>
26
+
27
+ DESC
28
+ task :install_conf do
29
+
30
+ fetch(:logrotate_name)
31
+ fetch(:logrotate_log_path)
32
+ fetch(:logrotate_options)
33
+
34
+ text = []
35
+ logrotate_options.each do |option|
36
+ if option.is_a?(Hash)
37
+ option.each do |key, value|
38
+ text << "#{key.to_s} #{value.to_s}"
39
+ end
40
+ else
41
+ text << option.to_s
42
+ end
43
+ end
44
+ set :logrotate_options_text, " " + text.join("\n ")
45
+
46
+ utils.install_template("logrotated/conf.erb", "/etc/logrotate.d/#{logrotate_name}")
47
+
48
+ end
49
+
50
+ desc <<-DESC
51
+ Force rotate files.
52
+ DESC
53
+ task :force do
54
+
55
+ fetch_or_default(:logrotate_prefix, "")
56
+ fetch_or_default(:logrotate_conf_path, "/etc/logrotate.conf")
57
+
58
+ command = "logrotate"
59
+ command = "#{logrotate_prefix}/logrotate" unless logrotate_prefix.blank?
60
+
61
+ run_via "#{command} -f #{logrotate_conf_path}"
62
+ end
63
+
64
+ end
@@ -1,5 +1,27 @@
1
1
  namespace :memcached do
2
2
 
3
+ desc "Create memcached yaml in shared path."
4
+ task :setup do
5
+
6
+ # Settings
7
+ fetch(:memcached_namespace)
8
+ fetch_or_default(:memcached_ttl, 3600)
9
+ fetch_or_default(:memcached_readonly, false)
10
+ fetch_or_default(:memcached_urlencode, false)
11
+ fetch_or_default(:memcached_c_threshold, 10000)
12
+ fetch_or_default(:memcached_compression, true)
13
+ fetch_or_default(:memcached_debug, false)
14
+ fetch_or_default(:memcached_servers, [ "localhost:11211" ])
15
+ fetch_or_default(:memcached_yml_template, "memcached/memcached.yml.erb")
16
+
17
+ utils.install_template(memcached_yml_template, "#{shared_path}/config/memcached.yml")
18
+ end
19
+
20
+ desc "Symlink memcached configuration after deploy."
21
+ task :update_code, :roles => :app do
22
+ run "ln -nfs #{shared_path}/config/memcached.yml #{release_path}/config/memcached.yml"
23
+ end
24
+
3
25
  namespace :monit do
4
26
 
5
27
  desc <<-DESC
data/lib/recipes/rails.rb CHANGED
@@ -2,7 +2,8 @@
2
2
  namespace :rails do
3
3
 
4
4
  desc <<-DESC
5
- Create database yaml in shared path.
5
+ Create database yaml in shared path. Note: If both <tt>:db_host</tt> and <tt>:db_socket</tt> are used,
6
+ db_socket wins.
6
7
 
7
8
  *db_name*: Database name (rails).\n
8
9
  @set :db_name, "app_db_name"@\n
@@ -11,10 +12,11 @@ namespace :rails do
11
12
  *db_pass*: Database password (rails).\n
12
13
  @set :db_pass, "the_password"@\n
13
14
  *db_host*: Database host (can be nil, if you are using socket). _Defaults to nil_\n
14
- *db_socket*: Database socket (can be nil, if you are using host). _Defaults to nil_\n
15
+ *db_socket*: Database socket (can be nil, if you are using host). _Defaults to nil_\n
15
16
  @set :db_socket, "/var/lib/mysql/mysql.sock"@\n
17
+ *database_yml_template*: Path to database yml erb template. _Defaults to <tt>rails/database.yml.erb</tt>_ (in this GEM)\n
16
18
  DESC
17
- task :setup do
19
+ task :setup, :roles => :app do
18
20
 
19
21
  # Settings
20
22
  fetch(:db_name)
@@ -22,6 +24,7 @@ namespace :rails do
22
24
  fetch(:db_pass)
23
25
  fetch_or_default(:db_host, nil)
24
26
  fetch_or_default(:db_socket, nil)
27
+ fetch_or_default(:database_yml_template, "rails/database.yml.erb")
25
28
 
26
29
  unless db_host.blank?
27
30
  set :db_connect_type, "host"
@@ -34,7 +37,7 @@ namespace :rails do
34
37
  end
35
38
 
36
39
  run "mkdir -p #{shared_path}/config"
37
- put template.load("rails/database.yml.erb"), "#{shared_path}/config/database.yml"
40
+ put template.load(database_yml_template), "#{shared_path}/config/database.yml"
38
41
  end
39
42
 
40
43
  desc "Make symlink for database yaml"
@@ -42,43 +45,50 @@ namespace :rails do
42
45
  run "ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml"
43
46
  end
44
47
 
45
- desc <<-DESC
46
- Tail production log files. (http://errtheblog.com/posts/19-streaming-capistrano)
47
- DESC
48
- task :tail_logs, :roles => :web do
49
- run "tail -f #{shared_path}/log/production.log" do |channel, stream, data|
50
- puts # for an extra line break before the host name
51
- puts "#{channel[:host]}: #{data}"
52
- break if stream == :err
48
+ # Log tasks
49
+ namespace :logs do
50
+
51
+ desc <<-DESC
52
+ Tail production log files.\n
53
+ http://errtheblog.com/posts/19-streaming-capistrano
54
+ DESC
55
+ task :tail, :roles => :web do
56
+ run "tail -f #{shared_path}/log/production.log" do |channel, stream, data|
57
+ puts # for an extra line break before the host name
58
+ puts "#{channel[:host]}: #{data}"
59
+ break if stream == :err
60
+ end
53
61
  end
54
- end
55
62
 
56
63
 
57
- desc <<-DESC
58
- Check production log files in TextMate. (http://errtheblog.com/posts/19-streaming-capistrano)
59
- DESC
60
- task :mate_logs, :roles => :app do
64
+ desc <<-DESC
65
+ Check production log files in TextMate.\n
66
+ See http://errtheblog.com/posts/19-streaming-capistrano
67
+ DESC
68
+ task :mate, :roles => :app do
61
69
 
62
- require 'tempfile'
63
- tmp = Tempfile.open('w')
64
- logs = Hash.new { |h,k| h[k] = '' }
70
+ require 'tempfile'
71
+ tmp = Tempfile.open('w')
72
+ logs = Hash.new { |h,k| h[k] = '' }
65
73
 
66
- run "tail -n500 #{shared_path}/log/production.log" do |channel, stream, data|
67
- logs[channel[:host]] << data
68
- break if stream == :err
69
- end
74
+ run "tail -n500 #{shared_path}/log/production.log" do |channel, stream, data|
75
+ logs[channel[:host]] << data
76
+ break if stream == :err
77
+ end
70
78
 
71
- logs.each do |host, log|
72
- tmp.write("--- #{host} ---\n\n")
73
- tmp.write(log + "\n")
74
- end
79
+ logs.each do |host, log|
80
+ tmp.write("--- #{host} ---\n\n")
81
+ tmp.write(log + "\n")
82
+ end
75
83
 
76
- exec "mate -w #{tmp.path}"
77
- tmp.close
84
+ exec "mate -w #{tmp.path}"
85
+ tmp.close
86
+ end
78
87
  end
79
88
 
80
89
  desc <<-DESC
81
- Remotely console. (http://errtheblog.com/posts/19-streaming-capistrano)
90
+ Remotely console.\n
91
+ See http://errtheblog.com/posts/19-streaming-capistrano
82
92
  DESC
83
93
  task :console, :roles => :app do
84
94
  input = ''
data/lib/recipes/sshd.rb CHANGED
@@ -5,7 +5,7 @@ namespace :sshd do
5
5
  desc <<-DESC
6
6
  Install sshd monit hooks.
7
7
 
8
- *sshd_port*: SSH daemon port. _Defaults to 22\n
8
+ *sshd_port*: SSH daemon port. _Defaults to 22_\n
9
9
  *sshd_pid_path*: Path to mysql pid file. _Defaults to /var/run/sshd.pid_\n
10
10
  *monit_conf_dir*: Destination for monitrc. _Defaults to "/etc/monit"_\n
11
11
  DESC
@@ -22,4 +22,53 @@ namespace :sshd do
22
22
 
23
23
  end
24
24
 
25
+ desc <<-DESC
26
+ Create public and private keys for ssh.
27
+
28
+ *ssh_keygen_type*: SSH keygen type. _Defaults to rsa_\n
29
+ *ssh_keygen_bits*: SSH keygen bits. _Defaults to 2048_\n
30
+ DESC
31
+ task :keygen do
32
+ # Settings
33
+ fetch_or_default(:ssh_keygen_type, "rsa")
34
+ fetch_or_default(:ssh_keygen_bits, 2048)
35
+
36
+ run "ssh-keygen -t #{ssh_keygen_type} -b #{ssh_keygen_bits}" do |channel, stream, data|
37
+ logger.trace data
38
+
39
+ if data =~ /^Overwrite (y\/n)?/
40
+ channel.send_data "n\n"
41
+ logger.important "This key already exists! Aborting."
42
+
43
+ # Use default for file and empty password
44
+ elsif data =~ /^Enter file/ or
45
+ data =~ /^Enter passphrase/ or
46
+ data =~ /^Enter same passphrase again/
47
+
48
+ channel.send_data "\n"
49
+
50
+ end
51
+ end
52
+
53
+ end
54
+
55
+ desc <<-DESC
56
+ Add to authorized keys. Uses <tt>.ssh/authorized_keys</tt>.
57
+
58
+ *ssh_public_key*: The public key from ssh:keygen.
59
+ DESC
60
+ task :authorize_key do
61
+
62
+ fetch(:ssh_public_key)
63
+
64
+ ssh_dir = "~/.ssh"
65
+ authorized_keys_path = "#{ssh_dir}/authorized_keys"
66
+
67
+ run_all <<-CMDS
68
+ if [ ! -d #{ssh_dir} ]; then mkdir #{ssh_dir} ; chmod 700 #{ssh_dir} ; fi
69
+ if [ ! -f #{authorized_keys_path} ]; then touch #{authorized_keys_path} ; chmod 600 #{authorized_keys_path} ; fi
70
+ echo "#{ssh_public_key}" >> #{authorized_keys_path}
71
+ CMDS
72
+ end
73
+
25
74
  end
@@ -0,0 +1,57 @@
1
+ namespace :syslogd do
2
+
3
+ desc <<-DESC
4
+ Add entry to syslog for application.
5
+
6
+ *syslog_program_name*: syslog program name. What you used for <tt>SyslogLogger.new("program_name_here")</tt>\n
7
+ *syslog_log_path*: Path to log.\n
8
+ *syslog_conf_path*: Path to syslog conf. _Defaults to <tt>/etc/syslog.conf</tt>_\n
9
+ DESC
10
+ task :setup_conf do
11
+
12
+ fetch(:syslog_program_name)
13
+ fetch(:syslog_log_path)
14
+ fetch_or_default(:syslog_conf_path, "/etc/syslog.conf")
15
+
16
+ utils.append_to(syslog_conf_path, <<-DATA, "^!#{syslog_program_name}")
17
+
18
+ # Entry for #{syslog_program_name}
19
+ !#{syslog_program_name}
20
+ *.* #{syslog_log_path}
21
+ DATA
22
+ end
23
+
24
+ desc <<-DESC
25
+ Add entry to newsyslog for application. See newsyslog man page for details.
26
+
27
+ Adds entry like:
28
+
29
+ <pre>
30
+ /var/log/my_app.log 640 7 * @T00 Z
31
+ </pre>
32
+
33
+ *syslog_log_path*: Path to log. _Defaults to <tt>/var/log/[syslog_program_name].log</tt>_\n
34
+ *newsyslog_conf_path*: Path to newsyslog conf.\n
35
+ *newsyslog_mode*: File mode (to create log with). _Defaults to _\n
36
+ *newsyslog_count*: Number of files to keep. _Defaults to 7_\n
37
+ *newsyslog_size*: Max size. _Defaults to *_\n
38
+ *newsyslog_when*: When to rotate. _Defaults to @T00_\n
39
+ *newsyslog_zb*: Whether to gzip or tarball. _Defaults to Z_\n
40
+ DESC
41
+ task :setup_newsyslog_conf do
42
+
43
+ fetch(:syslog_log_path)
44
+ fetch_or_default(:newsyslog_conf_path, "/etc/newsyslog.conf")
45
+
46
+ fetch_or_default(:newsyslog_mode, "640")
47
+ fetch_or_default(:newsyslog_count, "7")
48
+ fetch_or_default(:newsyslog_size, "*")
49
+ fetch_or_default(:newsyslog_when, "@T00")
50
+ fetch_or_default(:newsyslog_zb, "Z")
51
+
52
+ entry = "#{syslog_log_path} \t#{newsyslog_mode} \t#{newsyslog_count} \t#{newsyslog_size} \t#{newsyslog_when} \t#{newsyslog_zb}"
53
+
54
+ utils.append_to(newsyslog_conf_path, entry, "^#{syslog_log_path}")
55
+ end
56
+
57
+ end
@@ -0,0 +1,58 @@
1
+ #! /bin/sh
2
+ # backgroundrb_<%= application %>: Backgroundrb daemon for <%= application %>
3
+ #
4
+ # chkconfig: - 86 14
5
+ # description: backgroundrb daemon
6
+ # processname: backgroundrb
7
+ #
8
+ # Author: Gabriel Handford http://ducktyper.com
9
+
10
+ # Source function library
11
+ . /etc/rc.d/init.d/functions
12
+
13
+ RETVAL=0
14
+
15
+ DESC="backgroundrb daemon (<%= application %>)"
16
+ DAEMON="<%= backgroundrb_bin_path %>"
17
+ PIDFILE="<%= backgroundrb_pid_path %>"
18
+
19
+ # For stop/reload support using patched backgroundrb that takes
20
+ # pidfile as argument into backgroundrb.yml config.
21
+
22
+ start() {
23
+ daemon --user <%= user %> --pidfile $PIDFILE $DAEMON
24
+ RETVAL=$?
25
+ echo
26
+ return $RETVAL;
27
+ }
28
+
29
+ stop() {
30
+ kill -QUIT `cat $PIDFILE` || echo -n " not running"
31
+ }
32
+
33
+ case "$1" in
34
+ start)
35
+ echo -n "Starting $DESC: $NAME"
36
+ start
37
+ RETVAL=$?;
38
+ ;;
39
+ stop)
40
+ echo -n "Stopping $DESC: $NAME"
41
+ stop
42
+ RETVAL=$?;
43
+ ;;
44
+ restart)
45
+ echo -n "Restarting $DESC: $NAME"
46
+ stop
47
+ # Sleep after stop
48
+ sleep 1
49
+ start
50
+ RETVAL=$?;
51
+ ;;
52
+ *)
53
+ echo "Usage: $0 {start|stop|restart}" >&2
54
+ RETVAL=3;
55
+ ;;
56
+ esac
57
+
58
+ exit $RETVAL;
@@ -0,0 +1,10 @@
1
+ ---
2
+ :backgroundrb:
3
+ :port: <%= backgroundrb_port %>
4
+ :ip: <%= backgroundrb_host %>
5
+ :pid_file: "<%= backgroundrb_pid_path %>"
6
+
7
+
8
+ :development:
9
+ :backgroundrb:
10
+ :log: foreground
@@ -0,0 +1,3 @@
1
+ <%= logrotate_log_path %> {
2
+ <%= logrotate_options_text %>
3
+ }
@@ -0,0 +1,14 @@
1
+ defaults:
2
+ ttl: <%= memcached_ttl %>
3
+ readonly: <%= memcached_readonly.to_s %>
4
+ urlencode: <%= memcached_urlencode.to_s %>
5
+ c_threshold: <%= memcached_c_threshold %>
6
+ compression: <%= memcached_compression.to_s %>
7
+ debug: <%= memcached_debug.to_s %>
8
+ namespace: <%= memcached_namespace %>
9
+
10
+ development:
11
+ servers: localhost:11211
12
+
13
+ production:
14
+ servers: <%= memcached_servers.inspect %>
@@ -16,7 +16,7 @@ DESC="monit"
16
16
  NAME=monit
17
17
  DAEMON=/usr/local/bin/monit
18
18
  CONFFILE=/etc/monitrc
19
- LOGFILE=/var/log/monit.log
19
+ LOGFILE=<%= monit_log_path %>
20
20
  PIDFILE=<%= monit_pid_path %>
21
21
 
22
22
  start() {
@@ -1,5 +1,5 @@
1
1
  #! /bin/sh
2
- # sphinx: Sphinx search daemon for <%= application %>
2
+ # sphinx_<%= application %>: Sphinx search daemon for <%= application %>
3
3
  #
4
4
  # chkconfig: - 86 14
5
5
  # description: sphinx search daemon
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.8</a>
41
+ <a href="http://rubyforge.org/projects/capitate" class="numbers">0.2.11</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.8
4
+ version: 0.2.11
5
5
  platform: ""
6
6
  authors:
7
7
  - Gabriel Handford
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-03-13 00:00:00 -04:00
12
+ date: 2008-03-25 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -63,7 +63,8 @@ files:
63
63
  - lib/capitate/task_node.rb
64
64
  - lib/capitate/version.rb
65
65
  - lib/deployment/centos-5.1-64-web/install.rb
66
- - lib/deployment/deploy.rb
66
+ - lib/recipes/backgroundrb.rb
67
+ - lib/recipes/centos/backgroundrb.rb
67
68
  - lib/recipes/centos/centos.rb
68
69
  - lib/recipes/centos/imagemagick.rb
69
70
  - lib/recipes/centos/memcached.rb
@@ -74,6 +75,12 @@ files:
74
75
  - lib/recipes/centos/ruby.rb
75
76
  - lib/recipes/centos/sphinx.rb
76
77
  - lib/recipes/docs.rb
78
+ - lib/recipes/logrotate/mongrel_cluster.rb
79
+ - lib/recipes/logrotate/monit.rb
80
+ - lib/recipes/logrotate/nginx.rb
81
+ - lib/recipes/logrotate/rails.rb
82
+ - lib/recipes/logrotate/sphinx.rb
83
+ - lib/recipes/logrotated.rb
77
84
  - lib/recipes/memcached.rb
78
85
  - lib/recipes/mongrel_cluster.rb
79
86
  - lib/recipes/monit.rb
@@ -82,17 +89,20 @@ files:
82
89
  - lib/recipes/rails.rb
83
90
  - lib/recipes/sphinx.rb
84
91
  - lib/recipes/sshd.rb
92
+ - lib/recipes/syslogd.rb
93
+ - lib/templates/backgroundrb/backgroundrb.initd.centos.erb
94
+ - lib/templates/backgroundrb/backgroundrb.yml.erb
85
95
  - lib/templates/capistrano/Capfile
96
+ - lib/templates/logrotated/conf.erb
86
97
  - lib/templates/memcached/memcached.initd.centos.erb
87
98
  - lib/templates/memcached/memcached.monitrc.erb
99
+ - lib/templates/memcached/memcached.yml.erb
88
100
  - lib/templates/mongrel/mongrel_cluster.initd.erb
89
101
  - lib/templates/mongrel/mongrel_cluster.monitrc.erb
90
102
  - lib/templates/mongrel/mongrel_cluster.yml.erb
91
- - lib/templates/monit/cert.sh
92
103
  - lib/templates/monit/monit.cnf
93
104
  - lib/templates/monit/monit.initd.centos.erb
94
105
  - lib/templates/monit/monitrc.erb
95
- - lib/templates/monit/patch_inittab.sh
96
106
  - lib/templates/mysql/install_db.sql.erb
97
107
  - lib/templates/mysql/mysql.monitrc.erb
98
108
  - lib/templates/nginx/nginx.conf.erb
@@ -1,37 +0,0 @@
1
- # Example deploy.rb
2
-
3
- set :application, "sick"
4
- set :user, "sick"
5
- set :groups, "admin"
6
-
7
- set :deploy_to, "/var/www/apps/sick"
8
- set :web_host, "192.168.1.111"
9
- set :db_host, "192.168.1.111"
10
- set :db_user, "sick"
11
- set :db_pass, prompt.password("DB Password: ")
12
- set :db_name, "sick"
13
- set :repository, "http://svn.ducktyper.com/scratch/testapp/trunk"
14
- set :mongrel_port, 12000
15
- set :mongrel_size, 3
16
- set :domain_name, "localhost"
17
- set :mysql_admin_password, prompt.password('Mysql admin password: ')
18
-
19
- set :deploy_via, :copy
20
- set :copy_strategy, :export
21
-
22
- role :web, "192.168.1.111"
23
- role :db, "192.168.1.111", :primary => true
24
-
25
-
26
- # Callbacks
27
- before "deploy:setup", "centos:add_user"
28
-
29
- after "deploy:setup", "mysql:setup", "rails:setup", "mongrel:cluster:centos:setup",
30
- "nginx:mongrel:setup", "sphinx:centos:setup", "sphinx:setup_monit", "mongrel:cluster:monit:setup"
31
-
32
- after "nginx:mongrel:setup", "nginx:centos:restart"
33
-
34
- after "deploy:update_code", "rails:update_code", "sphinx:update_conf"
35
-
36
- # Auto cleanup after deploy
37
- after "deploy", "deploy:cleanup"
@@ -1,14 +0,0 @@
1
- #! /bin/sh
2
-
3
- set -e
4
- trap ERROR ERR
5
-
6
- mkdir -p /var/certs
7
- mv /tmp/monit.cnf /var/certs/monit.cnf
8
-
9
- echo "Generating PEM..."
10
- openssl req -new -x509 -days 365 -nodes -config /var/certs/monit.cnf -out /var/certs/monit.pem -keyout /var/certs/monit.pem -batch > /var/certs/debug_req.log 2>&1
11
- openssl gendh 512 >> /var/certs/monit.pem 2> /var/certs/debug_gendh.log
12
- echo "Generating x509..."
13
- openssl x509 -subject -dates -fingerprint -noout -in /var/certs/monit.pem > /var/certs/debug_x509.log
14
- chmod 700 /var/certs/monit.pem
@@ -1,15 +0,0 @@
1
- #! /bin/sh
2
-
3
- set -e
4
- trap ERROR ERR
5
-
6
- NO_MONIT=0
7
- grep -q monit /etc/inittab > /dev/null || export NO_MONIT=1
8
-
9
- if [ $NO_MONIT == 1 ]; then
10
- echo "Patching inittab with monit..."
11
- echo "" >> /etc/inittab
12
- echo "# Run monit in standard run-levels" >> /etc/inittab
13
- echo "mo:345:respawn:/usr/local/bin/monit -Ic /etc/monitrc -l /var/log/monit.log -p /var/run/monit.pid" >> /etc/inittab
14
- telinit q
15
- fi