caterer 0.11.2 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +34 -116
- data/Vagrantfile +4 -4
- data/lib/caterer.rb +3 -0
- data/lib/caterer/action.rb +1 -0
- data/lib/caterer/action/berkshelf/install.rb +3 -1
- data/lib/caterer/action/config/validate/provisioner.rb +16 -10
- data/lib/caterer/action/image.rb +9 -0
- data/lib/caterer/action/image/cleanup.rb +20 -0
- data/lib/caterer/action/image/prepare.rb +20 -0
- data/lib/caterer/action/image/run.rb +20 -0
- data/lib/caterer/action/provisioner.rb +0 -7
- data/lib/caterer/action/provisioner/cleanup.rb +19 -1
- data/lib/caterer/action/provisioner/prepare.rb +20 -2
- data/lib/caterer/action/provisioner/uninstall.rb +9 -1
- data/lib/caterer/action/server.rb +2 -1
- data/lib/caterer/action/{provisioner/install.rb → server/cleanup.rb} +5 -5
- data/lib/caterer/action/server/{reboot.rb → prepare.rb} +4 -2
- data/lib/caterer/actions.rb +8 -46
- data/lib/caterer/cli.rb +50 -4
- data/lib/caterer/command.rb +1 -4
- data/lib/caterer/command/base.rb +17 -108
- data/lib/caterer/command/berks.rb +5 -8
- data/lib/caterer/command/clean.rb +6 -4
- data/lib/caterer/command/lock.rb +5 -3
- data/lib/caterer/command/provision.rb +19 -4
- data/lib/caterer/command/server.rb +106 -0
- data/lib/caterer/command/unlock.rb +5 -3
- data/lib/caterer/commands.rb +0 -3
- data/lib/caterer/config.rb +0 -5
- data/lib/caterer/config/base.rb +5 -4
- data/lib/caterer/config/provisioner/chef_solo.rb +1 -2
- data/lib/caterer/group.rb +24 -0
- data/lib/caterer/image.rb +88 -0
- data/lib/caterer/member.rb +13 -0
- data/lib/caterer/provisioner.rb +1 -0
- data/lib/caterer/provisioner/base.rb +4 -3
- data/lib/caterer/provisioner/chef_solo.rb +58 -123
- data/lib/caterer/provisioner/shell.rb +83 -0
- data/lib/caterer/provisioners.rb +2 -1
- data/lib/caterer/server.rb +18 -36
- data/lib/caterer/version.rb +1 -1
- data/lib/templates/image/bin_wrapper.erb +8 -0
- data/lib/templates/provisioner/chef_solo/{bootstrap → install}/debian.sh +0 -0
- data/lib/templates/provisioner/chef_solo/{bootstrap → install}/el.sh +0 -0
- data/lib/templates/provisioner/chef_solo/{bootstrap → install}/fedora.sh +0 -0
- data/lib/templates/provisioner/chef_solo/{bootstrap → install}/sles.sh +0 -0
- data/lib/templates/provisioner/chef_solo/{bootstrap → install}/smartos.sh +0 -0
- data/lib/templates/provisioner/chef_solo/{bootstrap → install}/suse.sh +0 -0
- data/lib/templates/provisioner/chef_solo/{bootstrap → install}/ubuntu.sh +0 -0
- data/lib/templates/provisioner/chef_solo/solo.erb +1 -1
- data/lib/templates/provisioner/shell/script.erb +3 -0
- metadata +24 -26
- data/lib/caterer/action/provisioner/bootstrap.rb +0 -14
- data/lib/caterer/action/provisioner/load.rb +0 -29
- data/lib/caterer/action/provisioner/provision.rb +0 -14
- data/lib/caterer/action/provisioner/validate.rb +0 -10
- data/lib/caterer/action/provisioner/validate/bootstrapped.rb +0 -22
- data/lib/caterer/action/provisioner/validate/engine.rb +0 -24
- data/lib/caterer/command/bootstrap.rb +0 -24
- data/lib/caterer/command/reboot.rb +0 -24
- data/lib/caterer/command/test.rb +0 -19
- data/lib/caterer/command/up.rb +0 -24
- data/lib/caterer/config/group.rb +0 -26
- data/lib/caterer/config/image.rb +0 -21
- data/lib/caterer/config/member.rb +0 -15
@@ -0,0 +1,106 @@
|
|
1
|
+
module Caterer
|
2
|
+
module Command
|
3
|
+
class Server < Base
|
4
|
+
|
5
|
+
def add_server_opts(parser, options)
|
6
|
+
parser.separator ""
|
7
|
+
parser.on("-c CONFIG", 'assumes Caterfile in current directory')
|
8
|
+
parser.separator ""
|
9
|
+
parser.on("-u USER", "--user USER", 'assumes current username') do |u|
|
10
|
+
options[:user] = u
|
11
|
+
end
|
12
|
+
parser.on('-p PASSWORD', '--password PASSWORD', 'assumes key') do |p|
|
13
|
+
options[:pass] = p
|
14
|
+
end
|
15
|
+
parser.on('-k KEY', '--key KEY', 'path to private key') do |k|
|
16
|
+
options[:key] = k
|
17
|
+
end
|
18
|
+
parser.on('-P PORT', '--port PORT', 'assumes 22') do |p|
|
19
|
+
options[:port] = p
|
20
|
+
end
|
21
|
+
parser.on('-i IMAGE', '--image IMAGE', 'corresponds to a image in Caterfile') do |i|
|
22
|
+
options[:image] = i
|
23
|
+
end
|
24
|
+
parser.on('-g GROUP', '--group GROUP', 'corresponds to a group in Caterfile') do |g|
|
25
|
+
options[:group] = g
|
26
|
+
end
|
27
|
+
parser.separator ""
|
28
|
+
end
|
29
|
+
|
30
|
+
def with_target_servers(argv, options={})
|
31
|
+
target_servers(argv, options).each do |server|
|
32
|
+
yield server if block_given?
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def target_servers(argv, options={})
|
37
|
+
@servers ||= begin
|
38
|
+
servers = []
|
39
|
+
|
40
|
+
argv.first.split(",").each do |host|
|
41
|
+
|
42
|
+
if group = @env.config.groups[host.to_sym]
|
43
|
+
group.members.each do |key, member|
|
44
|
+
servers << init_server(group, member, options)
|
45
|
+
end
|
46
|
+
else
|
47
|
+
|
48
|
+
if not host.match /::/
|
49
|
+
host = "default::#{host}"
|
50
|
+
end
|
51
|
+
|
52
|
+
g, m = host.split "::"
|
53
|
+
group = nil
|
54
|
+
member = nil
|
55
|
+
|
56
|
+
if group = @env.config.groups[g.to_sym]
|
57
|
+
member = group.members[m.to_sym]
|
58
|
+
end
|
59
|
+
|
60
|
+
servers << init_server(group, member, options.merge(:host => m))
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
servers
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def init_server(group=nil, member=nil, options={})
|
69
|
+
|
70
|
+
group ||= Config::Group.new
|
71
|
+
member ||= Config::Member.new
|
72
|
+
|
73
|
+
opts = {}
|
74
|
+
opts[:alias] = member.name
|
75
|
+
opts[:user] = options[:user] || member.user || group.user
|
76
|
+
opts[:pass] = options[:pass] || member.password || group.password
|
77
|
+
opts[:host] = member.host || options[:host]
|
78
|
+
opts[:port] = options[:port] || member.port
|
79
|
+
opts[:images] = image_list(options) || member.images || group.images
|
80
|
+
opts[:key] = options[:key] || member.key || group.key
|
81
|
+
|
82
|
+
opts[:data] = begin
|
83
|
+
|
84
|
+
data = group.data.merge(member.data)
|
85
|
+
|
86
|
+
if options[:data]
|
87
|
+
# todo: rather than puking if the json is valid, this should create a pretty language
|
88
|
+
json = MultiJson.load options[:data], :symbolize_keys => true
|
89
|
+
data = data.merge(json) if json and json.is_a? Hash
|
90
|
+
end
|
91
|
+
|
92
|
+
data
|
93
|
+
end
|
94
|
+
|
95
|
+
Caterer::Server.new(@env, opts)
|
96
|
+
end
|
97
|
+
|
98
|
+
def image_list(options={})
|
99
|
+
if images = options[:image]
|
100
|
+
images.split(',').map(&:to_sym)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -1,15 +1,17 @@
|
|
1
1
|
module Caterer
|
2
2
|
module Command
|
3
|
-
class Unlock <
|
3
|
+
class Unlock < Server
|
4
4
|
|
5
5
|
def execute
|
6
6
|
options = {}
|
7
|
-
|
7
|
+
parser = OptionParser.new do |opts|
|
8
8
|
opts.banner = "Usage: cater unlock HOST [options]"
|
9
9
|
end
|
10
10
|
|
11
|
+
add_server_opts(parser, options)
|
12
|
+
|
11
13
|
# Parse the options
|
12
|
-
argv = parse_options(
|
14
|
+
argv = parse_options(parser, true)
|
13
15
|
return if not argv
|
14
16
|
|
15
17
|
with_target_servers(argv, options) do |server|
|
data/lib/caterer/commands.rb
CHANGED
@@ -1,8 +1,5 @@
|
|
1
1
|
# commands
|
2
|
-
Caterer.commands.register(:bootstrap) { Caterer::Command::Bootstrap }
|
3
2
|
Caterer.commands.register(:clean) { Caterer::Command::Clean }
|
4
3
|
Caterer.commands.register(:lock) { Caterer::Command::Lock }
|
5
4
|
Caterer.commands.register(:provision) { Caterer::Command::Provision }
|
6
|
-
Caterer.commands.register(:reboot) { Caterer::Command::Reboot }
|
7
5
|
Caterer.commands.register(:unlock) { Caterer::Command::Unlock }
|
8
|
-
Caterer.commands.register(:up) { Caterer::Command::Up }
|
data/lib/caterer/config.rb
CHANGED
@@ -2,11 +2,6 @@ module Caterer
|
|
2
2
|
module Config
|
3
3
|
autoload :Base, 'caterer/config/base'
|
4
4
|
autoload :Berkshelf, 'caterer/config/berkshelf'
|
5
|
-
autoload :Cluster, 'caterer/config/cluster'
|
6
|
-
autoload :Group, 'caterer/config/group'
|
7
|
-
autoload :Member, 'caterer/config/member'
|
8
|
-
autoload :Node, 'caterer/config/node'
|
9
|
-
autoload :Image, 'caterer/config/image'
|
10
5
|
autoload :Provisioner, 'caterer/config/provisioner'
|
11
6
|
end
|
12
7
|
end
|
data/lib/caterer/config/base.rb
CHANGED
@@ -3,12 +3,13 @@ module Caterer
|
|
3
3
|
class Base
|
4
4
|
|
5
5
|
attr_reader :images, :groups
|
6
|
-
attr_accessor :
|
6
|
+
attr_accessor :dest_dir
|
7
7
|
|
8
8
|
def initialize
|
9
|
-
@images
|
10
|
-
@groups
|
11
|
-
@keys
|
9
|
+
@images = {}
|
10
|
+
@groups = {}
|
11
|
+
@keys = {}
|
12
|
+
@dest_dir = '/opt/cater'
|
12
13
|
end
|
13
14
|
|
14
15
|
def image(name)
|
@@ -2,10 +2,9 @@ module Caterer
|
|
2
2
|
module Config
|
3
3
|
module Provisioner
|
4
4
|
class ChefSolo
|
5
|
-
attr_accessor :
|
5
|
+
attr_accessor :run_list, :json, :cookbooks_path, :roles_path, :data_bags_path, :bootstrap_scripts
|
6
6
|
|
7
7
|
def initialize
|
8
|
-
@dest_dir = '/opt/cater/chef_solo'
|
9
8
|
@run_list = []
|
10
9
|
@json = {}
|
11
10
|
@cookbooks_path = ['cookbooks']
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Caterer
|
2
|
+
class Group
|
3
|
+
|
4
|
+
attr_reader :name
|
5
|
+
attr_accessor :images, :members, :user, :password, :key, :data
|
6
|
+
|
7
|
+
def initialize(name=nil)
|
8
|
+
@name = name
|
9
|
+
@images = []
|
10
|
+
@members = {}
|
11
|
+
@data = {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def add_image(image)
|
15
|
+
@images << image
|
16
|
+
end
|
17
|
+
|
18
|
+
def member(name)
|
19
|
+
@members[name] ||= Member.new(name)
|
20
|
+
yield @members[name] if block_given?
|
21
|
+
@members[name]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'tilt'
|
2
|
+
|
3
|
+
module Caterer
|
4
|
+
class Image
|
5
|
+
|
6
|
+
attr_reader :name, :provisioners
|
7
|
+
|
8
|
+
def initialize(name)
|
9
|
+
@name = name
|
10
|
+
@provisioners = []
|
11
|
+
end
|
12
|
+
|
13
|
+
def provision(type, opts={})
|
14
|
+
provisioner_klass = Caterer.provisioners.get(type)
|
15
|
+
raise ":#{type} is not a valid provisioner" if not provisioner_klass
|
16
|
+
provisioner = provisioner_klass.new(self, opts)
|
17
|
+
yield provisioner if block_given?
|
18
|
+
@provisioners << provisioner
|
19
|
+
provisioner
|
20
|
+
end
|
21
|
+
|
22
|
+
# actions
|
23
|
+
|
24
|
+
def prepare(server)
|
25
|
+
# create bin dir
|
26
|
+
server.ssh.sudo "mkdir -p #{bin_dir}", :stream => true
|
27
|
+
server.ssh.sudo "chown -R #{server.username} #{bin_dir}", :stream => true
|
28
|
+
|
29
|
+
# create lib dir
|
30
|
+
server.ssh.sudo "mkdir -p #{lib_dir}", :stream => true
|
31
|
+
server.ssh.sudo "chown -R #{server.username} #{lib_dir}", :stream => true
|
32
|
+
|
33
|
+
# create var dir
|
34
|
+
server.ssh.sudo "mkdir -p #{var_dir}", :stream => true
|
35
|
+
server.ssh.sudo "chown -R #{server.username} #{var_dir}", :stream => true
|
36
|
+
|
37
|
+
# create bin wrapper
|
38
|
+
server.ui.info "Generating bin wrapper..."
|
39
|
+
server.ssh.upload(StringIO.new(bin_wrapper_content), bin_wrapper_path)
|
40
|
+
server.ssh.sudo "chmod +x #{bin_wrapper_path}", :stream => true
|
41
|
+
end
|
42
|
+
|
43
|
+
def run(server)
|
44
|
+
# run
|
45
|
+
server.ui.info "Running #{name}..."
|
46
|
+
res = server.ssh.sudo bin_wrapper_path, :stream => true
|
47
|
+
unless res == 0
|
48
|
+
server.ui.error "#{name} failed with exit code: #{res}"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def cleanup(server)
|
53
|
+
server.ui.info "Cleaning #{name}..."
|
54
|
+
server.ssh.sudo "rm -rf #{var_dir}"
|
55
|
+
server.ssh.sudo "rm -rf #{lib_dir}"
|
56
|
+
server.ssh.sudo "rm -f #{bin_wrapper_path}"
|
57
|
+
end
|
58
|
+
|
59
|
+
# helpers
|
60
|
+
|
61
|
+
def bin_dir
|
62
|
+
"#{config.dest_dir}/bin"
|
63
|
+
end
|
64
|
+
|
65
|
+
def lib_dir
|
66
|
+
"#{config.dest_dir}/lib/#{name}"
|
67
|
+
end
|
68
|
+
|
69
|
+
def var_dir
|
70
|
+
"#{config.dest_dir}/var/#{name}"
|
71
|
+
end
|
72
|
+
|
73
|
+
def bin_wrapper_path
|
74
|
+
"#{bin_dir}/cater-#{name}"
|
75
|
+
end
|
76
|
+
|
77
|
+
protected
|
78
|
+
|
79
|
+
def config
|
80
|
+
@config ||= Caterer.config
|
81
|
+
end
|
82
|
+
|
83
|
+
def bin_wrapper_content
|
84
|
+
Tilt.new(File.expand_path('../../templates/image/bin_wrapper.erb', __FILE__)).render(self)
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
end
|
data/lib/caterer/provisioner.rb
CHANGED
@@ -2,17 +2,18 @@ module Caterer
|
|
2
2
|
module Provisioner
|
3
3
|
class Base
|
4
4
|
|
5
|
+
attr_reader :image
|
6
|
+
|
5
7
|
# config dsl
|
6
8
|
def errors; end
|
7
9
|
|
8
10
|
# provision dsl
|
9
|
-
def bootstrap(server); end
|
10
|
-
def bootstrapped?(server); true; end
|
11
11
|
def cleanup(server); end
|
12
12
|
def install(server); end
|
13
|
+
def installed?(server); true; end
|
13
14
|
def prepare(server); end
|
14
|
-
def provision(server); end
|
15
15
|
def uninstall(server); end
|
16
|
+
def provision_cmd; end
|
16
17
|
|
17
18
|
end
|
18
19
|
end
|
@@ -10,18 +10,17 @@ module Caterer
|
|
10
10
|
|
11
11
|
include Util::Shell
|
12
12
|
|
13
|
-
attr_reader
|
14
|
-
attr_accessor :
|
15
|
-
attr_accessor :data_bags_path
|
16
|
-
|
17
|
-
def initialize
|
18
|
-
@
|
19
|
-
@run_list
|
20
|
-
@json
|
21
|
-
@cookbooks_path
|
22
|
-
@roles_path
|
23
|
-
@data_bags_path
|
24
|
-
@bootstrap_scripts = config.bootstrap_scripts.dup
|
13
|
+
attr_reader :run_list
|
14
|
+
attr_accessor :json, :cookbooks_path, :roles_path
|
15
|
+
attr_accessor :data_bags_path
|
16
|
+
|
17
|
+
def initialize(image, opts={})
|
18
|
+
@image = image
|
19
|
+
@run_list = provisioner_config.run_list.dup
|
20
|
+
@json = provisioner_config.json.dup
|
21
|
+
@cookbooks_path = provisioner_config.cookbooks_path.dup
|
22
|
+
@roles_path = provisioner_config.roles_path.dup
|
23
|
+
@data_bags_path = provisioner_config.data_bags_path.dup
|
25
24
|
end
|
26
25
|
|
27
26
|
# config DSL
|
@@ -34,27 +33,6 @@ module Caterer
|
|
34
33
|
@run_list << "role[#{role}]"
|
35
34
|
end
|
36
35
|
|
37
|
-
# I don't like this at all, but it seems to make the best Caterfile workflow
|
38
|
-
def add_image(image)
|
39
|
-
image = Caterer.config.images[image]
|
40
|
-
raise "Unknown image :#{image}" if not image
|
41
|
-
|
42
|
-
provisioner = image.provisioner
|
43
|
-
raise "No provisioner for :#{image}" if not provisioner
|
44
|
-
|
45
|
-
if not provisioner.class == self.class
|
46
|
-
raise "add_image incompatibility: #{provisioner.class} != #{self.class}"
|
47
|
-
end
|
48
|
-
|
49
|
-
@run_list += provisioner.run_list
|
50
|
-
@bootstrap_scripts += provisioner.bootstrap_scripts
|
51
|
-
@json = @json.merge(provisioner.json)
|
52
|
-
end
|
53
|
-
|
54
|
-
def add_bootstrap(script)
|
55
|
-
@bootstrap_scripts << script
|
56
|
-
end
|
57
|
-
|
58
36
|
def errors
|
59
37
|
errors = {}
|
60
38
|
|
@@ -81,54 +59,6 @@ module Caterer
|
|
81
59
|
|
82
60
|
# provision engine
|
83
61
|
|
84
|
-
def bootstrap(server)
|
85
|
-
|
86
|
-
# validate
|
87
|
-
with_bootstrap_scripts do |script, count|
|
88
|
-
|
89
|
-
if not File.exists? script
|
90
|
-
server.ui.error "#{script} does not exist!"
|
91
|
-
return
|
92
|
-
end
|
93
|
-
|
94
|
-
end
|
95
|
-
|
96
|
-
# upload
|
97
|
-
with_bootstrap_scripts do |script, count|
|
98
|
-
|
99
|
-
server.ui.info "Uploading #{script}..."
|
100
|
-
server.ssh.upload script, "#{target_bootstrap_path}-#{count}"
|
101
|
-
|
102
|
-
server.ssh.sudo "chown #{server.username} #{target_bootstrap_path}-#{count}", :stream => true
|
103
|
-
server.ssh.sudo "chmod +x #{target_bootstrap_path}-#{count}", :stream => true
|
104
|
-
|
105
|
-
end
|
106
|
-
|
107
|
-
# run
|
108
|
-
with_bootstrap_scripts do |script, count|
|
109
|
-
|
110
|
-
server.ui.info "Running #{script}..."
|
111
|
-
res = server.ssh.sudo "#{target_bootstrap_path}-#{count}", :stream => true
|
112
|
-
|
113
|
-
unless res == 0
|
114
|
-
server.ui.error "#{script} failed with exit code: #{res}"
|
115
|
-
end
|
116
|
-
|
117
|
-
end
|
118
|
-
|
119
|
-
end
|
120
|
-
|
121
|
-
def bootstrapped?(server)
|
122
|
-
res = server.ssh.sudo "command -v chef-solo &>/dev/null"
|
123
|
-
res == 0 ? true : false
|
124
|
-
end
|
125
|
-
|
126
|
-
def prepare(server)
|
127
|
-
# create base dir
|
128
|
-
server.ssh.sudo "mkdir -p #{dest_dir}", :stream => true
|
129
|
-
server.ssh.sudo "chown -R #{server.username} #{dest_dir}", :stream => true
|
130
|
-
end
|
131
|
-
|
132
62
|
def install(server)
|
133
63
|
server.ui.info "Preparing installation..."
|
134
64
|
|
@@ -141,12 +71,30 @@ module Caterer
|
|
141
71
|
|
142
72
|
res = server.ssh.sudo bash(File.read(installer)), :stream => true
|
143
73
|
|
74
|
+
# somewhere mark (on the server) that we installed chef-solo for later uninstall
|
75
|
+
|
144
76
|
unless res == 0
|
145
77
|
server.ui.error "install failed with exit code: #{res}"
|
146
78
|
end
|
147
79
|
end
|
148
80
|
|
149
|
-
def
|
81
|
+
def installed?(server)
|
82
|
+
res = server.ssh.sudo "command -v chef-solo &>/dev/null"
|
83
|
+
res == 0 ? true : false
|
84
|
+
end
|
85
|
+
|
86
|
+
def prepare(server)
|
87
|
+
# create lib dir
|
88
|
+
server.ssh.sudo "mkdir -p #{dest_lib_dir}", :stream => true
|
89
|
+
server.ssh.sudo "chown -R #{server.username} #{dest_lib_dir}", :stream => true
|
90
|
+
|
91
|
+
# create var dir
|
92
|
+
server.ssh.sudo "mkdir -p #{dest_var_dir}", :stream => true
|
93
|
+
server.ssh.sudo "chown -R #{server.username} #{dest_var_dir}", :stream => true
|
94
|
+
|
95
|
+
# create cache dir
|
96
|
+
server.ssh.sudo "mkdir -p #{dest_cache_dir}", :stream => true
|
97
|
+
server.ssh.sudo "chown -R #{server.username} #{dest_cache_dir}", :stream => true
|
150
98
|
|
151
99
|
# create cookbooks directory
|
152
100
|
server.ssh.sudo "mkdir -p #{target_cookbooks_path}", :stream => true
|
@@ -187,82 +135,73 @@ module Caterer
|
|
187
135
|
server.ssh.upload(StringIO.new(json_config(config_data.merge(server.data))), target_json_config_path)
|
188
136
|
|
189
137
|
# set permissions on everything
|
190
|
-
server.ssh.sudo "chown -R #{server.username} #{
|
138
|
+
server.ssh.sudo "chown -R #{server.username} #{dest_lib_dir}", :stream => true
|
139
|
+
server.ssh.sudo "chown -R #{server.username} #{dest_var_dir}", :stream => true
|
191
140
|
|
192
|
-
# run
|
193
|
-
server.ui.info "Running chef-solo..."
|
194
|
-
res = server.ssh.sudo command_string, :stream => true
|
195
|
-
unless res == 0
|
196
|
-
server.ui.error "chef-solo failed with exit code: #{res}"
|
197
|
-
end
|
198
141
|
end
|
199
142
|
|
200
|
-
def
|
201
|
-
|
202
|
-
|
203
|
-
# installer
|
204
|
-
server.ssh.sudo "rm -f #{target_install_path}", :stream => true
|
205
|
-
|
206
|
-
# bootstrap scripts
|
207
|
-
server.ssh.sudo "rm -f #{target_bootstrap_path}*", :stream => true
|
208
|
-
|
209
|
-
# solo.rb
|
210
|
-
server.ssh.sudo "rm -f #{target_solo_path}", :stream => true
|
211
|
-
|
212
|
-
# json
|
213
|
-
server.ssh.sudo "rm -f #{target_json_config_path}", :stream => true
|
214
|
-
|
215
|
-
# for now, leave cookbooks, roles, and data bags for faster provisioning
|
143
|
+
def provision_cmd
|
144
|
+
"chef-solo -c #{target_solo_path} -j #{target_json_config_path}"
|
216
145
|
end
|
217
146
|
|
218
147
|
def uninstall(server)
|
219
148
|
server.ui.info "Uninstalling..."
|
220
149
|
|
221
|
-
|
150
|
+
# figure out how to uninstall chef_solo IF we installed it
|
222
151
|
end
|
223
152
|
|
224
153
|
protected
|
225
154
|
|
226
155
|
def config
|
227
|
-
@config ||= Caterer.config
|
156
|
+
@config ||= Caterer.config
|
228
157
|
end
|
229
158
|
|
230
|
-
def
|
231
|
-
|
232
|
-
|
233
|
-
|
159
|
+
def provisioner_config
|
160
|
+
@provisioner_config ||= config.provisioner.chef_solo
|
161
|
+
end
|
162
|
+
|
163
|
+
def dest_lib_dir
|
164
|
+
"#{image.lib_dir}/chef-solo"
|
165
|
+
end
|
166
|
+
|
167
|
+
def dest_var_dir
|
168
|
+
"#{image.var_dir}/chef-solo"
|
169
|
+
end
|
170
|
+
|
171
|
+
def dest_cache_dir
|
172
|
+
"#{dest_var_dir}/cache"
|
234
173
|
end
|
235
174
|
|
236
175
|
def target_install_path
|
237
|
-
"#{
|
176
|
+
"#{dest_lib_dir}/install"
|
238
177
|
end
|
239
178
|
|
240
179
|
def target_bootstrap_path
|
241
|
-
"#{
|
180
|
+
"#{dest_lib_dir}/bootstrap"
|
242
181
|
end
|
243
182
|
|
244
183
|
def target_cookbooks_path
|
245
|
-
"#{
|
184
|
+
"#{dest_lib_dir}/cookbooks"
|
246
185
|
end
|
247
186
|
|
248
187
|
def target_roles_path
|
249
|
-
"#{
|
188
|
+
"#{dest_lib_dir}/roles"
|
250
189
|
end
|
251
190
|
|
252
191
|
def target_data_bags_path
|
253
|
-
"#{
|
192
|
+
"#{dest_lib_dir}/data_bags"
|
254
193
|
end
|
255
194
|
|
256
195
|
def target_solo_path
|
257
|
-
"#{
|
196
|
+
"#{dest_lib_dir}/solo.rb"
|
258
197
|
end
|
259
198
|
|
260
199
|
def target_json_config_path
|
261
|
-
"#{
|
200
|
+
"#{dest_lib_dir}/config.json"
|
262
201
|
end
|
263
202
|
|
264
203
|
def install_script(platform)
|
265
|
-
File.expand_path("../../../templates/provisioner/chef_solo/
|
204
|
+
File.expand_path("../../../templates/provisioner/chef_solo/install/#{platform}.sh", __FILE__)
|
266
205
|
end
|
267
206
|
|
268
207
|
def solo_content(server)
|
@@ -287,10 +226,6 @@ module Caterer
|
|
287
226
|
end
|
288
227
|
end
|
289
228
|
|
290
|
-
def command_string
|
291
|
-
"chef-solo -c #{target_solo_path} -j #{target_json_config_path}"
|
292
|
-
end
|
293
|
-
|
294
229
|
end
|
295
230
|
end
|
296
231
|
end
|