calas-capitate 0.3.6
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.
- data/Capfile +13 -0
- data/History.txt +167 -0
- data/License.txt +20 -0
- data/Manifest.txt +121 -0
- data/README.txt +8 -0
- data/Rakefile +4 -0
- data/config/hoe.rb +72 -0
- data/config/requirements.rb +17 -0
- data/lib/capitate.rb +56 -0
- data/lib/capitate/cap_ext/connections.rb +105 -0
- data/lib/capitate/cap_ext/docs.rb +26 -0
- data/lib/capitate/cap_ext/namespace.rb +34 -0
- data/lib/capitate/cap_ext/run_via.rb +16 -0
- data/lib/capitate/cap_ext/task_definition.rb +22 -0
- data/lib/capitate/cap_ext/variables.rb +132 -0
- data/lib/capitate/plugins/base.rb +140 -0
- data/lib/capitate/plugins/build.rb +71 -0
- data/lib/capitate/plugins/gem.rb +24 -0
- data/lib/capitate/plugins/prompt.rb +109 -0
- data/lib/capitate/plugins/rake.rb +25 -0
- data/lib/capitate/plugins/script.rb +96 -0
- data/lib/capitate/plugins/templates.rb +113 -0
- data/lib/capitate/plugins/utils.rb +151 -0
- data/lib/capitate/plugins/yum.rb +76 -0
- data/lib/capitate/recipes.rb +5 -0
- data/lib/capitate/task_node.rb +262 -0
- data/lib/capitate/version.rb +9 -0
- data/lib/deployment/centos-5.1-64-web/install.rb +196 -0
- data/lib/recipes/active_record.rb +36 -0
- data/lib/recipes/apache.rb +47 -0
- data/lib/recipes/backgroundrb.rb +29 -0
- data/lib/recipes/centos/backgroundjob.rb +27 -0
- data/lib/recipes/centos/backgroundrb.rb +23 -0
- data/lib/recipes/centos/centos.rb +45 -0
- data/lib/recipes/centos/imagemagick.rb +29 -0
- data/lib/recipes/centos/memcached.rb +45 -0
- data/lib/recipes/centos/merb.rb +23 -0
- data/lib/recipes/centos/mongrel_cluster.rb +54 -0
- data/lib/recipes/centos/monit.rb +62 -0
- data/lib/recipes/centos/mysql.rb +25 -0
- data/lib/recipes/centos/nginx.rb +64 -0
- data/lib/recipes/centos/ruby.rb +40 -0
- data/lib/recipes/centos/sphinx.rb +59 -0
- data/lib/recipes/docs.rb +24 -0
- data/lib/recipes/logrotate/backgroundjob.rb +26 -0
- data/lib/recipes/logrotate/backgroundrb.rb +26 -0
- data/lib/recipes/logrotate/merb.rb +25 -0
- data/lib/recipes/logrotate/mongrel_cluster.rb +29 -0
- data/lib/recipes/logrotate/monit.rb +28 -0
- data/lib/recipes/logrotate/mysql.rb +26 -0
- data/lib/recipes/logrotate/nginx.rb +37 -0
- data/lib/recipes/logrotate/rails.rb +21 -0
- data/lib/recipes/logrotate/sphinx.rb +21 -0
- data/lib/recipes/logrotated.rb +61 -0
- data/lib/recipes/memcached.rb +26 -0
- data/lib/recipes/merb.rb +32 -0
- data/lib/recipes/monit.rb +35 -0
- data/lib/recipes/monit/backgroundjob.rb +38 -0
- data/lib/recipes/monit/backgroundrb.rb +38 -0
- data/lib/recipes/monit/database.rb +25 -0
- data/lib/recipes/monit/memcached.rb +22 -0
- data/lib/recipes/monit/merb.rb +58 -0
- data/lib/recipes/monit/mongrel_cluster.rb +85 -0
- data/lib/recipes/monit/mysql.rb +20 -0
- data/lib/recipes/monit/nginx.rb +37 -0
- data/lib/recipes/monit/sphinx.rb +38 -0
- data/lib/recipes/monit/sshd.rb +27 -0
- data/lib/recipes/mysql.rb +42 -0
- data/lib/recipes/nginx.rb +29 -0
- data/lib/recipes/rails.rb +71 -0
- data/lib/recipes/redmine.rb +38 -0
- data/lib/recipes/sphinx.rb +60 -0
- data/lib/recipes/sshd.rb +47 -0
- data/lib/recipes/syslogd.rb +21 -0
- data/lib/templates/apache/vhost.mongrel_cluster.conf.erb +46 -0
- data/lib/templates/backgroundjob/backgroundjob.initd.centos.erb +54 -0
- data/lib/templates/backgroundjob/backgroundjob.monitrc.erb +3 -0
- data/lib/templates/backgroundrb/backgroundrb.initd.centos.erb +58 -0
- data/lib/templates/backgroundrb/backgroundrb.monitrc.erb +3 -0
- data/lib/templates/backgroundrb/backgroundrb.yml.erb +14 -0
- data/lib/templates/capistrano/Capfile +22 -0
- data/lib/templates/logrotated/conf.erb +3 -0
- data/lib/templates/memcached/memcached.initd.centos.erb +58 -0
- data/lib/templates/memcached/memcached.monitrc.erb +4 -0
- data/lib/templates/memcached/memcached.yml.erb +14 -0
- data/lib/templates/merb/merb-no-http.monitrc.erb +13 -0
- data/lib/templates/merb/merb.initd.centos.erb +123 -0
- data/lib/templates/merb/merb.monitrc.erb +15 -0
- data/lib/templates/mongrel/mongrel_cluster.initd.centos.erb +94 -0
- data/lib/templates/mongrel/mongrel_cluster.monitrc.erb +15 -0
- data/lib/templates/mongrel/mongrel_cluster.yml.erb +11 -0
- data/lib/templates/monit/monit.cnf +34 -0
- data/lib/templates/monit/monit.initd.centos.erb +68 -0
- data/lib/templates/monit/monitrc.erb +18 -0
- data/lib/templates/mysql/install_db.sql.erb +6 -0
- data/lib/templates/mysql/my.cnf.innodb_1024.erb +122 -0
- data/lib/templates/mysql/my.cnf.innodb_512.erb +127 -0
- data/lib/templates/mysql/mysql.monitrc.erb +6 -0
- data/lib/templates/nginx/nginx.conf.erb +97 -0
- data/lib/templates/nginx/nginx.initd.centos.erb +69 -0
- data/lib/templates/nginx/nginx.monitrc.erb +4 -0
- data/lib/templates/nginx/nginx_vhost.conf.erb +101 -0
- data/lib/templates/nginx/nginx_vhost_generic.conf.erb +99 -0
- data/lib/templates/rails/database.yml.erb +7 -0
- data/lib/templates/redmine/email.yml.erb +10 -0
- data/lib/templates/ruby/fix_openssl.sh +12 -0
- data/lib/templates/sphinx/sphinx.conf.erb +157 -0
- data/lib/templates/sphinx/sphinx.monitrc.erb +4 -0
- data/lib/templates/sphinx/sphinx_app.initd.centos.erb +90 -0
- data/lib/templates/sshd/sshd.monitrc.erb +5 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +80 -0
- data/setup.rb +1585 -0
- data/tasks/deployment.rake +34 -0
- data/tasks/environment.rake +7 -0
- data/tasks/website.rake +23 -0
- data/test/test_helper.rb +2 -0
- data/test/test_plugin_upload.rb +32 -0
- data/test/test_recipes.rb +37 -0
- data/test/test_templates.rb +29 -0
- metadata +198 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
module Capitate::Plugins::Yum
|
|
2
|
+
|
|
3
|
+
# Update all installed packages.
|
|
4
|
+
#
|
|
5
|
+
# ==== Options
|
|
6
|
+
# +packages+:: Packages to update, or empty to update all
|
|
7
|
+
#
|
|
8
|
+
# ==== Examples
|
|
9
|
+
# yum.update
|
|
10
|
+
# yum.update([ "aspell" ])
|
|
11
|
+
#
|
|
12
|
+
def update(packages = [])
|
|
13
|
+
run_via "yum -y update #{packages.join(" ")}"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Remove via yum.
|
|
17
|
+
#
|
|
18
|
+
# ==== Options
|
|
19
|
+
# +packages+:: Packages to remove
|
|
20
|
+
#
|
|
21
|
+
# ==== Examples
|
|
22
|
+
# yum.remove
|
|
23
|
+
# yum.remove([ "aspell" ])
|
|
24
|
+
#
|
|
25
|
+
def remove(packages)
|
|
26
|
+
run_via "yum -y remove #{packages.join(" ")}"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Install via yum.
|
|
30
|
+
#
|
|
31
|
+
# ==== Options
|
|
32
|
+
# +packages+:: Packages to install, either String (for single package) or Array
|
|
33
|
+
# +update_existing+:: If package exists, where to yum update it, defaults to true
|
|
34
|
+
#
|
|
35
|
+
# ==== Examples
|
|
36
|
+
# yum.install
|
|
37
|
+
# yum.install([ "aspell" ])
|
|
38
|
+
#
|
|
39
|
+
def install(packages, update_existing = true)
|
|
40
|
+
|
|
41
|
+
# If a single object, wrap in array
|
|
42
|
+
packages = [ packages ] unless packages.is_a?(Array)
|
|
43
|
+
|
|
44
|
+
if update_existing
|
|
45
|
+
|
|
46
|
+
installed_packages = []
|
|
47
|
+
|
|
48
|
+
run_via "yum -d 0 list installed #{packages.join(" ")}" do |channel, stream, data|
|
|
49
|
+
lines = data.split("\n")[1..-1]
|
|
50
|
+
if lines.blank?
|
|
51
|
+
logger.info "Invalid yum output: #{data}"
|
|
52
|
+
else
|
|
53
|
+
installed_packages += lines.collect { |line| line.split(".").first }
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
packages -= installed_packages
|
|
58
|
+
|
|
59
|
+
run_via "yum -y update #{installed_packages.join(" ")}" unless installed_packages.blank?
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
run_via "yum -y install #{packages.join(" ")}" unless packages.blank?
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Clean yum.
|
|
66
|
+
#
|
|
67
|
+
# ==== Examples
|
|
68
|
+
# yum.clean
|
|
69
|
+
#
|
|
70
|
+
def clean
|
|
71
|
+
run_via "yum -y clean all"
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
Capistrano.plugin :yum, Capitate::Plugins::Yum
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
# Task node in the capistrano namespace, task hierarchy.
|
|
2
|
+
class Capitate::TaskNode
|
|
3
|
+
|
|
4
|
+
include Capitate::Plugins::Base
|
|
5
|
+
|
|
6
|
+
attr_reader :name, :nodes, :tasks, :parent
|
|
7
|
+
|
|
8
|
+
# Create task node with name and parent
|
|
9
|
+
# For root not use name = "top"
|
|
10
|
+
#
|
|
11
|
+
# ==== Options
|
|
12
|
+
# +name+:: Node name (namespace name)
|
|
13
|
+
# +parent+:: Parent node
|
|
14
|
+
#
|
|
15
|
+
def initialize(name, parent = nil)
|
|
16
|
+
@name = name
|
|
17
|
+
@parent = parent
|
|
18
|
+
@nodes = []
|
|
19
|
+
@tasks = []
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Add "child" node.
|
|
23
|
+
#
|
|
24
|
+
# ==== Options
|
|
25
|
+
# +task_node+:: Node
|
|
26
|
+
#
|
|
27
|
+
def add_node(task_node)
|
|
28
|
+
@nodes << task_node
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Find node with name (namespace).
|
|
32
|
+
#
|
|
33
|
+
# ==== Options
|
|
34
|
+
# +name+:: Name to look for
|
|
35
|
+
#
|
|
36
|
+
def find(name)
|
|
37
|
+
@nodes.each do |node|
|
|
38
|
+
return node if node.name == name
|
|
39
|
+
end
|
|
40
|
+
nil
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Add task to this node.
|
|
44
|
+
#
|
|
45
|
+
# ==== Options
|
|
46
|
+
# +task+:: Add task associated with this node (namespace).
|
|
47
|
+
#
|
|
48
|
+
def add_task(task)
|
|
49
|
+
@tasks << task
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Get "child" nodes (sorted).
|
|
53
|
+
def sorted_nodes
|
|
54
|
+
nodes.sort_by(&:name)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Get tasks (sorted).
|
|
58
|
+
def sorted_tasks
|
|
59
|
+
tasks.sort_by(&:fully_qualified_name) # { |t| t.name.to_s }
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Iterate over ALL "child" nodes, depth first.
|
|
63
|
+
# Yields |node, level|.
|
|
64
|
+
#
|
|
65
|
+
# ==== Options
|
|
66
|
+
# +level+:: Current level
|
|
67
|
+
#
|
|
68
|
+
def each_node(level = 0, &block)
|
|
69
|
+
sorted_nodes.each do |node|
|
|
70
|
+
yield(node, level)
|
|
71
|
+
node.each_node(level + 1, &block)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Get the full name, using delimeter
|
|
76
|
+
#
|
|
77
|
+
# ==== Options
|
|
78
|
+
# +delimeter+:: Delimeter
|
|
79
|
+
#
|
|
80
|
+
# ==== Examples
|
|
81
|
+
# node.full_name(":") => "mysql:centos" # On node mysql centos node (top -> mysql -> centos)
|
|
82
|
+
#
|
|
83
|
+
def full_name(delimeter = "-")
|
|
84
|
+
if parent
|
|
85
|
+
parent_name = parent.full_name
|
|
86
|
+
return [ parent_name, name ].compact.join(delimeter)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Return nil for top node
|
|
90
|
+
name == "top" ? nil : name
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# Write textile documentation for node (recursively).
|
|
94
|
+
#
|
|
95
|
+
# Uses task desc attribute for task details.
|
|
96
|
+
#
|
|
97
|
+
# ==== Options
|
|
98
|
+
# +dir+:: Dir to write to
|
|
99
|
+
# +file_name+:: File name to write to, defaults to full name
|
|
100
|
+
# +title+:: Title and h1 for page, defaults to name
|
|
101
|
+
# +options+:: Options
|
|
102
|
+
#
|
|
103
|
+
def write_doc(dir, file_name = nil, title = nil, options = {}, &block)
|
|
104
|
+
|
|
105
|
+
file_name ||= full_name
|
|
106
|
+
title ||= full_name(":")
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
path = "#{dir}/#{file_name}.txt"
|
|
111
|
+
puts "%10s %-30s" % [ "create", path ]
|
|
112
|
+
|
|
113
|
+
File.open(path, "w") do |file|
|
|
114
|
+
file.puts "h1. #{title}\n\n"
|
|
115
|
+
|
|
116
|
+
#
|
|
117
|
+
# Breadcrumb generate
|
|
118
|
+
#
|
|
119
|
+
bc_full_name = full_name(":")
|
|
120
|
+
links = []
|
|
121
|
+
if bc_full_name
|
|
122
|
+
names = bc_full_name.split(":")
|
|
123
|
+
links << " #{names.pop} " # Pop off current
|
|
124
|
+
|
|
125
|
+
while(!names.empty?) do
|
|
126
|
+
links << %{ "#{names.last}":#{names.join("-")}.html }
|
|
127
|
+
names.pop
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# Write breadcrumb
|
|
132
|
+
file.puts %{ "home":../index.html > "recipes":index.html > #{links.reverse.join(" > ")} }
|
|
133
|
+
|
|
134
|
+
# Write task count
|
|
135
|
+
# count = 0
|
|
136
|
+
# each_node do |snode, level|
|
|
137
|
+
# count += snode.tasks.length
|
|
138
|
+
# end
|
|
139
|
+
# file.puts %{\n\n*#{count}* tasks!\n\n}
|
|
140
|
+
|
|
141
|
+
#
|
|
142
|
+
# Namespace
|
|
143
|
+
#
|
|
144
|
+
unless nodes.empty?
|
|
145
|
+
file.puts "\n\nh2. Namespaces\n\n"
|
|
146
|
+
each_node do |snode, level|
|
|
147
|
+
#li_level = (0..level).collect { "*" }.join
|
|
148
|
+
li_level = "*"
|
|
149
|
+
if snode.tasks.length > 0
|
|
150
|
+
file.puts %{#{li_level} "#{snode.full_name(":")}":#{snode.full_name}.html (#{snode.tasks.length}) \n}
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
#
|
|
156
|
+
# Tasks
|
|
157
|
+
#
|
|
158
|
+
unless tasks.empty?
|
|
159
|
+
file.puts "\n\nh2. Tasks\n\n"
|
|
160
|
+
sorted_tasks.each do |task|
|
|
161
|
+
file.puts %{* "#{task.fully_qualified_name}":##{task.fully_qualified_name} \n}
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
#
|
|
166
|
+
# Task details
|
|
167
|
+
#
|
|
168
|
+
unless tasks.empty?
|
|
169
|
+
file.puts "\n\nh2. Task documentation\n\n"
|
|
170
|
+
sorted_tasks.each do |task|
|
|
171
|
+
file.puts %{<div class="recipe">\n\n}
|
|
172
|
+
options = ""
|
|
173
|
+
options = "<span class='options'>, #{task.options.inspect}</span>" unless task.options.blank?
|
|
174
|
+
file.puts "h3(##{task.fully_qualified_name}). #{task.fully_qualified_name}#{options}\n\n"
|
|
175
|
+
file.puts "#{unindent(task.desc)}\n\n"
|
|
176
|
+
if task.arguments
|
|
177
|
+
file.puts "h4. Parameters\n\n"
|
|
178
|
+
file.puts "<dl>\n"
|
|
179
|
+
task.arguments.each do |arg|
|
|
180
|
+
file.puts "<dt>#{arg[:name]}</dt>"
|
|
181
|
+
file.puts "<dd>#{unindent(arg[:desc])}</dd>" if arg.has_key?(:desc)
|
|
182
|
+
if arg.has_key?(:default_desc)
|
|
183
|
+
file.puts "<dd class='default'>Defaults to @#{arg[:default_desc]}@</dd>"
|
|
184
|
+
elsif arg.has_key?(:default)
|
|
185
|
+
file.puts "<dd class='default'>Defaults to @#{arg[:default].inspect}@</dd>"
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
if arg.has_key?(:set)
|
|
189
|
+
file.puts "<dd class='default'>Defaults to @#{arg[:set].inspect}@ (cap setting)</dd>"
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
file.puts "<dd class='example'>Example: @set :#{arg[:name]}, #{arg[:example]}@" if arg.has_key?(:example)
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
file.puts "</dl>\n\n"
|
|
196
|
+
file.puts "</div>\n\n\n"
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
#
|
|
201
|
+
# Write doc (recursively for "child" namespace)
|
|
202
|
+
#
|
|
203
|
+
sorted_nodes.each do |snode|
|
|
204
|
+
snode.write_doc(dir, nil, nil, options)
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
# If block then let it do stuff with open file
|
|
208
|
+
if block_given?
|
|
209
|
+
file.puts "\n\n"
|
|
210
|
+
yield(file)
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
# Node to string.
|
|
216
|
+
def to_s(level = 0)
|
|
217
|
+
spaces = " "
|
|
218
|
+
indent = (0...level).collect { spaces }.join("")
|
|
219
|
+
|
|
220
|
+
# Ignore top node (level = -1)
|
|
221
|
+
if level >= 0
|
|
222
|
+
t_indent = "\n#{indent} #{spaces} - "
|
|
223
|
+
task_names = tasks.collect(&:name).sort_by(&:to_s).join(t_indent)
|
|
224
|
+
s = "#{indent} -- #{name}:#{t_indent}#{task_names}\n"
|
|
225
|
+
else
|
|
226
|
+
s = ""
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
sorted_nodes.each do |node|
|
|
230
|
+
s += node.to_s(level + 1)
|
|
231
|
+
end
|
|
232
|
+
s
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
# Create nodes and and task to node.
|
|
236
|
+
#
|
|
237
|
+
# If task is "mysql:centos:install", the nodes will look like:
|
|
238
|
+
#
|
|
239
|
+
# (top node) -> (mysql node) -> (centos node; w/ tasks: install)
|
|
240
|
+
#
|
|
241
|
+
# ==== Options
|
|
242
|
+
# +top_node+:: Node to start at
|
|
243
|
+
# +task+:: Task to add
|
|
244
|
+
#
|
|
245
|
+
def self.populate_with_task(top_node, task)
|
|
246
|
+
node_names = task.namespace.fully_qualified_name.split(":")
|
|
247
|
+
|
|
248
|
+
node = top_node
|
|
249
|
+
|
|
250
|
+
node_names.each do |name|
|
|
251
|
+
parent_node = node
|
|
252
|
+
node = parent_node.find(name)
|
|
253
|
+
if !node
|
|
254
|
+
node = self.new(name, parent_node)
|
|
255
|
+
parent_node.add_node(node)
|
|
256
|
+
end
|
|
257
|
+
end
|
|
258
|
+
node.add_task(task)
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
end
|
|
262
|
+
|
|
@@ -0,0 +1,196 @@
|
|
|
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
|
+
#
|
|
18
|
+
|
|
19
|
+
load 'deploy' if respond_to?(:namespace) # cap2 differentiator
|
|
20
|
+
|
|
21
|
+
require 'erb'
|
|
22
|
+
|
|
23
|
+
# Load capitate
|
|
24
|
+
gem 'capitate', '>= 0.2.9'
|
|
25
|
+
require 'capitate'
|
|
26
|
+
require 'capitate/recipes'
|
|
27
|
+
|
|
28
|
+
# Load more recipes
|
|
29
|
+
Dir[File.dirname(__FILE__) + "/recipes/*.rb"].each { |recipe| load recipe }
|
|
30
|
+
|
|
31
|
+
namespace :install do
|
|
32
|
+
|
|
33
|
+
task :default do
|
|
34
|
+
|
|
35
|
+
set :user, "root"
|
|
36
|
+
set :run_method, :run
|
|
37
|
+
check_role
|
|
38
|
+
|
|
39
|
+
# NTP Setup
|
|
40
|
+
yum.install([ "ntp" ])
|
|
41
|
+
script.run_all <<-CMDS
|
|
42
|
+
chkconfig --levels 235 ntpd on
|
|
43
|
+
ntpdate 0.pool.ntp.org
|
|
44
|
+
/sbin/service ntpd start
|
|
45
|
+
CMDS
|
|
46
|
+
|
|
47
|
+
# Setup for web
|
|
48
|
+
# * Add admin group
|
|
49
|
+
# * Change inittab to runlevel 3
|
|
50
|
+
# * Create web apps directory
|
|
51
|
+
# * Add admin group to suders ALL=(ALL) ALL
|
|
52
|
+
script.run_all <<-CMDS
|
|
53
|
+
egrep "^admin" /etc/group || /usr/sbin/groupadd admin
|
|
54
|
+
mkdir -p /var/www/apps
|
|
55
|
+
egrep "^%admin" /etc/sudoers || echo "%admin ALL=(ALL) ALL" >> /etc/sudoers
|
|
56
|
+
CMDS
|
|
57
|
+
|
|
58
|
+
# Package installs
|
|
59
|
+
yum.update
|
|
60
|
+
yum.install [ "gcc", "kernel-devel", "libevent-devel", "libxml2-devel", "openssl", "openssl-devel",
|
|
61
|
+
"aspell", "aspell-devel", "aspell-en", "aspell-es" ]
|
|
62
|
+
|
|
63
|
+
yum.clean
|
|
64
|
+
|
|
65
|
+
#
|
|
66
|
+
# App installs
|
|
67
|
+
#
|
|
68
|
+
|
|
69
|
+
ruby.centos.install
|
|
70
|
+
nginx.centos.install
|
|
71
|
+
mysql.centos.install
|
|
72
|
+
sphinx.centos.install
|
|
73
|
+
|
|
74
|
+
monit.centos.install
|
|
75
|
+
# Install firewall rule manually
|
|
76
|
+
#monit.centos.iptables
|
|
77
|
+
|
|
78
|
+
sshd.monit.install
|
|
79
|
+
|
|
80
|
+
imagemagick.centos.install
|
|
81
|
+
memcached.centos.install
|
|
82
|
+
|
|
83
|
+
#
|
|
84
|
+
# Install monit hooks
|
|
85
|
+
#
|
|
86
|
+
nginx.monit.install
|
|
87
|
+
mysql.monit.install
|
|
88
|
+
memcached.monit.install
|
|
89
|
+
|
|
90
|
+
# Install gems
|
|
91
|
+
gems_only
|
|
92
|
+
|
|
93
|
+
# Cleanup
|
|
94
|
+
yum.clean
|
|
95
|
+
|
|
96
|
+
# Log rotate tasks
|
|
97
|
+
monit.logrotate.install
|
|
98
|
+
nginx.logrotate.install
|
|
99
|
+
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
desc "Install gems only"
|
|
103
|
+
task :gems_only do
|
|
104
|
+
gems.install(fetch(:gems_to_install))
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Prompt for server if host not given
|
|
109
|
+
task :check_role do
|
|
110
|
+
# Can use cap HOSTS=192.168.1.111 install
|
|
111
|
+
# Otherwise prompt for the service
|
|
112
|
+
role :install, prompt.ask("Server: ") if find_servers_for_task(current_task).blank?
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# For for ruby install
|
|
116
|
+
after "ruby:centos:install" do
|
|
117
|
+
# Fix ruby install openssl
|
|
118
|
+
script.sh("ruby/fix_openssl.sh")
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
#
|
|
123
|
+
# Install options
|
|
124
|
+
#
|
|
125
|
+
|
|
126
|
+
set :gems_to_install, [ "rake", "mysql -- --with-mysql-include=/usr/include/mysql --with-mysql-lib=/usr/lib/mysql --with-mysql-config",
|
|
127
|
+
"raspell", "rmagick", "mongrel", "mongrel_cluster", "json", "mime-types", "hpricot" ]
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
# Ruby install
|
|
131
|
+
set :ruby_build_options, {
|
|
132
|
+
:url => "http://capitate.s3.amazonaws.com/ruby-1.8.6-p110.tar.gz",
|
|
133
|
+
:build_dest => "/usr/src",
|
|
134
|
+
:configure_options => "--prefix=/usr",
|
|
135
|
+
:clean => false
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
set :rubygems_build_options, {
|
|
139
|
+
:url => "http://rubyforge.org/frs/download.php/29548/rubygems-1.0.1.tgz"
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
# Memcached install
|
|
143
|
+
set :memcached_pid_path, "/var/run/memcached.pid"
|
|
144
|
+
set :memcached_memory, 64
|
|
145
|
+
set :memcached_port, 11211
|
|
146
|
+
set :memcached_build_options, {
|
|
147
|
+
:url => "http://www.danga.com/memcached/dist/memcached-1.2.4.tar.gz",
|
|
148
|
+
:configure_options => "--prefix=/usr/local"
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
# Monit install
|
|
152
|
+
set :monit_conf_dir, "/etc/monit"
|
|
153
|
+
set :monit_pid_path, "/var/run/monit.pid"
|
|
154
|
+
set :monit_port, 2812
|
|
155
|
+
set :monit_build_options, {
|
|
156
|
+
:url => "http://www.tildeslash.com/monit/dist/monit-4.10.1.tar.gz"
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
# Nginx install
|
|
160
|
+
set :nginx_bin_path, "/sbin/nginx"
|
|
161
|
+
set :nginx_conf_path, "/etc/nginx/nginx.conf"
|
|
162
|
+
set :nginx_pid_path, "/var/run/nginx.pid"
|
|
163
|
+
set :nginx_prefix_path, "/var/nginx"
|
|
164
|
+
set :nginx_build_options, {
|
|
165
|
+
:url => "http://sysoev.ru/nginx/nginx-0.5.35.tar.gz",
|
|
166
|
+
:configure_options => "--sbin-path=#{nginx_bin_path} --conf-path=#{nginx_conf_path} \
|
|
167
|
+
--pid-path=#{nginx_pid_path} --error-log-path=/var/log/nginx_master_error.log --lock-path=/var/lock/nginx \
|
|
168
|
+
--prefix=#{nginx_prefix_path} --with-md5=auto/lib/md5 --with-sha1=auto/lib/sha1 --with-http_ssl_module \
|
|
169
|
+
--with-http_flv_module"
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
# Sphinx install
|
|
173
|
+
set :sphinx_prefix, "/usr/local/sphinx-0.9.8-rc1"
|
|
174
|
+
set :sphinx_build_options, {
|
|
175
|
+
:url => "http://www.sphinxsearch.com/downloads/sphinx-0.9.8-rc1.tar.gz",
|
|
176
|
+
:configure_options => "--with-mysql-includes=/usr/include/mysql --with-mysql-libs=/usr/lib64/mysql --prefix=#{sphinx_prefix}",
|
|
177
|
+
:symlink => { sphinx_prefix => "/usr/local/sphinx" }
|
|
178
|
+
}
|
|
179
|
+
# Other possible sphinx_build_options
|
|
180
|
+
# :url => "http://www.sphinxsearch.com/downloads/sphinx-0.9.7.tar.gz",
|
|
181
|
+
# :configure_options => "--with-mysql-includes=/usr/include/mysql --with-mysql-libs=/usr/lib/mysql --prefix=#{sphinx_prefix}",
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
# For mysql:install
|
|
185
|
+
set :mysql_pid_path, "/var/run/mysqld/mysqld.pid"
|
|
186
|
+
set :mysql_port, 3306
|
|
187
|
+
|
|
188
|
+
# Imagemagick install
|
|
189
|
+
set :imagemagick_build_options, {
|
|
190
|
+
:url => "http://capitate.s3.amazonaws.com/ImageMagick.tar.gz",
|
|
191
|
+
:unpack_dir => "ImageMagick-*"
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
# For sshd:monit:install
|
|
195
|
+
set :sshd_pid_path, "/var/run/sshd.pid"
|
|
196
|
+
set :sshd_port, 2023
|