caterer 0.11.2 → 1.0.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.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
|