lib/soloist/cli.rb
require "librarian/chef/cli"
require "soloist/remote_config"
require "soloist/spotlight"
require "awesome_print"
require "thor"
module Soloist
class CLI < Thor
attr_writer :soloist_config
default_task :chef
desc "chef", "Run chef-solo"
method_option :remote, :aliases => "-r", :desc => "Run chef-solo on user@host"
method_option :identity, :aliases => "-i", :desc => "The SSH identity file"
def chef
install_cookbooks if cheffile_exists?
soloist_config.run_chef
end
desc "run_recipe [cookbook::recipe, ...]", "Run individual recipes"
method_option :remote, :aliases => "-r", :desc => "Run recipes on user@host"
method_option :identity, :aliases => "-i", :desc => "The SSH identity file"
def run_recipe(*recipes)
soloist_config.royal_crown.recipes = recipes
chef
end
desc "config", "Dumps configuration data for Soloist"
def config
Kernel.ap(soloist_config.as_node_json)
end
no_tasks do
def install_cookbooks
Dir.chdir(File.dirname(rc_path)) do
Librarian::Chef::Cli.with_environment do
Librarian::Chef::Cli.new.install
end
end
end
def soloist_config
@soloist_config ||= if options[:remote]
Soloist::RemoteConfig.from_file(rc_path, remote)
else
Soloist::Config.from_file(rc_path)
end.tap do |config|
config.merge!(rc_local) if rc_local_path
end
end
end
private
def rc_local
Soloist::Config.from_file(rc_local_path)
end
def remote
@remote ||= if options[:identity]
Soloist::Remote.from_uri(options[:remote], options[:identity])
else
Soloist::Remote.from_uri(options[:remote])
end
end
def cheffile_exists?
File.exists?(File.expand_path("../Cheffile", rc_path))
end
def rc_path
@rc_path ||= Soloist::Spotlight.find!("soloistrc", ".soloistrc")
end
def rc_local_path
@rc_local_path ||= Soloist::Spotlight.find("soloistrc_local", ".soloistrc_local")
end
end
end