{"id":87084,"date":"2020-07-03T13:42:34","date_gmt":"2020-07-03T11:42:34","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/osnovy-ansible-bez-kotoryh-vashi-plejbuki-komok-slipshihsya-makaron"},"modified":"2020-07-03T13:42:34","modified_gmt":"2020-07-03T11:42:34","slug":"osnovy-ansible-bez-kotoryh-vashi-plejbuki-komok-slipshihsya-makaron","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/osnovy-ansible-bez-kotoryh-vashi-plejbuki-komok-slipshihsya-makaron","title":{"rendered":"Die Grundlagen von Ansible, ohne die Ihre Playbooks ein Klumpen zusammengeklebter Spaghetti sind","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ich mache viele Reviews von fremdem Code in Ansible und schreibe viel selbst. W\u00e4hrend ich Fehler analysiere (sowohl eigene als auch fremde) und eine gewisse Anzahl von Vorstellungsgespr\u00e4chen f\u00fchre, habe ich den Hauptfehler erkannt, den Ansible-Nutzer machen \u2013 sie tauchen in komplexe Themen ein, ohne die Grundlagen beherrscht zu haben.<\/p>\n<p><\/p>\n<p>Um diese universelle Ungerechtigkeit zu beheben, habe ich beschlossen, eine Einf\u00fchrung in Ansible f\u00fcr diejenigen zu schreiben, die bereits ein gewisses Wissen haben. Ich warne vor, dass dies keine Zusammenfassung der Handb\u00fccher ist, sondern ein Longread mit vielen Buchstaben und ohne Bilder.<\/p>\n<p><\/p>\n<p>Das erwartete Niveau des Lesers \u2014 mehrere Tausend Zeilen YAML wurden bereits geschrieben, einige Dinge sind bereits in der Produktion, aber \"irgendwie ist alles schief\".<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1>Bezeichnungen<\/h1>\n<p><\/p>\n<p>Der Hauptfehler eines Ansible-Nutzers besteht darin, nicht zu wissen, wie die Dinge hei\u00dfen. Wenn Sie die Namen nicht kennen, k\u00f6nnen Sie nicht verstehen, was in der Dokumentation steht. Ein praktisches Beispiel: Bei einem Vorstellungsgespr\u00e4ch konnte eine Person, die angeblich viel mit Ansible gearbeitet hatte, die Frage \"Woraus besteht ein Playbook?\" nicht beantworten. Als ich dann darauf hinwies, dass \"die Antwort sein sollte, dass ein Playbook aus Plays besteht\", kam der verheerende Kommentar \"das verwenden wir nicht\". Menschen schreiben mit Ansible f\u00fcr Geld und benutzen keine Plays. <em>Tats\u00e4chlich verwenden viele es, wissen aber nicht, was es ist.<\/em><\/p>\n<p><\/p>\n<p>Lassen Sie uns damit anfangen, wie es genannt wird. Vielleicht wissen Sie es, vielleicht auch nicht, weil Sie nicht darauf geachtet haben, als Sie die Dokumentation gelesen haben.<\/p>\n<p><\/p>\n<p>Der ansible-playbook f\u00fchrt das Playbook aus. Ein Playbook ist eine Datei mit der Endung yml\/yaml, in der etwa Folgendes steht:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">---\n- hosts: group1\n  roles:\n    - role1\n\n- hosts: group2,group3\n  tasks:\n    - debug:<\/code><\/pre>\n<p><\/p>\n<p>Wir haben bereits verstanden, dass die gesamte Datei das Playbook ist. Wir k\u00f6nnen zeigen, wo die Rollen (roles) und die Aufgaben (tasks) sind. Aber wo ist das Play? Und was unterscheidet ein Play von einer Rolle oder einem Playbook?<\/p>\n<p><\/p>\n<p>Das steht alles in der Dokumentation. Doch das wird \u00fcbersehen. Anf\u00e4nger, weil es zu viel ist und man sich nicht alles auf einmal merken kann. Erfahrene, weil es \"triviale Dinge\" sind. Wenn Sie erfahren sind, lesen Sie diese Seiten mindestens einmal alle sechs Monate, und Ihr Code wird um Klassen besser.<\/p>\n<p><\/p>\n<p>Also, merken Sie sich: Ein Playbook ist eine Liste, die aus einem Play und <code>import_playbook<\/code>.<br \/>\nDas hier ist ein Play:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">- hosts: group1\n  roles:\n    - role1<\/code><\/pre>\n<p><\/p>\n<p>Und das hier ist auch ein weiteres Play:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">- hosts: group2,group3\n  tasks:\n    - debug:<\/code><\/pre>\n<p><\/p>\n<p>Was ist also ein Play? Warum ist es wichtig?<\/p>\n<p><\/p>\n<p>Play ist ein zentrales Element f\u00fcr das Playbook, denn nur Play verbindet die Liste der Rollen und\/oder Aufgaben mit der Liste der Hosts, auf denen diese ausgef\u00fchrt werden m\u00fcssen. In den Tiefen der Dokumentation findet man Hinweise auf <code>delegate_to<\/code>, lokale Lookup-Plugins, netzwerk-spezifische Einstellungen, Jump-Hosts usw. Diese erlauben, den Ausf\u00fchrungsort der Aufgaben leicht zu \u00e4ndern. Aber vergessen Sie das. Jede dieser cleveren Optionen hat sehr spezielle Anwendungen und ist definitiv nicht universell. Wir sprechen hier \u00fcber grundlegende Dinge, die jeder wissen und nutzen sollte.<\/p>\n<p><\/p>\n<p>Wenn Sie etwas \"irgendwo\" ausf\u00fchren m\u00f6chten, schreiben Sie ein Play. Nicht eine Rolle. Nicht eine Rolle mit Modulen und Delegierungen. Sie nehmen und schreiben ein Play. In dem Sie im Feld hosts angeben, wo es ausgef\u00fchrt werden soll, und in roles\/tasks, was ausgef\u00fchrt werden soll.<\/p>\n<p><\/p>\n<p>Ganz einfach, oder? Wie k\u00f6nnte es anders sein?<\/p>\n<p><\/p>\n<p>Ein typisches Szenario, in dem Menschen den Wunsch versp\u00fcren, dies nicht \u00fcber ein Play zu tun, ist die \"Rolle, die alles konfiguriert\". Man m\u00f6chte eine Rolle haben, die einstellt und <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/de\/server\/dts-los-angeles\/\"   title=\"Server\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"3633\">Server<\/a> Typ-1- als auch Typ-2-Server konfiguriert.<\/p>\n<p><\/p>\n<p>Ein archetypisches Beispiel ist das Monitoring. Man m\u00f6chte eine Rolle f\u00fcr das Monitoring haben, die das Monitoring einrichtet. Die Monitoring-Rolle wird auf die Monitoring-Hosts zugewiesen (im entsprechenden Play). Es stellt sich jedoch heraus, dass wir Pakete auf den Hosts installieren m\u00fcssen, die wir \u00fcberwachen. Warum also nicht Delegate verwenden? Au\u00dferdem m\u00fcssen die iptables konfiguriert werden. Delegate? Und wir m\u00fcssen auch die Konfiguration f\u00fcr die DB anpassen, damit das Monitoring funktioniert. Delegate! Sollte die Kreativit\u00e4t sprie\u00dfen, kann man auch Delegation einf\u00fchren. <code>include_role<\/code> in einer inneren Schleife mit einem cleveren Filter f\u00fcr die Gruppenliste, und innen <code>include_role<\/code> kann man noch machen <code>delegate_to<\/code> wieder. Und los geht's\u2026<\/p>\n<p><\/p>\n<p>Der hehre Wunsch, eine einzige Monitoring-Rolle zu haben, die \"alles erledigt\", f\u00fchrt uns in die H\u00f6lle, aus der es meist nur einen Ausweg gibt: alles von Grund auf neu zu schreiben.<\/p>\n<p><\/p>\n<p>Wo ist der Fehler aufgetreten? In dem Moment, als Sie festgestellt haben, dass Sie f\u00fcr die Aufgabe \"x\" auf Host X zu Host Y gehen m\u00fcssen, um dort \"y\" zu machen, h\u00e4tten Sie eine einfache \u00dcbung durchf\u00fchren m\u00fcssen: gehen Sie und schreiben Sie ein Play, das auf Host Y \"y\" macht. Nichts in \"x\" nachtr\u00e4glich hinzuf\u00fcgen, sondern alles von Grund auf neu schreiben. Auch wenn es mit fest kodierten Variablen ist.<\/p>\n<p><\/p>\n<p>Es scheint, dass in den obigen Abs\u00e4tzen alles richtig gesagt wurde. Aber das ist nicht Ihr Fall! Denn Sie m\u00f6chten wiederverwendbaren Code schreiben, der DRY ist und wie eine Bibliothek aussieht, und es muss ein Weg gefunden werden, dies zu tun.<\/p>\n<p><\/p>\n<p>Hier verbirgt sich ein weiterer schwerwiegender Fehler. Ein Fehler, der viele Projekte von akzeptabel geschrieben (man k\u00f6nnte es besser machen, aber es funktioniert und l\u00e4sst sich leicht erweitern) in einen v\u00f6lligen Albtraum verwandelt hat, in dem selbst der Autor nicht mehr klarkommt. Es funktioniert, aber Gott bewahre, wenn man etwas \u00e4ndern m\u00f6chte.<\/p>\n<p><\/p>\n<p>Dieser Fehler klingt so: Eine Rolle ist eine Bibliotheksfunktion. Diese Analogie hat so viele gute Ans\u00e4tze ruiniert, dass es einfach traurig ist, zuzusehen. Eine Rolle ist keine Bibliotheksfunktion. Sie kann keine Berechnungen durchf\u00fchren und sie kann keine Entscheidungen auf der Ebene des Spiels treffen. Erinnern Sie mich daran, welche Entscheidungen das Spiel trifft?<\/p>\n<p><\/p>\n<p>Danke, Sie haben recht. Das Spiel trifft Entscheidungen (genauer gesagt, enth\u00e4lt es Informationen) dar\u00fcber, welche Aufgaben und Rollen auf welchen Hosts ausgef\u00fchrt werden sollen.<\/p>\n<p><\/p>\n<p>Wenn Sie diese Entscheidung einer Rolle delegieren, noch dazu mit Berechnungen, verurteilen Sie sich selbst (und denjenigen, der Ihren Code zu verstehen versucht) zu einem erb\u00e4rmlichen Dasein. Die Rolle entscheidet nicht, wo sie ausgef\u00fchrt wird. Diese Entscheidung trifft das play. Die Rolle tut, was ihr gesagt wurde, dort, wo es gesagt wurde.<\/p>\n<p><\/p>\n<p>Warum Programmieren mit Ansible gef\u00e4hrlich ist und warum COBOL besser ist als Ansible, werden wir im Kapitel \u00fcber Variablen und Jinja besprechen. Bis dahin sei gesagt: Jede Berechnung hinterl\u00e4sst einen unausl\u00f6schlichen Eindruck in Form von \u00c4nderungen an globalen Variablen, und dagegen k\u00f6nnen Sie nichts tun. Sobald sich zwei \"Spuren\" \u00fcberschneiden, ist alles verloren.<\/p>\n<p><\/p>\n<p>Hinweis f\u00fcr die Penibel: Eine Rolle kann zweifellos den Kontrollfluss beeinflussen. Es gibt <code>delegate_to<\/code> und sie hat sinnvolle Anwendungen. Es gibt <code>meta: end host\/play<\/code>. Aber! Denken Sie daran, dass wir die Grundlagen lernen? Haben wir vergessen, dass es <code>delegate_to<\/code>geht? Wir sprechen \u00fcber den einfachsten und sch\u00f6nsten Code in Ansible. Der leicht zu lesen, leicht zu schreiben, leicht zu debuggen, leicht zu testen und leicht zu erweitern ist. Also, noch einmal:<\/p>\n<p><\/p>\n<p><strong>Das play und nur das play entscheidet, auf welchen Hosts was ausgef\u00fchrt wird.<\/strong><\/p>\n<p><\/p>\n<p>In diesem Abschnitt haben wir uns mit dem Gegensatz zwischen play und Rolle auseinandergesetzt. Nun sprechen wir \u00fcber die Beziehungen zwischen Tasks und Rolle.<\/p>\n<p><\/p>\n<h1>Tasks und Rollen<\/h1>\n<p><\/p>\n<p>Betrachten wir play:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">- hosts: somegroup\n  pre_tasks:\n    - some_tasks1:\n  roles:\n     - role1\n     - role2\n  post_tasks:\n     - some_task2:\n     - some_task3:<\/code><\/pre>\n<p><\/p>\n<p>Angenommen, Sie m\u00fcssen foo erstellen. Es sieht so aus: <code>foo: name=foobar state=present<\/code>. Wo soll das geschrieben werden? In pre? Post? Eine Rolle erstellen?<\/p>\n<p><\/p>\n<p>\u2026 Und wo sind die Aufgaben geblieben?<\/p>\n<p><\/p>\n<p>Wir beginnen wieder von vorne \u2014 mit dem Play-Ger\u00e4t. Wenn Sie in diesem Punkt unsicher sind, k\u00f6nnen Sie Play nicht als Basis f\u00fcr alles andere verwenden, und Ihr Ergebnis wird \"wackelig\".<\/p>\n<p><\/p>\n<p>Der Aufbau von play: die Direktive hosts, die Einstellungen von play selbst sowie die Abschnitte pre_tasks, tasks, roles, post_tasks. Die anderen Parameter f\u00fcr play sind f\u00fcr uns jetzt nicht wichtig.<\/p>\n<p><\/p>\n<p>Die Reihenfolge ihrer Abschnitte mit Aufgaben und Rollen: <code>pre_tasks<\/code>, <code>roles<\/code>, <code>tasks<\/code>, <code>post_tasks<\/code>. Da die semantische Reihenfolge der Ausf\u00fchrung zwischen <code>tasks<\/code> und <code>roles<\/code> nicht klar ist, besagen die besten Praktiken, dass wir den Abschnitt <code>tasks<\/code>hinzuf\u00fcgen, nur wenn es kein gibt <code>roles<\/code>. Wenn es eine <code>roles<\/code>, dann werden alle zugeh\u00f6rigen Aufgaben im Abschnitt <code>pre_tasks<\/code>\/<code>post_tasks<\/code>.<\/p>\n<p><\/p>\n<p>platziert. Es bleibt nur das, was semantisch klar ist: zuerst <code>pre_tasks<\/code>, dann <code>roles<\/code>, dann <code>post_tasks<\/code>.<\/p>\n<p><\/p>\n<p>Aber wir haben die Frage immer noch nicht beantwortet: Wo sollen wir den Modulaufruf <code>foo<\/code> schreiben? M\u00fcssen wir f\u00fcr jedes Modul eine eigene Rolle schreiben? Oder ist es besser, eine umfangreiche Rolle f\u00fcr alles zu haben? Und wenn es keine Rolle ist, wo soll es geschrieben werden \u2013 in pre oder in post?<\/p>\n<p><\/p>\n<p>Wenn es auf diese Fragen keine fundierte Antwort gibt, ist das ein Zeichen f\u00fcr mangelnde Intuition, also die gleichen \"wackeligen Grundlagen\". Lassen Sie uns das kl\u00e4ren. Zuerst eine Kontrollfrage: Wenn es bei Play gibt <code>pre_tasks<\/code> und <code>post_tasks<\/code> (und es weder Tasks noch Roles gibt), kann dann etwas kaputtgehen, wenn ich die erste Task aus <code>post_tasks<\/code> ans Ende verschiebe? <code>pre_tasks<\/code>?<\/p>\n<p><\/p>\n<p>Nat\u00fcrlich deutet die Formulierung der Frage darauf hin, dass etwas kaputtgehen wird. Aber was genau?<\/p>\n<p><\/p>\n<p>\u2026 Handler. Das Verst\u00e4ndnis der Grundlagen bringt eine wichtige Tatsache ans Licht: Alle Handler werden nach jedem Abschnitt automatisch geflusht. Das hei\u00dft, alle Aufgaben aus <code>pre_tasks<\/code>, dann alle Handler, die notified wurden. Danach werden alle Roles und alle Handler, die in den Roles notified wurden, ausgef\u00fchrt. Danach <code>post_tasks<\/code> und ihre Handler.<\/p>\n<p><\/p>\n<p>Somit, wenn Sie eine Task aus <code>post_tasks<\/code> in <code>pre_tasks<\/code>, dann k\u00f6nnten Sie sie potenziell vor der Ausf\u00fchrung des Handlers abschlie\u00dfen. Zum Beispiel, wenn in <code>pre_tasks<\/code> etwas installiert und konfiguriert wird, <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/de\/server\/\"   title=\"Webserver\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"1155\">Webserver<\/a>, sondern in <code>post_tasks<\/code> wird etwas hineingesendet. Wenn Sie diese Task in die Sektion <code>pre_tasks<\/code> f\u00fchrt dazu, dass zum Zeitpunkt des \"Versendens\" der Server noch nicht gestartet ist und alles kaputtgeht.<\/p>\n<p><\/p>\n<p>Nun lassen Sie uns noch einmal \u00fcberlegen, warum wir <code>pre_tasks<\/code> und <code>post_tasks<\/code>? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0441\u0451 \u043d\u0443\u0436\u043d\u043e\u0435 (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0445\u044d\u043d\u0434\u043b\u0435\u0440\u044b) \u0434\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0440\u043e\u043b\u0438. \u0410 <code>post_tasks<\/code> ben\u00f6tigen, um mit den Ergebnissen der Ausf\u00fchrung von Roles (einschlie\u00dflich Handler) zu arbeiten.<\/p>\n<p><\/p>\n<p>Ein aufmerksamer Kenner von Ansible wird uns sagen, dass es <code>meta: flush_handlers<\/code>, aber warum ben\u00f6tigen wir flush_handlers, wenn wir uns auf die Ausf\u00fchrungsreihenfolge der Abschnitte im Play verlassen k\u00f6nnen? Dar\u00fcber hinaus kann die Verwendung von meta: flush_handlers unerwartete Probleme mit sich bringen, wenn es um sich wiederholende Handler geht und uns merkw\u00fcrdige Warnungen beschert, wenn wir sie verwenden. <code>when<\/code> u <code>Block<\/code> usw. Je besser Sie Ansible kennen, desto mehr Nuancen k\u00f6nnen Sie f\u00fcr eine \"clevere\" L\u00f6sung benennen. Eine einfache L\u00f6sung \u2014 die Verwendung einer nat\u00fcrlichen Trennung zwischen pre\/roles\/post \u2014 verursacht keine Nuancen.<\/p>\n<p><\/p>\n<p>Und zur\u00fcck zu unserem 'foo'. Wo soll es platziert werden? In pre, post oder in roles? Offensichtlich h\u00e4ngt das davon ab, ob wir die Ergebnisse des Handlers f\u00fcr foo ben\u00f6tigen. Wenn nicht, muss foo weder in pre noch in post platziert werden \u2014 diese Abschnitte haben eine spezielle Bedeutung \u2014 das Ausf\u00fchren von Aufgaben vor und nach dem Hauptcode-Array.<\/p>\n<p><\/p>\n<p>Jetzt reduziert sich die Antwort auf die Frage \"Rolle oder Aufgabe\" darauf, was bereits im Play vorhanden ist \u2014 wenn dort Aufgaben (tasks) vorhanden sind, muss das in die Aufgaben geschrieben werden. Wenn es Rollen (roles) gibt, muss eine Rolle erstellt werden (auch wenn es nur aus einer Aufgabe besteht). Ich erinnere daran, dass Aufgaben und Rollen nicht gleichzeitig verwendet werden.<\/p>\n<p><\/p>\n<p>Ein Verst\u00e4ndnis der Grundlagen von Ansible liefert fundierte Antworten auf Fragen, die auf den ersten Blick nach Geschmacksfragen aussehen.<\/p>\n<p><\/p>\n<h1>Tasks und Rollen (Teil zwei)<\/h1>\n<p><\/p>\n<p>Lassen Sie uns nun die Situation besprechen, in der Sie gerade anfangen, ein Playbook zu schreiben. Sie m\u00fcssen foo, bar und baz erledigen. Handelt es sich um eine Aufgabe, eine Rolle oder drei Rollen? Allgemeiner gesagt: Ab wann sollten Rollen geschrieben werden? Wozu ist es sinnvoll, Rollen zu schreiben, wenn man auch Aufgaben schreiben kann? \u2026 Was ist eigentlich eine Rolle?<\/p>\n<p><\/p>\n<p>Einer der gravierendsten Fehler (ich habe dar\u00fcber bereits gesprochen) ist zu glauben, dass eine Rolle wie eine Funktion in einer Bibliothek eines Programms ist. Wie sieht die allgemeine Beschreibung einer Funktion aus? Sie nimmt Argumente entgegen, interagiert mit Nebeneffekten, erzeugt Nebenwirkungen und gibt einen Wert zur\u00fcck.<\/p>\n<p><\/p>\n<p>Jetzt, Achtung. Was davon kann in einer Rolle gemacht werden? Nebenwirkungen (side effects) aufrufen \u2014 immer gerne, das ist die Essenz von Ansible \u2014 Nebenwirkungen erzeugen. Side causes haben? Elementar. Aber bei \"Wert \u00fcbergeben und zur\u00fcckgeben\" \u2014 hier gibt es ein Problem. Erstens k\u00f6nnen Sie keinen Wert an eine Rolle \u00fcbergeben. Sie k\u00f6nnen eine globale Variable haben, deren Lebensdauer die des Plays hat, im Abschnitt vars f\u00fcr die Rolle. Eine globale Variable mit einer Lebensdauer innerhalb der Rolle setzen? Oder sogar mit einer Lebensdauer des Playbooks.<code>set_fact<\/code>\/<code>register<\/code>). Aber Sie k\u00f6nnen keine &quot;lokalen Variablen&quot; haben. Sie k\u00f6nnen keinen &quot;Wert empfangen&quot; und &quot;ihn zur\u00fcckgeben&quot;.<\/p>\n<p><\/p>\n<p>Daraus folgt das Wesentliche: Man kann in Ansible etwas schreiben, ohne dass es Nebenwirkungen gibt. Das \u00c4ndern von globalen Variablen ist immer eine Nebenwirkung f\u00fcr eine Funktion. In Rust beispielsweise ist die \u00c4nderung einer globalen Variablen <code>unsafe<\/code>. In Ansible gibt es jedoch nur eine Methode, um die Werte f\u00fcr eine Rolle zu beeinflussen. Achten Sie auf die verwendeten Worte: nicht &quot;Wert an die Rolle \u00fcbergeben&quot;, sondern &quot;Werte \u00e4ndern, die die Rolle verwendet&quot;. Es besteht keine Isolation zwischen den Rollen. Es gibt keine Isolation zwischen Aufgaben und Rollen.<\/p>\n<p><\/p>\n<p>Insgesamt: <strong>Eine Rolle ist keine Funktion.<\/strong>.<\/p>\n<p><\/p>\n<p>Was ist also gut an einer Rolle? Erstens hat eine Rolle Standardwerte (<code>\/default\/main.yaml<\/code>), zweitens gibt es in einer Rolle zus\u00e4tzliche Verzeichnisse, um Dateien zu speichern.<\/p>\n<p><\/p>\n<p>Was ist gut an Standardwerten? Aufgrund der etwas verzerrten Priorit\u00e4tstabelle der Variablen in Ansible sind die Standardwerte der Rolle die am wenigsten priorisierten (mit Ausnahme der Befehlszeilenparameter von Ansible). Das bedeutet, wenn Sie Standardwerte bereitstellen m\u00f6chten und sich keine Sorgen machen wollen, dass diese die Werte aus dem Inventory oder Gruppenvariablen \u00fcberschreiben, sind die Standardeinstellungen der Rolle der einzig richtige Ort f\u00fcr Sie. (Ich l\u00fcge ein wenig \u2013 es gibt noch <code>|d(your_default_here)<\/code>, aber wenn es um station\u00e4re Pl\u00e4tze geht \u2013 dann nur die Standardrollen).<\/p>\n<p><\/p>\n<p>Was ist noch gut an Rollen? Sie haben eigene Kataloge. Diese Kataloge sind f\u00fcr Variablen gedacht, sowohl f\u00fcr feste (d.h. f\u00fcr die Rolle berechnete) als auch f\u00fcr dynamische (es gibt dieses Muster oder Anti-Muster \u2013 <code>include_vars<\/code> , indem es <code>{{ ansible_distribution }}-{{ ansible_distribution_major_version }}.yml<\/code>). Diese Kataloge sind f\u00fcr <code>files\/<\/code>, <code>templates\/<\/code>. Au\u00dferdem erm\u00f6glichen sie Rollen, eigene Module und Plugins zu haben (<code>library\/<\/code>). Aber im Vergleich zu Aufgaben in Playbooks (wo auch all dies m\u00f6glich sein kann) liegt der Vorteil hier nur darin, dass die Dateien nicht in einem einzigen Haufen, sondern in mehreren separaten Haufen abgelegt sind.<\/p>\n<p><\/p>\n<p>Ein weiterer Aspekt: Man kann versuchen, Rollen zu erstellen, die f\u00fcr wiederkehrende Nutzung (\u00fcber Galaxy) verf\u00fcgbar sind. Nach dem Erscheinen von Collections kann die Verbreitung von Rollen als fast vergessen betrachtet werden.<\/p>\n<p><\/p>\n<p>Somit haben Rollen zwei wichtige Merkmale: Sie haben Standards (eine einzigartige Eigenschaft) und sie erm\u00f6glichen eine Strukturierung des Codes.<\/p>\n<p><\/p>\n<p>Zur\u00fcck zu der urspr\u00fcnglichen Frage: Wann sollten Aufgaben und wann Rollen erstellt werden? Aufgaben im Playbook werden meist entweder als \"Kleber\" vor\/nach Rollen verwendet oder als eigenst\u00e4ndiges Bauelement (in diesem Fall sollten keine Rollen im Code vorhanden sein). Eine Ansammlung normaler Aufgaben gemischt mit Rollen ist eindeutig unordentlich. Es sollte ein klarer Stil eingehalten werden \u2013 entweder Aufgaben oder Rollen. Rollen bieten eine Trennung der Entit\u00e4ten und Standardwerte, w\u00e4hrend Aufgaben es erm\u00f6glichen, den Code schneller zu lesen. Normalerweise umfasst eine Rolle den \u201estation\u00e4reren\u201c (wichtigen und komplexen) Code, w\u00e4hrend im Aufgabenstil unterst\u00fctzende Skripte geschrieben werden.<\/p>\n<p><\/p>\n<p>Es ist m\u00f6glich, import_role als Task zu verwenden, aber wenn du das tust, sei bereit, dir selbst zu erkl\u00e4ren, warum du das machen m\u00f6chtest.<\/p>\n<p><\/p>\n<p>Ein aufmerksamer Leser k\u00f6nnte anmerken, dass Rollen weitere Rollen importieren k\u00f6nnen, dass Rollen eine Abh\u00e4ngigkeit \u00fcber galaxy.yml haben k\u00f6nnen und dass es noch das erschreckende und furchtbare gibt. <code>include_role<\/code> Denkt daran, wir verbessern unsere F\u00e4higkeiten in Ansible, nicht in rhythmischer Gymnastik.<\/p>\n<p><\/p>\n<h1>Handler und Tasks<\/h1>\n<p><\/p>\n<p>Lassen Sie uns eine weitere offensichtliche Sache diskutieren: Handler. Die korrekte Verwendung von Handlern ist fast schon eine Kunst. Wo liegt der Unterschied zwischen einem Handler und einer Task?<\/p>\n<p><\/p>\n<p>Da wir die Grundlagen auffrischen, hier ein Beispiel:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">- hosts: group1\n  tasks:\n    - foo:\n      notify: handler1\n  handlers:\n     - name: handler1\n       bar:<\/code><\/pre>\n<p><\/p>\n<p>Die Handler liegen in rolename\/handlers\/main.yaml. Handler werden zwischen allen Teilnehmern des Plays geteilt: pre\/post_tasks k\u00f6nnen die Handler der Rolle aufrufen, und die Rolle kann Handler aus dem Play aufrufen. Allerdings f\u00fchren \"cross-role\" Aufrufe von Handlern zu viel gr\u00f6\u00dferem Verwirrung als die Wiederholung eines trivialen Handlers. (Ein weiteres Element der Best Practices ist, zu versuchen, die Namen der Handler nicht zu wiederholen).<\/p>\n<p><\/p>\n<p>Der Hauptunterschied besteht darin, dass eine Task immer (idempotent) ausgef\u00fchrt wird (plus\/minus Tags und <code>when<\/code>), ein Handler \u2013 zur Status\u00e4nderung (notify wird nur ausgel\u00f6st, wenn etwas ge\u00e4ndert wurde). Was bedeutet das? Zum Beispiel, dass bei einem erneuten Start, wenn es keine \u00c4nderungen gab, auch kein Handler ausgef\u00fchrt wird. Warum kann es jedoch n\u00f6tig sein, den Handler auszuf\u00fchren, auch wenn bei der generierenden Aufgabe keine \u00c4nderungen festgestellt wurden? Zum Beispiel, weil etwas kaputt gegangen ist und \u00c4nderungen vorgenommen wurden, aber der Ausf\u00fchrung des Handlers nicht nachgekommen wurde. Zum Beispiel, weil das Netzwerk vor\u00fcbergehend ausgefallen war. Die Konfiguration wurde ge\u00e4ndert, der Dienst wurde nicht neu gestartet. Bei der n\u00e4chsten Ausf\u00fchrung wird die Konfiguration nicht mehr ge\u00e4ndert, und der Dienst bleibt mit der alten Konfiguration.<\/p>\n<p><\/p>\n<p>Die Situation mit der Konfiguration ist nicht l\u00f6sbar (genauer gesagt, man k\u00f6nnte sich selbst ein spezielles Protokoll f\u00fcr den Neustart mit Datei-Flags ausdenken usw., aber das ist schon nicht mehr 'basic ansible' in irgendeiner Form). Es gibt jedoch eine andere h\u00e4ufige Geschichte: Wir haben die Anwendung installiert und sie aufgezeichnet. <code>.service<\/code>-Datei erstellt und wollen sie jetzt <code>daemon_reload<\/code> und <code>state=started<\/code>. Der nat\u00fcrliche Ort daf\u00fcr scheint ein Handler zu sein. Aber wenn man ihn nicht als Handler, sondern als Aufgabe am Ende der Taskliste oder Rolle einf\u00fcgt, wird er jedes Mal idempotent ausgef\u00fchrt. Selbst wenn das Playbook mitten drin kaputtgeht. Das l\u00f6st das Problem mit dem Attribut restarted nicht (man kann keine Aufgabe mit dem Attribut restarted ausf\u00fchren, da die Idempotenz verloren geht), aber es ist definitiv sinnvoll, state=started zu setzen. Die allgemeine Stabilit\u00e4t der Playbooks erh\u00f6ht sich, da die Anzahl der Abh\u00e4ngigkeiten und dynamischen Zust\u00e4nde verringert wird.<\/p>\n<p><\/p>\n<p>Ein weiteres positives Merkmal des Handlers ist, dass er die Ausgabe nicht \u00fcberlappt. Wenn es keine \u00c4nderungen gab, gibt es keine \u00fcberfl\u00fcssigen 'skipped' oder 'ok' in der Ausgabe \u2013 es ist leichter zu lesen. Das ist allerdings auch ein negatives Merkmal \u2013 wenn Sie einen Tippfehler in einer linear ausgef\u00fchrten Aufgabe beim ersten Durchlauf finden, werden die Handler nur bei 'changed' ausgef\u00fchrt, d.h. unter bestimmten Bedingungen \u2013 sehr selten. Zum Beispiel das erste Mal in meinem Leben nach f\u00fcnf Jahren. Und nat\u00fcrlich wird es dort einen Tippfehler im Namen geben, und alles wird kaputt gehen. Und ein zweites Mal k\u00f6nnen sie nicht gestartet werden \u2013 es gibt ja keine \u00c4nderung.<\/p>\n<p><\/p>\n<p>Es ist wichtig, \u00fcber die Verf\u00fcgbarkeit von Variablen zu sprechen. Wenn Sie beispielsweise notify f\u00fcr eine Aufgabe mit einer Schleife verwenden, was wird dann in den Variablen gespeichert? Es kann analytisch verstanden werden, aber das ist nicht immer trivial, besonders wenn die Variablen aus verschiedenen Quellen stammen.<\/p>\n<p><\/p>\n<p>\u2026 Daher sind Handler viel weniger n\u00fctzlich und viel problematischer, als es scheint. Wenn man etwas sch\u00f6n (ohne Ausreden) schreiben kann, sollte man es besser ohne Handler machen. Wenn es nicht sch\u00f6n gelingt, ist es besser, sie zu verwenden.<\/p>\n<p><\/p>\n<p>Ein aufmerksamer Leser weist vollkommen zu Recht darauf hin, dass wir nicht diskutiert haben <code>listen<\/code>, dass ein Handler notify f\u00fcr einen anderen Handler aufrufen kann, dass ein Handler import_tasks enthalten kann (der include_role mit with_items ausf\u00fchren kann), dass das System der Handler in Ansible Turing-vollst\u00e4ndig ist, dass die Handler aus include_role auf merkw\u00fcrdige Weise mit den Handlern aus Play \u00fcberlappen usw. \u2014 all dies sind offensichtlich keine \"Grundlagen\".<\/p>\n<p><\/p>\n<p>Obwohl es eine bestimmte \u00dcberraschung gibt, die tats\u00e4chlich eine Funktion ist und die man im Hinterkopf behalten sollte. Wenn Sie eine Aufgabe haben, die mit <code>delegate_to<\/code> ausgef\u00fchrt wird und die einen notify aufweist, wird der entsprechende Handler ohne <code>delegate_to<\/code>ausgef\u00fchrt, d.h. auf dem Host, auf dem das Play zugewiesen ist. (Obwohl der Handler nat\u00fcrlich auch einen <code>delegate_to<\/code> haben kann).<\/p>\n<p><\/p>\n<p>Ich m\u00f6chte ein paar Worte zu wiederverwendbaren Rollen sagen. Vor der Einf\u00fchrung von Kollektionen gab es die Idee, universelle Rollen zu schaffen, die man <code>ansible-galaxy install<\/code> , und los geht's. Es funktioniert auf allen Betriebssystemen in allen Varianten und in allen Situationen. Ich denke jedoch, dass es nicht funktioniert. Jede Rolle, die auf unz\u00e4hlige F\u00e4lle abzielt, <code>include_vars<\/code>, mit der Unterst\u00fctzung von 100500 F\u00e4llen ist dazu verurteilt, in den Abgrund von Corner-Case-Bugs zu f\u00fchren. Diese lassen sich zwar mit massivem Testing abdecken, aber wie bei jeder Art von Testing, entweder haben Sie das kartesische Produkt der Eingabewerte und eine totale Funktion, oder Sie \"decken einzelne Szenarien ab\". Meiner Meinung nach ist es viel besser, wenn die Rolle linear ist (cyclomatic complexity 1).<\/p>\n<p><\/p>\n<p>Je weniger if\u2019s (explizit oder deklarativ \u2014 in Form von <code>when<\/code> oder in Form von <code>include_vars<\/code> nach einer Variablenliste) vorhanden sind, desto besser ist die Rolle. Manchmal m\u00fcssen Abzweigungen gemacht werden, aber ich wiederhole, je weniger, desto besser. Eine scheinbar gute Rolle von Galaxy (es funktioniert ja!) mit einer F\u00fclle von <code>when<\/code> kann weniger bevorzugt sein als eine \"eigene\" Rolle aus f\u00fcnf Tasks. Der Moment, wenn eine Rolle mit galaxy besser ist \u2014 ist, wenn Sie anfangen, etwas zu schreiben. Der Moment, wenn sie schlechter wird \u2014 ist, wenn etwas kaputtgeht und Sie den Verdacht haben, dass es an der \"Rolle mit galaxy\" liegt. Sie \u00f6ffnen sie und finden f\u00fcnf Includes, acht Task-Listen und einen Stapel <code>when<\/code>\u2018 \u2026 und das muss man herausfinden. Anstelle von 5 Tasks in einer linearen Liste, in der es nichts gibt, woran etwas kaputtgehen kann.<\/p>\n<p><\/p>\n<h1>In den folgenden Teilen<\/h1>\n<p><\/p>\n<ul>\n<li>Ein wenig \u00fcber Inventare, Gruppenvariablen, das Plugin host_group_vars und Hostvars. Wie man aus Spaghetti einen Gordischen Knoten bindet. Scope und Pr\u00e4ferenz von Variablen, Ansible-Speichermodell. \"Wo zur H\u00f6lle soll der Benutzername f\u00fcr die Datenbank gespeichert werden?\".<\/li>\n<li><code>jinja: {{ jinja }}<\/code> \u2014 nosql notype nosense weicher Knetgummi. Es ist \u00fcberall, sogar da, wo man es nicht erwartet. Ein bisschen \u00fcber <code>!!unsafe<\/code> und k\u00f6stliches yaml.<\/li>\n<\/ul>\n<p>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/508762\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042f \u0434\u0435\u043b\u0430\u044e \u043c\u043d\u043e\u0433\u043e \u0440\u0435\u0432\u044c\u044e \u0434\u043b\u044f \u0447\u0443\u0436\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0430 \u0410\u043d\u0441\u0438\u0431\u043b \u0438 \u043c\u043d\u043e\u0433\u043e \u043f\u0438\u0448\u0443 \u0441\u0430\u043c. \u0412 \u0445\u043e\u0434\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043e\u0448\u0438\u0431\u043e\u043a (\u043a\u0430\u043a \u0447\u0443\u0436\u0438\u0445, \u0442\u0430\u043a \u0438 \u0441\u0432\u043e\u0438\u0445), \u0430 \u0442\u0430\u043a \u0436\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439, \u044f \u043f\u043e\u043d\u044f\u043b \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0410\u043d\u0441\u0438\u0431\u043b\u0430 \u2014 \u043e\u043d\u0438 \u043b\u0435\u0437\u0443\u0442 \u0432 \u0441\u043b\u043e\u0436\u043d\u043e\u0435, \u043d\u0435 \u043e\u0441\u0432\u043e\u0438\u0432 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e. \u0414\u043b\u044f \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0432\u0441\u0435\u043b\u0435\u043d\u0441\u043a\u043e\u0439 \u043d\u0435\u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e\u0441\u0442\u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u0410\u043d\u0441\u0438\u0431\u043b [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-87084","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u042f \u0434\u0435\u043b\u0430\u044e \u043c\u043d\u043e\u0433\u043e \u0440\u0435\u0432\u044c\u044e \u0434\u043b\u044f \u0447\u0443\u0436\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0430 \u0410\u043d\u0441\u0438\u0431\u043b \u0438 \u043c\u043d\u043e\u0433\u043e \u043f\u0438\u0448\u0443 \u0441\u0430\u043c. \u0412 \u0445\u043e\u0434\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043e\u0448\u0438\u0431\u043e\u043a (\u043a\u0430\u043a \u0447\u0443\u0436\u0438\u0445, \u0442\u0430\u043a \u0438 \u0441\u0432\u043e\u0438\u0445), \u0430 \u0442\u0430\u043a \u0436\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439, \u044f \u043f\u043e\u043d\u044f\u043b \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0410\u043d\u0441\u0438\u0431\u043b\u0430 \u2014 \u043e\u043d\u0438 \u043b\u0435\u0437\u0443\u0442 \u0432 \u0441\u043b\u043e\u0436\u043d\u043e\u0435, \u043d\u0435 \u043e\u0441\u0432\u043e\u0438\u0432 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e. \u0414\u043b\u044f \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0432\u0441\u0435\u043b\u0435\u043d\u0441\u043a\u043e\u0439 \u043d\u0435\u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e\u0441\u0442\u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u0410\u043d\u0441\u0438\u0431\u043b\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/osnovy-ansible-bez-kotoryh-vashi-plejbuki-komok-slipshihsya-makaron\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041e\u0441\u043d\u043e\u0432\u044b Ansible, \u0431\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0430\u0448\u0438 \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0438 \u2014 \u043a\u043e\u043c\u043e\u043a \u0441\u043b\u0438\u043f\u0448\u0438\u0445\u0441\u044f \u043c\u0430\u043a\u0430\u0440\u043e\u043d | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042f \u0434\u0435\u043b\u0430\u044e \u043c\u043d\u043e\u0433\u043e \u0440\u0435\u0432\u044c\u044e \u0434\u043b\u044f \u0447\u0443\u0436\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0430 \u0410\u043d\u0441\u0438\u0431\u043b \u0438 \u043c\u043d\u043e\u0433\u043e \u043f\u0438\u0448\u0443 \u0441\u0430\u043c. \u0412 \u0445\u043e\u0434\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043e\u0448\u0438\u0431\u043e\u043a (\u043a\u0430\u043a \u0447\u0443\u0436\u0438\u0445, \u0442\u0430\u043a \u0438 \u0441\u0432\u043e\u0438\u0445), \u0430 \u0442\u0430\u043a \u0436\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439, \u044f \u043f\u043e\u043d\u044f\u043b \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0410\u043d\u0441\u0438\u0431\u043b\u0430 \u2014 \u043e\u043d\u0438 \u043b\u0435\u0437\u0443\u0442 \u0432 \u0441\u043b\u043e\u0436\u043d\u043e\u0435, \u043d\u0435 \u043e\u0441\u0432\u043e\u0438\u0432 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e. \u0414\u043b\u044f \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0432\u0441\u0435\u043b\u0435\u043d\u0441\u043a\u043e\u0439 \u043d\u0435\u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e\u0441\u0442\u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u0410\u043d\u0441\u0438\u0431\u043b\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/osnovy-ansible-bez-kotoryh-vashi-plejbuki-komok-slipshihsya-makaron\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-07-03T11:42:34+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-03T11:42:34+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Die Grundlagen von Ansible, ohne die Ihre Playbooks ein klumpiger Haufen ausgeh\u00e4rteter Nudeln sind | ProHoster","description":"Ich mache viele Reviews von fremdem Code in Ansible und schreibe selbst viel. Bei der Analyse von Fehlern (sowohl bei anderen als auch bei meinen eigenen) sowie bei einigen Interviews habe ich den grundlegenden Fehler erkannt, den Ansible-Nutzer machen \u2013 sie gehen in die Tiefe, ohne die Grundlagen gemeistert zu haben. Um diese universelle Ungerechtigkeit zu beheben, habe ich beschlossen, eine Einf\u00fchrung in Ansible zu schreiben.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/osnovy-ansible-bez-kotoryh-vashi-plejbuki-komok-slipshihsya-makaron","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041e\u0441\u043d\u043e\u0432\u044b Ansible, \u0431\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0430\u0448\u0438 \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0438 \u2014 \u043a\u043e\u043c\u043e\u043a \u0441\u043b\u0438\u043f\u0448\u0438\u0445\u0441\u044f \u043c\u0430\u043a\u0430\u0440\u043e\u043d | ProHoster","og:description":"\u042f \u0434\u0435\u043b\u0430\u044e \u043c\u043d\u043e\u0433\u043e \u0440\u0435\u0432\u044c\u044e \u0434\u043b\u044f \u0447\u0443\u0436\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0430 \u0410\u043d\u0441\u0438\u0431\u043b \u0438 \u043c\u043d\u043e\u0433\u043e \u043f\u0438\u0448\u0443 \u0441\u0430\u043c. \u0412 \u0445\u043e\u0434\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043e\u0448\u0438\u0431\u043e\u043a (\u043a\u0430\u043a \u0447\u0443\u0436\u0438\u0445, \u0442\u0430\u043a \u0438 \u0441\u0432\u043e\u0438\u0445), \u0430 \u0442\u0430\u043a \u0436\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439, \u044f \u043f\u043e\u043d\u044f\u043b \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0410\u043d\u0441\u0438\u0431\u043b\u0430 \u2014 \u043e\u043d\u0438 \u043b\u0435\u0437\u0443\u0442 \u0432 \u0441\u043b\u043e\u0436\u043d\u043e\u0435, \u043d\u0435 \u043e\u0441\u0432\u043e\u0438\u0432 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e. \u0414\u043b\u044f \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0432\u0441\u0435\u043b\u0435\u043d\u0441\u043a\u043e\u0439 \u043d\u0435\u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e\u0441\u0442\u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u0410\u043d\u0441\u0438\u0431\u043b","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/osnovy-ansible-bez-kotoryh-vashi-plejbuki-komok-slipshihsya-makaron","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-07-03T11:42:34+00:00","article:modified_time":"2020-07-03T11:42:34+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"87084","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 13:58:53","updated":"2026-02-22 15:29:30"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/87084","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=87084"}],"version-history":[{"count":2,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/87084\/revisions"}],"predecessor-version":[{"id":162161,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/87084\/revisions\/162161"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=87084"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=87084"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=87084"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}