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