Series: Before i forget Dashing with Icinga2 Part Deux

Hallo geneigter Leser!

Ich hatte versprochen mit dem zweiten Teil des Dashing Tutorials auf die API Abfragen einzugehen.

Wir hatten den API Benutzer unter Icinga 2 im ersten Part des Tutorials angelegt es fehlt nun noch an den entsprechenden Services welche wir im Dashing präsentieren wollen.

Als Beispiel nehmen wir den check_users aus Icinga 2 und check_procs.
Dies sind beides Sample Checks wenn Icinga 2 frisch installiert ist.

Diese beiden checks fragen wir als Beispiel per API ab.
Dazu bedienen wir uns eines einfachen Curl Aufrufes.

curl -k -s -u 'dashing:dashing' 'https://localhost:5665/v1/services?service=localhost.localdomain!users'

Zur besseren Lesbarkeit pipen wir das ganze durch einen JSON Parser.

curl -k -s -u 'dashing:dashing' 'https://localhost:5665/v1/services?service=localhost.localdomain!users' | jq "."

Wir benötigen die Attribs um die Dashlets zu befüllen.

curl -k -s -u 'dashing:dashing' 'https://localhost:5665/v1/services?service=localhost.localdomain!users&attrs=name&attrs=state&attrs=last_check_result' | jq "."

Diese Abfrage führt zu dem folgenden Ergebnis:

{
  "results": [
    {
      "attrs": {
        "last_check_result": {
          "active": true,
          "check_source": "localhost.localdomain",
          "command": [
            "/usr/lib64/nagios/plugins/check_users",
            "-c",
            "50",
            "-w",
            "20"
          ],
          "execution_end": 1479937762.53654,
          "execution_start": 1479937762.531455,
          "exit_status": 0,
          "output": "USERS OK - 1 users currently logged in ",
          "performance_data": [
            "users=1;20;50;0"
          ],
          "schedule_end": 1479937762.536798,
          "schedule_start": 1479937762.53,
          "state": 0,
          "type": "CheckResult",
          "vars_after": {
            "attempt": 1,
            "reachable": true,
            "state": 0,
            "state_type": 1
          },
          "vars_before": {
            "attempt": 1,
            "reachable": true,
            "state": 0,
            "state_type": 1
          }
        },
        "name": "users",
        "state": 0
      },
      "joins": {},
      "meta": {},
      "name": "localhost.localdomain!users",
      "type": "Service"
    }
  ]
}

Dies müssen wir nun im Dashing verarbeiten.

Wir fangen damit an das Dashboard Layout zu bearbeiten.
Wir editieren die dashboard.erb Datei.
Welche wir nach dem erstellen eines neuen Dashboards per dashing new Dashboard_test . Diese ist im unterordner dashboards.

vi /Dashboard_test/dashboards/dashboard.erb
<!--
<script type='text/javascript'>
$(function() {
  // These settings override the defaults set in application.coffee. You can do this on a per dashboard basis.
  Dashing.widget_base_dimensions ||= [300, 420]
  Dashing.numColumns ||= 6
});
</script>
-->
<% content_for :title do %>Icinga 2 Dashboard<% end %>
<div class="gridster">
  <ul>
    <li data-row="1" data-col="2" data-sizex="1" data-sizey="1">
      <div data-id="icinga-users" data-view="Simplemon" data-title="Users" style="background-color: #0095bf;"></div>
    </li>
  </ul>
</div>

Wir benötigen ein list item in dem enthaltenen div brauchen wir ein 'data-id' item welches wir mit einem unique attribute benennen.
Der data-view Typ ist der eines Widgets. Das Simplemon Widget haben wir uns aus dem Icinga2-Example Widget gestohlen & nach widgets kopiert.

Wir sollten als letztes den data-title einen Sinnvollen Namen geben.

Anschliessend müssen wir wie schon vorhin angesprochen das Dashlet mit Information versorgen dies geschieht mit dem dazugehörigen job File unter jobs.

require 'rest-client'

$api_url_base = "https://localhost:5665"   #Icinga2 API URL inkl. Port
if defined? settings.icinga2_api_url
  api_url_base = settings.icinga2_api_url
end
$api_username = "dashing"  #Icinga2 Api Username
if defined? settings.icinga2_api_username
  api_username = settings.icinga2_api_username
end
$api_password = "dashing"  #Icinga2 Api UserPW
if defined? settings.icinga2_api_password
  api_password = settings.icinga2_api_password
end

def prepare_rest_client(api_url)
  options = { :user => $api_username, :password => $api_password, :verify_ssl => OpenSSL::SSL::VERIFY_NONE }  #Zusammenfuegen der Vars fuer den REST Aufruf
  res = RestClient::Resource.new(URI.encode(api_url), options)  #Zusammensetzen des REST Aufrufs
  return res  #Rueckgabe des gesammten REST Strings mit Inhalten
end

def get_user()
  api_url = $api_url_base + "/v1/services?service=localhost.localdomain!users&attrs=name&attrs=state&attrs=last_check_result"
  rest_client = prepare_rest_client(api_url)
  headers = {"Content-Type" => "application/json", "Accept" => "application/json"}

  return rest_client.get(headers)
end

def get_colour(color)
  case color
  when 0
    return color = 'green'
  when 1
    return color = 'yellow'
  when 2
    return color = 'red'
  else
    return color = 'purple'
end
end

SCHEDULER.every '2s' do

  nieuw = get_users()
  result = JSON.parse(nieuw.body)

  usr_status = result["results"][0]["attrs"]["state"]
  usr_name = result["results"][0]["attrs"]["name"]
  usr_output = result["results"][0]["attrs"]["last_check_result"]["output"]

  usr_map = usr_output.split(' ')
  usr_out = usr_map[3]

  usr_status_clr = get_colour(usr_status)

### Update Event des Widgets

  send_event('icinga-users', {
   value: usr_out,
   color: usr_status_clr })

end 

Nach einem systemctl restart dashing

Sollte uns das frische Dashboard anlächeln.

Es ist auch ganz nützlich ein Systemd Servicefile zu haben.
Sie sollten die Datei /usr/lib/systemd/system/ ablegen.

Inhalt des Servicesfiles:

[Unit]
Description=Dashing Systemd Service File

[Service]
ExecStart=/root/dashboard/dashing start

[Install]
WantedBy=multi-user.target

Sample Dashing2