chake 0.10.2 → 0.11
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.
- checksums.yaml +4 -4
- data/ChangeLog.md +11 -0
- data/README.md +57 -1
- data/lib/chake.rb +66 -10
- data/lib/chake/bootstrap/00_set_hostname.sh +5 -0
- data/lib/chake/readline.rb +44 -12
- data/lib/chake/tmpdir.rb +5 -0
- data/lib/chake/version.rb +1 -1
- data/spec/spec_helper.rb +6 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1984eadb9d5b222a4e1aed1b8180b04819c8158b
|
4
|
+
data.tar.gz: ec4ed19becc23cbe25377524ddc800fbc8da1e4c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 32a7a9675766f6ea039d8e1c07587c210e831e97d497f2f229be1f4253b2c0c1374a74be6e27f679fd5eedaa4905ca380a02d98d5e41fceb69989240be3e4576
|
7
|
+
data.tar.gz: 775af5a4f9d52c8d70a10cab818a235a6af76b8b167c7616d6fcb97dcd343195f44da6df986200bc19f19dfb04a6e5bfa696d2d8831dc324e2d2ef9da4bf5819
|
data/ChangeLog.md
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
# 0.11
|
2
|
+
|
3
|
+
* bootstrap: make sure FQDN matches hostname
|
4
|
+
* Add `rake check` task to check SSH connectivity and sudo setup
|
5
|
+
* Add tasks to apply a single recipe to nodes: `rake apply[recipe]` and `rake
|
6
|
+
apply:$NODE[recipe]`. If `[recipe]` is not passed in the command line, the
|
7
|
+
user is prompted for the recipe name.
|
8
|
+
* run task changed to have the same interface and behavior as the new apply
|
9
|
+
task: `rake run[command]`, or `rake run:$NODE[command]`. If `[command]` is
|
10
|
+
not passed in the command line, the user is prompted for the command.
|
11
|
+
|
1
12
|
# 0.10.2
|
2
13
|
|
3
14
|
* Fix check for modified files at the upload phase. Now chake will properly
|
data/README.md
CHANGED
@@ -38,7 +38,7 @@ A brief explanation of the created files:
|
|
38
38
|
After the repository is created, you can call either `chake` or `rake`, as they
|
39
39
|
are completely equivalent.
|
40
40
|
|
41
|
-
## Managing nodes
|
41
|
+
## Managing nodes
|
42
42
|
|
43
43
|
Just after you created your repository, the contents of `nodes.yaml` is the
|
44
44
|
following:
|
@@ -95,6 +95,24 @@ password prompts, you can:
|
|
95
95
|
- Configure passwordless `sudo` access for the user you use to connect to your
|
96
96
|
nodes.
|
97
97
|
|
98
|
+
## Checking connectivity and initial host setup
|
99
|
+
|
100
|
+
To check whether hosts are correcly configured, you can use the `check` task:
|
101
|
+
|
102
|
+
```bash
|
103
|
+
$ rake check
|
104
|
+
```
|
105
|
+
|
106
|
+
That will run the the `sudo true` command on each host. If that pass without
|
107
|
+
you having to passwords, you are sure that
|
108
|
+
|
109
|
+
* you have SSH access to each host; and
|
110
|
+
* the user you are connecting as has password-less sudo correctly setup.
|
111
|
+
|
112
|
+
```bash
|
113
|
+
$ rake check
|
114
|
+
```
|
115
|
+
|
98
116
|
## Applying cookbooks
|
99
117
|
|
100
118
|
To apply the configuration to all nodes, run
|
@@ -109,6 +127,44 @@ To apply the configuration to a single node, run
|
|
109
127
|
$ rake converge:$NODE
|
110
128
|
```
|
111
129
|
|
130
|
+
To apply a single recipe on all nodes, run
|
131
|
+
|
132
|
+
```bash
|
133
|
+
$ rake apply[myrecipe]
|
134
|
+
```
|
135
|
+
|
136
|
+
To apply a single recipe on a specific node, run
|
137
|
+
|
138
|
+
```bash
|
139
|
+
$ rake apply:$NODE[myrecipe]
|
140
|
+
```
|
141
|
+
|
142
|
+
If you don't inform a recipe in the command line, you will be prompted for one.
|
143
|
+
|
144
|
+
To run a shell command on all nodes, run
|
145
|
+
|
146
|
+
```
|
147
|
+
$ rake run[command]
|
148
|
+
```
|
149
|
+
|
150
|
+
If the `command` you want to run contains spaces, or other characters that are
|
151
|
+
special do the shell, you have to quote them.
|
152
|
+
|
153
|
+
To run a shell command on a specific node, run
|
154
|
+
|
155
|
+
```
|
156
|
+
$ rake run:$NODE[command]
|
157
|
+
```
|
158
|
+
|
159
|
+
If you don't inform a command in the command line, you will be prompted for
|
160
|
+
one.
|
161
|
+
|
162
|
+
To check the existing tasks, run
|
163
|
+
|
164
|
+
```bash
|
165
|
+
$ rake -T
|
166
|
+
```
|
167
|
+
|
112
168
|
## Writing cookbooks
|
113
169
|
|
114
170
|
Since chake is actually a wrapper for Chef Solo, you should read the [chef
|
data/lib/chake.rb
CHANGED
@@ -7,6 +7,7 @@ require 'tmpdir'
|
|
7
7
|
require 'chake/version'
|
8
8
|
require 'chake/node'
|
9
9
|
require 'chake/readline'
|
10
|
+
require 'chake/tmpdir'
|
10
11
|
|
11
12
|
nodes_file = ENV['CHAKE_NODES'] || 'nodes.yaml'
|
12
13
|
nodes_directory = ENV['CHAKE_NODES_D'] || 'nodes.d'
|
@@ -15,7 +16,7 @@ Dir.glob(File.join(nodes_directory, '*.yaml')).sort.each do |f|
|
|
15
16
|
node_data.merge!(YAML.load_file(f))
|
16
17
|
end
|
17
18
|
$nodes = node_data.map { |node,data| Chake::Node.new(node, data) }.reject(&:skip?).uniq(&:hostname)
|
18
|
-
$chake_tmpdir =
|
19
|
+
$chake_tmpdir = Chake.tmpdir
|
19
20
|
|
20
21
|
desc "Initializes current directory with sample structure"
|
21
22
|
task :init do
|
@@ -206,33 +207,80 @@ $nodes.each do |node|
|
|
206
207
|
end
|
207
208
|
end
|
208
209
|
|
210
|
+
converge_dependencies = [:converge_common, "bootstrap:#{hostname}", "upload:#{hostname}"]
|
211
|
+
|
209
212
|
desc "converge #{hostname}"
|
210
|
-
task "converge:#{hostname}" =>
|
213
|
+
task "converge:#{hostname}" => converge_dependencies do
|
211
214
|
chef_logging = Rake.application.options.silent && '-l fatal' || ''
|
212
215
|
node.run_as_root "chef-solo -c #{node.path}/config.rb #{chef_logging} -j #{node.path}/#{$chake_tmpdir}/#{hostname}.json"
|
213
216
|
end
|
214
217
|
|
218
|
+
desc 'apply <recipe> on #{hostname}'
|
219
|
+
task "apply:#{hostname}", [:recipe] => [:recipe_input] do |task, args|
|
220
|
+
chef_logging = Rake.application.options.silent && '-l fatal' || ''
|
221
|
+
node.run_as_root "chef-solo -c #{node.path}/config.rb #{chef_logging} -j #{node.path}/#{$chake_tmpdir}/#{hostname}.json --override-runlist recipe[#{$recipe_to_apply}]"
|
222
|
+
end
|
223
|
+
task "apply:#{hostname}" => converge_dependencies
|
224
|
+
|
215
225
|
desc "run a command on #{hostname}"
|
216
|
-
task "run:#{hostname}" =>
|
217
|
-
node.run($
|
226
|
+
task "run:#{hostname}", [:command] => [:run_input] do
|
227
|
+
node.run($cmd_to_run)
|
218
228
|
end
|
219
229
|
|
220
230
|
desc "Logs in to a shell on #{hostname}"
|
221
231
|
task "login:#{hostname}" do
|
222
232
|
node.run_shell
|
223
233
|
end
|
234
|
+
|
235
|
+
desc 'checks connectivity and setup on all nodes'
|
236
|
+
task "check:#{hostname}" do
|
237
|
+
node.run('sudo true')
|
238
|
+
end
|
239
|
+
|
224
240
|
end
|
225
241
|
|
226
|
-
task :run_input do
|
227
|
-
|
228
|
-
|
229
|
-
|
242
|
+
task :run_input, :command do |task,args|
|
243
|
+
$cmd_to_run = args[:command]
|
244
|
+
if !$cmd_to_run
|
245
|
+
puts "# Enter command to run (use arrow keys for history):"
|
246
|
+
$cmd_to_run = Chake::Readline::Commands.readline
|
247
|
+
end
|
248
|
+
if !$cmd_to_run || $cmd_to_run.strip == ''
|
230
249
|
puts
|
231
250
|
puts "I: no command provided, operation aborted."
|
232
251
|
exit(1)
|
233
252
|
end
|
234
253
|
end
|
235
254
|
|
255
|
+
task :recipe_input, :recipe do |task,args|
|
256
|
+
$recipe_to_apply = args[:recipe]
|
257
|
+
|
258
|
+
if !$recipe_to_apply
|
259
|
+
recipes = Dir['**/*/recipes/*.rb'].map do |f|
|
260
|
+
f =~ %r{(.*/)?(.*)/recipes/(.*).rb$}
|
261
|
+
cookbook = $2
|
262
|
+
recipe = $3
|
263
|
+
recipe = nil if recipe == 'default'
|
264
|
+
[cookbook,recipe].compact.join('::')
|
265
|
+
end.sort
|
266
|
+
puts 'Available recipes:'
|
267
|
+
|
268
|
+
IO.popen('column', 'w') do |column|
|
269
|
+
column.puts(recipes)
|
270
|
+
end
|
271
|
+
|
272
|
+
$recipe_to_apply = Chake::Readline::Recipes.readline
|
273
|
+
if !$recipe_to_apply || $recipe_to_apply.empty?
|
274
|
+
puts
|
275
|
+
puts "I: no recipe provided, operation aborted."
|
276
|
+
exit(1)
|
277
|
+
end
|
278
|
+
if !recipes.include?($recipe_to_apply)
|
279
|
+
abort "E: no such recipe: #{$recipe_to_apply}"
|
280
|
+
end
|
281
|
+
end
|
282
|
+
end
|
283
|
+
|
236
284
|
desc "upload to all nodes"
|
237
285
|
task :upload => $nodes.map { |node| "upload:#{node.hostname}" }
|
238
286
|
|
@@ -242,7 +290,15 @@ task :bootstrap => $nodes.map { |node| "bootstrap:#{node.hostname}" }
|
|
242
290
|
desc "converge all nodes (default)"
|
243
291
|
task "converge" => $nodes.map { |node| "converge:#{node.hostname}" }
|
244
292
|
|
245
|
-
desc "
|
246
|
-
task :
|
293
|
+
desc "Apply <recipe> on all nodes"
|
294
|
+
task "apply", [:recipe] => $nodes.map { |node| "apply:#{node.hostname}" }
|
295
|
+
|
296
|
+
desc "run <command> on all nodes"
|
297
|
+
task :run, [:command] => $nodes.map { |node| "run:#{node.hostname}" }
|
247
298
|
|
248
299
|
task :default => :converge
|
300
|
+
|
301
|
+
desc 'checks connectivity and setup on all nodes'
|
302
|
+
task :check => ($nodes.map { |node| "check:#{node.hostname}" }) do
|
303
|
+
puts "✓ all hosts OK"
|
304
|
+
end
|
@@ -3,6 +3,11 @@ hostname="$1"
|
|
3
3
|
echo "$hostname" > /etc/hostname
|
4
4
|
hostname --file /etc/hostname
|
5
5
|
|
6
|
+
fqdn=$(hostname --fqdn || true)
|
7
|
+
if [ "$fqdn" != "$hostname" ]; then
|
8
|
+
printf "127.0.1.1\t%s\n" "$hostname" >> /etc/hosts
|
9
|
+
fi
|
10
|
+
|
6
11
|
# Stop cloud-init from resetting the hostname
|
7
12
|
if [ -f /etc/cloud/cloud.cfg ]; then
|
8
13
|
sed -i -e '/^\s*-\s*\(set_hostname\|update_hostname\)/d' /etc/cloud/cloud.cfg
|
data/lib/chake/readline.rb
CHANGED
@@ -1,26 +1,33 @@
|
|
1
1
|
require 'etc'
|
2
2
|
require 'readline'
|
3
3
|
|
4
|
+
require 'chake/tmpdir'
|
5
|
+
|
4
6
|
module Chake
|
5
7
|
|
6
|
-
|
8
|
+
class Readline
|
7
9
|
|
8
10
|
class << self
|
9
11
|
|
10
12
|
def history_file
|
11
|
-
|
13
|
+
raise NotImplementedError
|
14
|
+
end
|
15
|
+
|
16
|
+
def history
|
17
|
+
@history ||= []
|
18
|
+
end
|
19
|
+
|
20
|
+
def prompt
|
21
|
+
raise NotImplementedError
|
12
22
|
end
|
13
23
|
|
14
24
|
def init
|
15
25
|
return if !File.exists?(history_file)
|
16
|
-
File.readlines(history_file).
|
17
|
-
@last = line.strip
|
18
|
-
::Readline::HISTORY.push(@last)
|
19
|
-
end
|
26
|
+
@history = File.readlines(history_file).map(&:strip)
|
20
27
|
end
|
21
28
|
|
22
29
|
def finish
|
23
|
-
|
30
|
+
return if !File.writable?(File.dirname(history_file)) || history.empty?
|
24
31
|
File.open(history_file, 'w') do |f|
|
25
32
|
history.last(500).each do |line|
|
26
33
|
f.puts(line)
|
@@ -29,20 +36,45 @@ module Chake
|
|
29
36
|
end
|
30
37
|
|
31
38
|
def readline
|
32
|
-
|
39
|
+
::Readline::HISTORY.clear
|
40
|
+
history.each do |cmd|
|
41
|
+
::Readline::HISTORY.push(cmd)
|
42
|
+
end
|
43
|
+
input = ::Readline.readline(prompt)
|
33
44
|
if input && input.strip != '' && input != @last
|
34
|
-
|
45
|
+
history.push(input)
|
35
46
|
end
|
36
47
|
input
|
37
48
|
end
|
38
49
|
|
39
50
|
end
|
40
51
|
|
52
|
+
class Commands < Readline
|
53
|
+
def self.history_file
|
54
|
+
File.join(Chake.tmpdir, '.commands_history')
|
55
|
+
end
|
56
|
+
def self.prompt
|
57
|
+
'$ '
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
class Recipes < Readline
|
62
|
+
def self.history_file
|
63
|
+
File.join(Chake.tmpdir, '.recipes_history')
|
64
|
+
end
|
65
|
+
def self.prompt
|
66
|
+
'> '
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
41
70
|
end
|
42
71
|
|
43
72
|
end
|
44
73
|
|
45
|
-
Chake::Readline.
|
46
|
-
|
47
|
-
|
74
|
+
Chake::Readline.constants.each do |subclass|
|
75
|
+
subclass = Chake::Readline.const_get(subclass)
|
76
|
+
subclass.init
|
77
|
+
at_exit do
|
78
|
+
subclass.finish
|
79
|
+
end
|
48
80
|
end
|
data/lib/chake/tmpdir.rb
ADDED
data/lib/chake/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chake
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.11'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Antonio Terceiro
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-11-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -101,6 +101,7 @@ files:
|
|
101
101
|
- lib/chake/bootstrap/99_unsupported.sh
|
102
102
|
- lib/chake/node.rb
|
103
103
|
- lib/chake/readline.rb
|
104
|
+
- lib/chake/tmpdir.rb
|
104
105
|
- lib/chake/version.rb
|
105
106
|
- man/.gitignore
|
106
107
|
- man/Rakefile
|
@@ -140,4 +141,3 @@ test_files:
|
|
140
141
|
- spec/chake/backend_spec.rb
|
141
142
|
- spec/chake/node_spec.rb
|
142
143
|
- spec/spec_helper.rb
|
143
|
-
has_rdoc:
|