kuzushi 0.0.8 → 0.0.9
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/VERSION +1 -1
- data/lib/kuzushi.rb +85 -46
- metadata +2 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.9
|
data/lib/kuzushi.rb
CHANGED
@@ -4,6 +4,12 @@ require 'restclient'
|
|
4
4
|
require 'ostruct'
|
5
5
|
require 'rush'
|
6
6
|
require 'ohai'
|
7
|
+
require 'erb'
|
8
|
+
|
9
|
+
## IDEAS
|
10
|
+
|
11
|
+
## firewall until ready
|
12
|
+
## ruby 1.9 compatibility
|
7
13
|
|
8
14
|
class Kuzushi
|
9
15
|
def initialize(url)
|
@@ -15,10 +21,29 @@ class Kuzushi
|
|
15
21
|
@tasks = []
|
16
22
|
load_config_stack(@name)
|
17
23
|
@config = @configs.reverse.inject({}) { |i,c| i.merge(c) }
|
24
|
+
end
|
25
|
+
|
26
|
+
def init
|
27
|
+
@init = true
|
28
|
+
start
|
29
|
+
end
|
30
|
+
|
31
|
+
def start
|
32
|
+
process_stack
|
33
|
+
puts "----"
|
34
|
+
@tasks.each do |t|
|
35
|
+
puts "TASK: #{t[:description]}"
|
36
|
+
t[:blk].call
|
37
|
+
end
|
38
|
+
puts "----"
|
39
|
+
end
|
40
|
+
|
41
|
+
protected
|
42
|
+
|
43
|
+
def system
|
18
44
|
ohai = Ohai::System.new
|
19
45
|
ohai.all_plugins
|
20
|
-
|
21
|
-
process_stack
|
46
|
+
ohai
|
22
47
|
end
|
23
48
|
|
24
49
|
def load_config_stack(name)
|
@@ -36,12 +61,11 @@ class Kuzushi
|
|
36
61
|
process :local_packages
|
37
62
|
process :gems
|
38
63
|
process :volumes
|
39
|
-
process :raids
|
40
|
-
process :mounts
|
41
64
|
process :files
|
42
65
|
process :users
|
43
66
|
|
44
67
|
script get("after")
|
68
|
+
script get("init") if init?
|
45
69
|
end
|
46
70
|
|
47
71
|
## magic goes here
|
@@ -59,6 +83,7 @@ class Kuzushi
|
|
59
83
|
send("process_#{type}", item)
|
60
84
|
end
|
61
85
|
script item["after"]
|
86
|
+
script item["init"] if init?
|
62
87
|
end
|
63
88
|
end
|
64
89
|
end
|
@@ -66,7 +91,7 @@ class Kuzushi
|
|
66
91
|
def process_packages
|
67
92
|
@packages = get_array("packages")
|
68
93
|
task "install packages" do
|
69
|
-
shell "apt-get update && apt-get upgrade -y && apt-get install -y #{@packages.join(" ")}"
|
94
|
+
shell "apt-get update && apt-get upgrade -y && apt-get install -y #{@packages.join(" ")}"
|
70
95
|
end
|
71
96
|
end
|
72
97
|
|
@@ -85,39 +110,56 @@ class Kuzushi
|
|
85
110
|
end
|
86
111
|
|
87
112
|
def process_volumes(v)
|
113
|
+
handle_ebs v if v.type == "ebs"
|
114
|
+
handle_raid v if v.type == "raid"
|
115
|
+
set_readahead v if v.readahead
|
116
|
+
set_scheduler v if v.scheduler
|
117
|
+
handle_format v if v.format
|
118
|
+
handle_mount v if v.mount
|
119
|
+
end
|
120
|
+
|
121
|
+
def handle_ebs(v)
|
88
122
|
task "wait for volume #{v.device}" do
|
89
123
|
wait_for_volume v.device
|
90
124
|
end
|
91
|
-
set_readahead v
|
92
|
-
set_scheduler v
|
93
|
-
check_format v
|
94
125
|
end
|
95
126
|
|
96
|
-
def
|
97
|
-
task "
|
98
|
-
|
127
|
+
def handle_raid(r)
|
128
|
+
task "create raid #{r.device}", :init => true do
|
129
|
+
shell "mdadm --create #{r.device} -n #{r.drives.size} -l #{r.level} -c #{r.chunksize || 64} #{r.drives.join(" ")}"
|
130
|
+
end
|
131
|
+
task "assemble raid #{r.device}" do ## assemble fails a lot with device busy - is udev to blame :(
|
132
|
+
if not dev_exists? r.device
|
133
|
+
shell "service stop udev"
|
99
134
|
shell "mdadm --assemble #{r.device} #{r.drives.join(" ")}"
|
100
|
-
|
101
|
-
## sometimes the disks come back with odd error messages - retry seems to be the best option
|
102
|
-
puts "error: #{o.message}"
|
103
|
-
retry
|
135
|
+
shell "service start udev"
|
104
136
|
end
|
105
137
|
end
|
106
|
-
set_readahead r
|
107
|
-
set_scheduler r
|
108
|
-
check_format r
|
109
138
|
add_package "mdadm"
|
110
139
|
end
|
111
140
|
|
112
|
-
def
|
113
|
-
task "mount #{m.
|
114
|
-
shell "mkdir -p #{m.
|
141
|
+
def handle_mount(m)
|
142
|
+
task "mount #{m.device}" do
|
143
|
+
shell "mkdir -p #{m.mount} && mount -o #{m.options || "noatime"} #{m.device} #{m.mount}" unless mounted?(m.device)
|
115
144
|
end
|
116
145
|
end
|
117
146
|
|
147
|
+
def system_arch
|
148
|
+
system.kernel["machine"]
|
149
|
+
end
|
150
|
+
|
151
|
+
def mounted?(dev)
|
152
|
+
!!system.filesystem[dev]["mount"]
|
153
|
+
end
|
154
|
+
|
155
|
+
def package_arch
|
156
|
+
`dpkg --print-architecture`.chomp
|
157
|
+
end
|
158
|
+
|
118
159
|
def process_files(f)
|
119
160
|
fetch("/templates/#{f.template}") do |file|
|
120
161
|
task "setting up #{f.file}" do
|
162
|
+
@system = system
|
121
163
|
t = ERB.new File.read(file), 0, '<>'
|
122
164
|
File.open(f.file,"w") { |f| f.write(t.render) }
|
123
165
|
end
|
@@ -129,26 +171,26 @@ class Kuzushi
|
|
129
171
|
task "add authorized_key for user #{user.name}" do
|
130
172
|
shell "su - #{user.name} -c 'mkdir -p .ssh; echo \"#{key}\" >> .ssh/authorized_keys; chmod -R 0600 .ssh'"
|
131
173
|
end
|
132
|
-
end
|
174
|
+
end
|
133
175
|
end
|
134
176
|
|
135
177
|
def set_readahead(v)
|
136
|
-
|
137
|
-
|
138
|
-
shell "blockdev --setra #{v.readahead} #{v.device}"
|
139
|
-
end
|
178
|
+
task "set readahead for #{v.device}" do
|
179
|
+
shell "blockdev --setra #{v.readahead} #{v.device}"
|
140
180
|
end
|
141
181
|
end
|
142
182
|
|
143
183
|
def set_scheduler(v)
|
144
|
-
|
145
|
-
|
146
|
-
shell "echo #{v.scheduler} > /sys/block/#{File.basename(v.device)}/queue/scheduler"
|
147
|
-
end
|
184
|
+
task "set scheduler for #{v.device}" do
|
185
|
+
shell "echo #{v.scheduler} > /sys/block/#{File.basename(v.device)}/queue/scheduler"
|
148
186
|
end
|
149
187
|
end
|
150
188
|
|
151
|
-
def
|
189
|
+
def handle_format(v)
|
190
|
+
task "formatting #{v.device}", :init => true do
|
191
|
+
label = "-L " + v.label rescue ""
|
192
|
+
"mkfs.#{v.format} #{label} #{v.device}"
|
193
|
+
end
|
152
194
|
add_package "xfsprogs" if v.format == "xfs"
|
153
195
|
end
|
154
196
|
|
@@ -157,7 +199,7 @@ class Kuzushi
|
|
157
199
|
end
|
158
200
|
|
159
201
|
def package(p, &block)
|
160
|
-
fetch("/packages/#{p}
|
202
|
+
fetch("/packages/#{p}_#{package_arch}.deb") do |file|
|
161
203
|
block.call(file)
|
162
204
|
end
|
163
205
|
end
|
@@ -221,31 +263,28 @@ class Kuzushi
|
|
221
263
|
end
|
222
264
|
|
223
265
|
def wait_for_volume(vol)
|
224
|
-
|
266
|
+
## Maybe use ohai here instead -- FIXME
|
267
|
+
until dev_exists? vol do
|
225
268
|
puts "waiting for volume #{vol}"
|
226
269
|
sleep 2
|
227
270
|
end
|
228
271
|
end
|
229
272
|
|
230
|
-
def
|
231
|
-
puts "
|
232
|
-
|
233
|
-
puts "TASK: #{t[:description]}"
|
234
|
-
t[:blk].call
|
235
|
-
end
|
236
|
-
puts "----"
|
273
|
+
def shell(cmd)
|
274
|
+
puts "# #{cmd}"
|
275
|
+
puts Rush.bash cmd
|
237
276
|
end
|
238
277
|
|
239
|
-
def
|
240
|
-
|
241
|
-
puts Rush.bash cmd, :env => env
|
278
|
+
def init?
|
279
|
+
@init ||= false
|
242
280
|
end
|
243
281
|
|
244
|
-
def task(description, &blk)
|
282
|
+
def task(description, options = {} &blk)
|
283
|
+
return if options[:init] and not init?
|
245
284
|
@tasks << { :description => description, :blk => blk }
|
246
285
|
end
|
247
286
|
|
248
|
-
def
|
249
|
-
|
287
|
+
def dev_exists?(dev)
|
288
|
+
File.exists?("/sys/block/#{File.basename(dev)}")
|
250
289
|
end
|
251
290
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kuzushi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Orion Henry
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-02-
|
12
|
+
date: 2010-02-21 00:00:00 -05:00
|
13
13
|
default_executable: kuzushi
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|