vagrant/plugins/provisioners/chef/provisioner/chef_client.rb

117 lines
4.5 KiB
Ruby
Raw Normal View History

2012-04-19 04:53:19 +00:00
require 'pathname'
require File.expand_path("../base", __FILE__)
module VagrantPlugins
module Chef
module Provisioner
# This class implements provisioning via chef-client, allowing provisioning
# with a chef server.
class ChefClient < Base
2013-01-14 00:41:32 +00:00
def configure(root_config)
raise ChefError, :server_validation_key_required if @config.validation_key_path.nil?
2012-04-19 04:53:19 +00:00
raise ChefError, :server_validation_key_doesnt_exist if !File.file?(validation_key_path)
2013-01-14 00:41:32 +00:00
raise ChefError, :server_url_required if @config.chef_server_url.nil?
2012-04-19 04:53:19 +00:00
end
def provision
2012-04-19 04:53:19 +00:00
verify_binary(chef_binary_path("chef-client"))
chown_provisioning_folder
create_client_key_folder
upload_validation_key
2013-01-14 00:41:32 +00:00
upload_encrypted_data_bag_secret if @config.encrypted_data_bag_secret_key_path
2012-04-19 04:53:19 +00:00
setup_json
setup_server_config
run_chef_client
end
def cleanup
delete_from_chef_server('client') if config.delete_client
delete_from_chef_server('node') if config.delete_node
end
2012-04-19 04:53:19 +00:00
def create_client_key_folder
2013-01-14 00:41:32 +00:00
@machine.env.ui.info I18n.t("vagrant.provisioners.chef.client_key_folder")
path = Pathname.new(@config.client_key_path)
2012-04-19 04:53:19 +00:00
2013-01-14 00:41:32 +00:00
@machine.communicate.sudo("mkdir -p #{path.dirname}")
2012-04-19 04:53:19 +00:00
end
def upload_validation_key
2013-01-14 00:41:32 +00:00
@machine.env.ui.info I18n.t("vagrant.provisioners.chef.upload_validation_key")
@machine.communicate.upload(validation_key_path, guest_validation_key_path)
2012-04-19 04:53:19 +00:00
end
def upload_encrypted_data_bag_secret
2013-01-14 00:41:32 +00:00
@machine.env.ui.info I18n.t("vagrant.provisioners.chef.upload_encrypted_data_bag_secret_key")
@machine.communicate.upload(encrypted_data_bag_secret_key_path,
@config.encrypted_data_bag_secret)
2012-04-19 04:53:19 +00:00
end
def setup_server_config
setup_config("provisioners/chef_client/client", "client.rb", {
2013-01-14 00:41:32 +00:00
:node_name => @config.node_name,
:chef_server_url => @config.chef_server_url,
:validation_client_name => @config.validation_client_name,
2012-04-19 04:53:19 +00:00
:validation_key => guest_validation_key_path,
2013-01-14 00:41:32 +00:00
:client_key => @config.client_key_path,
:environment => @config.environment,
:encrypted_data_bag_secret => @config.encrypted_data_bag_secret
2012-04-19 04:53:19 +00:00
})
end
def run_chef_client
if @config.run_list && @config.run_list.empty?
@machine.ui.warn(I18n.t("vagrant.chef_run_list_empty"))
end
2013-01-14 00:41:32 +00:00
command_env = @config.binary_env ? "#{@config.binary_env} " : ""
command_args = @config.arguments ? " #{@config.arguments}" : ""
command = "#{command_env}#{chef_binary_path("chef-client")} -c #{@config.provisioning_path}/client.rb -j #{@config.provisioning_path}/dna.json #{command_args}"
2012-04-19 04:53:19 +00:00
2013-01-14 00:41:32 +00:00
@config.attempts.times do |attempt|
2012-04-19 04:53:19 +00:00
if attempt == 0
2013-01-14 00:41:32 +00:00
@machine.env.ui.info I18n.t("vagrant.provisioners.chef.running_client")
2012-04-19 04:53:19 +00:00
else
2013-01-14 00:41:32 +00:00
@machine.env.ui.info I18n.t("vagrant.provisioners.chef.running_client_again")
2012-04-19 04:53:19 +00:00
end
2013-01-14 00:41:32 +00:00
exit_status = @machine.communicate.sudo(command, :error_check => false) do |type, data|
2012-04-19 04:53:19 +00:00
# Output the data with the proper color based on the stream.
color = type == :stdout ? :green : :red
@machine.env.ui.info(
data, :color => color, :new_line => false, :prefix => false)
2012-04-19 04:53:19 +00:00
end
# There is no need to run Chef again if it converges
return if exit_status == 0
end
# If we reached this point then Chef never converged! Error.
raise ChefError, :no_convergence
end
def validation_key_path
2013-01-14 00:41:32 +00:00
File.expand_path(@config.validation_key_path, @machine.env.root_path)
2012-04-19 04:53:19 +00:00
end
def encrypted_data_bag_secret_key_path
2013-01-14 00:41:32 +00:00
File.expand_path(@config.encrypted_data_bag_secret_key_path, @machine.env.root_path)
2012-04-19 04:53:19 +00:00
end
def guest_validation_key_path
2013-01-14 00:41:32 +00:00
File.join(@config.provisioning_path, "validation.pem")
2012-04-19 04:53:19 +00:00
end
def delete_from_chef_server(deletable)
node_name = config.node_name || env[:vm].config.vm.host_name
env[:ui].info(I18n.t(
"vagrant.provisioners.chef.deleting_from_server",
deletable: deletable, name: node_name))
2012-12-17 17:04:53 +00:00
Kernel.system("knife #{deletable} delete --yes #{node_name} > /dev/null 2>&1")
end
2012-04-19 04:53:19 +00:00
end
end
end
end