88 lines
3.1 KiB
Ruby
88 lines
3.1 KiB
Ruby
#
|
|
# Cookbook Name:: rsyslog
|
|
# Recipe:: client
|
|
#
|
|
# Copyright 2009-2015, Chef Software, Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
|
|
# Do not run this recipe if the server attribute is set
|
|
return if node['rsyslog']['server']
|
|
|
|
include_recipe 'rsyslog::default'
|
|
|
|
def chef_solo_search_installed?
|
|
klass = ::Search.const_get('Helper')
|
|
return klass.is_a?(Class)
|
|
rescue NameError
|
|
return false
|
|
end
|
|
|
|
# On Chef Solo, we use the node['rsyslog']['server_ip'] attribute, and on
|
|
# normal Chef, we leverage the search query.
|
|
if Chef::Config[:solo] && !chef_solo_search_installed?
|
|
if node['rsyslog']['server_ip']
|
|
server_ips = Array(node['rsyslog']['server_ip'])
|
|
else
|
|
Chef::Application.fatal!("Chef Solo does not support search. You must set node['rsyslog']['server_ip'] or use the chef-solo-search cookbook!")
|
|
end
|
|
else
|
|
results = search(:node, node['rsyslog']['server_search']).map do |server|
|
|
ipaddress = server['ipaddress']
|
|
# If both server and client are on the same cloud and local network, they may be
|
|
# instructed to communicate via the internal interface by enabling `use_local_ipv4`
|
|
if node['rsyslog']['use_local_ipv4'] && server.attribute?('cloud') && server['cloud']['local_ipv4']
|
|
ipaddress = server['cloud']['local_ipv4']
|
|
end
|
|
ipaddress
|
|
end
|
|
server_ips = Array(node['rsyslog']['server_ip']) + Array(results)
|
|
end
|
|
|
|
rsyslog_servers = []
|
|
|
|
server_ips.each do |ip|
|
|
rsyslog_servers << { 'server' => ip, 'port' => node['rsyslog']['port'], 'logs' => node['rsyslog']['logs_to_forward'], 'protocol' => node['rsyslog']['protocol'], 'remote_template' => node['rsyslog']['default_remote_template'] }
|
|
end
|
|
|
|
unless node['rsyslog']['custom_remote'].first.empty?
|
|
node['rsyslog']['custom_remote'].each do |server|
|
|
if server['server'].nil?
|
|
Chef::Application.fatal!('Found a custom_remote server with no IP. Check your custom_remote attribute definition!')
|
|
end
|
|
end
|
|
rsyslog_servers += node['rsyslog']['custom_remote']
|
|
end
|
|
|
|
if rsyslog_servers.empty?
|
|
Chef::Application.fatal!('The rsyslog::client recipe was unable to determine the remote syslog server. Checked both the server_ip attribute and search!')
|
|
end
|
|
|
|
remote_type = node['rsyslog']['use_relp'] ? 'relp' : 'remote'
|
|
|
|
template "#{node['rsyslog']['config_prefix']}/rsyslog.d/49-remote.conf" do
|
|
source "49-#{remote_type}.conf.erb"
|
|
owner 'root'
|
|
group 'root'
|
|
mode '0644'
|
|
variables(servers: rsyslog_servers)
|
|
notifies :restart, "service[#{node['rsyslog']['service_name']}]"
|
|
only_if { node['rsyslog']['remote_logs'] }
|
|
end
|
|
|
|
file "#{node['rsyslog']['config_prefix']}/rsyslog.d/server.conf" do
|
|
action :delete
|
|
notifies :restart, "service[#{node['rsyslog']['service_name']}]"
|
|
end
|