{"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 aus zusammengeklebten Nudeln sind","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ich mache viele Code-Reviews f\u00fcr fremden Ansible-Code und schreibe auch viel selbst. Bei der Analyse von Fehlern (sowohl von anderen als auch von mir selbst) sowie w\u00e4hrend einiger Interviews habe ich den grundlegenden Fehler erkannt, den Ansible-Nutzer machen \u2014 sie st\u00fcrzen sich auf die Komplexit\u00e4t, ohne die Grundlagen zu beherrschen.<\/p>\n<p><\/p>\n<p>Um diese universelle Ungerechtigkeit zu beseitigen, habe ich beschlossen, eine Einf\u00fchrung in Ansible f\u00fcr diejenigen zu schreiben, die es bereits kennen. Ich warne vor, das ist keine Zusammenfassung der Handb\u00fccher, sondern ein Longread mit vielen Buchstaben und ohne Bilder.<\/p>\n<p><\/p>\n<p>Das erwartete Niveau des Lesers \u2014 er hat bereits mehrere tausend Zeilen YAML geschrieben, etwas l\u00e4uft bereits in der Produktion, aber \"irgendwie l\u00e4uft 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 der Ansible-Nutzer ist, nicht zu wissen, wie die Dinge hei\u00dfen. Wenn Sie die Bezeichnungen nicht wissen, k\u00f6nnen Sie die Dokumentation nicht verstehen. Ein anschauliches Beispiel: In einem Vorstellungsgespr\u00e4ch konnte eine Person, die angeblich viel mit Ansible gearbeitet hat, die Frage, \"Woraus bestehen die Elemente eines Playbooks?\", nicht beantworten. Als ich anmerkte, dass \"die Antwort sein sollte, dass ein Playbook aus Plays besteht\", folgte der verheerende Kommentar \"das benutzen wir nicht\". Menschen schreiben mit Ansible gegen Bezahlung und nutzen keine Plays. <em>In Wirklichkeit verwenden sie es, wissen aber nicht, was das ist.<\/em><\/p>\n<p><\/p>\n<p>Lassen Sie uns also mit den Grundlagen beginnen: wie die Dinge hei\u00dfen. Vielleicht wissen Sie das schon, vielleicht aber auch nicht, weil Sie nicht darauf geachtet haben, als Sie die Dokumentation gelesen haben.<\/p>\n<p><\/p>\n<p>ansible-playbook f\u00fchrt Playbooks aus. Ein Playbook ist eine Datei mit der Erweiterung 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 ein Playbook ist. Wir k\u00f6nnen zeigen, wo die Rollen (roles) und wo die Aufgaben (tasks) sind. Aber wo ist hier das Play? Und worin unterscheidet sich ein Play von einer Rolle oder einem Playbook?<\/p>\n<p><\/p>\n<p>Das steht alles in der Dokumentation. Und das wird \u00fcbersehen. Anf\u00e4nger \u2014 weil es zu viel ist und man sich nicht alles auf einmal merken kann. Erfahrene \u2014 weil es \"triviale Dinge\" sind. Wenn Sie erfahren sind, lesen Sie diese Seiten mindestens einmal in sechs Monaten erneut, und Ihr Code wird viel besser werden.<\/p>\n<p><\/p>\n<p>Also, merken Sie sich: Ein Playbook ist eine Liste, die aus 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 ebenfalls ein 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 existiert es?<\/p>\n<p><\/p>\n<p>Play ist ein Schl\u00fcsselelement f\u00fcr das Playbook, denn nur Play verbindet die Liste der Rollen und\/oder Aufgaben mit der Liste von Hosts, auf denen sie ausgef\u00fchrt werden m\u00fcssen. In den tiefen Untiefen der Dokumentation finden sich Hinweise auf <code>delegate_to<\/code>, lokale Lookup-Plugins, netzwerkspezifische Einstellungen, Jump Hosts usw. Sie erm\u00f6glichen es, den Ausf\u00fchrungsort der Aufgaben leicht zu \u00e4ndern. Aber vergessen Sie das. Jede dieser ausgekl\u00fcgelten Optionen hat sehr spezielle Anwendungen und ist definitiv nicht universell. Wir sprechen \u00fcber grundlegende Dinge, die jeder wissen und nutzen sollte.<\/p>\n<p><\/p>\n<p>Wenn Sie \"etwas\" \"irgendwo\" ausf\u00fchren m\u00f6chten \u2014 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 ausgef\u00fchrt werden soll, und in Roles\/Tasks, was ausgef\u00fchrt werden soll.<\/p>\n<p><\/p>\n<p>Einfach, oder? Und wie k\u00f6nnte es anders sein?<\/p>\n<p><\/p>\n<p>Eines der charakteristischen Merkmale, das die Leute dazu bringt, es nicht \u00fcber ein Play zu machen, ist die \"Rolle, die alles konfiguriert\". Man m\u00f6chte eine Rolle haben, die konfiguriert 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> erster Art, sowie Server zweiter Art.<\/p>\n<p><\/p>\n<p>Ein archetypisches Beispiel ist das Monitoring. Man m\u00f6chte eine Rolle Monitoring haben, die das Monitoring einrichtet. Die Rolle Monitoring wird auf die Monitoring-Hosts zugewiesen (im entsprechenden Play). Aber es stellt sich heraus, dass wir f\u00fcr das Monitoring Pakete auf den Hosts installieren m\u00fcssen, die wir \u00fcberwachen. Warum also nicht delegate? Und wir m\u00fcssen auch iptables konfigurieren. delegate? Und wir m\u00fcssen die Konfiguration f\u00fcr die DBMS anpassen, damit das Monitoring startet. delegate! Und wenn die Kreativit\u00e4t \u00dcberhand nimmt, kann man die Delegation <code>include_role<\/code> in einer verschachtelten Schleife mit einem ausgekl\u00fcgelten Filter auf die Liste der Gruppen machen, und darin <code>include_role<\/code> kann man noch wieder machen <code>delegate_to<\/code> wiederholt. Und es geht los\u2026<\/p>\n<p><\/p>\n<p>Der gute Wunsch \u2014 eine einzige Monitoring-Rolle zu haben, die \"alles macht\" \u2014 f\u00fchrt uns in die H\u00f6lle, aus der es meistens nur einen Ausweg gibt: alles von Grund auf neu zu schreiben.<\/p>\n<p><\/p>\n<p>Wo ist der Fehler passiert? In dem Moment, als Sie festgestellt haben, dass Sie zur Ausf\u00fchrung der Aufgabe \"x\" auf Host X zu Host Y gehen m\u00fcssen, um dort \"y\" zu machen, h\u00e4tten Sie eine einfache \u00dcbung ausf\u00fchren m\u00fcssen: gehen und ein Play schreiben, das auf Host Y \"y\" macht. Nichts an \"x\" hinzuf\u00fcgen, sondern von Grund auf neu schreiben. Auch wenn es mit hartkodierten Variablen ist.<\/p>\n<p><\/p>\n<p>Es scheint, als w\u00e4re in den obigen Abs\u00e4tzen alles richtig gesagt. Aber das ist doch nicht Ihr Fall! Denn Sie m\u00f6chten wiederverwendbaren Code schreiben, der DRY ist und wie eine Bibliothek aussieht, und Sie m\u00fcssen einen Weg finden, wie das geht.<\/p>\n<p><\/p>\n<p>Hier versteckt sich ein weiterer grober Fehler. Ein Fehler, der viele Projekte von akzeptabler Qualit\u00e4t (man k\u00f6nnte es besser machen, aber alles funktioniert und es l\u00e4sst sich leicht erweitern) in einen vollkommenen Albtraum verwandelt hat, in dem selbst der Autor nicht mehr zurechtkommt. Es funktioniert, aber Gott bewahre, wenn man etwas \u00e4ndert.<\/p>\n<p><\/p>\n<p>Dieser Fehler klingt so: Eine Rolle ist eine Bibliotheksfunktion. Diese Analogie hat so viele gute Ans\u00e4tze zerst\u00f6rt, dass es einfach traurig ist, zuzusehen. Eine Rolle ist keine Bibliotheksfunktion. Sie kann keine Berechnungen durchf\u00fchren und sie kann keine Entscheidungen auf Play-Ebene treffen. Erinnern Sie mich daran, welche Entscheidungen Play trifft?<\/p>\n<p><\/p>\n<p>Danke, Sie haben recht. Play trifft die Entscheidung (genauer gesagt, enth\u00e4lt sie die Informationen), welche Aufgaben und Rollen auf welchen Hosts ausgef\u00fchrt werden.<\/p>\n<p><\/p>\n<p>Wenn Sie diese Entscheidung an eine Rolle delegieren und auch noch Berechnungen hineinpacken, verurteilen Sie sich selbst (und die Person, die versucht, Ihren Code zu verstehen) zu einer elenden Existenz. Eine Rolle entscheidet nicht, wo sie ausgef\u00fchrt wird. Diese Entscheidung trifft Play. Eine Rolle tut das, was ihr gesagt wird, dort, wo ihr gesagt wird.<\/p>\n<p><\/p>\n<p>Warum Programmierung mit Ansible gef\u00e4hrlich ist und warum COBOL besser ist als Ansible, werden wir im Kapitel \u00fcber Variablen und Jinja besprechen. Bis dahin lassen Sie uns eines sagen \u2014 jede Berechnung hinterl\u00e4sst eine unausl\u00f6schliche Spur globaler Variablenver\u00e4nderungen, und Sie k\u00f6nnen nichts dagegen tun. Sobald zwei \"Spuren\" sich \u00fcberschneiden \u2014 ist alles verloren.<\/p>\n<p><\/p>\n<p>Anmerkung f\u00fcr die Aufmerksamen: Eine Rolle kann nat\u00fcrlich den Steuerfluss beeinflussen. Es gibt <code>delegate_to<\/code> und es hat vern\u00fcnftige Anwendungen. Es gibt <code>meta: end host\/play<\/code>. Aber! Denken Sie daran, wir lernen die Grundlagen? Haben Sie vergessen, was <code>delegate_to<\/code>ist? 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>Play und nur Play entscheidet, auf welchen Hosts was ausgef\u00fchrt wird.<\/strong><\/p>\n<p><\/p>\n<p>In diesem Abschnitt haben wir uns mit dem Konflikt zwischen Play und Rolle besch\u00e4ftigt. Nun sprechen wir \u00fcber das Verh\u00e4ltnis zwischen Aufgaben und Rolle.<\/p>\n<p><\/p>\n<h1>Aufgaben 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 machen. Und es sieht so aus wie <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 fangen wieder von vorne an \u2013 mit dem Play-Ger\u00e4t. Wenn Sie in diesem Punkt unsicher sind, k\u00f6nnen Sie Play nicht als Grundlage f\u00fcr alles andere verwenden, und Ihr Ergebnis wird \"instabil\".<\/p>\n<p><\/p>\n<p>Die Play-Anweisung: Hosts, Einstellungen f\u00fcr das Play selbst und die Abschnitte pre_tasks, tasks, roles, post_tasks. Die anderen Parameter f\u00fcr das Play sind momentan nicht wichtig f\u00fcr uns.<\/p>\n<p><\/p>\n<p>Die Reihenfolge ihrer Abschnitte mit Tasks 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, besagt die Best Practice, dass wir einen Abschnitt hinzuf\u00fcgen, <code>tasks<\/code>, nur wenn es kein <code>roles<\/code>. Wenn es eine gibt <code>roles<\/code>, dann werden alle zugeh\u00f6rigen Tasks in die Abschnitte gelegt. <code>pre_tasks<\/code>\/<code>post_tasks<\/code>.<\/p>\n<p><\/p>\n<p>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 noch nicht beantwortet: Wo soll der Aufruf des Moduls <code>foo<\/code> geschrieben werden? M\u00fcssen wir f\u00fcr jedes Modul eine ganze Rolle schreiben? Oder ist es besser, eine gro\u00dfe Rolle f\u00fcr alles zu haben? Und wenn keine Rolle, wo soll es dann geschrieben werden \u2013 in pre oder in post?<\/p>\n<p><\/p>\n<p>Wenn auf diese Fragen keine stichhaltigen Antworten gegeben werden k\u00f6nnen, ist das ein Zeichen f\u00fcr einen Mangel an Intuition, also diese \"instabilen Grundlagen\". Lassen Sie uns das kl\u00e4ren. Zun\u00e4chst eine Kontrollfrage: Wenn Play <code>pre_tasks<\/code> und <code>post_tasks<\/code> hat (und keine Tasks oder Rollen), 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 es kaputtgehen wird. Aber was genau?<\/p>\n<p><\/p>\n<p>\u2026 Handler. Das Lesen der Grundlagen zeigt eine wichtige Tatsache: Alle Handler werden nach jedem Abschnitt automatisch ausgef\u00fchrt. D.h. alle Aufgaben aus <code>pre_tasks<\/code>, dann alle Handler, die notify waren. Danach werden alle Rollen und alle Handler, die in den Rollen notify waren, ausgef\u00fchrt. Danach <code>post_tasks<\/code> und deren Handler.<\/p>\n<p><\/p>\n<p>Somit, wenn Sie eine Task aus <code>post_tasks<\/code> in <code>pre_tasks<\/code>, dann f\u00fchren Sie diese potenziell vor dem Handler aus. Zum Beispiel, wenn in <code>pre_tasks<\/code> etwas installiert und konfiguriert wird, wird das Verschieben dieser Task in den Abschnitt <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/de\/server\/\"   title=\"einen Webserver\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"1155\">einen Webserver<\/a>, sondern in <code>post_tasks<\/code> dazu f\u00fchren, dass der Server im Moment des \"Schickens\" noch nicht gestartet ist und alles kaputtgeht. <code>pre_tasks<\/code> f\u00fchrt dazu, dass der Server zum Zeitpunkt des \"Sendens\" m\u00f6glicherweise noch nicht gestartet ist und alles scheitert.<\/p>\n<p><\/p>\n<p>arbeiten k\u00f6nnen, um mit den Ergebnissen der Ausf\u00fchrungen der Rollen (einschlie\u00dflich Handler) zu arbeiten. <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> Ein aufmerksamer Kenner von Ansible wird uns sagen, dass es<\/p>\n<p><\/p>\n<p>meta: flush_handlers <code>, aber warum ben\u00f6tigen wir flush_handlers, wenn wir uns auf die Reihenfolge der Ausf\u00fchrung der Abschnitte im Play verlassen k\u00f6nnen? Dar\u00fcber hinaus kann die Verwendung von meta: flush_handlers uns mit unerwarteten wiederholten Handlers \u00fcberraschen und uns seltsame Warnungen im Falle der Verwendung von<\/code>block <code>when<\/code> arbeiten <code>usw. Je besser Sie Ansible kennen, desto mehr Nuancen k\u00f6nnen Sie f\u00fcr eine \"clevere\" L\u00f6sung benennen. Und die einfache L\u00f6sung \u2013 die Verwendung einer nat\u00fcrlichen Trennung zwischen pre\/roles\/post \u2013 verursacht keine Nuancen.<\/code> usw. Je besser Sie mit Ansible vertraut sind, desto mehr Nuancen k\u00f6nnen Sie f\u00fcr die \"schlaue\" L\u00f6sung benennen. Eine einfache L\u00f6sung ist \u2013 die nat\u00fcrliche Trennung zwischen pre\/roles\/post zu verwenden, die keine Nuancen aufwirft.<\/p>\n<p><\/p>\n<p>Und jetzt kommen wir zur\u00fcck zu unserem \u2018foo\u2019. Wo soll es platziert werden? In pre, post oder in roles? Offensichtlich h\u00e4ngt das davon ab, ob wir die Ergebnisse der Arbeit des Handlers f\u00fcr foo ben\u00f6tigen. Wenn nicht, muss foo weder in pre noch in post platziert werden \u2013 diese Abschnitte haben eine spezielle Bedeutung \u2013 die Ausf\u00fchrung 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\" auf das, was bereits im Play vorhanden ist \u2013 wenn dort Aufgaben vorhanden sind, muss in tasks weitergeschrieben werden. Wenn Rollen vorhanden sind, muss eine Rolle erstellt werden (auch wenn es nur eine Aufgabe ist). Ich erinnere daran, dass tasks und roles nicht gleichzeitig verwendet werden.<\/p>\n<p><\/p>\n<p>Das Verst\u00e4ndnis der Grundlagen von Ansible gibt fundierte Antworten auf, scheinbar, Fragen des Geschmacks.<\/p>\n<p><\/p>\n<h1>Tasks und Rollen (Teil zwei)<\/h1>\n<p><\/p>\n<p>Jetzt besprechen wir die Situation, wenn Sie gerade erst anfangen, ein Playbook zu schreiben. Sie m\u00fcssen foo, bar und baz machen. Sind das drei Tasks, eine Rolle oder drei Rollen? Zusammenfassend die Frage: Wann sollte man mit dem Schreiben von Rollen beginnen? Was ist der Sinn, Rollen zu schreiben, wenn man Tasks schreiben kann? \u2026 Aber was ist eine Rolle?<\/p>\n<p><\/p>\n<p>Einer der gravierendsten Fehler (dar\u00fcber habe ich bereits gesprochen) \u2014 zu glauben, dass eine Rolle wie eine Funktion in der Programmbibliothek ist. Wie sieht eine allgemeine Beschreibung einer Funktion aus? Sie nimmt Argumente als Eingabe, interagiert mit Nebeneffekten, erzeugt Side Effects und gibt einen Wert zur\u00fcck.<\/p>\n<p><\/p>\n<p>Jetzt, Achtung. Was davon kann in einer Rolle gemacht werden? Nebenwirkungen ausl\u00f6sen \u2013 immer gerne, das ist das Wesen von Ansible \u2013 Nebenwirkungen zu erzeugen. Side causes haben? Ganz einfach. Aber mit \"einen Wert \u00fcbergeben und zur\u00fcckgeben\" \u2013 genau hier gibt es Einschr\u00e4nkungen. Erstens k\u00f6nnen Sie keinen Wert an eine Rolle \u00fcbergeben. Sie k\u00f6nnen eine globale Variable mit einer Lebensdauer von Play im Abschnitt vars f\u00fcr die Rolle festlegen. Sie k\u00f6nnen auch eine globale Variable mit einer Lebensdauer von Play innerhalb der Rolle festlegen. Oder sogar mit einer Lebensdauer von Playbooks (<code>set_fact<\/code>\/<code>register<\/code>). Aber Sie k\u00f6nnen keine \"lokalen Variablen\" haben. Sie k\u00f6nnen keinen \"Wert empfangen\" und \"davon zur\u00fcckgeben\".<\/p>\n<p><\/p>\n<p>Daraus folgt das Hauptprinzip: Man kann in Ansible nichts schreiben und keine Side Effects ausl\u00f6sen. Die \u00c4nderung globaler Variablen ist immer ein Side Effect f\u00fcr eine Funktion. In Rust ist beispielsweise die \u00c4nderung einer globalen Variablen... <code>unsafe<\/code>. In Ansible gibt es nur eine Methode, um Werte f\u00fcr eine Rolle zu beeinflussen. Beachten Sie die verwendeten Worte: nicht \"einen Wert an die Rolle \u00fcbergeben\", sondern \"Werte \u00e4ndern, die die Rolle verwendet\". Es gibt 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 gut an Rollen? Erstens gibt es in Rollen Standardwerte (<code>\/default\/main.yaml<\/code>), zweitens haben Rollen zus\u00e4tzliche Verzeichnisse zum Speichern von Dateien.<\/p>\n<p><\/p>\n<p>Was sind die Vorteile von Standardwerten? In der etwas abwegigen Priorit\u00e4tstabelle von Maslow spielt das, was in Ansible als Role Defaults bezeichnet wird, die niedrigste Rolle ( von den Befehlszeilenparametern von Ansible abgesehen). Das bedeutet, dass, wenn Sie Standardwerte bereitstellen m\u00f6chten, ohne sich Sorgen zu machen, dass sie die Werte aus dem Inventar oder den Gruppenvariablen \u00fcberschreiben, die Standardwerte der Rolle der einzig richtige Ort f\u00fcr Sie sind. (Ich l\u00fcge ein wenig \u2013 es gibt noch <code>|d(your_default_here)<\/code>, aber wenn wir \u00fcber feste Pl\u00e4tze sprechen \u2013 dann nur die Standardwerte der Rollen).<\/p>\n<p><\/p>\n<p>Was ist noch gut an Rollen? Sie haben ihre eigenen Verzeichnisse. Dies sind Verzeichnisse f\u00fcr Variablen, sowohl f\u00fcr feste (d.h. berechnete f\u00fcr die Rolle) als auch f\u00fcr dynamische (es gibt ein Muster oder ein Anti-Muster \u2013 <code>include_vars<\/code> zusammen mit <code>{{ ansible_distribution }}-{{ ansible_distribution_major_version }}.yml<\/code>.). Dies sind Verzeichnisse f\u00fcr <code>files\/<\/code>, <code>templates\/. Au\u00dferdem erm\u00f6glichen sie es, dass Rollen ihre eigenen Module und Plugins haben (<\/code>library\/). Aber im Vergleich zu den Aufgaben in Playbooks (wo auch all dies sein kann) besteht der Vorteil hier nur darin, dass die Dateien nicht in einem einzigen Haufen liegen, sondern in mehreren getrennten Haufen.<code>Ein weiterer Punkt: Man kann versuchen, Rollen zu machen, die f\u00fcr die Wiederverwendung verf\u00fcgbar sind (\u00fcber Galaxy). Nach dem Aufkommen von Sammlungen kann man die Verbreitung von Rollen als fast vergessen betrachten.<\/code>). Im Vergleich zu Aufgaben in einem Playbook (das ebenfalls all dies haben kann), besteht der Vorteil hier nur darin, dass die Dateien nicht in einen Haufen geworfen werden, sondern in mehrere getrennte Haufen.<\/p>\n<p><\/p>\n<p>Zur\u00fcck zur urspr\u00fcnglichen Frage: Wann sollte man Aufgaben und wann Rollen verwenden? Aufgaben werden in Playbooks meist entweder als \"Kleber\" vor\/nach Rollen verwendet oder als eigenst\u00e4ndiges Bauelement (dann sollten im Code keine Rollen vorhanden sein). Ein Haufen normaler Aufgaben gemischt mit Rollen ist eindeutig unordentlich. Man sollte sich an einen bestimmten Stil halten \u2013 entweder Aufgaben oder Rollen. Rollen bieten eine Trennung von Entit\u00e4ten und Standardwerten, w\u00e4hrend Aufgaben das Lesen des Codes schneller erm\u00f6glichen. In der Regel wird in Rollen der eher \"statische\" (wichtige und komplexe) Code ausgegliedert, w\u00e4hrend unterst\u00fctzende Skripte im Aufgabenstil geschrieben werden.<\/p>\n<p><\/p>\n<p>}<\/p>\n<p><\/p>\n<p>Zur\u00fcck zur urspr\u00fcnglichen Frage: Wann sollten Aufgaben und wann Rollen verwendet werden? Aufgaben in einem Playbook werden h\u00e4ufig entweder als \"Kleber\" vor\/nach Rollen oder als selbstst\u00e4ndiges Bauelement eingesetzt (dann sollten im Code keine Rollen vorhanden sein). Ein Haufen normaler Aufgaben gemischt mit Rollen ist unbestreitbar nachl\u00e4ssig. Man sollte sich an einen bestimmten Stil halten \u2013 entweder Aufgaben oder Rollen. Rollen bieten eine Trennung von Entit\u00e4ten und Standardwerten, w\u00e4hrend Aufgaben das Lesen des Codes erleichtern. In Rollen wird in der Regel komplexerer (wichtigerer und schwierigerer) Code untergebracht, w\u00e4hrend Unterst\u00fctzungs-Skripte im Stil der Aufgaben geschrieben werden.<\/p>\n<p><\/p>\n<p>Es besteht die M\u00f6glichkeit, import_role als Aufgabe zu erstellen, aber wenn Sie so etwas tun, seien Sie bereit, es f\u00fcr Ihr eigenes Gef\u00fchl von \u00c4sthetik zu erkl\u00e4ren, warum Sie das tun m\u00f6chten.<\/p>\n<p><\/p>\n<p>Ein genauer Leser k\u00f6nnte sagen, dass Rollen Rollen importieren k\u00f6nnen, dass Rollen Abh\u00e4ngigkeiten durch galaxy.yml haben k\u00f6nnen und dass es au\u00dferdem das furchtbare und schreckliche gibt. <code>include_role<\/code> \u2014 Ich erinnere daran, dass wir unsere F\u00e4higkeiten in grundlegender Ansible verbessern und nicht in Rhythmischer Gymnastik.<\/p>\n<p><\/p>\n<h1>Handler und Aufgaben<\/h1>\n<p><\/p>\n<p>Lassen Sie uns noch eine offensichtliche Sache besprechen: Handler. Sie richtig zu nutzen, ist fast eine Kunst. Was ist der Unterschied zwischen einem Handler und einer Aufgabe?<\/p>\n<p><\/p>\n<p>Da wir die Grundlagen wieder aufgreifen, 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>In der Rolle liegen Handler in rolename\/handlers\/main.yaml. Handler werden zwischen allen Teilnehmern des Play verwendet: 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 mehr Verwirrung, als die Wiederholung eines triviales Handlers. (Ein weiterer Punkt guter Praktiken ist es, zu versuchen, die Namen von Handlers nicht zu wiederholen).<\/p>\n<p><\/p>\n<p>Der Hauptunterschied besteht darin, dass eine Aufgabe (idempotent) immer ausgef\u00fchrt wird (plus\/minus Tags und <code>when<\/code>), w\u00e4hrend ein Handler nur bei einer \u00c4nderung des Zustands (notify wird nur ausgel\u00f6st, wenn es eine Ver\u00e4nderung gab) aufgerufen wird. Was kann das zur Folge haben? Zum Beispiel, dass bei einem erneuten Ausf\u00fchren, wenn keine Ver\u00e4nderung stattfand, kein Handler ausgef\u00fchrt wird. Aber warum k\u00f6nnte es sein, dass wir einen Handler ausf\u00fchren m\u00fcssen, wenn es bei der dazugeh\u00f6rigen Aufgabe keine \u00c4nderungen gab? Zum Beispiel, weil etwas kaputt gegangen ist und es eine \u00c4nderung gab, aber der Handler nicht erreicht wurde. Zum Beispiel, weil das Netzwerk tempor\u00e4r ausgefallen ist. Die Konfiguration hat sich 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 Version der 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 zum Neustart mit Dateifahnen und \u00e4hnlichem ausdenken, aber das ist schon nicht mehr 'basic ansible' in irgendeiner Form). Allerdings gibt es eine andere h\u00e4ufige Geschichte: Wir haben eine Anwendung installiert, sie aufgezeichnet. <code>.service<\/code>-Datei erstellt und m\u00f6chten nun, dass sie <code>daemon_reload<\/code> und <code>state=started<\/code>. Und ein nat\u00fcrlicher Platz daf\u00fcr scheint der Handler zu sein. Aber wenn man ihn nicht als Handler, sondern als Task am Ende der Taskliste oder als Rolle ausf\u00fchrt, wird er bei jedem Durchlauf idempotent ausgef\u00fchrt. Selbst wenn das Playbook mitten im Durchlauf abst\u00fcrzt. Das l\u00f6st das Problem mit restarted (man kann keine Task mit dem Attribut restarted durchf\u00fchren, da die Idempotenz verloren geht) nicht, aber es ist definitiv sinnvoll, state=started zu setzen, die allgemeine Stabilit\u00e4t der Playbooks steigt, da die Anzahl der Abh\u00e4ngigkeiten und des dynamischen Zustands verringert wird.<\/p>\n<p><\/p>\n<p>Eine weitere positive Eigenschaft des Handlers besteht darin, dass er die Ausgabe nicht \u00fcberflutet. Wenn keine \u00c4nderungen vorgenommen wurden, gibt es keine \u00fcberfl\u00fcssigen skipped oder ok in der Ausgabe \u2013 es ist leichter zu lesen. Dies ist jedoch auch ein negatives Merkmal \u2013 w\u00e4hrend Sie einen Tippfehler in einer linear ausf\u00fchrbaren Aufgabe beim ersten Durchlauf finden, werden Handler nur bei \u00c4nderungen ausgef\u00fchrt, d.h. unter bestimmten Bedingungen \u2013 sehr selten. Zum Beispiel das erste Mal in f\u00fcnf Jahren. Und nat\u00fcrlich wird es einen Tippfehler im Namen geben, und alles wird kaputtgehen. Und beim zweiten Mal l\u00e4sst sich das nicht mehr ausf\u00fchren \u2013 es gibt ja keine \u00c4nderung.<\/p>\n<p><\/p>\n<p>Man muss gesondert \u00fcber die Zug\u00e4nglichkeit von Variablen sprechen. Zum Beispiel, wenn Sie notify f\u00fcr eine Task mit einer Schleife haben, was wird in den Variablen sein? Man kann es analytisch herausfinden, aber das ist nicht immer trivial, insbesondere wenn die Variablen aus verschiedenen Quellen kommen.<\/p>\n<p><\/p>\n<p>Handler sind also viel weniger n\u00fctzlich und viel problematischer, als es scheint. Wenn man etwas sch\u00f6n (ohne Tricks) schreiben kann, sollte man es 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 zu Recht darauf hin, dass wir nicht besprochen haben, <code>listen<\/code>, dass Handler notify f\u00fcr einen anderen Handler aufrufen kann, dass ein Handler import_tasks enthalten kann (was include_role mit with_items machen kann), dass das System der Handler in Ansible Turing-vollst\u00e4ndig ist, dass Handler aus include_role auf interessanteste Weise mit den Handlern aus dem Play \u00fcberlappen usw. \u2014 dies ist offensichtlich nicht &quot;Grundlagen&quot;).<\/p>\n<p><\/p>\n<p>Obwohl es einen bestimmten WTF gibt, der tats\u00e4chlich ein Feature ist, und an den man sich erinnern muss. Wenn Ihre Task mit <code>delegate_to<\/code> ausgef\u00fchrt wird und sie notify hat, wird der entsprechende Handler ohne <code>delegate_to<\/code>, das hei\u00dft, auf dem Host, auf dem das Play zugewiesen ist, ausgef\u00fchrt. (Obwohl der Handler nat\u00fcrlich auch sein kann, <code>delegate_to<\/code> ).<\/p>\n<p><\/p>\n<p>Au\u00dferdem m\u00f6chte ich ein paar Worte zu wiederverwendbaren Rollen sagen. Vor der Einf\u00fchrung von Collections gab es die Idee, dass man universelle Rollen schaffen kann, die man <code>ansible-galaxy install<\/code> und fuhr. Funktioniert auf allen Betriebssystemen aller Varianten in allen Situationen. Nun, meine Meinung: das funktioniert nicht. Jede Rolle mit Unterst\u00fctzung f\u00fcr 100500 F\u00e4lle ist zu einem Abgrund von Corner-Case-Fehlern verurteilt. Diese k\u00f6nnen durch massives Testen abgedeckt werden, aber wie bei jedem Testen hat man entweder das kartesische Produkt von Eingabewerten und eine totale Funktion, oder man hat \"einzelne Szenarien abgedeckt\". Meine Meinung ist \u2014 es ist viel besser, wenn die Rolle linear ist (cyclomatische Komplexit\u00e4t 1). <code>include_vars<\/code>, unterst\u00fctzt 100500 F\u00e4lle und ist zum Abgrund von Corner-Case-Bugs verurteilt. Diese k\u00f6nnen durch massives Testen abgedeckt werden, aber wie bei jedem Testen haben Sie entweder das kartesische Produkt der Eingabewerte und eine totale Funktion oder Sie haben &quot;einzelne Szenarien abgedeckt&quot;. Meiner Meinung nach ist es viel besser, wenn die Rolle linear ist (zyklomatische Komplexit\u00e4t 1).<\/p>\n<p><\/p>\n<p>Je weniger if&#8217;s (explizit oder deklarativ \u2014 in Form von <code>when<\/code> nach Variablen), desto besser ist die Rolle. Manchmal muss man Verzweigungen machen, aber ich wiederhole, je weniger es davon gibt, desto besser. Also ist eine scheinbar gute Rolle mit Galaxy (es funktioniert ja!) mit einer Menge <code>include_vars<\/code> vielleicht weniger vorteilhaft als eine \"eigene\" Rolle aus f\u00fcnf Tasks. Der Moment, in dem die Rolle mit Galaxy besser ist \u2014 wenn man anf\u00e4ngt, etwas zu schreiben. Der Moment, in dem sie schlechter wird \u2014 wenn etwas kaputtgeht und man den Verdacht hat, dass es an der \"Rolle mit Galaxy\" liegt. Man \u00f6ffnet sie, und da sind f\u00fcnf Includes, acht Task-Listen und ein Stapel <code>when<\/code> ) weniger bevorzugt sein kann als eine &quot;eigene&quot; Rolle aus f\u00fcnf Aufgaben. Der Moment, in dem die Rolle mit Galaxy besser wird \u2014 ist, wenn Sie anfangen, etwas zu schreiben. Der Moment, in dem sie schlechter wird \u2014 ist, wenn etwas kaputtgeht, und Sie den Verdacht haben, dass es an der &quot;Rolle mit Galaxy&quot; liegt. Sie \u00f6ffnen sie, und dort sind f\u00fcnf Includes, acht Task-Listen und ein Stapel <code>when<\/code>\u2019\u2026 Und das muss man verstehen. Statt 5 Aufgaben in einer linearen Liste, wo nichts kaputtgehen kann.<\/p>\n<p><\/p>\n<h1>Ein wenig \u00fcber Inventar, Gruppenvariablen, host_group_vars Plugin, hostvars. Wie man aus Spaghetti den Gordischen Knoten verbindet. Scope und Pr\u00e4zedenz von Variablen, Ansible-Speichermodell. \"Wo zur H\u00f6lle soll der Benutzername f\u00fcr die Datenbank gespeichert werden?\"<\/h1>\n<p><\/p>\n<ul>\n<li>Ein wenig \u00fcber Inventory, Gruppenvariablen, host_group_vars Plugin, hostvars. Wie man aus Spaghetti einen gordischen Knoten bindet. Geltungsbereich und Vorrang von Variablen, das Ansible-Speichermodell. &quot;Wo sollten wir den Benutzernamen f\u00fcr die Datenbank speichern?&quot;.<\/li>\n<li><code>\u2014 nosql notype nosense weiche Knetmasse. Es ist \u00fcberall, sogar dort, wo man es nicht erwartet. Ein wenig \u00fcber<\/code> !!unsafe <code>und schmackhaften YAML.<\/code> Die Ver\u00f6ffentlichung der OpenSUSE Leap 15.2 Distribution<\/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 5.0.1.1 - 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.\" \/>\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) 5.0.1.1\" \/>\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.\" \/>\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":"Die Grundlagen von Ansible, ohne die eure Playbooks ein Klumpen ausgeh\u00e4rteter Nudeln sind | ProHoster","description":"\ud83e\udd47Die Grundlagen von Ansible, ohne die Ihre Playbooks ein Klumpen aus zusammengeklebten Nudeln sind | ProHoster","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.","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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}