capitate 0.1.9 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. data/Capfile +3 -2
  2. data/History.txt +6 -0
  3. data/Manifest.txt +28 -11
  4. data/bin/capitate +13 -61
  5. data/config/hoe.rb +2 -2
  6. data/docs/nginx.README +12 -0
  7. data/docs/recipes/centos.txt +33 -0
  8. data/docs/recipes/deploy-pending.txt +25 -0
  9. data/docs/recipes/deploy-web.txt +33 -0
  10. data/docs/recipes/deploy.txt +159 -0
  11. data/docs/recipes/docs.txt +26 -0
  12. data/docs/recipes/imagemagick-centos.txt +20 -0
  13. data/docs/recipes/imagemagick.txt +8 -0
  14. data/docs/recipes/index.txt +26 -0
  15. data/docs/recipes/memcached-centos.txt +32 -0
  16. data/docs/recipes/memcached.txt +35 -0
  17. data/docs/recipes/mongrel_cluster-centos.txt +27 -0
  18. data/docs/recipes/mongrel_cluster.txt +40 -0
  19. data/docs/recipes/monit-centos.txt +32 -0
  20. data/docs/recipes/monit.txt +8 -0
  21. data/docs/recipes/mysql-centos.txt +22 -0
  22. data/docs/recipes/mysql.txt +58 -0
  23. data/docs/recipes/nginx-centos.txt +43 -0
  24. data/docs/recipes/nginx.txt +51 -0
  25. data/docs/recipes/rails.txt +58 -0
  26. data/docs/recipes/ruby-centos.txt +22 -0
  27. data/docs/recipes/ruby.txt +8 -0
  28. data/docs/recipes/sphinx-centos.txt +35 -0
  29. data/docs/recipes/sphinx.txt +89 -0
  30. data/lib/capitate/cap_ext/run_via.rb +14 -0
  31. data/lib/capitate/plugins/gem.rb +2 -3
  32. data/lib/capitate/plugins/prompt.rb +24 -0
  33. data/lib/capitate/plugins/script.rb +29 -15
  34. data/lib/capitate/plugins/templates.rb +45 -40
  35. data/lib/capitate/plugins/yum.rb +12 -22
  36. data/lib/capitate/task_node.rb +28 -9
  37. data/lib/capitate/version.rb +2 -2
  38. data/lib/capitate.rb +4 -5
  39. data/lib/deployment/deploy.rb +42 -0
  40. data/lib/deployment/install-centos-rubyweb.rb +131 -0
  41. data/lib/recipes/centos/centos.rb +30 -21
  42. data/lib/recipes/centos/imagemagick.rb +9 -8
  43. data/lib/recipes/centos/memcached.rb +11 -21
  44. data/lib/recipes/centos/mongrel_cluster.rb +7 -11
  45. data/lib/recipes/centos/monit.rb +13 -18
  46. data/lib/recipes/centos/mysql.rb +6 -9
  47. data/lib/recipes/centos/nginx.rb +17 -30
  48. data/lib/recipes/centos/ruby.rb +14 -19
  49. data/lib/recipes/centos/sphinx.rb +14 -28
  50. data/lib/recipes/docs.rb +22 -6
  51. data/lib/recipes/memcached.rb +14 -8
  52. data/lib/recipes/mongrel_cluster.rb +11 -14
  53. data/lib/recipes/mysql.rb +22 -40
  54. data/lib/recipes/nginx.rb +9 -4
  55. data/lib/recipes/rails.rb +53 -6
  56. data/lib/recipes/sphinx.rb +86 -17
  57. data/lib/templates/capistrano/Capfile +2 -6
  58. data/lib/templates/monit/cert.sh +1 -1
  59. data/lib/templates/mysql/install_db.sql.erb +2 -2
  60. data/lib/templates/sphinx/sphinx.conf.erb +28 -399
  61. data/lib/templates/sphinx/sphinx_app.initd.centos.erb +1 -1
  62. data/website/index.html +20 -34
  63. data/website/index.txt +12 -22
  64. data/website/stylesheets/screen.css +22 -11
  65. data/website/template.rhtml +7 -5
  66. data/website/template_recipe.rhtml +7 -3
  67. metadata +55 -15
  68. data/lib/capitate/plugins/package.rb +0 -30
  69. data/lib/capitate/plugins/profiles.rb +0 -33
  70. data/lib/capitate/plugins/wget.rb +0 -23
  71. data/lib/profiles/centos-sick.rb +0 -116
  72. data/lib/recipes/README +0 -5
  73. data/lib/recipes/centos/README +0 -3
  74. data/lib/recipes/gems.rb +0 -20
  75. data/lib/recipes/packages.rb +0 -39
  76. data/lib/recipes/recipes.rb +0 -30
  77. data/lib/templates/centos/setup_for_web.sh +0 -17
  78. data/lib/templates/centos/sudoers +0 -95
@@ -1,22 +1,16 @@
1
1
  module Capitate::Plugins::Templates
2
2
 
3
- # Get the absolute base templates path.
4
- def gem_templates_root
5
- File.expand_path(File.dirname(__FILE__) + "/../../templates")
6
- end
7
-
8
- # Get full template path from relative path.
3
+ # Load template. If extension is erb will be evaluated with binding.
9
4
  #
10
- # Something like <tt>monit/monit.cnf => /usr/lib/..../capitate/lib/templates/monit/monit.cnf</tt>.
5
+ # You can add to the list of places we search for templates by setting:
11
6
  #
12
- # ==== Options
13
- # +template_path+:: Relative path
7
+ # set :templates_dirs, [ "path/to/templates1", "/path/to/templates2" ]
14
8
  #
15
- def gem_template_path(template_path)
16
- File.join(gem_templates_root, template_path)
17
- end
18
-
19
- # Load template. If extension is erb will be evaluated with binding.
9
+ # It looks for the template from:
10
+ # * the <tt>:templates_dirs</tt> setting (if set)
11
+ # * the current directory
12
+ # * the <tt>:project_root</tt> setting (if set)
13
+ # * the gem templates path
20
14
  #
21
15
  # ==== Options
22
16
  # +path+:: If starts with '/', absolute path, otherwise relative path to templates dir
@@ -27,21 +21,16 @@ module Capitate::Plugins::Templates
27
21
  # put template.load("memcached/memcached.monitrc.erb"), "/tmp/memcached.monitrc"
28
22
  #
29
23
  def load(path, override_binding = nil)
30
- template_paths = [ path, gem_template_path(path) ]
31
24
 
32
- template_paths = template_paths.select { |file| File.exist?(file) }
25
+ template_dirs_found = template_dirs.select { |dir| File.exist?("#{dir}/#{path}") }
33
26
 
34
- if template_paths.empty?
35
- raise <<-EOS
36
-
37
-
38
- Template not found: #{path}
39
-
40
- EOS
27
+ # Not found anywhere, throw error
28
+ if template_dirs_found.empty?
29
+ raise "\n\nTemplate not found: #{path}\n\n"
41
30
  end
42
31
 
43
32
  # Use first
44
- template_path = template_paths.first
33
+ template_path = template_dirs_found.first + "/#{path}"
45
34
 
46
35
  template_data = IO.read(template_path)
47
36
 
@@ -51,21 +40,6 @@ module Capitate::Plugins::Templates
51
40
  end
52
41
  template_data
53
42
  end
54
-
55
- # Load template from project.
56
- # If extension is erb will be evaluated with binding.
57
- #
58
- # ==== Options
59
- # +path+:: If starts with '/', absolute path, otherwise relative path to templates dir
60
- # +override_binding+:: Binding to override, otherwise uses current (task) binding
61
- #
62
- # ==== Examples
63
- # template.project("config/templates/sphinx.conf.erb")
64
- # put template.project("config/templates/sphinx.conf.erb"), "#{shared_path}/config/sphinx.conf"
65
- #
66
- def project(path, override_binding = nil)
67
- load(project_root + "/" + path, override_binding || binding)
68
- end
69
43
 
70
44
  # Write template at (relative path) with binding to LOCAL destination path.
71
45
  #
@@ -77,7 +51,7 @@ module Capitate::Plugins::Templates
77
51
  # +verbose+:: Verbose output
78
52
  #
79
53
  # ==== Examples
80
- # template.write("config/templates/sphinx.conf.erb", binding, "config/sphinx.conf")
54
+ # template.write("config/templates/sphinx.conf.erb", "config/sphinx.conf")
81
55
  #
82
56
  def write(template_path, dest_path, override_binding = nil, overwrite = false, verbose = true)
83
57
  # This is gnarly!
@@ -93,6 +67,37 @@ module Capitate::Plugins::Templates
93
67
  File.open(dest_path, "w") { |file| file.puts(load(template_path, override_binding)) }
94
68
  end
95
69
 
70
+
71
+ protected
72
+
73
+ # Load all possible places for templates
74
+ def template_dirs
75
+ @template_dir ||= begin
76
+ template_dirs = []
77
+ template_dirs += fetch(:templates_dirs) if exists?(:templates_dirs)
78
+ template_dirs << [ "." ]
79
+ template_dirs << project_root if exists?(:project_root)
80
+ template_dirs << gem_templates_root
81
+ template_dirs
82
+ end
83
+ end
84
+
85
+ # Get the absolute base templates path.
86
+ def gem_templates_root
87
+ File.expand_path(File.dirname(__FILE__) + "/../../templates")
88
+ end
89
+
90
+ # Get full template path from relative path.
91
+ #
92
+ # Something like <tt>monit/monit.cnf => /usr/lib/..../capitate/lib/templates/monit/monit.cnf</tt>.
93
+ #
94
+ # ==== Options
95
+ # +template_path+:: Relative path
96
+ #
97
+ def gem_template_path(template_path)
98
+ File.join(gem_templates_root, template_path)
99
+ end
100
+
96
101
  end
97
102
 
98
103
  Capistrano.plugin :template, Capitate::Plugins::Templates
@@ -10,12 +10,8 @@ module Capitate::Plugins::Yum
10
10
  # yum.update
11
11
  # yum.update([ "aspell" ])
12
12
  #
13
- # Also can use package plugin with package.type = :yum, and then:
14
- # package.update
15
- # package.update([ "aspell" ])
16
- #
17
13
  def update(packages = [])
18
- sudo "yum -y update #{packages.join(" ")}"
14
+ run_via "yum -y update #{packages.join(" ")}"
19
15
  end
20
16
 
21
17
  # Remove via yum.
@@ -27,12 +23,8 @@ module Capitate::Plugins::Yum
27
23
  # yum.remove
28
24
  # yum.remove([ "aspell" ])
29
25
  #
30
- # Also can use package plugin with package.type = :yum, and then:
31
- # package.remove
32
- # package.remove([ "aspell" ])
33
- #
34
26
  def remove(packages)
35
- sudo "yum -y remove #{packages.join(" ")}"
27
+ run_via "yum -y remove #{packages.join(" ")}"
36
28
  end
37
29
 
38
30
  # Install via yum.
@@ -44,10 +36,6 @@ module Capitate::Plugins::Yum
44
36
  # ==== Examples
45
37
  # yum.install
46
38
  # yum.install([ "aspell" ])
47
- #
48
- # Also can use package plugin with package.type = :yum, and then:
49
- # package.install
50
- # package.install([ "aspell" ])
51
39
  #
52
40
  def install(packages, update_existing = true)
53
41
 
@@ -58,16 +46,21 @@ module Capitate::Plugins::Yum
58
46
 
59
47
  installed_packages = []
60
48
 
61
- sudo "yum -d 0 list installed #{packages.join(" ")}" do |channel, stream, data|
62
- installed_packages += data.split("\n")[1..-1].collect { |line| line.split(".").first }
49
+ run_via "yum -d 0 list installed #{packages.join(" ")}" do |channel, stream, data|
50
+ lines = data.split("\n")[1..-1]
51
+ if lines.blank?
52
+ logger.info "Invalid yum output: #{data}"
53
+ else
54
+ installed_packages += lines.collect { |line| line.split(".").first }
55
+ end
63
56
  end
64
57
 
65
58
  packages -= installed_packages
66
59
 
67
- sudo "yum -y update #{installed_packages.join(" ")}" unless installed_packages.blank?
60
+ run_via "yum -y update #{installed_packages.join(" ")}" unless installed_packages.blank?
68
61
  end
69
62
 
70
- sudo "yum -y install #{packages.join(" ")}" unless packages.blank?
63
+ run_via "yum -y install #{packages.join(" ")}" unless packages.blank?
71
64
  end
72
65
 
73
66
  # Clean yum.
@@ -75,11 +68,8 @@ module Capitate::Plugins::Yum
75
68
  # ==== Examples
76
69
  # yum.clean
77
70
  #
78
- # Also can use package plugin with package.type = :yum, and then:
79
- # package.clean
80
- #
81
71
  def clean
82
- sudo "yum -y clean all"
72
+ run_via "yum -y clean all"
83
73
  end
84
74
 
85
75
  end
@@ -56,6 +56,12 @@ class Capitate::TaskNode
56
56
  nodes.sort_by(&:name)
57
57
  end
58
58
 
59
+ # Get tasks (sorted).
60
+ #
61
+ def sorted_tasks
62
+ tasks.sort_by(&:fully_qualified_name) # { |t| t.name.to_s }
63
+ end
64
+
59
65
  # Iterate over ALL "child" nodes, depth first.
60
66
  # Yields |node, level|.
61
67
  #
@@ -87,7 +93,9 @@ class Capitate::TaskNode
87
93
  name == "top" ? nil : name
88
94
  end
89
95
 
90
- # Write doc for node (recursively)
96
+ # Write textile documentation for node (recursively).
97
+ #
98
+ # Uses task desc attribute for task details.
91
99
  #
92
100
  # ==== Options
93
101
  # +dir+:: Dir to write to
@@ -126,22 +134,33 @@ class Capitate::TaskNode
126
134
  #
127
135
  # Namespace
128
136
  #
129
- unless sorted_nodes.empty?
130
- file.puts "h2. Namespaces\n\n"
137
+ unless nodes.empty?
138
+ file.puts "\n\nh2. Namespaces\n\n"
131
139
  each_node do |snode, level|
132
- li_level = (0..level).collect { "*" }.join
133
- file.puts %{#{li_level} "#{snode.full_name(":")}":#{snode.full_name}.html \n}
140
+ #li_level = (0..level).collect { "*" }.join
141
+ if snode.tasks.length > 0
142
+ file.puts %{* "#{snode.full_name(":")}":#{snode.full_name}.html (#{snode.tasks.length}) \n}
143
+ end
134
144
  end
135
145
  end
136
146
 
137
147
  #
138
148
  # Tasks
149
+ #
150
+ unless tasks.empty?
151
+ file.puts "\n\nh2. Tasks\n\n"
152
+ sorted_tasks.each do |task|
153
+ file.puts %{* "#{task.fully_qualified_name}":##{task.fully_qualified_name} \n}
154
+ end
155
+ end
156
+
157
+ #
158
+ # Task details
139
159
  #
140
160
  unless tasks.empty?
141
- file.puts "\n\n"
142
- file.puts "h2. Tasks\n\n"
143
- tasks.each do |task|
144
- file.puts "h3. #{task.fully_qualified_name}\n\n"
161
+ file.puts "\n\nh2. Task documentation\n\n"
162
+ sorted_tasks.each do |task|
163
+ file.puts "h3(##{task.fully_qualified_name}). #{task.fully_qualified_name}\n\n"
145
164
  file.puts "#{unindent(task.desc)}\n\n\n\n"
146
165
  end
147
166
  end
@@ -1,8 +1,8 @@
1
1
  module Capitate #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
- MINOR = 1
5
- TINY = 9
4
+ MINOR = 2
5
+ TINY = 1
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
data/lib/capitate.rb CHANGED
@@ -15,21 +15,20 @@ end
15
15
 
16
16
  require 'capitate/plugins/base'
17
17
  require 'capitate/plugins/gem'
18
- require 'capitate/plugins/package'
19
- require 'capitate/plugins/profiles'
20
18
  require 'capitate/plugins/script'
19
+ require 'capitate/plugins/prompt'
21
20
  require 'capitate/plugins/templates'
22
- require 'capitate/plugins/wget'
23
- require 'capitate/plugins/yum'
24
-
25
21
  require 'capitate/plugins/upload'
22
+ require 'capitate/plugins/yum'
26
23
 
27
24
  require "capitate/cap_ext/connections"
28
25
  require "capitate/cap_ext/extension_proxy"
29
26
  require "capitate/cap_ext/variables"
27
+ require "capitate/cap_ext/run_via"
30
28
 
31
29
  class Capistrano::Configuration
32
30
  include Capitate::CapExt::Variables
31
+ include Capitate::CapExt::RunVia
33
32
  end
34
33
 
35
34
  require 'capitate/task_node'
@@ -0,0 +1,42 @@
1
+ #
2
+ # Settings for project
3
+ #
4
+
5
+ set :application, "sick"
6
+ set :user, "sick"
7
+ set :groups, "admin"
8
+
9
+ set :deploy_to, "/var/www/apps/sick"
10
+ set :web_host, "192.168.1.111"
11
+ set :db_host, "192.168.1.111"
12
+ set :db_user, "sick"
13
+ set :db_pass, prompt.password("DB Password: ")
14
+ set :db_name, "sick"
15
+ set :repository, "http://svn.ducktyper.com/scratch/testapp/trunk"
16
+ set :mongrel_port, 12000
17
+ set :mongrel_size, 3
18
+ set :domain_name, "localhost"
19
+ set :mysql_admin_password, prompt.password('Mysql admin password: ')
20
+
21
+ set :deploy_via, :copy
22
+ set :copy_strategy, :export
23
+
24
+ role :web, "192.168.1.111"
25
+ role :db, "192.168.1.111", :primary => true
26
+
27
+
28
+ # Callbacks
29
+ before "deploy:setup", "centos:add_user"
30
+
31
+ after "deploy:setup", "mysql:setup", "rails:setup", "mongrel_cluster:centos:setup",
32
+ "nginx:setup_mongrel", "sphinx:centos:setup"
33
+
34
+ after "sphinx:centos:setup", "sphinx:setup_monit"
35
+ after "mongrel_cluster:centos:setup", "mongrel_cluster:setup_monit"
36
+
37
+ after "nginx:setup_mongrels", "nginx:centos:restart"
38
+
39
+ after "deploy:update_code", "rails:update_code", "sphinx:update_code"
40
+
41
+ # Auto cleanup after deploy
42
+ after "deploy", "deploy:cleanup"
@@ -0,0 +1,131 @@
1
+ #
2
+ # This is an EXAMPLE deployment script based on some recipes in Capitate.
3
+ #
4
+
5
+ #
6
+ # For installing apps on the thoughpolice centos 5.1 image
7
+ #
8
+ task :install do
9
+
10
+ # Set templates dir to this here gem
11
+ set :templates_dirs, [ File.dirname(__FILE__) + "/../templates" ]
12
+
13
+ set :user, "root"
14
+ set :run_method, :run
15
+
16
+ # Can use cap HOSTS=192.168.1.111 install
17
+ # Otherwise prompt for the service
18
+ role :install, prompt.ask("Server: ") if find_servers_for_task(current_task).blank?
19
+
20
+ # Setup for web
21
+ # * Add admin group
22
+ # * Change inittab to runlevel 3
23
+ # * Create web apps directory
24
+ # * Add admin group to suders ALL=(ALL) ALL
25
+ script.run_all <<-CMDS
26
+ egrep "^admin" /etc/group || /usr/sbin/groupadd admin
27
+ sed -i -e 's/^id:5:initdefault:/id:3:initdefault:/g' /etc/inittab
28
+ mkdir -p /var/www/apps
29
+ egrep "^%admin" /etc/sudoers || echo "%admin ALL=(ALL) ALL" > /etc/sudoers
30
+ CMDS
31
+
32
+ # Package installs
33
+ yum.remove [ "openoffice.org-*", "ImageMagick" ]
34
+ yum.update
35
+ yum.install [ "gcc", "kernel-devel", "libevent-devel", "libxml2-devel", "openssl", "openssl-devel",
36
+ "aspell", "aspell-devel", "aspell-en", "aspell-es" ]
37
+
38
+ #
39
+ # App installs
40
+ #
41
+
42
+ ruby.centos.install
43
+ # Fix ruby install openssl
44
+ script.sh("ruby/fix_openssl.sh")
45
+
46
+ nginx.centos.install
47
+ mysql.centos.install
48
+ sphinx.centos.install
49
+ monit.centos.install
50
+ imagemagick.centos.install
51
+ memcached.centos.install
52
+
53
+ #
54
+ # Install monit hooks
55
+ #
56
+ nginx.install_monit
57
+ mysql.install_monit
58
+
59
+ # Gem installs
60
+ gems.install([ "rake", "mysql -- --with-mysql-include=/usr/include/mysql --with-mysql-lib=/usr/lib/mysql --with-mysql-config",
61
+ "raspell", "rmagick", "mongrel", "mongrel_cluster","json" ])
62
+
63
+ # Cleanup
64
+ yum.clean
65
+ end
66
+
67
+
68
+ # For mysql:install
69
+ set :mysql_pid_path, "/var/run/mysqld/mysqld.pid"
70
+ set :db_port, 3306
71
+
72
+ # For sphinx:install
73
+ set :sphinx_prefix, "/usr/local/sphinx"
74
+
75
+
76
+ #
77
+ # Install options
78
+ #
79
+
80
+ # Ruby install
81
+ set :ruby_build_options, {
82
+ :url => "http://capigen.s3.amazonaws.com/ruby-1.8.6-p110.tar.gz",
83
+ :build_dest => "/usr/src",
84
+ :configure_options => "--prefix=/usr",
85
+ :clean => false
86
+ }
87
+
88
+ set :rubygems_build_options, {
89
+ :url => "http://rubyforge.org/frs/download.php/29548/rubygems-1.0.1.tgz"
90
+ }
91
+
92
+ # Memcached install
93
+ set :memcached_pid_path, "/var/run/memcached.pid"
94
+ set :memcached_memory, 64
95
+ set :memcached_port, 11211
96
+ set :memcached_build_options, {
97
+ :url => "http://www.danga.com/memcached/dist/memcached-1.2.4.tar.gz",
98
+ :configure_options => "--prefix=/usr/local"
99
+ }
100
+
101
+ # Monit install
102
+ set :monit_conf_dir, "/etc/monit"
103
+ set :monit_port, 2812
104
+ set :monit_build_options, {
105
+ :url => "http://www.tildeslash.com/monit/dist/monit-4.10.1.tar.gz"
106
+ }
107
+
108
+ # Nginx install
109
+ set :nginx_bin_path, "/sbin/nginx"
110
+ set :nginx_conf_path, "/etc/nginx/nginx.conf"
111
+ set :nginx_pid_path, "/var/run/nginx.pid"
112
+ set :nginx_prefix_path, "/var/nginx"
113
+ set :nginx_build_options, {
114
+ :url => "http://sysoev.ru/nginx/nginx-0.5.35.tar.gz",
115
+ :configure_options => "--sbin-path=#{nginx_bin_path} --conf-path=#{nginx_conf_path} \
116
+ --pid-path=#{nginx_pid_path} --error-log-path=/var/log/nginx_master_error.log --lock-path=/var/lock/nginx \
117
+ --prefix=#{nginx_prefix_path} --with-md5=auto/lib/md5 --with-sha1=auto/lib/sha1 --with-http_ssl_module"
118
+ }
119
+
120
+ # Sphinx install
121
+ set :sphinx_build_options, {
122
+ :url => "http://www.sphinxsearch.com/downloads/sphinx-0.9.7.tar.gz",
123
+ :configure_options => "--with-mysql-includes=/usr/include/mysql --with-mysql-libs=/usr/lib/mysql \
124
+ --prefix=#{sphinx_prefix}"
125
+ }
126
+
127
+ # Imagemagick install
128
+ set :imagemagick_build_options, {
129
+ :url => "ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick.tar.gz",
130
+ :unpack_dir => "ImageMagick-*"
131
+ }
@@ -1,34 +1,43 @@
1
1
  # Custom tasks for centos OS profiles
2
2
  namespace :centos do
3
-
4
- desc "Setup centos for web"
5
- task :setup_for_web do
6
- put template.load("centos/sudoers"), "/tmp/sudoers"
7
- script.sh("centos/setup_for_web.sh")
8
- end
9
-
10
- desc "Cleanup"
11
- task :cleanup do
12
- yum.clean
13
- # TODO: Add cleanup tasks here
14
- end
15
-
3
+
16
4
  # Add user for an application
17
- desc "Add user (adds to admin group)"
18
- task :add_user_for_app do
5
+ desc <<-DESC
6
+ Add user and set user password for application. Adds user to specified groups.
7
+
8
+ *user*: User to add.\n
9
+ @set :user, "app_user"@
10
+ *groups*: Groups for user to be in. _Defaults to none_\n
11
+ @set :groups, "admin,foo"@\n
12
+ *home*: Home directory for user. _Defaults to <tt>:deploy_to</tt> setting_\n
13
+ @set :home, "/var/www/apps/app_name"@\n
14
+ *home_readable*: Whether home permissions are readable by all. Needed if using deploy dir as home. _Defaults to true_\n
15
+ @set :home_readable, true@\n
16
+ DESC
17
+ task :add_user do
19
18
 
20
19
  # Settings
21
- user = fetch(:user)
22
- fetch_or_default(:install_user, "root")
20
+ fetch(:user)
21
+ fetch_or_default(:groups, nil)
22
+ fetch_or_default(:home, deploy_to)
23
+ fetch_or_default(:home_readable, true)
24
+
25
+ # Need to be root because we don't have any other users at this point
26
+ install_user = "root"
23
27
 
24
28
  with_user(install_user) do
29
+
30
+ adduser_options = []
31
+ adduser_options << "-d #{home}" unless home.blank?
32
+ adduser_options << "-G #{groups}" unless groups.blank?
25
33
 
26
- sudo "id sick || /usr/sbin/adduser -d #{deploy_to} -G admin #{user}"
27
- sudo "chmod a+rx #{deploy_to}"
34
+ run "id sick || /usr/sbin/adduser #{adduser_options.join(" ")} #{user}"
35
+
36
+ run "chmod a+rx #{home}" if home_readable
28
37
 
29
- new_password = Capistrano::CLI.password_prompt("Password for user (#{user}): ")
38
+ new_password = prompt.password("Password for user (#{user}): ", true)
30
39
 
31
- sudo "passwd #{user}" do |channel, stream, data|
40
+ run "passwd #{user}" do |channel, stream, data|
32
41
  logger.info data
33
42
 
34
43
  if data =~ /password:/i
@@ -1,19 +1,20 @@
1
1
  namespace :imagemagick do
2
2
  namespace :centos do
3
3
 
4
- desc "Install imagemagick"
4
+ desc <<-DESC
5
+ Install imagemagick.\n
6
+ *imagemagick_build_options*: Imagemagick build options.
7
+ DESC
5
8
  task :install do
6
9
 
10
+ # Settings
11
+ fetch(:imagemagick_build_options)
12
+
7
13
  # Install dependencies
8
14
  yum.install([ "libjpeg-devel", "libpng-devel", "glib2-devel", "fontconfig-devel", "zlib-devel",
9
15
  "libwmf-devel", "freetype-devel", "libtiff-devel" ])
10
-
11
- imagemagick_options = {
12
- :url => "ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick.tar.gz",
13
- :unpack_dir => "ImageMagick-*"
14
- }
15
-
16
- script.make_install("imagemagick", imagemagick_options)
16
+
17
+ script.make_install("imagemagick", imagemagick_build_options)
17
18
  end
18
19
 
19
20
  end
@@ -5,18 +5,13 @@ namespace :memcached do
5
5
  desc <<-DESC
6
6
  Install memcached.
7
7
 
8
- memcached_memory: Memcached memory (in MB).
9
-
10
- set :memcached_memory, 64
11
-
12
- memcached_pid_path: Path to memcached pid file. Defaults to /var/run/memcached.pid
13
-
14
- set :memcached_pid_path, "/var/run/memcached.pid"
15
-
16
- memcached_port: Memcached port. Defaults to 11211.
17
-
18
- set :memcached_port, 11211
19
-
8
+ *memcached_build_options*: Memcached build options.\n
9
+ *memcached_memory*: Memcached memory (in MB).\n
10
+ @set :memcached_memory, 64@\n
11
+ *memcached_pid_path*: Path to memcached pid file. Defaults to /var/run/memcached.pid\n
12
+ @set :memcached_pid_path, "/var/run/memcached.pid"@\n
13
+ *memcached_port*: Memcached port. Defaults to 11211.\n
14
+ @set :memcached_port, 11211@\n
20
15
  DESC
21
16
  task :install do
22
17
 
@@ -24,20 +19,15 @@ namespace :memcached do
24
19
  fetch_or_default(:memcached_pid_path, "/var/run/memcached.pid")
25
20
  fetch_or_default(:memcached_port, 11211)
26
21
  fetch(:memcached_memory)
27
-
28
- # Build options
29
- memcached_options = {
30
- :url => "http://www.danga.com/memcached/dist/memcached-1.2.4.tar.gz",
31
- :configure_options => "--prefix=/usr/local"
32
- }
22
+ fetch(:memcached_build_options)
33
23
 
34
24
  # Build
35
- script.make_install("memcached", memcached_options)
25
+ script.make_install("memcached", memcached_build_options)
36
26
 
37
27
  # Install initscript, service
38
28
  put template.load("memcached/memcached.initd.centos.erb"), "/tmp/memcached.initd"
39
- sudo "install -o root /tmp/memcached.initd /etc/init.d/memcached && rm -f /tmp/memcached.initd"
40
- sudo "/sbin/chkconfig --level 345 memcached on"
29
+ run_via "install -o root /tmp/memcached.initd /etc/init.d/memcached && rm -f /tmp/memcached.initd"
30
+ run_via "/sbin/chkconfig --level 345 memcached on"
41
31
 
42
32
  end
43
33
 
@@ -5,15 +5,11 @@ namespace :mongrel_cluster do
5
5
  desc <<-DESC
6
6
  Create mongrel cluster.
7
7
 
8
- mongrel_size: Number of mongrels.
9
-
10
- set :mongrel_size, 3
11
-
12
- mongrel_port: Starting port for mongrels. If there are 3 mongrels with port 9000, then instances will be at
13
- 9000, 9001, and 9002
14
-
15
- set :mongrel_port, 9000
16
-
8
+ *mongrel_size*: Number of mongrels.\n
9
+ @set :mongrel_size, 3@\n
10
+ *mongrel_port*: Starting port for mongrels. If there are 3 mongrels with port 9000,
11
+ then instances will be at 9000, 9001, and 9002\n
12
+ @set :mongrel_port, 9000@\n
17
13
  DESC
18
14
  task :setup do
19
15
 
@@ -29,8 +25,8 @@ namespace :mongrel_cluster do
29
25
 
30
26
  pid_path = "#{shared_path}/pids"
31
27
 
32
- put template.load("mongrel/mongrel_cluster.initd.erb", binding), "/tmp/mongrel_cluster_#{application}.initd"
33
- put template.load("mongrel/mongrel_cluster.yml.erb", binding), "#{mongrel_config_path}/mongrel_cluster.yml"
28
+ put template.load("mongrel/mongrel_cluster.initd.erb"), "/tmp/mongrel_cluster_#{application}.initd"
29
+ put template.load("mongrel/mongrel_cluster.yml.erb"), "#{mongrel_config_path}/mongrel_cluster.yml"
34
30
 
35
31
  # Setup the mongrel_cluster init script
36
32
  sudo "install -o root /tmp/mongrel_cluster_#{application}.initd /etc/init.d/mongrel_cluster_#{application}"