2010-03-20 01:25:14 -07:00

84 lines
2.7 KiB
Ruby

module Vagrant
module Provisioners
# This class implements provisioning via chef-client, allowing provisioning
# with a chef server.
class ChefServer < Chef
def prepare
if env.config.chef.validation_key_path.nil?
raise Actions::ActionException.new(:chef_server_validation_key_required)
elsif !File.file?(validation_key_path)
raise Actions::ActionException.new(:chef_server_validation_key_doesnt_exist)
end
if env.config.chef.chef_server_url.nil?
raise Actions::ActionException.new(:chef_server_url_required)
end
end
def provision!
chown_provisioning_folder
create_client_key_folder
upload_validation_key
setup_json
setup_config
run_chef_client
end
def create_client_key_folder
logger.info "Creating folder to hold client key..."
path = Pathname.new(env.config.chef.client_key_path)
env.ssh.execute do |ssh|
ssh.exec!("sudo mkdir -p #{path.dirname}")
end
end
def upload_validation_key
logger.info "Uploading chef client validation key..."
env.ssh.upload!(validation_key_path, guest_validation_key_path)
end
def setup_config
solo_file = <<-solo
log_level :info
log_location STDOUT
ssl_verify_mode :verify_none
chef_server_url "#{env.config.chef.chef_server_url}"
validation_client_name "#{env.config.chef.validation_client_name}"
validation_key "#{guest_validation_key_path}"
client_key "#{env.config.chef.client_key_path}"
file_store_path "/srv/chef/file_store"
file_cache_path "/srv/chef/cache"
pid_file "/var/run/chef/chef-client.pid"
Mixlib::Log::Formatter.show_time = true
solo
logger.info "Uploading chef-client configuration script..."
env.ssh.upload!(StringIO.new(solo_file), File.join(env.config.chef.provisioning_path, "client.rb"))
end
def run_chef_client
logger.info "Running chef-client..."
env.ssh.execute do |ssh|
ssh.exec!("cd #{env.config.chef.provisioning_path} && sudo chef-client -c client.rb -j dna.json") do |channel, data, stream|
# TODO: Very verbose. It would be easier to save the data and only show it during
# an error, or when verbosity level is set high
logger.info("#{stream}: #{data}")
end
end
end
def validation_key_path
File.expand_path(env.config.chef.validation_key_path, env.root_path)
end
def guest_validation_key_path
File.join(@env.config.chef.provisioning_path, "validation.pem")
end
end
end
end