Icinga 2 – Ein praktischer Einstieg ins Monitoring – ab heute verfügbar!

Ich bin seit fast 9 Jahren bei NETWAYS und in regelmäßigen Abständen wollte einer meiner Kollegen ein Buch zu Nagios und später dann zu Icinga schreiben (oder hat zumindest seine Absicht bekundet). Und nachdem wir mittlerweile große Erfahrungen im Schreiben von Schulungsunterlagen sammeln konnten, gab es keine Ausreden mehr. Wir dürfen also mit großem Stolz verkünden, dass meine Kollegen Thomas Widhalm und Lennart Betz das erste Buch zu Icinga 2 verfasst haben: Icinga 2 (ix Edition): Ein praktischer Einstieg ins Monitoring (ab heute verfügbar!)

Icinga 2 Ein praktischer Einstieg ins Monitoring»Icinga 2« gibt eine umfassende Einführung in das gleichnamige Monitoringprodukt, das als Fork einer etablierten Lösung für Verfügbarkeitsmonitoring entstanden ist, in Version 2 jedoch einen kompletten Rewrite mit vielen, meist massiven, Verbesserungen erhalten hat. Dabei zeigt es Umsteigern von anderen freien Monitoringlösungen genauso wie Monitoring-Neulingen, wie eine Umgebung aufgebaut und Schritt für Schritt immer umfangreicher und umfassender gestaltet wird.

Die Beispiele haben einen sehr starken Praxisbezug und sollen nicht nur Wege zeigen, wie übliche Probleme irgendwie gelöst werden können, sondern welcher Ansatz sich vielfach in unterschiedlichsten Setups bewährt hat. Dabei bekommt der Leser aber nicht nur ganz konkrete Lösungen für immer wieder auftretende Aufgaben an die Hand, sondern erfährt auch, wie er sich selbst weiterhelfen kann, wenn eine Anforderung einmal nicht vom Buch abgedeckt ist.

Gezeigt werden die Überwachung von Linux, Unix und MS Windows Hosts, Netzwerkgeräten, Virtualisierungsplattformen, Netzwerkdienste wie Web- und Mailserver, Verzeichnisdienste, Datenbanken, etc. Für die Überwachung werden bewährte Plugins vorgestellt, darüber hinaus aber auch Lösungen für Logmanagement und Perfomance-Graphing aufgezeigt.

Zielgruppe:

  • Monitoringverantwortliche
  • Rechenzentrumsverantwortliche
  • Administratoren mit Linux/Unix Erfahrung

Jetzt könnte man das Buch einfach kaufen (was uns und vor allem die beiden Autoren sehr freuen würde), aber noch einfacher kommt an das das Werk beim Besuch unserer Icinga 2 Fundamentals Schulung. Und mit viel Glück hält auch noch einer der beiden Autoren die Schulung, da kann man sich gleich noch ein Autogramm abholen.

 

Martin Krodel

Autor: Martin Krodel

Der studierte Volljurist leitet bei NETWAYS die Sales Abteilung und berät unsere Kunden bei ihren Monitoring- und Hosting-Projekten. Privat reist er gerne durch die Weltgeschichte und widmet sich seinem ständig wachsenden Fuhrpark an Apple Hardware.

GitLab – Webhooks

gitlab-webhooks

Da ich vor kurzem für einen unserer namhaften Kunden ein GitLab Setup aufsetzten durfte und dieser sich nun auch Automatische Checkouts seiner Live Branches auf seinen Produktiv Systemen wünschte, habe ich mich dazu entschlossen euch ein bisschen an der Einrichtung dieser Mechaniken teilhaben zu lassen, natürlich nicht im vollem Umfang des Projektes für unseren Kunden, das eine oder andere habe ich für diesen Artikel verständlicherweise leicht abwandeln müssen, das hier gezeigte funktioniert trotzdem, ich habe es selber ausprobiert.

Dann legen wir mal los…

In einem klassischen Git Setup werden die Hooks direkt im Repository im Unterordner hooks abgelegt, hier mal ein Beispiel wie das aussehen kann…

$ MyAwesomeProject/hooks $ ll
-rwxrwxr-x 1 enzo enzo  452 Jun 28 11:46 applypatch-msg.sample*
-rwxrwxr-x 1 enzo enzo  896 Jun 28 11:46 commit-msg.sample*
-rwxrwxr-x 1 enzo enzo  189 Jun 28 11:46 post-update.sample*
-rwxrwxr-x 1 enzo enzo  398 Jun 28 11:46 pre-applypatch.sample*
-rwxrwxr-x 1 enzo enzo 1642 Jun 28 11:46 pre-commit.sample*
-rwxrwxr-x 1 enzo enzo 1239 Jun 28 11:46 prepare-commit-msg.sample*
-rwxrwxr-x 1 enzo enzo 1352 Jun 28 11:46 pre-push.sample*
-rwxrwxr-x 1 enzo enzo 4898 Jun 28 11:46 pre-rebase.sample*
-rwxrwxr-x 1 enzo enzo 3611 Jun 28 11:46 update.sample*

GitLab geht hier allerdings einen anderen Weg, da dieses das hooks Verzeichnis durch einen Symbolischen Link auf System eigene Hooks umlenkt (wie hier Beispielhaft zu sehen ist)…

gitlab-webhooks-art2

…nun sollte man hier auch besser die Finger heraus lassen, da GitLab dieses Verzeichnis für allerlei anderen Mechaniken benötigt, der Weg über die Webhooks ist meiner Meinung nach aber auch flexibler (allein schon wegen der einfachen Anbindung an Web Dienste wie GitHub, Bitbucket, Heroku, etc.).

Nun direkt zum spaßigen Teil, im GitLab benötigen wir einen neuen User ohne irgendwelche besonderen Rechte incl. SSH Public Key, fangen wir mit dem Key selbst an, da der Checkout User keinen besonderen Rechte benötigt außer einen Pull/Fetch zu tätigen, reicht es uns den Key also entsprechend Unprivilegiert zu preparieren (bei der Passwortabfrage bitte nichts angeben, einfach mit Enter bestätigen)…

$ ssh-keygen -t rsa -b 2048 -O clear -O no-agent-forwarding -O no-port-forwarding -O no-pty -O no-user-rc -O no-x11-forwarding -f gitlab.key
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in gitlab.key.
Your public key has been saved in gitlab.key.pub.
The key fingerprint is:
4b:f3:ae:60:d4:5d:5e:02:75:64:4c:7f:ce:09:ec:8a enzo@ebony
The key's randomart image is:
+--[ RSA 2048]----+
|          ...+=  |
|           ..o.. |
|            oo. o|
|       . . o.o.oo|
|      . S . .. .o|
|     . . +. .    |
|      o .E..     |
|     . . .       |
|        ...      |
+-----------------+
$ ll
insgesamt 8
-rw------- 1 enzo enzo 1675 Jun 28 11:52 gitlab.key
-rw-r--r-- 1 enzo enzo  392 Jun 28 11:52 gitlab.key.pub

…nun benötigen wir lediglich noch einen User im GitLab, das sollte keine große Herausforderung darstellen, bitte stellt auch sicher das ihr den SSH PublicKey in unserem Beispiel gitlab.key.pub dem User, lasst ihn uns hier der Einfachheit halber checkout nennen zuweist, da die Webhooks mit den Berechtigungen des Standard Apache User www-data läuft (das ist zumindest unter Debian/Ubuntu der Fall, unter Redhat Systemen heißt dieser wwwrun) solltet ihr dem Key als Identifier so etwas wie www-data to gitlab oder ähnliches benennen, damit ihr später ganz einfach den Überblick behalten könnt…

gitlab-webhooks-art4
gitlab-webhooks-art5

…nun müssen wir unserem User checkout lediglich noch in unser Projekt aufnehmen, die Rechte eines Reporter sollten dafür ausreichend sein um Fetch/Pull oder auch Clone zu können, mehr benötigen wir an dieser Stelle nicht…

gitlab-webhooks-art9

…somit sind wir auf schon fast fertig, zumindest was das GitLab Setup selbst betrifft, nun müssen wir lediglich noch die URL unseres Webhook konfigurieren und schon können wir uns dem Hook selber widmen…

gitlab-webhooks-art7

gitlab-webhooks-art8…bitte beachtet auch, das es beim Entwickeln eines Webhooks sehr hilfreich sein kann wenn ihr über den Button [Test Hook] den Push Event einfach mal Manuell triggert, ansonsten würde euer Webhook erst aufgerufen werden wenn ihr wirklich in das Repository Pusht (das geht natürlich auch, legt euch hierzu einfach ein neues Repository zum spielen an).

So nun geht es an den Server der unseren Webhook ausführen soll, ihr benötigt lediglich einen simplen Apache/NginX vHost mit Standard Rechten, man kann selbstverständlich auch ein komplizierteres Deployment bauen aber darum geht es in diesem Artikel nicht (ich nutzte hier den Apache2 mit PHP5, da dieser bereits auf dem Kunden System vorhanden wahr und zusätzliche Scriptsprachen installieren ist meist schlechte Praxis sowie auch unnötiger Aufwand).

Ich habe mich hier für den Standard Pfad des Apache Setups entschieden da der Standard vHost bereits auf diesen zeigt und dieser auch nur aus dem internen Netz bedienbar ist, somit ist sichergestellt das Niemand von außerhalb Unfug treiben kann.

Dort habe ich im DocumentRoot des Apache ein Verzeichnis api erstellt, der volle Pfad lautet hier /var/www/html/api, dort habe ich mein Webhook mit Namen on-push.php abgelegt, dieser hat nun folgenden Inhalt…

<?php
    // global settings
    define( "DEBUG", true );
    define( "OK", "Status: 200" ); 
    define( "ERR", "Status: 503" );
    define( "LOGFILE", getcwd()."/on-push.log" );
 
    // project settings
    define( "PROJECTROOT", "/var/www/project1/htdocs" );
    define( "BRANCH", "staging" );
    define( "COMMAND", "/bin/bash -c \"git fetch --all && git reset --hard origin/".BRANCH."\"" );
 
    // user which can do/trigger some updates on our staging branch
    $USERS = array( 'operator', 'developer1', 'developer2' );
 
    // =================================== MAIN =============================================
 
    try { 
        if( DEBUG ) {
            if( file_exists( LOGFILE ) ) unlink( LOGFILE );
            msg( "====== SERVER VARIABLES BEGIN ======" );
            msg( print_r( $_SERVER, true ) ); 
            msg( "====== SERVER VARIABLES END ======" );
        } 
 
        if( $_SERVER['REQUEST_METHOD'] === 'POST' ) {
            $obj = getRequestBody();
            msg( "====== JSON OBJ BEGIN ======" );
            msg( print_r( $obj, true ) );
            msg( "====== JSON OBJ END ======" );
 
            if( $obj->object_kind == 'push' ) {
                if( $obj->ref == 'refs/heads/'.BRANCH ) {
                    $allowed = false;
                    foreach( $USERS as $user ) {
                        msg( "permission test ( ".$obj->user_name ." == ". $user." ) ..." );
                        if( preg_match( "/$user/i", $obj->user_name ) ) {
                            msg( $user . " allowed to do updates on refs/heads/".BRANCH." branch" );
                            $allowed = true;
                            break;
                        }
                    } 
 
                    if( $allowed ) {
                        if( $obj->before != "0000000000000000000000000000000000000000" ) {
                            msg( "changing directory to ".PROJECTROOT );
                            chdir( PROJECTROOT );
 
                            msg( "executing: ". COMMAND );
                            $fh = popen( COMMAND." 2>&1", "r" );
                            $result = fread( $fh );
                            while( !feof( $fh ) ) {
                                msg( rtrim(fgets( $fh, 4096 )) );
                            } 
                            pclose( $fh );
                        } else {
                            msg( "it's a empty repository, we'll do nothing at this point" );
                        } 
                    } else {
                        msg( "permission denied for ". $obj->user_name );
                    }
                } else {
                    msg( "everybody can push to ". $obj->ref.", but we'll do nothing, please check your project settings" );
                }
            } else {
                msg( "[ ". $obj->object_kind ." ] event handler not yet implemented" );
            }
        } else {
            msg( strtoupper($_SERVER['REQUEST_METHOD'])." from [ ".$_SERVER['REMOTE_ADDR'] ." ] is not allowed, please check your server settings" );
            return_status( ERR );
        }
    } catch( Exception $e ) {
        msg( "======= EXCEPTION BEGIN ========" );
        msg( $e->getMessage() );
        msg( "======= EXCEPTION END ==========" );
        return_status( ERR );
    }
 
    return_status( OK ); 
 
    // ================================ FUNCTIONS ===========================================
    function return_status( $status = ERR ) { header( $status ); }
    function getRequestBody() { return json_decode( file_get_contents('php://input') ); }
    function msg( $message ) { if( $message != null ) file_put_contents( LOGFILE, $message."\n", FILE_APPEND ); } 
?>

..damit das nun funktionieren kann, müssen wir nun noch das Projekt Klonen und die SSH Settings anlegen, fangen wir daher direkt mit den SSH Settings an…

# (beginne mit Root Login)
su - -s /bin/bash www-data
mkdir -p .ssh && chmod 0600 .ssh
exit
cp gitlab.key /var/www/.ssh/ && chown www-data. /var/www/.ssh/gitlab.key && chmod 0400 /var/www/.ssh/gitlab.key
su - -s /bin/bash www-data
vi .ssh/config

…die .ssh/config sieht dabei wie folgt aus…

Host gitlab.example.org
    UserKnownHostsFile /dev/null
    StrictHostKeyChecking no
    IdentityFile ~/.ssh/gitlab.key
    User git
    LogLevel VERBOSE

…speichert nun das ganze und Klont eurer Projekt nach /var/www/project1/htdocs

# (beginne mit Root Login)
su - -s /bin/bash www-data
cd /var/www/project1
git clone git@gitlab.example.org:test/number1.git htdocs

…wenn ihr nun Lokal mit eurer Arbeitskopie arbeitet und an dem Punkt seit das ihr alles fertig zuhaben scheint und dann einen Push in euren staging Branch macht, wird GitLab jedesmal den Webhook on-push.php Aufrufen und auf dem Projekt/Web -Server einen Fetch/Pull ausführen lassen, um das Projekt auf den selben Stand wie eure Arbeitskopie zu bringen.

Zugegeben der PHP Handler oben ist keinesfalls perfekt, ich bin auch kein guter PHP Programmierer, genau genommen eigentlich gar keiner ;). Der Hook für das Kunden Projekt umfasst zudem noch mehr Fähigkeiten und würde mit seine zu diesem Zeitpunt ca. 800 Zeilen diesen Artikel in jedem Fall sprengen, aber ich denke das der gezeigte Webhook oben bereits eine gute Ausgangsbasis darstellt, sodass ich euch hoffentlich dazu Animieren konnte, das ganze doch einmal selber nachzubauen.

Zum zweck des Debugging, loggt dieser zur Kontrolle nach /var/www/html/api/on-push.log , hier lohnt also ein Blick.

Noch ein kleiner Hinweis meinerseits, der eine oder andere von euch wird schnell feststellen, das GitLab selber im Admin Panel auch einen Menü Eintrag mit der Bezeichnung [Deploy Keys] bereitstellt, womit sich das oben gezeigte auch umsetzten lässt, aufgrund einiger bedenken bzgl. Sicherheit dieses allerdings nicht immer gewünscht ist, da alle Keys die dort hinterlegt werden automatisch, für allen Projekte (auch für zukünftige) direkt verwendet werden können.

Nützliche Links:

Enrico Labedzki

Autor: Enrico Labedzki

Enrico ist beruflich ganz schön rumgekommen – IT hat ihn aber immer beschäftigt. Nach einem Ausflug in die Selbstständigkeit im Bereich Webentwicklung und Network Solutions, wurde es dann Zeit Nägel mit Köpfen zu machen und endlich den Weg als Softwareentwickler und Systemintegrator einzuschlagen. In seiner Freizeit widmet sich der passionierte Bastler der Elektrotechnik und Animatronik. Bei Netways bereichert er mit seinem vielseitigen Know-How das Managed Service-Team.

Advanced Puppet Schulungen – jetzt doppelt und dreifach sparen!

Nach Webder Umstellung unserer Puppet Schulungen können wir nun die erste erfolgreich durchgeführte Fundamentals for Puppet Schulung verzeichnen. Und nun geht es mit Advanced Puppet weiter. Die neuen eigenen NETWAYS Puppet Schulungsunterlagen sind auch schon komplett. Neu wird sein, dass die Schulung nun auf Puppet 4 basiert und wir uns mit der Open Source Variante beschäftigen werden, weil „We love Open Source“.
Wir sind schon ganz aufgeregt und freuen uns riesig auf die Schulung.

Und das werden die Schulungsinhalte sein:

Review, Neuerungen und zusätzliche Optionen
Optionale Facts und Funktionen
Reports
Orchestrierung
Qualitätssicherung der Puppet-Module
Versionierung mit Git und Syntaxvalidierung
Unit tests mit rspec
Acceptance tests mit serverspec
Module-Design
Architektur eines Modules
Vererbung und Parametrierung
Abhängigkeiten innerhalb und zwischen Modulen
Troubleshooting a Puppet run

Außerdem besteht wie bei jeder NETWAYS Schulung die Möglichkeit, sich bei gemeinsamen Mittag – und Abendessen mit dem Trainer und anderen Teilnehmern zusammenzusetzen und sich über gesammelte Erfahrungen auszutauschen. Unsere Schulungen enthalten die Teilnahme an allen Trainingstagen in kleiner Gruppe, die Verpflegung, ein Schulungsnotebook für die Dauer der Schulung, Unterlagen, sowie kostenlosen WLAN-Zugang.
Für die Teilnahme sind gute Linux-Kenntnisse, sowie Erfahrung mit der Entwicklung von Puppet Modulen von Vorteil.

Lust auf Advanced Puppet bekommen? Die nächste Schulung findet schon vom 11.-13. Juli 2016 in Nürnberg statt. Hier geht‘ zur Anmeldung.

Schulungen Preisstaffelung

Bei vielen Firmen ist man nicht der einzige, der neues Know-How in Form einer Schulung benötigt. Für diesen Fall haben uns für euch jetzt etwas ausgedacht. Falls nämlich gleich mehrere Kollegen deiner Firma Lust auf die Schulung haben, könnt Ihr für jeden Kollegen nochmal kräftig sparen! Hier unsere Preisstaffelung:

Julia Hackbarth

Autor: Julia Hackbarth

Julia ist seit 2015 bei NETWAYS. Sie hat im September ihre Ausbildung zur Kauffrau für Büromanagement gestartet. Etwas zu organisieren macht ihr großen Spaß und sie freut sich auf vielseitige Herausforderungen. In ihrer Freizeit spielt Handball eine große Rolle: Julia steht selbst aktiv auf dem Feld, übernimmt aber auch gerne den Part als Schiedsrichterin.

Foreman wird 7 – Save the date

English version below

Foreman Logo

Ende nächsten Monat wird das Foreman-Projekt 7 Jahr alt und erwartet seinen Release 1.12, welcher solche interessante Features wie Support für Puppet 4 und IPv6 mitbringt. Dies nahm Greg Sutcliffe (Community Manager des Projekts) zum Anlass ein paar offizielle Parties zu organisieren und wie jeder weiß schmeißt Netways die besten Parties, weshalb ich nun die Ehre habe folgendes zu verkünden.

Am 21.07.2016 findet in unserem Eventraum, dem beliebten Kesselhaus, die deutsche Foreman-Geburtstagsparty statt und alle sind eingeladen vom interessierten Neuling bis zum alten Hasen.

Aktuell sieht das Programm folgendermaßen aus:
Wir werden um 12:30 mit einer Hands-on-Session beginnen. Für diese werde ich ein paar Demosysteme vorbereiten, die einige der Möglichkeiten von Foreman und Katello zeigen werden. Neben diesen Demosystemen stehe ich, weitere Kollegen und Mitglieder des Foreman-Projekts zur Verfügung um Fragen zu beantworten und jedem der sein eigenes Notebook mitbringt bei der Installation eines eigenen Demosetups zu helfen. Wer will geht also mit einer Foreman-Installation nach Hause mit der er jederzeit weitere virtuelle Maschinen bereitstellen kann.
So gegen 15 Uhr machen wir dann eine Kaffeepause um frisch gestärkt in eine Reihe von Vorträgen zu starten. Bisher ist es mir gelungen dafür Timo Goebel von Filiadata, dem IT-Dienstleister der Drogeriemarktkette dm, zu gewinnen. Dieser wird unter dem Motto “From 0 to 2000 – Life-Cycle-Management with Foreman at dm-drogeriemarkt” ihre Foreman-Installation vorstellen und zeigen wie tief diese in ihre Umgebung integriert ist. Michael Moll von der Mayflower GmbH wird als Mitglied des Foreman-Projekts auf die Neuerungen des 1.12 Release eingehen, insbesondere die “Puppet 4”-Unterstützung. Mein Kollege Achim Ledermüller aus unserem “Managed Service”-Team wird unsere Umgebung und die dafür so wichtige Foreman-OpenNebula-Integration vorstellen.
Für einen vierten oder gar fünften Vortrag bin ich noch an ein paar weiteren Personen dran, welche das hochkarätige Programm noch weiter aufwerten könnten. Ein paar weitere Mitglieder des Foreman-Teams kann ich schon als Teilnehmer versprechen und an weiteren bin ich dran, so dass hoffentlich keine Frage offen bleibt, wenn wir nach den Vorträgen zum gemütlichen Teil mit Essen und Getränken übergehen.

Zur kostenlosen Anmeldung geht hier.

Zur weiteren Planung halten wir euch über Twitter auf dem laufenden und sobald das Programm feststeht wird dieses auch auf der offiziellen Geburtstagsseite des Foreman-Projekts veröffentlicht.

P.S.: Und wer es nicht zur Party schafft oder danach nicht mehr genug von Foreman bekommen kann, hat gleiche in der folgenden Woche die Chance an unserer Schulung teilzunehmen.

(more…)

Dirk Götz

Autor: Dirk Götz

Dirk ist Red Hat Spezialist und arbeitet bei NETWAYS im Bereich Consulting für Icinga, Nagios, Puppet und andere Systems Management Lösungen. Früher war er bei einem Träger der gesetzlichen Rentenversicherung als Senior Administrator beschäftigt und auch für die Ausbildung der Azubis verantwortlich.

Funktionales Programmieren in PHP

Letztens bin ich auf Github auf ein interessantes Projekt gestoßen, das ich euch nicht vorenthalten möchte. Ihor Burlachenko bietet mit PHP NSPL eine großartige Bibliothek, um alltägliche Programmieraufgaben elegant und funktional zu lösen. Sein Projekt auf Github ist ausführlich dokumentiert und bietet einige Beispiele. Also am besten gleich vorbeischauen oder hier den ersten Eindruck gewinnen:

// Get user ids
 
// NSPL
$userIds = map(propertyGetter('id'), $users);
 
// vs PHP
$userIds = array_map(
    function ($user) {
        return $user->id;
    },
    $users
);
 
// Filter active users
 
// NSPL
$activeUsers = filter(methodCaller('isActive'), $users);
 
// vs PHP
$activeUsers = array_filter(
    $users,
    function ($user) {
        return $user->isActive();
    }
);

Eric Lippmann

Autor: Eric Lippmann

Eric kam während seines ersten Lehrjahres zu NETWAYS und hat seine Ausbildung bereits 2011 sehr erfolgreich abgeschlossen. Seit Beginn arbeitet er in der Softwareentwicklung und dort an den unterschiedlichen NETWAYS Open Source Lösungen, insbesondere inGraph und im Icinga Team an Icinga Web. Darüber hinaus zeichnet er sich für viele Kundenentwicklungen in der Finanz- und Automobilbranche verantwortlich.