2015-07-21 19:45:23 +02:00

61 lines
2.0 KiB
Ruby

# 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