Systemd-Unitfiles kurz erklärt

Tux
Nachdem ich feststellen musst, dass immer noch der ein oder andere mit Systemd und den Unitfiles auf Kriegsfuß steht und mit tieferem Wissen manches Problem zu vermeiden wäre, will ich mit ein paar kurzen Erklärungen Abhilfe schaffen.

Systemd hat als Ersatz für init bereits 2010 angefangen in die verschiedenen Distributionen Einzug zu halten und ist mittlerweile Standard. Somit haben auch die alten init-Skripte ausgedient und wurde durch Unitfiles ersetzt. Auf den ersten Blick lassen diese weniger Optionen zu, aber sobald man sich etwas weiter mit den Einstellmöglichkeiten auseinandersetzt, wird man wohl nichts an Funktionalität vermissen.

Für die Erläuterungen möchte ich ein Beispiel nehmen, dass vielleicht der ein oder andere schon kennt, und habe mich darum für Icinga 2 entschieden. Dieses findet sich in /usr/lib/systemd/system als icinga2.service und sieht folgendermaßen aus:

[Unit]
Description=Icinga host/service/network monitoring system
After=syslog.target network-online.target postgresql.service mariadb.service carbon-cache.service carbon-relay.service

[Service]
Type=forking
EnvironmentFile=/etc/sysconfig/icinga2
ExecStartPre=/usr/lib/icinga2/prepare-dirs /etc/sysconfig/icinga2
ExecStart=/usr/sbin/icinga2 daemon -d -e ${ICINGA2_ERROR_LOG}
PIDFile=/run/icinga2/icinga2.pid
ExecReload=/usr/lib/icinga2/safe-reload /etc/sysconfig/icinga2
TimeoutStartSec=30m

[Install]
WantedBy=multi-user.target

Als erstes möchte ich auf den Pfad selbst eingehen. Diese muss per Konvention heißen wie der Service, der über sie gesteuert wird, und auf .service enden, damit sie von anderen Units unterscheidbar ist. Andere Units wären beispielsweise Sockets für die socketbasierende Aktivierung oder Targets als Gruppierung von Services und Ersatz für die Runlevel. Der Pfad /usr/lib/systemd/system ist hierbei der Ablageort für Package-Maintainer und kann mit Dateien in /run/systemd/system oder /etc/systemd/system überschrieben werden, wobei letzteres für den Administrator gedacht ist.

Die Datei selbst ist dann im Ini-Format, heißt es gibt verschiedene Sektion wie [Unit] und Key-Value-Paare, die in der entsprechenden Sektion sein müssen. In der Sektion [Unit] finden sich somit allgemeine Einstellungen die bei jedem Unit-Typen vorkommen können, in diesem Fall die Beschreibung und mit After eine Liste von Units, die wenn vorhanden vor Icinga 2 gestartet sein sollen. Die Manpage systemd.unit gibt hierüber detailliert Auskunft.

In der für den Unit-Typ spezifischen Sektion in unserem Fall [Service] werden dann weitere Einstellungen vorgenommen. Hier wird Systemd gesagt wie das Startverhalten des Dienstes ist denn standardmäßig möchte Systemd Dienste im Vordergrund starten im Gegensatz zum Standardverhalten von init bei dem sich der Dienst in den Hintergrund forkt. Über EnvironmentFile, zusätzliche Skripte in ExecStartPre oder ExecStartPost und den eigentlich Aufruf des zu startenden Dienst mittels ExecStart wird das frühere init-Skript abgelöst. In Fall von Icinga2 wird im Pre-Skript sichergestellt, dass benötigte Verzeichnisse existieren und entsprechend berechtigt sind. Zusätzlich wird der Reload-Mechanismus durch ein Skript ersetzt, damit die Konfiguration validiert wird bevor gegebenenfalls der Dienst neugestartet wird. TimeoutStartSec ist prinzipiell selbsterklärend denk ich, nimmt im Gegensatz zu den Sekunden im Namen aber auch andere Einheiten an wie hier 30m für 30 Minuten. Hierbei bitte aufpassen, dass nur der Start-Timeout und nicht der allgemeine Timeout hochgesetzt wird, da letzterer auch für den Shutdown des Systems gilt. Mehr Details liefert die Manpage systemd.service.

Die letzte Sektion gibt an in welches Target der Dienst “installiert” werden soll, wenn systemctl enable ausgeführt wird.

Die Datei unter /usr/lib/systemd/system sollte nicht angepasst werden, da diese beim nächsten Update überschrieben wird. Kopiert man es aber nach /etc/systemd/system muss man die komplette Pflege übernehmen, da es das aus dem Paket gelieferte komplett ersetzt. Hierfür gibt es den Mechanismus der Drop-Ins. Diese müssen in ein Verzeichnis mit dem Namen der Unit abgelegt werden, in unserem Fall /etc/systemd/system/icinga2.service.d und auf .conf enden. Der Name ist hierbei prinzipiell egal, sollte aber sprechend gewählt werden und da sich Eigenschaften überschreiben bietet sich eine Priorität als Präfix an. Beim Inhalt nicht die Sektionsheader vergessen! Auch hierfür ein Beispiel aus Icinga 2:

# Icinga 2 sets some default values to extend OS defaults
#
# Please refer to our troubleshooting documentations for details
# and reasons on these values.
[Service]
TasksMax=infinity

# May also cause problems, uncomment if you have any
#LimitNPROC=62883

Mit dem Kommando systemctl property kann man genau diesen Mechanismus nutzen ohne sich um die Dateistruktur kümmern zu müssen, aber leider funktioniert dies nicht für alle Optionen. Kernel-Parameter, Posix-Limits und vieles mehr lassen sich hier einstellen, welche sich in systemd.exec finden, und Einstellungen für die Kontrolle über Ressourcen, welche Systemd mittels Cgroups umsetzt, finden sich in systemd.resource-control. Die Defaults hierfür finden sich übrigens in /etc/systemd/system.conf und müssen nicht immer gleich heißen, beispielsweise DefaultTasksMax und TasksMax. Die eingebundenen Drop-Ins zeigt systemctl status sehr schön an und die aktuellen Werte für alle Einstellungen eines Services inklusive Defaults liefert systemctl show.

Und abschließend nicht vergessen Systemd die vorgenommenen Änderungen mit systemctl daemon-reload auch mitzuteilen.

Ich hoffe diese kleine Erläuterung hilft dem ein oder anderen Unitfiles besser zu verstehen und er weiß nun wo er hin langen muss wenn Stellschrauben anzupassen sind.

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.

NETWAYS stellt sich vor – Riccardo Gringer

This entry is part 33 of 33 in the series Mitarbeitervorstellung

Name: Riccardo Gringer

Alter: 19

Position bei NETWAYS: Junior Developer

Was genau gehört zu Deinem Aufgabenbereich bei NETWAYS?

Momentan arbeite ich mich noch in Icinga 2 und Icinga Web 2 ein und werde damit in der Zukunft arbeiten. Natürlich gibt es etliche kleinere Nebenprojekte die auch bearbeitet werden müssen.

An welchen Projekten arbeitest Du gerade?

Zur Zeit bin ich wie schon gesagt noch an einer Einarbeitungsphase. Das heißt ich versuche mich in die verschiedenen Programme und Projekte einzuarbeiten um einen Überblick über alles zu bekommen. Aktuell sind das Icinga 2 und Icinga Web 2.

Was macht Dir an Deiner Arbeit am meisten Spaß?

Ich glaube am meisten Spaß macht bis jetzt das tüfteln an einer Lösung für ein Problem. Bei jedem Problem gibt es Kleinigkeiten die anders behandelt werden müssen. Es gibt ja schließlich nicht immer eine Lösung die man immer anwenden kann!

Was machst Du, wenn Du mal nicht bei NETWAYS bist?

Meine Freizeit verbringe ich zu (nahezu) gleichen Teilen mit meinen Katzen (2 Perser), meinem Heimkino und dem zocken. Das Heimkino ist dabei ein Langzeitprojekt seit mehreren Jahren. Natürlich verbringe ich an Wochenenden auch viel Zeit mit Freunden, vor allem zur Kerwazeit ;).

Wie geht es in Zukunft bei Dir weiter?

Die Ausbildung wird in den nächsten drei Jahren die größte Aufmerksamkeit bekommen. Schließlich muss ich außerhalb der Arbeitszeiten noch für die Berufsschule lernen und Hausaufgaben machen. Natürlich versuche ich während der Ausbildung so viel wie möglich zu lernen und mitzunehmen um danach erfolgreich als Developer arbeiten zu können.

 

Riccardo Gringer

Autor: Riccardo Gringer

Riccardo hat bei NETWAYS sein Praktikum im Development gestartet. In seiner Freizeit bastelt er mit Feuereifer an einem Heimkino und kümmert sich nebenbei darum, dass sich seine zwei Perserkatzen nicht langweilen. Außerdem schaut er gerne Filme, liest viel und spielt natürlich auch gerne Computer. Für seine Zeit bei NETWAYS wünscht er sich, sein Praktikum und seine Ausbildung erfolgreich zu bestreiten und dabei selbstverständlich auch genug Spaß und Freude mit den Kollegen zu haben!

Das Professional Services Team unterwegs

Um 8:30 gingen wir aus den Professional Services nach Ingolstadt zu unserem gemeinsamen Teamweekend.
Nach einer Fahrt von 30 Minuten und einer netten Unterhaltung über Applegeräte im Vergleich mit Androidgeräten mit den Kollegen im Auto, sind wir dann in Ingolstadt angekommen. Untergebracht waren wir im Hotel im GVZ. Als wir dann schlussendlich auch im Hotel ankamen, besetzten wir direkt den Konferenzraum, der erstaunlich wenige Steckdosen bereit hielt. In unserer 7 stündigen Konferenz mit mehreren Kaffeepausen, besprachen wir betriebsinterne Dinge und dann wurden nochmals alle AZUBIS begrüßt.
Am Abend wusste niemand wirklich was geplant war, außer unsere Teamleiter. Es ging in einen Klettergarten, allerdings lediglich zum Steak essen. Der Abend klang dann mit Bier am Lagerfeuer aus. Als wir dann um 23 Uhr wieder im Hotel ankamen, bin ich geschafft ins Bett gefallen.

Der kommende Morgen begann für mich um 8:00Uhr. Das Frühstück stand schon im kleinen Hotelrestaurant bereit. Um 9:30 war dann Aufbruch und wir gingen wieder in den Klettergarten, in dem wir schon letzten Abend dinierten, um dort unsere Teamaufgabe zu absolvieren.
Diese bestand daraus eine Hängebrücke über einen Weiher mit ca. 30 Metern Durchmesser zu bauen. Das Material, das uns zur Verfügung stand belief sich auf:
• 30-35 Bretter mit je 1 Meter Länge
• ca. 60 Kletterseile
• ca. 70 Karabinerhaken
• 2 Stahlseile
Die nachfolgenden Ereignisse fanden im Zeitraum zwischen 11 Uhr und 14 Uhr statt:

Killian Pieper-Müller

Autor: Killian Pieper-Müller

Killian ist seit 1. September 2017 bei uns als angehender Fachinformatiker für Systemintegration. Er erwartet sich von seiner Ausbildung richtige Kenntnisse im Programmieren und in Linux. In seiner Freizeit schaut er sehr gerne Serien, Programmiert oder trifft sich mit Freunden ... im Internet zum Online-Gaming.

GUI REST clients

Mittlerweile sind HTTP REST APIs aus der täglichen Arbeit in der IT nicht mehr wegzudenken. Noch vor Jahren durchaus als exotisch zu bezeichnen, ohne Dokumentation und chaotisch verwoben, entstehen immer mehr gute APIs die sich an entsprechende Standards halten und sinnvolle Funktion bieten. Angefangen von atmosphärischen Zufallszahlen, randomisierten Bildern  oder Kartendecks ist mittlerweile alles aus Microservices zu holen – man denke nur an die 125726 Google APIs. Übrigens bieten wir mit Icinga 2 oder Icinga Web 2 standardisierte APIs für die Monitoring-Umgebung an und ein nicht geringer Anteil unserer Routine besteht mit der Arbeit dieser APIs.

Um effektiv mit den Schnittstellen arbeiten zu können muss man sich diese etwas genauer anschauen. Am besten geht das mit entsprechenden Tools und einer Handvoll guter Features, z.B.:

  • Repetitive Anfragen
  • Absteigende URLs
  • Header, Parameter, Request Body, Cookies
  • Authentifizierung
  • Organisation (Sammlungen, Request-Historie)
  • Binary Daten
  • Pretty Print der Rückgaben

Ich bin mittlerweile unter macOS bei zwei Tools hängengeblieben die gerne einmal zeigen möchte: CocoaRestClient und Postman. Beide Tools besitzen oben genannte Features. Postman gibt es sogar als Chrome App. Bei Verwendung von Chrome und debugging von JavaScript kommt also gleich alles aus einem Guss ;-). Postman ist insgesamt mehr Feature-Complete und die native Cocoa macOS App unglaublich fix. Und natürlich hat auch Curl seine Berechtigung – wenn auch kein GUI!

Es folgt noch eine kleine Photostrecke. Dann ist die eigene Meinung gefragt…

 

Marius Hein

Autor: Marius Hein

Marius Hein ist schon seit 2003 bei NETWAYS. Er hat hier seine Ausbildung zum Fachinformatiker absolviert, dann als Application Developer gearbeitet und ist nun Leiter der Softwareentwicklung. Ausserdem ist er Mitglied im Icinga Team und verantwortet dort das Icinga Web.

Der Consultant und die lieben Zertifizierungen II

RHCA
Vielleicht erinnert sich noch jemand an meinen Blogpost bezüglich Zertifizierungen in dem ich angekündigt hatte auch noch den Performance-Tuning-Kurs bei Red Hat besuchen zu wollen. Nach einigem Hin und Her bei der Terminfindung durfte ich diesen nun endlich besuchen. Nach 4 Tagen Kurs die sich um Performance-Tuning und dem Sammeln der notwendigen Daten allgemein, den Tuning-Daemon tuned und das Tuning für verschiedene Workloads drehten, stand auch wieder eine Prüfung für das “Certificate of Expertise” an. Allein das Ziel dieses zu erlangen sorgte dafür, dass die 4 Tage Schulung jeweils aus mehr als 8 Stunden “Unterricht” und 2 Stunden “Nachlernen” bestanden. So tief hatte ich mich schließlich noch nie mit verschiedensten Kernelparametern, ihrer Auswirkung und den Berechnungen dahinter beschäftigt. Um nur ein Beispiel herauszupicken sei hier das Bandwidth delay product (BDP) mit dem so einiges aus den Verbindungen herauszuholen war. Natürlich kann aus einem optimal konfigurierten System nicht mehr viel herausgeholt werden, man spricht von 3-5%, aber das Wissen hilft auch erstmal diesen optimalen Zustand zu erreichen.

Vollgestopft mit diesem Wissen und trotzdem gefühlt vollkommen blank saß ich dann am Freitag in der Prüfung. Wie bei Red Hat üblich war dies eine praktische Prüfung am System. Das heißt man hat einem Pflichtenheft nicht unähnliche Aufgaben, die gelöst werden wollen. Im Gegensatz zu den bisher abgelegten Zertifizierungen hat diese auch viele “theoretische” Aufgaben bei denen Werte, Daten oder Zeiten ermittelt werden müssen, gerade bei diesen tut man sich schwer, wenn man sonst gewohnheitsmäßig ein anderes Werkzeug nutzt. Wer mein 4-stündiges emotionales Auf und Ab während der Prüfung beobachten konnte hatte sicher seine Freude, nach dem ersten Neustart und der Feststellung was nicht funktionierte wie gedacht war ich mir dann auch sicher nicht bestanden zu haben. Doch bereits wenige Stunden später kam das Prüfungsergebnis aus den USA und ich hatte genauso bestanden wie die beiden anderen Teilnehmer.

Zusätzlich zu dem Prüfungsergebnis kam überraschenderweise auch noch eine Mail, die mir zum Erlangen des Titels “Red Hat Certified Architect” gratulierte. Zwar wusste ich dass es mein fünftes “Certificate of Expertise” ist, aber ich hatte die Umstrukturierung so verstanden, dass man mittlerweile 5 bestimmte für die jeweilige Spezialisierung des RHCA wie beispielsweise “Datacenter” oder “Cloud” benötigt. Auch wenn ich überrascht war, freue ich mich nun zu den RHCAs zählen zu dürfen, denn dahinter steckt nicht nur viel erworbenes Wissen sondern auch viel aufgewendete Zeit. Ein Wissen, dass ich gerne an unsere Auszubildenden weitergeben und für unsere Kunden einsetze.

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.

Vom Noob-OS zum IPv4-Router

Dass man die Docker-Alternative LXD ohne große Hürden auch auf Mac OS X betreiben kann, habe ich in meinem letzten Blog-Post bereits detailliert erläutert.

Leider kann ich im Rahmen meiner Arbeit nicht alles in diesen Ubuntu-Containern betreiben. Die Entwicklungsumgebungen für so manche Anwendungen wie z. B. Icinga Web 2 werden mit Vagrant provisioniert und dieses Programm lässt sich nur sehr mühsam an LXD koppeln. Deshalb komme ich nur mit der einen LXD-VM wohl oder übel nicht aus.

Spätestens wenn die anderen VMs (oder deren Container) mit den LXD-Containern kommunizieren müssen, stößt dieses Setup an seine Grenzen… oder?

Das Setup im Detail

Wie auch jeder andere Gewerbebetrieb, in dem keine Schreibmaschinen mehr zum Einsatz kommen, verfügt NETWAYS über ein internes IP-Netz – beispielhaft mit den Host-Adressen 192.0.2.1 – 192.0.2.14. Der Router zum Internet beansprucht für sich die 192.0.2.1 und meinem Arbeitsgerät ist die 192.0.2.2 zugeteilt.

Um mit meinen virtuellen Maschinen kommunizieren zu können, teilt meine Workstation sich ein IP-Netz mit ihnen (192.0.2.17 – 192.0.2.30). Und schließlich sollen auch meine LXD-Container nicht so isoliert sein wie ein Schreibmaschinen-Nutzer – deshalb teilen sie sich ein wieder anderes IP-Netz (192.0.2.33 – 192.0.2.46) mit der LXD-VM.

Wenn nun ein Knoten einen anderen ansprechen will, muss er entweder im selben IP-Netz sein wie der gewünschte Gesprächspartner – oder in der Netz-Hierarchie unter einem Router stehen, der den gewünschten Gesprächspartner erreichen kann.

Beispiel #1

LXD-Container #1 will mit 192.0.2.50 kommunizieren, ist aber nicht im selben Netz. Ihm bleibt nichts anderes, als über sein Standard-Gateway, 192.0.2.33, zu senden und zu hoffen, dass die Verbindung erfolgreich zustande kommt. Die LXD-VM ist aber auch nicht im selben Netz. Daher muss sie sich wiederum auf ihren Standard-Gateway (192.0.2.17) verlassen. Meine Workstation delegiert wiederum an 192.0.2.1 usw.. Und wenn da draußen tatsächlich eine 192.0.2.50 online ist (und alle Internet-Router so rund laufen wie unser Firmen-Gateway) kommt letztendlich die Verbindung erfolgreich zustande.

Beispiel #2

VM #1 will mit 192.0.2.34 kommunizieren, ist aber nicht im selben Netz. Ihr bleibt nichts anderes, als an ihr Standard-Gateway, 192.0.2.17, zu delegieren. Leider weiß Mac OS nichts vom Netz 192.0.2.32/28 und delegiert an unser Firmen-Gateway. Das und alles dahinter kann noch so rund laufen, aber der Zug in Richtung des LXD-Container-Netzes ist längst abgefahren.

Aber ich würde nicht schon gut 3,5 Jahre bei NETWAYS arbeiten wenn ich diese Hürde nicht spielend einfach überwinden könnte. Dazu braucht es nur…

Statische Routen auf Mac OS X

Natürlich könnte ich auch auf jeder VM eine statische Route hinterlegen, aber das wäre zusätzlicher Aufwand bei jeder VM-Erstellung. Sollte darüber hinaus die Anzahl der VMs mit Linux-Containern zunehmen, steigt damit auch mein Aufwand beim Routen-Management nicht zu knapp…

Deshalb ist es langfristig so oder so sinnvoller, alle VMs an die Workstation delegieren zu lassen und diese zum Router zu befördern. Wie praktisch, dass Mac OS X auf 4.4BSD basiert und damit zur *nix-Familie gehört. Damit ist dieses Vorhaben ein Kinderspiel (wenn man weiß wie es geht).

Jetzt aber endlich mal Butter bei die Fische

Schritt 1: Konzentration!

Um Mac OS die gewünschten statischen Routen beizubringen, muss man tiefer ins System eingreifen, als es ein durchschnittlicher Mac-Nutzer es gewohnt ist. Dabei lässt sich mit ein bisschen Schusseligkeit sehr viel kaputt machen. Wenn Du gerade z. B. eine ordentliche Portion G&T konsumiert hast… habe Geduld. Morgen ist auch noch ein Tag und Mac OS läuft schon nicht weg.

Schritt 2: Root-Rechte

Obwohl Mac OS sich an weniger versierte Nutzer richtet, bietet es die Möglichkeit, Root-Rechte zu erlangen wie man das von verbreiteten GNU/Linux-Distributionen kennt:

Alexanders-MacBook-Pro:~ aklimov$ sudo -i
Password:
Alexanders-MacBook-Pro:~ root#

Schritt 3: Hilfs-Skripte

Die eben erlangten Privilegien berechtigen uns, Skripte in dem OS vorbehaltene Verzeichnisse zu platzieren – wovon wir auch Gebrauch machen, indem wir zunächst das Verzeichnis /usr/local/sbin erstellen und darin zwei Skripte ablegen:

Alexanders-MacBook-Pro:~ root# mkdir -p /usr/local/sbin
Alexanders-MacBook-Pro:~ root# vim /usr/local/sbin/add-static-route.pl
Alexanders-MacBook-Pro:~ root# chmod 0755 /usr/local/sbin/add-static-route.pl
Alexanders-MacBook-Pro:~ root# vim /usr/local/sbin/add-static-routes.sh
Alexanders-MacBook-Pro:~ root# chmod 0755 /usr/local/sbin/add-static-routes.sh

Das erste Skript, /usr/local/sbin/add-static-route.pl, dient dem Hinzufügen von statischen Routen, sobald die entsprechende Netzwerk-Schnittstelle online ist:

#!/usr/bin/perl

# (C) 2017 NETWAYS GmbH | GPLv2+
# Author: Alexander A. Klimov

my $destination = shift;
my $gateway = shift;

if (!(defined($destination) && defined($gateway))) {
    exit 2 # RTFM at https://wp.me/pgR2o-rlj
}


my $gatewayDec = ip4_2dec($gateway);

POLL: for (;;) {
    for (`/sbin/ifconfig`) {
        if (/^\tinet (.+?) netmask (.+?) /) {
            my $mask = hex($2);
            if (($gatewayDec & $mask) == (ip4_2dec($1) & $mask)) {
                my $status = system("/sbin/route", "add", "-net", $destination, $gateway) >> 8;
                die "/sbin/route: $status" if ($status != 0);
                last POLL
            }
        }
    }

    sleep 1
}


sub ip4_2dec
{
    hex(join("", map({ sprintf("%02x", $_) } split(/\./, shift()))))
}

Das zweite Skript, /usr/local/sbin/add-static-routes.sh, ruft das erste Skript auf und fügt damit konkrete Routen hinzu:

#!/bin/bash

set -e
set -o pipefail

/usr/local/sbin/add-static-route.pl 192.0.2.32/28 192.0.2.18

Die Kommandozeilen-Schnittstelle des ersten Skripts habe ich extra so gestaltet, dass die Routen-Liste (das zweite Skript) möglichst einfach erweitert werden kann. Wenn bspw. eine zweite LXD-VM mit der IP-Adresse 192.0.2.21 dazukommt und mit ihren Containern über das Netz 192.0.2.64/28 verbunden ist, gehört folgende Zeile ans Ende der Routen-Liste:

/usr/local/sbin/add-static-route.pl 192.0.2.64/28 192.0.2.21

Schritt 4: Autostart

Damit das zweite Skript nicht bei jedem Systemstart manuell ausgeführt werden muss, lassen wir Mac OS es für uns automatisch starten:

Alexanders-MacBook-Pro:~ root# pushd /Library/LaunchDaemons
/Library/LaunchDaemons ~
Alexanders-MacBook-Pro:LaunchDaemons root# vim mystaticroutes.plist
Alexanders-MacBook-Pro:LaunchDaemons root# launchctl load mystaticroutes.plist

Inhalt von mystaticroutes.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>MyStaticRoutes</string>
    <key>ProgramArguments</key>
    <array>
      <string>/usr/local/sbin/add-static-routes.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
  </dict>
</plist>

Fazit

Obwohl mich die Kollegen aus den eigenen Reihen – aber auch aus NMS und PS – spätestens seit diesem Blogeintrag mit besorgten Blicken überschütten, werde ich einfach nicht müde, das Noob-OS von Apple auf biegen und brechen meinen seltsamen Bedürfnissen entsprechend aufzubohren.

Abonniert gerne kostenlos diesen Blog um auch über die nächste Runde informiert zu werden – wenn ich den abgebissenen Apfel bis auf den Kern schäle…

Alexander Klimov

Autor: Alexander Klimov

Alexander hat 2017 seine Ausbildung zum Developer bei NETWAYS erfolgreich abgeschlossen. Als leidenschaftlicher Programmierer und begeisterter Anhänger der Idee freier Software, hat er sich dabei innerhalb kürzester Zeit in die Herzen seiner Kollegen im Development geschlichen. Wäre nicht ausgerechnet Gandhi sein Vorbild, würde er von dort aus daran arbeiten, seinen geheimen Plan, erst die Abteilung und dann die Weltherrschaft an sich zu reißen, zu realisieren - tut er aber nicht. Stattdessen beschreitet er mit der Arbeit an Icinga Web 2 bei uns friedliche Wege.