baker 0.1.0
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/README.markdown +18 -0
- data/Rakefile +32 -0
- data/bin/baker +10 -0
- data/gemspec.rb +18 -0
- data/lib/baker.rb +93 -0
- metadata +66 -0
data/README.markdown
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'rake/gempackagetask'
|
4
|
+
require 'spec/rake/spectask'
|
5
|
+
require 'gemspec'
|
6
|
+
|
7
|
+
desc "Generate gemspec"
|
8
|
+
task :gemspec do
|
9
|
+
File.open("#{Dir.pwd}/#{GEM_NAME}.gemspec", 'w') do |f|
|
10
|
+
f.write(GEM_SPEC.to_ruby)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "Install gem"
|
15
|
+
task :install do
|
16
|
+
sudo = ENV['SUDO'].nil? ? '' : 'sudo '
|
17
|
+
Rake::Task['gem'].invoke
|
18
|
+
`#{sudo} gem uninstall #{GEM_NAME} -x`
|
19
|
+
`#{sudo} gem install pkg/#{GEM_NAME}*.gem`
|
20
|
+
`rm -Rf pkg`
|
21
|
+
end
|
22
|
+
|
23
|
+
desc "Package gem"
|
24
|
+
Rake::GemPackageTask.new(GEM_SPEC) do |pkg|
|
25
|
+
pkg.gem_spec = GEM_SPEC
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "Run specs"
|
29
|
+
Spec::Rake::SpecTask.new do |t|
|
30
|
+
t.spec_opts = ["--format", "specdoc", "--colour"]
|
31
|
+
t.spec_files = FileList["spec/**/*_spec.rb"]
|
32
|
+
end
|
data/bin/baker
ADDED
data/gemspec.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
GEM_NAME = 'baker'
|
2
|
+
GEM_FILES = FileList['**/*'] - FileList['coverage', 'coverage/**/*', 'pkg', 'pkg/**/*']
|
3
|
+
GEM_SPEC = Gem::Specification.new do |s|
|
4
|
+
# == CONFIGURE ==
|
5
|
+
s.author = "Tung Nguyen"
|
6
|
+
s.email = "tongueroo@gmail.com"
|
7
|
+
s.homepage = "http://github.com/tongueroo/#{GEM_NAME}"
|
8
|
+
s.summary = "A simple way to run chef recipes"
|
9
|
+
# == CONFIGURE ==
|
10
|
+
s.executables += [GEM_NAME]
|
11
|
+
s.extra_rdoc_files = [ "README.markdown" ]
|
12
|
+
s.files = GEM_FILES.to_a
|
13
|
+
s.has_rdoc = false
|
14
|
+
s.name = GEM_NAME
|
15
|
+
s.platform = Gem::Platform::RUBY
|
16
|
+
s.require_path = "lib"
|
17
|
+
s.version = "0.1.0"
|
18
|
+
end
|
data/lib/baker.rb
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
# TODO: upload config files: dna.json and solo.rb
|
2
|
+
|
3
|
+
require 'net/ssh'
|
4
|
+
require 'pp'
|
5
|
+
|
6
|
+
class Baker
|
7
|
+
def self.run(host)
|
8
|
+
new(host)
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(host, user = nil)
|
12
|
+
log "start running chef recipes on #{host}"
|
13
|
+
@debug = true
|
14
|
+
@host = host
|
15
|
+
@user = user
|
16
|
+
Net::SSH.start(@host, @user) do |ssh|
|
17
|
+
check
|
18
|
+
upload_chef_configs(ssh)
|
19
|
+
upload_recipes(ssh)
|
20
|
+
run_chef(ssh)
|
21
|
+
end
|
22
|
+
log "done running chef recipes on #{host}"
|
23
|
+
end
|
24
|
+
|
25
|
+
def check
|
26
|
+
if !File.exist?('cookbooks')
|
27
|
+
raise "not in chef cookbooks project need to be in one"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
def upload_chef_configs(ssh)
|
31
|
+
log "uploading chef configs to #{@host}..."
|
32
|
+
if !File.exist?("config/baker/dna.json") or !File.exist?("config/baker/solo.rb")
|
33
|
+
raise "need to create a config/baker/dna.json and config/baker/solo.rb file, so it can be uploaded to the server that needs it"
|
34
|
+
end
|
35
|
+
bash_exec("tar czf chef-config.tgz config/baker")
|
36
|
+
bash_exec("scp chef-config.tgz #{@host}:")
|
37
|
+
ssh_exec(ssh, "rm -rf chef-config && tar -zxf chef-config.tgz && mv config/baker chef-config")
|
38
|
+
ssh_exec(ssh, "rm -f chef-config.tgz")
|
39
|
+
bash_exec("rm -f chef-config.tgz")
|
40
|
+
end
|
41
|
+
def upload_recipes(ssh)
|
42
|
+
log "uploading chef recipes to #{@host}..."
|
43
|
+
@file_cache_path = "/tmp/chef-solo"
|
44
|
+
@recipes_path = "/tmp/chef-solo/recipes"
|
45
|
+
# create
|
46
|
+
bash_exec("tar czf recipes.tgz .")
|
47
|
+
# upload
|
48
|
+
bash_exec("scp recipes.tgz #{@host}:")
|
49
|
+
# move
|
50
|
+
ssh_exec(ssh, "rm -rf #{@recipes_path}")
|
51
|
+
ssh_exec(ssh, "mkdir -p #{@recipes_path}")
|
52
|
+
ssh_exec(ssh, "tar -zxf recipes.tgz -C #{@recipes_path}")
|
53
|
+
bash_exec("rm recipes.tgz")
|
54
|
+
end
|
55
|
+
|
56
|
+
def run_chef(ssh)
|
57
|
+
log "running chef recipes on #{@host}..."
|
58
|
+
chef_cmd = "chef-solo -c ~/chef-config/solo.rb -j ~/chef-config/dna.json"
|
59
|
+
log "chef_cmd : #{chef_cmd}"
|
60
|
+
ssh_exec(ssh, chef_cmd)
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
def log(msg)
|
65
|
+
puts msg
|
66
|
+
end
|
67
|
+
def debug(msg)
|
68
|
+
puts msg if @debug
|
69
|
+
end
|
70
|
+
def bash_exec(command)
|
71
|
+
`#{command}`
|
72
|
+
end
|
73
|
+
def ssh_exec(ssh, command)
|
74
|
+
|
75
|
+
unless ARGV.empty?
|
76
|
+
debug "Executing command: #{command}"
|
77
|
+
end
|
78
|
+
|
79
|
+
stdout = ""
|
80
|
+
ssh.exec!(command) do |channel, stream, data|
|
81
|
+
stdout << data if stream == :stdout
|
82
|
+
end
|
83
|
+
output = stdout
|
84
|
+
|
85
|
+
if output and @debug
|
86
|
+
output = output.split("\n").join("\n ")
|
87
|
+
debug " ssh output: #{output}"
|
88
|
+
end
|
89
|
+
|
90
|
+
output
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
metadata
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: baker
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
version: 0.1.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Tung Nguyen
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-03-19 00:00:00 -07:00
|
18
|
+
default_executable:
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description:
|
22
|
+
email: tongueroo@gmail.com
|
23
|
+
executables:
|
24
|
+
- baker
|
25
|
+
extensions: []
|
26
|
+
|
27
|
+
extra_rdoc_files:
|
28
|
+
- README.markdown
|
29
|
+
files:
|
30
|
+
- bin/baker
|
31
|
+
- gemspec.rb
|
32
|
+
- lib/baker.rb
|
33
|
+
- Rakefile
|
34
|
+
- README.markdown
|
35
|
+
has_rdoc: true
|
36
|
+
homepage: http://github.com/tongueroo/baker
|
37
|
+
licenses: []
|
38
|
+
|
39
|
+
post_install_message:
|
40
|
+
rdoc_options: []
|
41
|
+
|
42
|
+
require_paths:
|
43
|
+
- lib
|
44
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
segments:
|
49
|
+
- 0
|
50
|
+
version: "0"
|
51
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
segments:
|
56
|
+
- 0
|
57
|
+
version: "0"
|
58
|
+
requirements: []
|
59
|
+
|
60
|
+
rubyforge_project:
|
61
|
+
rubygems_version: 1.3.6
|
62
|
+
signing_key:
|
63
|
+
specification_version: 3
|
64
|
+
summary: A simple way to run chef recipes
|
65
|
+
test_files: []
|
66
|
+
|