{"id":1524,"date":"2019-03-09T13:00:23","date_gmt":"2019-03-09T11:00:23","guid":{"rendered":"https:\/\/www.my-it-brain.de\/wordpress\/?p=1524"},"modified":"2019-03-09T13:33:02","modified_gmt":"2019-03-09T11:33:02","slug":"rhel-spiegelserver-fuer-arme-admins","status":"publish","type":"post","link":"https:\/\/www.my-it-brain.de\/wordpress\/rhel-spiegelserver-fuer-arme-admins\/","title":{"rendered":"RHEL Spiegelserver f\u00fcr arme Admins"},"content":{"rendered":"\n<p>Es muss nicht immer gleich der <a href=\"https:\/\/access.redhat.com\/products\/red-hat-satellite\" target=\"_blank\" rel=\"noopener noreferrer\">Red Hat Sattelite Server<\/a> sein, um einen lokalen Spiegelserver f\u00fcr die Installation von RPM-Paketen bereitzustellen.<\/p>\n\n\n\n<p>Auf GitHub habe ich im Repository <a rel=\"noopener noreferrer\" href=\"https:\/\/github.com\/Tronde\/poor-man-s-rhel-mirror\" target=\"_blank\">&#8222;Poor man&#8217;s RHEL mirror&#8220;<\/a> eine kleine Sammlung von Bash-Skripten zusammengestellt, mit denen sich ein Spiegelserver f\u00fcr RHEL-Repositories aufbauen l\u00e4sst. Mit diesem k\u00f6nnen RHEL-Repositories, f\u00fcr welche man eine g\u00fcltige Subskription besitzt, auf einen Host im lokalen Netzwerk synchronisiert und deren Pakete anderen RHEL-Servern im LAN zur Verf\u00fcgung gestellt werden.<\/p>\n\n\n\n<p>Neben der reinen Spiegelung k\u00f6nnen mit den auf GitHub bereitgestellten Skripten weitere lokale Stage-Repositories eingerichtet werden, mit denen sich die Verf\u00fcgbarkeit von Paketen f\u00fcr einzelne Stages steuern l\u00e4sst. Zus\u00e4tzlich bietet das Projekt Skripte, um eigene YUM-Repositories zu erstellen, um zum Beispiel eigene Pakete dar\u00fcber bereitstellen zu k\u00f6nnen. Des Weiteren wurde die M\u00f6glichkeit ber\u00fccksichtigt, die Red Hat Errata Informationen in die lokalen RHEL-Repositories zu integrieren, um die <code>--advisory<\/code> Option f\u00fcr YUM auch auf Systemen nutzen zu k\u00f6nnen, die \u00fcber keine eigene Verbindung zum Internet verf\u00fcgen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Warum ist dieses Projekt n\u00fctzlich?<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Es schont die eigene Internetverbindung, da Pakete nur einmal aus dem Internet heruntergeladen und anschlie\u00dfend im LAN zur Verf\u00fcgung gestellt werden.<\/li><li>Es unterst\u00fctzt bei der Erstellung eines YUM-Repositories zur Bereitstellung von RPM-Paketen.<\/li><li>Es unterst\u00fctzt das Staging-Konzept, in dem es die M\u00f6glichkeit bietet, stage-spezifische Repositories bereitzustellen.<\/li><li>Es implementiert die Red Hat Errata Informationen in die gespiegelten RHEL-Repos, so dass diese von angebundenen Servern genutzt werden k\u00f6nnen, die \u00fcber keine eigene Internetverbindung verf\u00fcgen.<\/li><li>Es entstehen keine Zusatzkosten, da alle notwendigen Werkzeuge in den Repos einer RHEL-Standard-Subskription enthalten sind.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Wer kann dieses Projekt nutzen?<\/h2>\n\n\n\n<p>Das Projekt selbst steht unter der <a href=\"https:\/\/github.com\/Tronde\/poor-man-s-rhel-mirror\/blob\/master\/LICENSE\">MIT-Lizenz<\/a> und kann unter deren Bedingungen frei genutzt, modifiziert und weiter verteilt werden.<\/p>\n\n\n\n<p>F\u00fcr den Betrieb des Spiegelservers ist der Besitz einer g\u00fcltigen RHEL-Subskription Voraussetzung. Denn es k\u00f6nnen nur jene Repos gespiegelt werden, f\u00fcr die eine g\u00fcltige Subskription vorhanden ist. Auch alle an den Spiegelserver angeschlossenen Systeme m\u00fcssen \u00fcber eine entsprechende und g\u00fcltige Subskription verf\u00fcgen.<\/p>\n\n\n\n<p>Bei Fragen zu Subskriptionen helfen die folgenden Seiten weiter:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/www.redhat.com\/en\/about\/subscription-model-faq\">Red Hat subscription model FAQ<\/a><\/li><li><a href=\"https:\/\/www.redhat.com\/en\/resources\/how-open-source-subscriptions-deliver-business-value\">Red Hat subscription service overview<\/a><\/li><\/ul>\n\n\n\n<p>Um mit diesem Projekt einen Spiegelserver aufsetzen und betreiben zu k\u00f6nnen, sind gewisse Kenntnisse erforderlich. Zu diesen z\u00e4hlen die Installation eine RHEL-Systems inkl. Registrierung, das Hinzuf\u00fcgen von Subskriptionen und die Installation von Paketen. Informationen hierzu bietet die <a href=\"https:\/\/access.redhat.com\/documentation\/en-us\/red_hat_enterprise_linux\/7\/\">Product Documentation for Red Hat Enterprise Linux 7<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wie ist das GitHub-Repository zu diesem Projekt aufgebaut?<\/h2>\n\n\n\n<p>Das <a href=\"https:\/\/github.com\/Tronde\/poor-man-s-rhel-mirror\">GitHub-Repository<\/a> beinhaltet ein <a href=\"https:\/\/github.com\/Tronde\/poor-man-s-rhel-mirror\/blob\/master\/README.md\">README<\/a>, welches einen \u00dcberblick \u00fcber das Projekt und eine Kurzbeschreibung der einzelnen Skripte in englischer Sprache beinhaltet. Im Master-Branch befindet sich die letzte stabile Version des Projekts. Weiterentwicklungen und Fehlerkorrekturen werden im Dev-Branch gepflegt und nach einer Testphase in den Master-Branch \u00fcbernommen.<\/p>\n\n\n\n<p>Sorgen, N\u00f6te und Antr\u00e4ge sowie gefundene Fehler d\u00fcrfen gern \u00fcber die <a href=\"https:\/\/github.com\/Tronde\/poor-man-s-rhel-mirror\/issues\">Issue-Funktion<\/a> oder in den Kommentaren zu diesem Beitrag gemeldet werden.<\/p>\n\n\n\n<p>An dieser Stelle folgt eine Beschreibung in deutscher Sprache, wie ein Spiegelserver mit diesem Projekt aufgebaut werden kann. Dabei handelt es sich um <strong>keine<\/strong> Schritt-f\u00fcr-Schritt-Anleitung und es werden grundlegende Kenntnisse \u00fcber den Betrieb eines RHEL-Servers und die Installation sowie Konfiguration von Paketen vorausgesetzt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Einrichtung eines Spiegelservers f\u00fcr arme Sysadmins<\/h2>\n\n\n\n<p>Um das Projekt nutzen zu k\u00f6nnen, ben\u00f6tigt man eine RHEL-Installation mit g\u00fcltiger Subskription, auf welcher mindestens die folgenden Pakete installiert sein m\u00fcssen: <\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>reposync<\/strong> und <strong>createrepo<\/strong>, um RHEL-Repos synchronisieren und eigene Repos erstellen zu k\u00f6nnen<\/li><li><strong>git<\/strong> zum Klonen des hier beschriebenen Projekts<\/li><li>Die Gruppe <strong>Basic Web Server<\/strong> oder einen anderen Webserver eurer Wahl, um die gespiegelten Repos \u00fcber HTTP im LAN bereitstellen zu k\u00f6nnen<\/li><\/ul>\n\n\n\n<p>Zu Beginn sind die Dateien aus dem oben genannten <a href=\"https:\/\/github.com\/Tronde\/poor-man-s-rhel-mirror\">GitHub-Repository<\/a> in einem Verzeichnis auf dem lokalen Host bereitzustellen. Anschlie\u00dfend ist das Projekt zu konfigurieren. Die dazu notwendigen Schritte werden in den folgenden Abschnitten erl\u00e4utert.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">CONFIG.SAMPLE<\/h3>\n\n\n\n<p>Hierbei handelt es sich um die Hauptkonfigurationsdatei. Diese ist in CONFIG umzubenennen bzw. zu kopieren und zu editieren. In dieser Datei werden die Variablen gesetzt, die von den verschiedenen Shell-Skripten verwendet werden. Darunter sind z.B. Angaben, welche Repos gespiegelt werden und wo die Dateien gespeichert werden sollen.<\/p>\n\n\n\n<p>Die Datei ist mit Kommentaren versehen und sollte weitgehend selbsterkl\u00e4rend sein (was f\u00fcr alle weiteren Dateien gilt).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">create_yum_repo.sh<\/h3>\n\n\n\n<p>Dieses Skript kann genutzt werden, um ein eigenes YUM-Repository zu erstellen, \u00fcber welches RPM-Pakete bereitgestellt werden k\u00f6nnen. Der Name des zu erstellenden Repos kann dem Skript als Parameter \u00fcbergeben werden.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">do_reposync.sh<\/h3>\n\n\n\n<p>Dies ist das Herzst\u00fcck des Projekts. Es k\u00fcmmert sich um die Spiegelung der RHEL-Repos. Die notwendigen Parameter werden in der Datei CONFIG konfiguriert.<\/p>\n\n\n\n<p>Das Skript l\u00e4dt nur die aktuellen Pakete aus den Repos herunter, l\u00f6scht aus den Upstream-Repos entfernte Pakete jedoch nicht automatisch auf dem lokalen Host. Dies ist meinen pers\u00f6nlichen Anforderungen geschuldet. Es ist nicht ausgeschlossen, dass ich diese Parameter in Zukunft ebenfalls konfigurierbar gestalte.<\/p>\n\n\n\n<p>Einen \u00dcberblick \u00fcber den Speicherbedarf ausgew\u00e4hlter RHEL-Repos findet ihr hier: <a rel=\"noreferrer noopener\" aria-label=\"How much disk space do I need for reposync? (\u00f6ffnet in neuem Tab)\" href=\"https:\/\/access.redhat.com\/discussions\/2906821#comment-1448831\" target=\"_blank\">How much disk space do I need for reposync?<\/a><\/p>\n\n\n\n<p>Um die heruntergeladenen Pakete im LAN zur Verf\u00fcgung zu stellen, muss das <code>BASEDIR<\/code> (siehe CONFIG) \u00fcber einen Webserver zugreifbar gemacht werden.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">refresh_repo.sh<\/h3>\n\n\n\n<p>Werden einem Repo neue RPM-Dateien hinzugef\u00fcgt, muss die Metadaten-Datenbank aktualisiert werden, damit Klienten die neuen Pakete auch finden k\u00f6nnen. Um diese Aktualisierung k\u00fcmmert sich eben dieses Skript.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>rsync_repo.sh<\/strong><\/h3>\n\n\n\n<p>Mit diesem Skript lassen sich Repos auf dem lokalen System synchronisieren. Dabei werden die Dateien jedoch nicht 1:1 kopiert, sondern Hardlinks erstellt. Dies spart bei der Verwendung mehrerer Repos f\u00fcr unterschiedliche Stages Speicherplatz.<\/p>\n\n\n\n<p>Neben dem kompletten Sync eines Repos ist es auch m\u00f6glich, dem Skript eine Datei zu \u00fcbergeben, welche die Namen der Pakete enth\u00e4lt, welche in ein weiteres Repo &#8222;transportiert&#8220; werden sollen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Wrapper-Scripts<\/h3>\n\n\n\n<p>In meiner Umgebung arbeiten wir mit bis zu vier verschiedenen Stages (E, I, Q und P). F\u00fcr jede dieser Stages wird ein eigenes Stage-Repo des Upstream <em>rhel-7-server-rpms<\/em> erzeugt. Um diese Stage-Repos zu aktualisieren, werden die folgenden Skripte verwendet:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>update_rhel-e-stage.sh<\/li><li>update_rhel-i-stage.sh<\/li><li>update_rhel-q-stage.sh<\/li><li>update_rhel-p-stage.sh<\/li><\/ul>\n\n\n\n<p>Jede Stage wird mit den Paketen aus der vorhergehenden aktualisiert. So ruft z.B. <em>update_rhel-e-stage.sh<\/em> das Skript <em>rsync_repo.sh<\/em>, um die Pakete aus dem lokalen Spiegel des Upstreams <em>rhel-7-server-rpms<\/em> zu importieren. <em>update_rhel-i-stage.sh<\/em> verwendet dementsprechend die <em>rhel-e-stage<\/em> als Quelle usw.<\/p>\n\n\n\n<p>Diese Konfiguration ist f\u00fcr meinen Anwendungsfall optimiert. Die Verwendung der Skripte ist optional. Der Spiegelserver funktioniert auch ohne diese Wrapper-Scripts.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">update_mirror_packages_and_erratas.sh<\/h3>\n\n\n\n<p>Dieses Skript aktualisiert die Pakete in den Repos des lokalen Spiegelservers inkl. der Red Hat Errata Informationen. Letztere erm\u00f6glichen es, die Erratas (RHSA, RHBA und RHEA) auch Systemen verf\u00fcgbar zu machen, welche \u00fcber keine Verbindung zum Internet verf\u00fcgen.<\/p>\n\n\n\n<p>Das Skript ist in der Standardeinstellung auf meinen Anwendungsfall optimiert und aktualisiert am Ende alle vorhandenen RHEL-Stage-Repos. Wer diese Funktion nicht ben\u00f6tigt, kann sie durch Auskommentieren der Zeilen 45 und 46 im Skript deaktivieren.<\/p>\n\n\n\n<p>Anschlie\u00dfend kann ein <a rel=\"noreferrer noopener\" aria-label=\"Cronjob (\u00f6ffnet in neuem Tab)\" href=\"https:\/\/de.wikipedia.org\/wiki\/Cron\" target=\"_blank\">Cronjob<\/a> erstellt werden, welcher das Skript ausf\u00fchrt, um den Spiegelserver regelm\u00e4\u00dfig gem\u00e4\u00df der eigenen Anforderungen zu aktualisieren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Die gespiegelten Repos verf\u00fcgbar machen<\/h2>\n\n\n\n<p>Hat man die Repos seiner Wahl gespiegelt, ergibt sich je nach Konfiguration eine Verzeichnisstruktur \u00e4hnlich der folgenden.<br><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ tree -L 2\n.\n\u251c\u2500\u2500  rhel-7-test-mirror\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 rhel-7-server-extras-rpms\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 rhel-7-server-optional-rpms\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 rhel-7-server-rpms\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 rhel-7-server-supplementary-rpms\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 rhel-e-stage\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 rhel-e-stage.repo\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 rhel-i-stage\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 rhel-p-stage\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 rhel-q-stage\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 rhel-server-rhscl-7-rpms<\/code><\/pre>\n\n\n\n<p>Das Verzeichnis <em>rhel-7-test-mirror<\/em> aus obigen Beispiel enth\u00e4lt die gespiegelten Repos als Unterverzeichnisse. Dieses Verzeichnis sollte \u00fcber einen Webserver zugreifbar gemacht werden, um die Pakete den Clients im lokalen Netzwerk verf\u00fcgbar zu machen.<\/p>\n\n\n\n<p>Im obigen Listing ist eine Datei namens <em>rhel-e-stage.repo<\/em> zu sehen. Dabei handelt es sich um eine Repo-Datei, welche heruntergeladen und im Verzeichnis <em>\/etc\/yum.repos.d\/<\/em> platziert werden kann, um wie in diesem Beispiel das Repo <em>rhel-e-stage<\/em> zu aktivieren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Aufbau einer Repo-Datei<\/h2>\n\n\n\n<p>Das folgende Listing zeigt die kommentierte Repo-Datei aus dem vorstehenden Abschnitt. Sie kann als Muster f\u00fcr weitere eigene Repo-Dateien dienen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[rhel-e-stage] # Repo ID\nbaseurl = http:\/\/example.com\/rhel-7-test-mirror\/rhel-e-stage\/\ngpgcheck = 1\ngpgkey = file:\/\/\/etc\/pki\/rpm-gpg\/RPM-GPG-KEY-redhat-release\nname = Repo for rhel-7-server-rpms (Test)<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Fragen, Sorgen, N\u00f6te und Antr\u00e4ge<\/h2>\n\n\n\n<p>Das Projekt und die enthaltene Software werden so wie sie sind unter der angegebenen Lizenz zur Verf\u00fcgung gestellt.<\/p>\n\n\n\n<p>Fragen, Sorgen, N\u00f6te und Antr\u00e4ge k\u00f6nnen sowohl hier in den Kommentaren zum Artikel, als auch auf Github hinterlassen werden.<\/p>\n\n\n\n<p>Ich hoffe, dass dieses Projekt euch (weiterhin) n\u00fctzlich ist und freue mich \u00fcber R\u00fcckmeldungen, wie es euch gef\u00e4llt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Es muss nicht immer gleich der Red Hat Sattelite Server sein, um einen lokalen Spiegelserver f\u00fcr die Installation von RPM-Paketen bereitzustellen. Auf GitHub habe ich im Repository &#8222;Poor man&#8217;s RHEL mirror&#8220; eine kleine Sammlung von Bash-Skripten zusammengestellt, mit denen sich ein Spiegelserver f\u00fcr RHEL-Repositories aufbauen l\u00e4sst. Mit diesem k\u00f6nnen RHEL-Repositories, f\u00fcr welche man eine g\u00fcltige<span class=\"continue-reading\"> <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/rhel-spiegelserver-fuer-arme-admins\/\">[Weiterlesen&#8230;]<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_metis_text_type":"","_metis_text_length":0,"_post_count":0,"footnotes":""},"categories":[51],"tags":[421,430,305,419,420,391],"class_list":["post-1524","post","type-post","status-publish","format-standard","hentry","category-linux","tag-createrepo","tag-osbn","tag-planet","tag-red-hat","tag-reposync","tag-spiegelserver"],"_links":{"self":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/1524","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/comments?post=1524"}],"version-history":[{"count":11,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/1524\/revisions"}],"predecessor-version":[{"id":2174,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/1524\/revisions\/2174"}],"wp:attachment":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/media?parent=1524"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/categories?post=1524"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/tags?post=1524"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}