From: Tom Hughes Date: Tue, 22 Dec 2015 22:05:51 +0000 (+0000) Subject: Use ohai disk information to configure smartd and munin X-Git-Url: https://git.openstreetmap.org/chef.git/commitdiff_plain/327d24752df2584f8d09837a8d30d60e901546fc Use ohai disk information to configure smartd and munin --- diff --git a/cookbooks/hardware/recipes/default.rb b/cookbooks/hardware/recipes/default.rb index 238d65690..2f8a4398e 100644 --- a/cookbooks/hardware/recipes/default.rb +++ b/cookbooks/hardware/recipes/default.rb @@ -297,118 +297,31 @@ end end end -disks = [] - -node[:block_device].each do |name, attributes| - disks << { :device => name } if attributes[:vendor] == "ATA" -end - -if status_packages["cciss-vol-status"] && File.exist?("/usr/sbin/cciss_vol_status") - status_packages["cciss-vol-status"].each do |device| - IO.popen(["cciss_vol_status", "-V", "/dev/#{device}"]).each do |line| - disks << { :device => device, :driver => "cciss", :id => Regexp.last_match[1].to_i - 1 } if line =~ / bay ([0-9]+) +HP / - end - end -end - -if status_packages["megaclisas-status"] && File.exist?("/usr/sbin/megacli") - controller = 0 - - Dir.glob("/sys/class/scsi_host/host*") do |host| - driver = File.new("#{host}/proc_name").read.chomp - - next unless driver == "megaraid_sas" - - bus = host.sub("/sys/class/scsi_host/host", "") - device = File.basename(Dir.glob("/sys/bus/scsi/devices/#{bus}:*/scsi_generic/*").first) - - IO.popen(["megacli", "-PDList", "-a#{controller}", "-NoLog"]).each do |line| - disks << { :device => device, :driver => "megaraid", :id => Regexp.last_match[1] } if line =~ /^Device Id: ([0-9]+)$/ - - disks.pop if line =~ /^Firmware state: Hotspare, Spun down$/ +disks = node[:hardware][:disk][:disks].map do |disk| + if disk[:smart_device] + controller = node[:hardware][:disk][:controllers][disk[:controller]] + device = File.basename(controller[:device]) + smart = disk[:smart_device] + + if device.start_with?("cciss/") && smart =~ /^cciss,(\d+)$/ + array = node[:hardware][:disk][:arrays][disk[:arrays].first] + munin = "cciss-3#{array[:wwn]}-#{Regexp.last_match(1)}" + elsif smart =~ /^.*,(\d+)$/ + munin = "#{device}-#{Regexp.last_match(1)}" + elsif smart =~ %r{^.*,(\d+)/(\d+)$} + munin = "#{device}-#{Regexp.last_match(1)}:#{Regexp.last_match(2)}" end - - controller += 1 - end -end - -if tools_packages.include?("lsiutil") - Dir.glob("/sys/class/scsi_host/host*") do |host| - driver = File.new("#{host}/proc_name").read.chomp - - next unless driver == "mptsas" - - bus = host.sub("/sys/class/scsi_host/host", "") - - Dir.glob("/sys/bus/scsi/devices/#{bus}:0:*/scsi_generic/*").each do |sg| - disks << { :device => File.basename(sg) } - end - end -end - -if status_packages["sas2ircu-status"] - Dir.glob("/sys/class/scsi_host/host*") do |host| - driver = File.new("#{host}/proc_name").read.chomp - - next unless driver == "mpt2sas" || driver == "mpt3sas" - - bus = host.sub("/sys/class/scsi_host/host", "") - - Dir.glob("/sys/bus/scsi/devices/#{bus}:0:*/scsi_generic/*").each do |sg| - next if File.directory?("#{sg}/../../block") - - disks << { :device => File.basename(sg) } - end - end -end - -if status_packages["aacraid-status"] - Dir.glob("/sys/class/scsi_host/host*") do |host| - driver = File.new("#{host}/proc_name").read.chomp - - next unless driver == "aacraid" - - bus = host.sub("/sys/class/scsi_host/host", "") - - Dir.glob("/sys/bus/scsi/devices/#{bus}:1:*/scsi_generic/*").each do |sg| - disks << { :device => File.basename(sg) } - end - end -end - -if tools_packages.include?("areca") && File.exist?("/opt/areca/x86_64/cli64") - device = IO.popen(["lsscsi", "-g"]).grep(%r{Areca +RAID controller .*/dev/(sg[0-9]+)}) do - Regexp.last_match[1] - end.first - - IO.popen(["/opt/areca/x86_64/cli64", "disk", "info"]).each do |line| - next if line =~ /N\.A\./ - - if line =~ /^ +[0-9]+ +0*([0-9]+) +(?:Slot#|SLOT )0*([0-9]+) +/ - enc = Regexp.last_match[1] - slot = Regexp.last_match[2] - - disks << { :device => device, :driver => "areca", :id => "#{slot}/#{enc}" } - elsif line =~ /^ +([0-9]+) +[0-9]+ +/ - disks << { :device => device, :driver => "areca", :id => Regexp.last_match[1] } - end - end -end - -disks.each do |disk| - if disk[:device] =~ %r{^cciss/(.*)$} - id = File.read("/sys/bus/cciss/devices/#{Regexp.last_match[1]}/unique_id").chomp - - disk[:munin] = "cciss-3#{id.downcase}" else - disk[:munin] = disk[:device] - end - - if disk[:id] - disk[:munin] = "#{disk[:munin]}-#{disk[:id].to_s.tr('/', ':')}" + device = File.basename(disk[:device]) + munin = device end - disk[:hddtemp] = disk[:munin].tr("-:", "_") + Hash[ + :device => device, + :smart => smart, + :munin => munin, + :hddtemp => munin.tr("-:", "_") + ] end if disks.count > 0 @@ -447,7 +360,7 @@ if disks.count > 0 # an Areca controller as they only allow one thing to # talk to the controller at a time and smartd will # throw errors if it clashes with munin - disks = disks.reject { |disk| disk[:driver] == "areca" } + disks = disks.reject { |disk| disk[:smart] && disk[:smart].start_with?("areca,") } disks.each do |disk| munin_plugin "smart_#{disk[:munin]}" do diff --git a/cookbooks/hardware/templates/default/munin.hddtemp.erb b/cookbooks/hardware/templates/default/munin.hddtemp.erb index 330be0630..1263fa7b3 100644 --- a/cookbooks/hardware/templates/default/munin.hddtemp.erb +++ b/cookbooks/hardware/templates/default/munin.hddtemp.erb @@ -3,8 +3,8 @@ [hddtemp_smartctl] env.drives <%= @disks.map { |d| d[:hddtemp] }.sort.join(" ") %> <% @disks.sort_by { |d| d[:hddtemp] }.each do |disk| -%> -<% if disk[:driver] -%> -env.type_<%= disk[:hddtemp] %> <%= disk[:driver] %>,<%= disk[:id] %> +<% if disk[:smart] -%> +env.type_<%= disk[:hddtemp] %> <%= disk[:smart] %> %> <% end -%> env.dev_<%= disk[:hddtemp] %> <%= disk[:device] %> <% end -%> diff --git a/cookbooks/hardware/templates/default/munin.smart.erb b/cookbooks/hardware/templates/default/munin.smart.erb index 8a09c838f..7fd1a0117 100644 --- a/cookbooks/hardware/templates/default/munin.smart.erb +++ b/cookbooks/hardware/templates/default/munin.smart.erb @@ -1,8 +1,8 @@ # DO NOT EDIT - This file is being maintained by Chef [smart_<%= @disk[:munin] %>] -<% if @disk[:driver] -%> -env.smartargs -H -d <%= @disk[:driver] %>,<%= @disk[:id] %> +<% if @disk[:smart] -%> +env.smartargs -H -d <%= @disk[:smart] %> %> <% else -%> env.smartargs -H <% end -%> diff --git a/cookbooks/hardware/templates/default/smartd.conf.erb b/cookbooks/hardware/templates/default/smartd.conf.erb index e0d86831a..5dea481bc 100644 --- a/cookbooks/hardware/templates/default/smartd.conf.erb +++ b/cookbooks/hardware/templates/default/smartd.conf.erb @@ -1,8 +1,8 @@ # DO NOT EDIT - This file is being maintained by Chef <% @disks.each do |disk| -%> -<% if disk[:driver] -%> -/dev/<%= disk[:device] %> -d <%= disk[:driver] %>,<%= disk[:id] %> -s S/../../7/02 -m admins@openstreetmap.org -M exec /usr/local/bin/smartd-mailer +<% if disk[:smart] -%> +/dev/<%= disk[:device] %> -d <%= disk[:smart] %> -s S/../../7/02 -m admins@openstreetmap.org -M exec /usr/local/bin/smartd-mailer <% else -%> /dev/<%= disk[:device] %> -s S/../../7/02 -m admins@openstreetmap.org -M exec /usr/local/bin/smartd-mailer <% end -%>