{"id":34841,"date":"2019-10-31T22:00:43","date_gmt":"2019-10-31T19:00:43","guid":{"rendered":"https:\/\/prohoster.info\/blog\/avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible\/"},"modified":"2019-10-31T22:00:43","modified_gmt":"2019-10-31T19:00:43","slug":"avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible","title":{"rendered":"Automatisierung des Austauschs von Festplatten mit Ansible","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Automatisierung des Austauschs von Festplatten mit Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/c60a2326ab13e7766eafda3ae5ac39c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHallo zusammen. Ich arbeite als leitender Systemadministrator bei OK und bin f\u00fcr den stabilen Betrieb des Portals verantwortlich. Ich m\u00f6chte erz\u00e4hlen, wie wir den Prozess der automatischen Festplattentauschs aufgebaut haben und anschlie\u00dfend, wie wir den Administrator aus diesem Prozess ausgeschlossen und ihn durch einen Bot ersetzt haben.<\/p>\n<p>Dieser Artikel ist eine Art Transliterierung <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=5WhbG3FQveE&amp;list=FLKN7KW1sxju7fWJvKuyKxEQ\">Vortrags<\/a><\/noindex> bei HighLoad+ 2018<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Aufbau des Prozesses zum Austausch von Festplatten<\/h2>\n<p><\/p>\n<h3>Zun\u00e4chst einige Zahlen<\/h3>\n<p>\nOK ist ein riesiger Dienst, der von Millionen Menschen genutzt wird. Er wird von etwa 7.000 Servern unterst\u00fctzt, die in 4 verschiedenen Rechenzentren verteilt sind. In den Servern befinden sich \u00fcber 70.000 Festplatten. Wenn man sie \u00fcbereinander stapelt, ergibt sich ein Turm von mehr als 1 km H\u00f6he. <\/p>\n<p>Festplatten sind der Bestandteil eines Servers, der am h\u00e4ufigsten ausf\u00e4llt. Bei solch einem Volumen m\u00fcssen wir etwa 30 Festplatten pro Woche austauschen, und dieser Vorgang ist zu einer unangenehmen Routine geworden.<\/p>\n<p><img decoding=\"async\" alt=\"Automatisierung des Austauschs von Festplatten mit Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/5e915e9077994efcc4e74a26fc6286fa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Vorf\u00e4lle<\/h3>\n<p>\nIn unserem Unternehmen haben wir ein vollst\u00e4ndiges Incident-Management eingef\u00fchrt. Jeden Vorfall dokumentieren wir in Jira und l\u00f6sen ihn dann. Wenn ein Vorfall Auswirkungen auf die Nutzer hatte, kommen wir auf jeden Fall zusammen und \u00fcberlegen, wie wir schneller auf solche F\u00e4lle reagieren k\u00f6nnen, wie wir die Auswirkungen minimieren und nat\u00fcrlich, wie wir Wiederholungen verhindern k\u00f6nnen.<\/p>\n<p>Speichermedien sind da keine Ausnahme. Ihr Zustand wird von Zabbix \u00fcberwacht. Wir \u00fcberpr\u00fcfen die Syslog-Nachrichten auf Schreib-\/Lesefehler, analysieren den Zustand von HW\/SW-RAIDs und \u00fcberwachen SMART. Bei SSDs berechnen wir den Verschlei\u00df. <\/p>\n<h3>Wie die Festplatten fr\u00fcher ausgetauscht wurden<\/h3>\n<p>\nWenn in Zabbix ein Trigger aktiviert wird, wird in Jira ein Vorfall erstellt und automatisch den entsprechenden Ingenieuren in den Rechenzentren zugewiesen. So verfahren wir mit allen HW-Vorf\u00e4llen, also solchen, die irgendeine physische Arbeit mit der Hardware im Rechenzentrum erfordern. <br \/>\nDer Ingenieur im Rechenzentrum ist die Person, die sich mit Fragen rund um die Hardware besch\u00e4ftigt, verantwortlich f\u00fcr die Installation, Wartung und Demontage der Server ist. Hat er ein Ticket erhalten, beginnt der Ingenieur mit der Arbeit. In den Festplattensch\u00e4chten wechselt er die Festplatten selbstst\u00e4ndig. Hat er jedoch keinen Zugang zum ben\u00f6tigten Ger\u00e4t, wendet sich der Ingenieur an die diensthabenden Systemadministratoren um Hilfe. Zun\u00e4chst muss die Festplatte aus der Rotation genommen werden. Dazu sind die notwendigen \u00c4nderungen am Server vorzunehmen, die Anwendungen zu stoppen und die Festplatte auszuh\u00e4ngen.<\/p>\n<p>Der diensthabende Systemadministrator ist w\u00e4hrend der Arbeitsschicht f\u00fcr den gesamten Betrieb des Portals verantwortlich. Er untersucht Vorf\u00e4lle, f\u00fchrt Reparaturen durch und unterst\u00fctzt Entwickler bei kleinen Aufgaben. Lediglich um Festplatten k\u00fcmmert er sich nicht.<\/p>\n<p>Fr\u00fcher kommunizierten die Ingenieure der Rechenzentren im Chat mit dem Systemadministrator. Die Ingenieure schickten Links zu Jira-Tickets, der Administrator ging sie durch und f\u00fchrte ein Protokoll der Arbeiten in einem Notizbuch. Aber f\u00fcr solche Aufgaben sind Chats unpraktisch: Die Informationen sind dort unstrukturiert und gehen schnell verloren. Au\u00dferdem konnte der Administrator einfach vom Computer weggehen und eine Zeit lang keine Anfragen beantworten, w\u00e4hrend der Ingenieur am Server mit einer Stapel Festplatten wartete.<\/p>\n<p>Das Schlimmste war jedoch, dass die Administratoren das Gesamtbild nicht sahen: welche Festplattenvorf\u00e4lle es gibt und wo potenziell Probleme entstehen k\u00f6nnen. Das liegt daran, dass wir alle HW-Vorf\u00e4lle den Ingenieuren \u00fcbergeben. Ja, man h\u00e4tte alle Vorf\u00e4lle im Dashboard des Administrators anzeigen k\u00f6nnen. Aber es sind zu viele, und der Administrator wurde nur f\u00fcr einige von ihnen eingebunden.<\/p>\n<p>Dar\u00fcber hinaus konnte der Ingenieur die Priorit\u00e4ten nicht richtig festlegen, da er nichts \u00fcber die spezifische Nutzung der Server oder die Verteilung der Daten auf den Speichern wusste.<\/p>\n<h3>Neues Austauschverfahren<\/h3>\n<p>\nDas Erste, was wir gemacht haben, war, alle Festplatten-Vorf\u00e4lle in einen separaten Typ \u201eHW-Disk\u201c zu \u00fcberf\u00fchren und ihm die Felder \u201eName des Blockger\u00e4ts\u201c, \u201eGr\u00f6\u00dfe\u201c und \u201eFestplattentyp\u201c hinzuzuf\u00fcgen, damit diese Informationen im Ticket gespeichert werden und nicht st\u00e4ndig im Chat ausgetauscht werden m\u00fcssen. <\/p>\n<p><img decoding=\"async\" alt=\"Automatisierung des Austauschs von Festplatten mit Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/c4526bf668e31d90e0fbd061de44f1a7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAu\u00dferdem haben wir vereinbart, dass wir im Rahmen eines Vorfalls nur eine Festplatte austauschen. Das hat den Prozess der Automatisierung, der Statistiksammlung und der Arbeit erheblich vereinfacht. <\/p>\n<p>Zus\u00e4tzlich haben wir ein Feld \u201everantwortlicher Administrator\u201c hinzugef\u00fcgt. Dort wird automatisch der diensthabende Sysadmin eingetragen. Das ist sehr praktisch, denn jetzt sieht der Ingenieur immer, wer verantwortlich ist. Es ist nicht n\u00f6tig, im Kalender nachzusehen. Genau dieses Feld hat es erm\u00f6glicht, die Tickets in das Dashboard des Administrators zu bringen, f\u00fcr die m\u00f6glicherweise seine Hilfe ben\u00f6tigt wird.<\/p>\n<p><img decoding=\"async\" alt=\"Automatisierung des Austauschs von Festplatten mit Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/5097e5dcca1fddd68d1e5f296c09f60a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nUm sicherzustellen, dass alle Teilnehmer maximal von den Neuerungen profitieren, haben wir Filter und Dashboards erstellt und den Leuten dar\u00fcber erz\u00e4hlt. Wenn die Menschen die Ver\u00e4nderungen verstehen, distanzieren sie sich nicht von ihnen, als w\u00e4re es etwas \u00dcberfl\u00fcssiges. F\u00fcr den Ingenieur ist es wichtig, die Racknummer zu kennen, in der sich der Server befindet, sowie die Gr\u00f6\u00dfe und den Typ der Festplatte. Der Administrator muss in erster Linie verstehen, um welche Gruppe von Servern es sich handelt und welchen Effekt der Austausch der Festplatte haben k\u00f6nnte.<\/p>\n<p>Das Vorhandensein von Feldern und deren Anzeige ist zwar praktisch, hat uns jedoch nicht von der Notwendigkeit befreit, Chats zu nutzen. Dazu mussten wir den Arbeitsprozess \u00e4ndern. <\/p>\n<p>Fr\u00fcher war er so:<\/p>\n<p><img decoding=\"async\" alt=\"Automatisierung des Austauschs von Festplatten mit Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/2b79cdb7ec88b5ae3d2917ad8b164c6d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nHeute arbeiten Ingenieure weiterhin so, wenn sie keine Hilfe vom Administrator ben\u00f6tigen.<\/p>\n<p>Das erste, was wir gemacht haben, ist die Einf\u00fchrung eines neuen Status <b>Investigate<\/b>. In diesem Status befindet sich das Ticket, wenn der Ingenieur noch nicht entschieden hat, ob er einen Administrator ben\u00f6tigt oder nicht. \u00dcber diesen Status kann der Ingenieur das Ticket an den Administrator weitergeben. Au\u00dferdem kennzeichnen wir mit diesem Status Tickets, wenn eine Festplatte ersetzt werden muss, aber die Festplatte vor Ort nicht vorhanden ist. Das kommt bei CDN und Remote-Standorten vor.<\/p>\n<p>Au\u00dferdem haben wir den Status <b>Bereit<\/b>hinzugef\u00fcgt. In diesen Status wird das Ticket nach dem Austausch der Festplatte versetzt. Das hei\u00dft, alles ist bereits erledigt, aber auf dem Server wird HW\/SW RAID synchronisiert. Das kann ziemlich viel Zeit in Anspruch nehmen.<\/p>\n<p>Wenn ein Administrator in die Arbeit einbezogen wird, wird das Schema etwas komplizierter.<\/p>\n<p><img decoding=\"async\" alt=\"Automatisierung des Austauschs von Festplatten mit Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/5b6aacbb0d4049e62e7cb9ee28eb6498.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDas Ticket kann sowohl vom Systemadministrator als auch vom Ingenieur aus dem Status <b>Offen<\/b> \u00fcbertragen werden. Im Status <b>In progress<\/b> nimmt der Administrator die Festplatte aus dem Betrieb, sodass der Ingenieur sie einfach herausziehen kann: Er aktiviert das Licht, demontiert die Festplatte, stoppt die Anwendungen, je nach der konkreten Gruppe von Servern.<\/p>\n<p>Dann wird das Ticket in den Status <b>Ready to change<\/b>: das ist das Signal an den Ingenieur, dass die Festplatte herausgenommen werden kann. Alle Felder in Jira sind bereits ausgef\u00fcllt, der Ingenieur wei\u00df, welcher Typ und welche Gr\u00f6\u00dfe die Festplatte hat. Diese Daten werden entweder im vorherigen Status automatisch oder durch den Administrator eingetragen.<\/p>\n<p>Nach dem Austausch der Festplatte wird das Ticket in den Status <b>Changed<\/b>. Es wird \u00fcberpr\u00fcft, dass die richtige Festplatte eingelegt wurde, eine Partitionierung erfolgt, die Anwendung wird gestartet und einige Datenwiederherstellungsaufgaben durchgef\u00fchrt. Das Ticket kann auch in den Status <b>Bereit<\/b>\u00fcbertragen werden, in diesem Fall bleibt der Administrator verantwortlich, da er die Festplatte in Umlauf gebracht hat. Das gesamte Schema sieht so aus.<\/p>\n<p><img decoding=\"async\" alt=\"Automatisierung des Austauschs von Festplatten mit Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/32f8d488e2ff6a28a3341114b66de0a3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDie Hinzuf\u00fcgung neuer Felder hat unser Leben erheblich erleichtert. Die Mitarbeiter arbeiten nun mit strukturierten Informationen, es ist klar, was und in welchem Schritt zu tun ist. Die Priorit\u00e4ten sind deutlich relevanter geworden, da sie jetzt vom Administrator festgelegt werden.<\/p>\n<p>Die Notwendigkeit von Chats entfiel. Nat\u00fcrlich kann der Administrator dem Ingenieur schreiben: \u201eHier muss schneller ersetzt werden\u201c oder \u201eEs ist schon Abend, schaffst du es noch zu ersetzen?\u201c. Aber wir kommunizieren nicht mehr t\u00e4glich in Chats \u00fcber diese Fragen.<\/p>\n<p>Festplatten werden nun in gro\u00dfen Mengen ausgetauscht. Wenn der Administrator etwas fr\u00fcher zur Arbeit kommt, hat er Zeit und es ist noch nichts passiert, kann er mehrere Server f\u00fcr den Austausch vorbereiten: Felder festlegen, Festplatten aus der Rotation nehmen und die Aufgabe an den Ingenieur \u00fcbergeben. Der Ingenieur kommt etwas sp\u00e4ter ins Rechenzentrum, sieht die Aufgabe, nimmt die ben\u00f6tigten Speichermedien aus dem Lager und wechselt sie sofort aus. Dadurch hat sich die Austauschgeschwindigkeit erh\u00f6ht.<\/p>\n<h3>Erfahrungen aus dem Workflow-Aufbau<\/h3>\n<p><\/p>\n<ul>\n<li><b>Beim Aufbau der Prozedur m\u00fcssen Informationen aus verschiedenen Quellen gesammelt werden.<\/b><br \/>\nEinige unserer Administratoren wussten nicht, dass Ingenieure die Festplatten eigenst\u00e4ndig wechseln. Einige dachten, dass die Ingenieure die MD-RAID-Synchronisation \u00fcberwachen, obwohl einige von ihnen nicht einmal Zugang dazu hatten. Einige leitende Ingenieure erledigten dies, jedoch nicht immer, da der Prozess nirgendwo dokumentiert war.<\/li>\n<li><b>Die Prozedur sollte einfach und verst\u00e4ndlich sein.<\/b><br \/>\nEs ist f\u00fcr Menschen schwierig, sich viele Schritte zu merken. Die wichtigsten angrenzenden Status in Jira sollten auf dem Hauptbildschirm angezeigt werden. Man kann sie umbenennen, zum Beispiel nennen wir 'In progress' 'Bereit zum Wechseln'. Die anderen Status k\u00f6nnen im Dropdown-Men\u00fc versteckt werden, damit sie nicht st\u00f6ren. Es ist jedoch besser, die Menschen nicht einzuschr\u00e4nken, sondern ihnen die M\u00f6glichkeit zu geben, den \u00dcbergang zu machen.<br \/>\nErkl\u00e4rt den Wert der Neuerungen. Wenn die Menschen verstehen, nehmen sie die neue Prozedur besser an. F\u00fcr uns war es sehr wichtig, dass die Menschen den gesamten Prozess nicht einfach durchklicken, sondern ihm folgen. Danach haben wir darauf die Automatisierung aufgebaut.<\/li>\n<li><b>Warten, analysieren, verstehen.<\/b><br \/>\nWir haben ungef\u00e4hr einen Monat ben\u00f6tigt, um das Verfahren, die technische Umsetzung, die Meetings und die Diskussionen zu erstellen. Die Implementierung dauerte mehr als drei Monate. Ich habe gesehen, wie die Leute allm\u00e4hlich mit der Neuerung zu arbeiten begannen. In den ersten Phasen gab es viel Negatives. Aber das hing \u00fcberhaupt nicht vom Verfahren oder der technischen Umsetzung ab. Zum Beispiel benutzte ein Administrator nicht Jira, sondern ein Jira-Plugin in Confluence, und einige Funktionen waren f\u00fcr ihn nicht verf\u00fcgbar. Als wir ihm Jira zeigten, stieg seine Produktivit\u00e4t sowohl bei den allgemeinen Aufgaben als auch bei den Festplattentauschvorg\u00e4ngen.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Automatisierung des Festplattentausches<\/h2>\n<p>\nWir haben uns mehrmals der Automatisierung des Festplattentausches gen\u00e4hert. Wir hatten bereits einige Entwicklungen und Skripte, aber alle funktionierten entweder interaktiv oder manuell und erforderten einen Start. Erst nach der Implementierung des neuen Verfahrens haben wir verstanden, dass wir genau das fehlten.<\/p>\n<p>Da der Prozess des Festplattentausches nun in Etappen unterteilt ist, f\u00fcr die jeweils ein Verantwortlicher und eine Liste von Aktionen festgelegt sind, k\u00f6nnen wir die Automatisierung schrittweise aktivieren, und nicht auf einmal. Zum Beispiel kann die einfachste Phase - Ready (\u00dcberpr\u00fcfung der RAID-\/Daten-Synchronisation) - leicht an einen Bot delegiert werden. Wenn der Bot ein wenig trainiert ist, kann man ihm eine verantwortungsvollere Aufgabe geben - die Einf\u00fchrung der Festplatte in die Rotation usw.<\/p>\n<h3>Der Zoo der Setups<\/h3>\n<p>\nBevor ich von dem Bot erz\u00e4hle, machen wir einen kurzen Ausflug in unseren Zoo der Installationen. Zun\u00e4chst ist dies auf die riesige Gr\u00f6\u00dfe unserer Infrastruktur zur\u00fcckzuf\u00fchren. Zweitens versuchen wir, f\u00fcr jeden Dienst die optimale Hardwarekonfiguration auszuw\u00e4hlen. Wir haben etwa 20 Modelle von Hardware-RAID, haupts\u00e4chlich von LSI und Adaptec, aber auch HP und DELL in verschiedenen Versionen. Jeder RAID-Controller hat sein eigenes Verwaltungstool. Die Befehle und die Ausgabe k\u00f6nnen von Version zu Version bei jedem RAID-Controller unterschiedlich sein. Wo kein HW-RAID verwendet wird, kann mdraid zum Einsatz kommen.<\/p>\n<p>Fast alle neuen Installationen f\u00fchren wir ohne Festplattenspiegelung durch. Wir versuchen, keine Hardware- und Software-RAID mehr zu verwenden, da wir unsere Systeme auf Data-Center-Ebene und nicht auf Server-Ebene reservieren. Aber nat\u00fcrlich gibt es viele Legacy-Server, die gewartet werden m\u00fcssen.<\/p>\n<p>Irgendwo werden in RAID-Controllern Raw-Ger\u00e4te durchgeschleift, irgendwo werden JBODs verwendet. Es gibt Konfigurationen mit einer einzigen Systemplatte im Server, und wenn diese ersetzt werden muss, muss der Server mit der Installation von OS und Anwendungen, einschlie\u00dflich der gleichen Versionen, neu aufgesetzt werden, gefolgt von dem Hinzuf\u00fcgen von Konfigurationsdateien und dem Starten von Anwendungen. Es gibt auch viele Gruppen von Servern, bei denen die Redundanz nicht auf der Ebene des Speichersystems, sondern direkt in den Anwendungen implementiert ist.<\/p>\n<p>Insgesamt haben wir mehr als 400 einzigartige Gruppen von Servern, auf denen etwa 100 verschiedene Anwendungen laufen. Um eine so enorme Anzahl von Varianten abzudecken, ben\u00f6tigten wir ein vielseitiges Automatisierungstool. Vorzugsweise mit einer einfachen DSL, damit nicht nur derjenige, der es geschrieben hat, es unterst\u00fctzen kann.<\/p>\n<p>Wir haben uns f\u00fcr Ansible entschieden, weil es agentenlos ist: Es war nicht notwendig, die Infrastruktur vorzubereiten, ein schneller Start. Au\u00dferdem ist es in Python geschrieben, was im Team als Standard akzeptiert ist.<\/p>\n<h3>Das allgemeine Schema<\/h3>\n<p>\nLassen Sie uns das allgemeine Automatisierungsschema am Beispiel eines Vorfalls betrachten. Zabbix erkennt, dass die Festplatte sdb ausgefallen ist, ein Trigger wird aktiviert und ein Ticket in Jira erstellt. Der Administrator sieht sich das Ticket an, erkennt, dass es kein Duplikat und kein false positive ist, das hei\u00dft, die Festplatte muss gewechselt werden, und verschiebt das Ticket in den Status \"In Bearbeitung\".<\/p>\n<p><img decoding=\"async\" alt=\"Automatisierung des Austauschs von Festplatten mit Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/673df0fe9600bc65633841222f436d37.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDie Anwendung DiskoBot, die in Python geschrieben ist, fragt regelm\u00e4\u00dfig Jira nach neuen Tickets. Sie bemerkt, dass ein neues Ticket im Status In Bearbeitung erscheint, ein entsprechender Thread wird aktiviert, der das Playbook in Ansible startet (das geschieht f\u00fcr jeden Status in Jira). In diesem Fall wird Prepare2change gestartet.<\/p>\n<p>Ansible wird auf den Host gesendet, entfernt die Festplatte aus der Rotation und berichtet den Status der Anwendung \u00fcber Callbacks. <\/p>\n<p><img decoding=\"async\" alt=\"Automatisierung des Austauschs von Festplatten mit Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/8bfc13129f8deca640eb63ea81f616c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNach den Ergebnissen \u00fcbersetzt der Bot das Ticket automatisch in den Status \"Bereit zum Wechseln\". Der Ingenieur erh\u00e4lt eine Benachrichtigung und macht sich an den Wechsel der Festplatte, wonach er das Ticket in den Status \"Gewechselt\" verschiebt. <\/p>\n<p><img decoding=\"async\" alt=\"Automatisierung des Austauschs von Festplatten mit Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/eeda06b6966f435e2172d3f9c61b341e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNach dem oben beschriebenen Schema gelangt das Ticket zur\u00fcck zum Bot, dieser startet ein anderes Playbook, geht zum Host und f\u00fchrt die Festplatte wieder in die Rotation ein. Der Bot schlie\u00dft das Ticket. Hurra!<\/p>\n<p><img decoding=\"async\" alt=\"Automatisierung des Austauschs von Festplatten mit Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/51b8c7050b0c10c16ad6a6d4974c3ebf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJetzt sprechen wir \u00fcber einige Komponenten des Systems.<\/p>\n<h3>Diskobot<\/h3>\n<p>\nDiese Anwendung ist in Python geschrieben. Sie w\u00e4hlt Tickets aus Jira gem\u00e4\u00df JQL aus. Je nach Status des Tickets gelangt es zu dem entsprechenden Handler, der seinerseits das passende Ansible Playbook startet.<\/p>\n<p>JQL und Umfrageintervalle sind in der Konfigurationsdatei der Anwendung definiert.<\/p>\n<pre><code class=\"plaintext\">jira_states:\n  investigate:\n    jql: '\u2026 status = Open and \"Disk Size\" is EMPTY'\n    interval: 180\n\n  inprogress:\n    jql: '\u2026  und \"Disk Size\" ist not EMPTY und \"Device Name\" ist not EMPTY'\n \n  ready:\n    jql: '\u2026 und (labels not in (\"dbot_ignore\") oder labels is EMPTY)'\n    interval: 7200\n<\/code><\/pre>\n<p>\nZum Beispiel, unter den Tickets im Status In progress werden nur die ausgew\u00e4hlt, bei denen die Felder Disk size und Device name ausgef\u00fcllt sind. Device name ist der Name des Blockger\u00e4ts, das f\u00fcr die Ausf\u00fchrung des Playbooks ben\u00f6tigt wird. Disk size ist wichtig, damit der Ingenieur wei\u00df, welche Gr\u00f6\u00dfe die Festplatte haben muss.<\/p>\n<p>Unter den Tickets im Status Ready werden die Tickets mit dem Label dbot_ignore gefiltert. \u00dcbrigens verwenden wir Jira-Labels sowohl f\u00fcr eine solche Filterung als auch zur Kennzeichnung von Duplikaten und zur Sammlung von Statistiken.<\/p>\n<p>Im Falle eines Fehlers im Playbook weist Jira das Label dbot_failed zu, um sp\u00e4ter eine Analyse zu erm\u00f6glichen. <\/p>\n<h3>Interaktion mit Ansible<\/h3>\n<p>\nDie Anwendung interagiert mit Ansible \u00fcber <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/dev_guide\/developing_api.html\">Ansible Python API<\/a><\/noindex>. Im playbook_executor \u00fcbergeben wir den Dateinamen und eine Gruppe von Variablen. Dies erm\u00f6glicht es, das Ansible-Projekt in Form von normalen yml-Dateien zu halten, anstatt es in Python-Code zu beschreiben. <\/p>\n<p>Zudem werden in Ansible \u00fcber *extra_vars* der Name des Blockger\u00e4ts, der Status des Tickets sowie die callback_url \u00fcbergeben, in der der Issue-Schl\u00fcssel eingebettet ist \u2013 dieser wird f\u00fcr den Callback in HTTP verwendet.<\/p>\n<p>F\u00fcr jeden Lauf wird ein tempor\u00e4res Inventory generiert, das aus einem Host und einer Gruppe besteht, zu der dieser Host geh\u00f6rt, damit die group_vars angewendet werden k\u00f6nnen.<\/p>\n<p>Hier ist ein Beispiel f\u00fcr eine Aufgabe, in der der HTTP-Callback implementiert ist.<\/p>\n<p>Die Ergebnisse der Ausf\u00fchrung der Playbooks erhalten wir durch Callbacks. Es gibt zwei Typen:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/plugins\/callback.html\">Ansible Callback-Plugin<\/a><\/noindex>, es liefert Daten zu den Ergebnissen der Ausf\u00fchrung des Playbooks. Dort sind die Aufgaben beschrieben, die gestartet wurden, erfolgreich oder erfolglos ausgef\u00fchrt wurden. Dieses Callback wird am Ende des Playbook-Spielens aufgerufen.<\/li>\n<li>HTTP-Callback zur Informationsabfrage w\u00e4hrend des Spielens des Playbooks. Im Ansible-Task f\u00fchren wir eine POST\/GET-Anfrage an unsere Anwendung durch.<\/li>\n<\/ul>\n<p>\n\u00dcber HTTP-Callbacks werden die Variablen \u00fcbermittelt, die bei der Ausf\u00fchrung des Playbooks definiert wurden und die wir speichern und in zuk\u00fcnftigen L\u00e4ufen verwenden m\u00f6chten. Diese Daten schreiben wir in SQLite.<\/p>\n<p>Au\u00dferdem hinterlassen wir \u00fcber HTTP-Callbacks Kommentare und \u00e4ndern den Status des Tickets.<\/p>\n<p><b class=\"spoiler_title\">HTTP-Callback<\/b><\/p>\n<pre><code class=\"plaintext\"># Make callback to Diskobot App\n# Variables:\n#    callback_post_body: # A dict with follow keys. All keys are optional\n#       msg: If exist it would be posted to Jira as comment\n#       data: If exist it would be saved in Incident.variables\n#       desire_state: Set desire_state for incident\n#       status: If exist Proceed issue to that status\n\n  - name: Callback to Diskobot app (jira comment\/status)\n    uri:\n      url: \"{{ callback_url }}\/{{ devname }}\"\n      user: \"{{ diskobot_user }}\"\n      password: \"{{ diskobot_pass }}\"\n      force_basic_auth: True\n      method: POST\n      body: \"{{ callback_post_body | to_json }}\"\n      body_format: json\n    delegate_to: 127.0.0.1\n<\/code><\/pre>\n<p>Wie viele \u00e4hnliche Aufgaben haben wir es in eine separate gemeinsame Datei ausgegliedert und f\u00fcgen es bei Bedarf hinzu, um nicht st\u00e4ndig im Playbooks zu wiederholen. Hier spielt die callback_url eine Rolle, in der der Issue-Key und der Hostname eingebettet sind. Wenn Ansible diese POST-Anfrage ausf\u00fchrt, versteht der Bot, dass sie im Rahmen eines bestimmten Vorfalls eingegangen ist.<\/p>\n<p>Hier ist ein Beispiel aus dem Playbook, in dem wir die Festplatte aus dem MD-Ger\u00e4t ausgegeben haben:<\/p>\n<pre><code class=\"plaintext\">  # Save mdadm configuration\n  - include: common\/callback.yml\n    vars:\n      callback_post_body:\n        status: 'Ready to change'\n        msg: \"Removed disk from mdraid {{ mdadm_remove_disk.msg | comment_jira }}\"\n        data:\n          mdadm_data: \"{{ mdadm_remove_disk.removed }}\"\n          parted_info: \"{{ parted_info | default() }}\"\n    when:\n      - mdadm_remove_disk | changed\n      - mdadm_remove_disk.removed\n<\/code><\/pre>\n<p>\nDiese Aufgabe versetzt das Jira-Ticket in den Status \u201eBereit zum \u00c4ndern\u201c und f\u00fcgt einen Kommentar hinzu. In der Variablen mdam_data wird auch die Liste der md-Ger\u00e4te gespeichert, aus denen die Festplatte entfernt wurde, und in parted_info wird ein Dump der Partition von parted gespeichert. <\/p>\n<p>Wenn der Ingenieur die neue Festplatte einsetzt, k\u00f6nnen wir diese Variablen verwenden, um den Dump der Partitionen wiederherzustellen und die Festplatte in die md-Ger\u00e4te einzuf\u00fchren, aus denen sie entfernt wurde.<\/p>\n<h3>Ansible-Pr\u00fcfmodus<\/h3>\n<p>\nEs war be\u00e4ngstigend, die Automatisierung zu aktivieren. Daher haben wir beschlossen, alle Playbooks im <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_checkmode.html\">Trockentest<\/a><\/noindex>, in dem Ansible keine Aktionen auf den Servern ausf\u00fchrt, sondern sie nur emuliert. <\/p>\n<p>Dieser Start wird \u00fcber ein separates Callback-Modul durchgef\u00fchrt, und das Ergebnis der Ausf\u00fchrung des Playbooks wird in Jira als Kommentar gespeichert.<\/p>\n<p><img decoding=\"async\" alt=\"Automatisierung des Austauschs von Festplatten mit Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/b02d7f1dc428f2797ae8556cd496b115.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nErstens erm\u00f6glichte es die Validierung der Arbeit des Bots und der Playbooks. Zweitens erh\u00f6hte es das Vertrauen der Administratoren in den Bot. <\/p>\n<p>Als wir die Validierung abgeschlossen hatten und verstanden, dass wir Ansible nicht nur im Trockentestmodus ausf\u00fchren k\u00f6nnen, haben wir in Jira die Schaltfl\u00e4che Run Diskobot f\u00fcr die Ausf\u00fchrung des gleichen Playbooks mit den gleichen Variablen auf demselben Host im regul\u00e4ren Modus erstellt. <\/p>\n<p>Dar\u00fcber hinaus wird die Schaltfl\u00e4che verwendet, um das Playbook im Fall eines Fehlers erneut auszuf\u00fchren.<\/p>\n<h3>Struktur der Playbooks<\/h3>\n<p>\nIch habe bereits erw\u00e4hnt, dass der Bot je nach Status des Jira-Tickets verschiedene Playbooks ausf\u00fchrt.<\/p>\n<p>Erstens ist es so viel einfacher, den Zugang zu organisieren. <br \/>\nZweitens ist es in einigen F\u00e4llen einfach notwendig. <\/p>\n<p>Zum Beispiel muss man bei der Ersetzung der Systemfestplatte zuerst ins Bereitstellungssystem gehen, eine Aufgabe erstellen, und nach der korrekten Bereitstellung wird der Server \u00fcber SSH verf\u00fcgbar, und man kann die Anwendung aufspielen. Wenn wir all dies in einem Playbook gemacht h\u00e4tten, h\u00e4tte Ansible es aufgrund der Nichterreichbarkeit des Hosts nicht ausf\u00fchren k\u00f6nnen.<\/p>\n<p>Wir verwenden Ansible-Rollen f\u00fcr jede Servergruppe. Hier sieht man, wie die Playbooks in einer von ihnen organisiert sind. <\/p>\n<p><img decoding=\"async\" alt=\"Automatisierung des Austauschs von Festplatten mit Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/7a14035392b33f01d3182d5fff779321.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEs ist praktisch, da sofort klar ist, wo sich welche Aufgaben befinden. In der main.yml, die der Eingang f\u00fcr die Ansible-Rolle ist, k\u00f6nnen wir einfach nach dem Status des Tickets oder allgemeinen Aufgaben, die f\u00fcr alle notwendig sind, wie z.B. Identifikation oder Token-Abruf, einf\u00fcgen.<\/p>\n<h4>Investigation.yml<\/h4>\n<p>\nWird f\u00fcr Tickets im Status Investigation und Open gestartet. Das Wichtigste f\u00fcr dieses Playbook ist der Name des Blockger\u00e4ts. Diese Information ist nicht immer verf\u00fcgbar. <\/p>\n<p>Um diese zu erhalten, analysieren wir die Zusammenfassung in Jira, den letzten Wert vom Zabbix-Trigger. Dort kann der Name des Blockger\u00e4ts enthalten sein \u2013 Gl\u00fcck gehabt. Oder es k\u00f6nnte der Mount-Punkt sein, dann muss man auf den Server gehen, parsen und die ben\u00f6tigte Festplatte berechnen. Auch der Trigger kann die SCSI-Adresse oder andere Informationen \u00fcbermitteln. Aber manchmal gibt es auch keine Hinweise, und man muss analysieren.<\/p>\n<p>Nachdem wir den Namen des Blockger\u00e4ts herausgefunden haben, sammeln wir Informationen \u00fcber den Typ und die Gr\u00f6\u00dfe der Festplatte, um die Felder in Jira auszuf\u00fcllen. Wir erfassen auch Informationen \u00fcber den Anbieter, das Modell, die Firmware, die ID, SMART und f\u00fcgen all dies in den Kommentar im Jira-Ticket ein. Der Administrator und der Techniker m\u00fcssen diese Daten jetzt nicht mehr suchen. \ud83d\ude42<\/p>\n<p><img decoding=\"async\" alt=\"Automatisierung des Austauschs von Festplatten mit Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/259bf8712c013ee00d238f111b4280fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4>prepare2change.yml<\/h4>\n<p>\nAus der Rotation nehmen der Festplatte, Vorbereitung auf den Austausch. Die schwierigste und verantwortungsvollste Phase. Hier kann man die Anwendung anhalten, wenn sie nicht gestoppt werden kann. Oder man zieht die Festplatte heraus, bei der keine Replikate vorhanden waren, was Auswirkungen auf die Benutzer hat und m\u00f6glicherweise Datenverlust bedeutet. Hier haben wir die meisten \u00dcberpr\u00fcfungen und Benachrichtigungen im Chat.<\/p>\n<p>Im einfachsten Fall handelt es sich um das Entfernen der Festplatte aus HW\/MD RAID. <\/p>\n<p>In komplexeren Situationen (in unseren Speichersystemen), wenn das Backup auf Anwendungsebene durchgef\u00fchrt wird, muss man \u00fcber die API zur Anwendung gehen, die Entfernung der Festplatte melden, sie deaktivieren und die Wiederherstellung einleiten.<\/p>\n<p>Wir migrieren derzeit massiv nach <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/odnoklassniki\/blog\/346868\">die Cloud<\/a><\/noindex>, und wenn der Server in der Cloud ist, kontaktiert Diskobot die API der Cloud, teilt mit, dass er mit diesem Minion \u2013 dem Server, auf dem die Container laufen \u2013 arbeiten wird, und bittet darum, \"alle Container von diesem Minion zu migrieren\". Gleichzeitig aktiviert er die Beleuchtung der Festplatte, damit der Ingenieur sofort sieht, welche herausgezogen werden muss.<\/p>\n<h4>changed.yml<\/h4>\n<p>\nNach dem Austausch der Festplatte \u00fcberpr\u00fcfen wir zuerst deren Verf\u00fcgbarkeit. <\/p>\n<p>Ingenieure setzen nicht immer neue Festplatten ein, daher haben wir eine \u00dcberpr\u00fcfung der uns geeigneten SMART-Werte hinzugef\u00fcgt.<\/p>\n<p><b class=\"spoiler_title\">Welche Attribute betrachten wir<\/b>Anzahl der umgeschichteten Sektoren (5) &lt; 100<br \/>\nAktuelle Anzahl der wartenden Sektoren (107) == 0<\/p>\n<p>Wenn die Festplatte den Test nicht besteht, wird der Ingenieur \u00fcber einen erneuten Austausch informiert. Wenn alles in Ordnung ist, schaltet sich die Anzeige aus, wird eine Markierung aufgebracht und die Festplatte wird in den Betrieb genommen.<\/p>\n<h4>ready.yml<\/h4>\n<p>\nDer einfachste Fall: \u00dcberpr\u00fcfung der Synchronisation von HW\/SW Raid oder Abschluss der Datensynchronisation in der Anwendung.<\/p>\n<h3>API der Anwendungen<\/h3>\n<p>\nIch habe mehrfach erw\u00e4hnt, dass der Bot h\u00e4ufig auf die API der Anwendungen zugreift. Nat\u00fcrlich hatten nicht alle Anwendungen die erforderlichen Methoden, also mussten sie angepasst werden. Hier sind die wichtigsten Methoden, die wir verwenden:<\/p>\n<ul>\n<li>Status. Status des Clusters oder der Festplatte, um zu verstehen, ob man damit arbeiten kann;\n<\/li>\n<li>Start\/Stopp. Aktivierung-Deaktivierung der Festplatte;\n<\/li>\n<li>Migrieren\/Wiederherstellen. Migration und Wiederherstellung von Daten w\u00e4hrend und nach dem Austausch.\n<\/li>\n<\/ul>\n<p><\/p>\n<h3>Erfahrungen zu Ansible<\/h3>\n<p>\nIch liebe Ansible sehr. Aber oft, wenn ich mir verschiedene Open-Source-Projekte ansehe und sehe, wie die Leute Playbooks schreiben, macht es mir ein wenig Angst. Komplexe logische Verkn\u00fcpfungen von when\/loop, mangelnde Flexibilit\u00e4t und Idempotenz aufgrund der h\u00e4ufigen Verwendung von shell\/command.<\/p>\n<p>Wir haben beschlossen, alles so einfach wie m\u00f6glich zu halten und die Modularit\u00e4t von Ansible zu nutzen. Auf der h\u00f6chsten Ebene befinden sich die Playbooks, die von jedem Administrator oder externen Entwickler, der ein wenig Ansible kennt, geschrieben werden k\u00f6nnen.<\/p>\n<pre><code class=\"plaintext\">- name: Blink disk\n  become: True\n  register: locate_action\n  disk_locate:\n      locate: '{{ locate }}'\n      devname: '{{ devname }}'\n      ids: '{{ locate_ids | default(pd_id) | default(omit) }}'\n<\/code><\/pre>\n<p>Wenn eine Logik in Playbooks schwer umzusetzen ist, lagern wir sie in ein Ansible-Modul oder einen Filter aus. Die Skripte k\u00f6nnen in Python oder jeder anderen Sprache geschrieben werden. <\/p>\n<p>Sie sind leicht und schnell zu schreiben. Zum Beispiel besteht das oben gezeigte Modul zur Anzeigesteuerung der Festplatte aus 265 Zeilen.<\/p>\n<p><img decoding=\"async\" alt=\"Automatisierung des Austauschs von Festplatten mit Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/08e0384bfad24f3ee61e0643ca087852.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAuf der untersten Ebene befindet sich die Bibliothek. F\u00fcr dieses Projekt haben wir eine separate Anwendung geschrieben, eine Art Abstraktion \u00fcber Hardware- und Software-RAID, die die entsprechenden Anfragen ausf\u00fchrt. <\/p>\n<p><img decoding=\"async\" alt=\"Automatisierung des Austauschs von Festplatten mit Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/0edda3182026ce6279bd84c99613e3d6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDie gr\u00f6\u00dften St\u00e4rken von Ansible sind die Einfachheit und die verst\u00e4ndlichen Playbooks. Ich glaube, dass man dies nutzen sollte, anstatt schreckliche YAML-Dateien und eine gro\u00dfe Menge an Bedingungen, Shell-Code und Schleifen zu generieren.<\/p>\n<p>Wenn Sie unsere Erfahrungen mit der Ansible-API nachahmen m\u00f6chten, beachten Sie bitte zwei Dinge:<\/p>\n<ul>\n<li>Playbook_executor und dem playbook kann kein Timeout \u00fcbergeben werden. Es gibt ein Timeout f\u00fcr SSH-Sitzungen, aber kein Timeout f\u00fcr das Playbook. Wenn wir versuchen, eine Festplatte zu demontieren, die im System nicht mehr existiert, wird das Playbook endlos ausgef\u00fchrt, weshalb wir ihren Start in einen separaten Wrapper einbetten und nach Timeout beenden mussten.\n<\/li>\n<li>Ansible basiert auf Fork-Prozessen, daher ist seine API nicht thread-sicher. Wir f\u00fchren alle unsere Playbooks einstr\u00e4ngig aus.\n<\/li>\n<\/ul>\n<p>\nInsgesamt ist es uns gelungen, den Austausch von etwa 80 % der Festplatten zu automatisieren. Insgesamt hat sich die Austauschgeschwindigkeit verdoppelt. Heute schaut der Administrator nur auf das Incident und trifft eine Entscheidung, ob die Festplatte gewechselt werden muss oder nicht, und klickt dann einmal.<\/p>\n<p>Aber jetzt stehen wir vor einem anderen Problem: Einige neue Administratoren wissen nicht, wie man Festplatten wechselt. \ud83d\ude42<br \/>\n<br \/>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/odnoklassniki\/blog\/452110\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442. \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432\u0435\u0434\u0443\u0449\u0438\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0432 \u041e\u041a \u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u044e \u0437\u0430 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u043e\u0440\u0442\u0430\u043b\u0430. \u0425\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0432\u044b\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0437\u0430\u043c\u0435\u043d\u044b \u0434\u0438\u0441\u043a\u043e\u0432, \u0430 \u0437\u0430\u0442\u0435\u043c, \u043a\u0430\u043a \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u043b\u0438 \u0435\u0433\u043e \u0431\u043e\u0442\u043e\u043c. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0440\u043e\u0434\u0430 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043d\u0430 HighLoad+ 2018 \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043f\u043e \u0437\u0430\u043c\u0435\u043d\u0435 \u0434\u0438\u0441\u043a\u043e\u0432 \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":26233,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-34841","post","type-post","status-publish","format-standard","has-post-thumbnail","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=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442.\" \/>\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\/avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible\" \/>\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\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u043c\u0435\u043d\u044b \u0434\u0438\u0441\u043a\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Ansible | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible\" \/>\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=\"2019-10-31T19:00:43+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:00:43+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\udd47Automatisierung des Festplattentausches mit Ansible | ProHoster","description":"Hallo zusammen.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible","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\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u043c\u0435\u043d\u044b \u0434\u0438\u0441\u043a\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Ansible | ProHoster","og:description":"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442.","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible","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":"2019-10-31T19:00:43+00:00","article:modified_time":"2019-10-31T19:00:43+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"34841","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":"2026-01-21 20:48:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:14:05","updated":"2026-01-21 20:48:19","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\/34841","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=34841"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/34841\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/26233"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=34841"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=34841"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=34841"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}