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.

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.

Foreman’s 8th birthday – How was the party?

Foreman logo

As you may remember we gave the Foreman Project another party to celebrate its 8th birthday, so now it is time for a small recap.

At 12:30 I welcomed a group of about 20 people for the event coming mostly from Southern Germany, but with Ewoud Kohl van Wijngaarden coming down from the Netherlands we had again at least one international guest. Afterwards we started with the hands-on session. This session was planned as a completely open session, so some discussions and hacking started while others played around with the demo systems I prepared. In addition to the basic setup containing several ways of provisioning, Puppet for configuration management and some plugins like OpenSCAP, Remote Execution and Expire Hosts one demo setup included the Monitoring Plugin, so Host provisioning included adding them to Icinga Web 2 Director and monitor them. Another one had added Docker integration, CoreOS provisioning and updating via Foreman’s Omaha Plugin. The third one was installed using nightly builds of Foreman and the plugins to demonstrate Puppet 5 and Ansible. The last demo was showing Katello and its Lifecyclemanagement. I think every system has created some interest but this year the most persons were interested in Ansible and Monitoring Integration, followed by Lifecyclemanagement and OpenSCAP.

Foreman Event 2017 - Start

I tried to get the talks in a reasoned order, so Michael Moll started with his talk “The last year in Foreman” which gave a nice look inside last year’s development and changes and some hints on future improvements. The second speaker was Timo Goebel with “Foreman – Advanced Use Cases” who had many ideas what he could talk about from his experience at dm/filiadata, but in the end he demonstrated how to deploy a CoreOS cluster including update management via the Omaha Plugin he created. Third talk was “Refactoring Katello Installer modules” by Ewoud Kohl van Wijngaarden who is constantly improving the quality of the Puppet modules used by the Foreman, Katello and the Kafo installer. I and probably many others will be really happy when he reaches his goal to allow a distributed setup of Katello and users being capable of upgrading Foreman to Katello. Last but not least Evgeni Golov explained some lessons learned and showed possible problems he come across while migrating a big environment to Red Hat Satellite 6 (the Red Hat branded version of Katello) in his talk “Mass-Migration of 5000 Servers to Foreman/Katello with bootstrap.py”.

Foreman Event 2017 - Evening

The casual part started afterwards with beer and pizza but it did not stop nice and productive discussions from going on. From the feedback I got all attendees enjoyed the event like I did and everyone took some additional knowledge and ideas with him when I closed the door 3 hours later. So I think you can look forward for next year and Foreman’s 9th birthday. If you can not wait, our next Foreman training is already end of September.

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.

Icinga 2 – Monitoring automatisiert mit Puppet Teil 6: Agenten

This entry is part 6 of 8 in the series Icinga 2 Monitoring automatisiert mit Puppet

Nachdem Lennart sich bereits mit vielen Aspekte des Moduls befasst hat, will ich dieses Mal auf die Installation von Icinga 2 als Agenten eingehen. Neben einem generellen Einstieg mit zu beachtenden Konfigurationsoptionen, will ich hierbei auf die verschiedenen Möglichkeiten für die benötigten Zertifikate und Anbindung an die übergeordnete Zone eingehen.

Puppet-Icinga2

Die Installation und Feature-Konfiguration erfolgt wie Lennart dies in den ersten beiden Teilen der Serie beschrieben hat. Hierbei möchte ich beim Agent sicherstellen, dass keine lokale Konfiguration angezogen wird, da ich für die Verteilung der CheckCommands die Konfigurationssynchronisation von Icinga 2 nutzen möchte. Alternativ können diese zwar auch über Puppet verteilt werden, da ja auch die Plugins installiert werden müssen, aber in den meisten Umgebungen trenne ich an dieser Stelle Konfiguration der Monitoring-Infrastruktur von der eigentlichen Monitoring-Konfiguration. Der Start meines Agenten-Profils sieht also meist so aus:

  class { 'icinga2':
    confd       => false,
    manage_repo => true,
    features    => ['checker','mainlog'],
  }

(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.

Foreman’s 8th birthday – We will give a party

Foreman Logo

After the success last year we decided to celebrate the 8th Birthday of the Foreman Project again at event room Kesselhaus on July, 27th. As feedback was very good about the provided content we decided to provide the same schedule.

We will start right after lunch at 12:30pm with a hands-on session, so you can do your first steps with Foreman, have a look into latest development or get some inspiration which plugins to add to your environment. There will be some experienced users and developers around to help you, give you some tips for your environment or do some in-person hacking. The demos will showcase several ways of provisioning, configuration management with Puppet and Ansible, orchestration, monitoring integration and other plug-ins.

After a short coffee break we will have 3-5 talks for 30-40 minutes depending on how many speakers I can find. Already confirmed speakers are Ewoud Kohl van Wijngaarden, Michael Moll and Timo Goebel, all being long-term users and contributors to the Foreman Project. I am still looking for someone willing to talk about how he is using Foreman, so if you want to give a case study talk simply drop me a mail.

It would not be a party if we would not have at least some Pizza and Beer afterwards. And the Foreman’s Community guy Greg Sutcliffe already promised some swag to take home with you.

So if you want to join us, please register for free here. This will enable us to order enough food and drinks. We will keep you updated on twitter and on the event page. As a teaser you can watch the recording of me giving a demo at OSDC.

If you can not make it to our event, keep your eyes open for an event near you. For example Julien Pivotto already announced one in Belgium.

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.