Initial Chef repository
This commit is contained in:
60
cookbooks/ssh_known_hosts/recipes/cacher.rb
Normal file
60
cookbooks/ssh_known_hosts/recipes/cacher.rb
Normal file
@@ -0,0 +1,60 @@
|
||||
# Gather a list of all nodes, warning if using Chef Solo
|
||||
if Chef::Config[:solo]
|
||||
fail 'ssh_known_hosts::cacher requires Chef search - Chef Solo does ' \
|
||||
'not support search!'
|
||||
else
|
||||
all_host_keys = partial_search(
|
||||
:node, 'keys:*',
|
||||
:keys => {
|
||||
'hostname' => [ 'hostname' ],
|
||||
'fqdn' => [ 'fqdn' ],
|
||||
'ipaddress' => [ 'ipaddress' ],
|
||||
'host_rsa_public' => [ 'keys', 'ssh', 'host_rsa_public' ],
|
||||
'host_dsa_public' => [ 'keys', 'ssh', 'host_dsa_public' ]
|
||||
}
|
||||
).collect do |host|
|
||||
{
|
||||
'fqdn' => host['fqdn'] || host['ipaddress'] || host['hostname'],
|
||||
'key' => host['host_rsa_public'] || host['host_dsa_public']
|
||||
}
|
||||
end
|
||||
Chef::Log.debug("Partial search got: #{all_host_keys.inspect}")
|
||||
end
|
||||
|
||||
new_data_bag_content = {
|
||||
"id" => node['ssh_known_hosts']['cacher']['data_bag_item'],
|
||||
"keys" => all_host_keys
|
||||
}
|
||||
|
||||
Chef::Log.debug('New data bag content: ' \
|
||||
"#{new_data_bag_content.inspect}")
|
||||
|
||||
if Chef::DataBag.list.key?(node['ssh_known_hosts']['cacher']['data_bag'])
|
||||
# Check to see if there are actually any changes to be made (so we don't save
|
||||
# data bags unnecessarily)
|
||||
existing_data_bag_content = data_bag_item(
|
||||
node['ssh_known_hosts']['cacher']['data_bag'],
|
||||
node['ssh_known_hosts']['cacher']['data_bag_item']
|
||||
).raw_data
|
||||
Chef::Log.debug('Existing data bag content: ' \
|
||||
"#{existing_data_bag_content.inspect}")
|
||||
else
|
||||
Chef::Log.debug('Data bag ' \
|
||||
"\"#{node['ssh_known_hosts']['cacher']['data_bag']}\" not found. " \
|
||||
'Creating.')
|
||||
new_databag = Chef::DataBag.new
|
||||
new_databag.name(node['ssh_known_hosts']['cacher']['data_bag'])
|
||||
new_databag.save
|
||||
end
|
||||
|
||||
unless (defined? existing_data_bag_content) &&
|
||||
new_data_bag_content == existing_data_bag_content
|
||||
|
||||
Chef::Log.debug('Data bag contents differ. Saving updates.')
|
||||
|
||||
host_key_db_item = Chef::DataBagItem.new
|
||||
host_key_db_item.data_bag(node['ssh_known_hosts']['cacher']['data_bag'])
|
||||
host_key_db_item.raw_data = new_data_bag_content
|
||||
|
||||
host_key_db_item.save
|
||||
end
|
||||
Reference in New Issue
Block a user