Vor einigen Jahren waren die Haupttrends Automatisierung, DevOps-Praktiken und die Beschleunigung der Bereitstellung von Werten auf dem Markt. Die Home Credit Bank entschied sich, mit der technologischen Entwicklung Schritt zu halten, zumal das offene Flüstern der Benutzer, die es satt hatten, mehrere Tage auf neue Ressourcen für ihre wichtigen Projekte zu warten, immer lauter wurde.
Wir haben uns entschlossen, mit der Genehmigung von Anträgen durch Abteilungen zu beginnen, was wie in vielen großen Unternehmen Zeit und Mühe erfordert. Als erste Aufgabe haben wir den Prozess der Erstellung einer virtuellen Maschine unabhängig von der Virtualisierungsumgebung ausgewählt. Bei der Erstellung einer Liste von Aufgaben wurde uns klar, dass eine Integration in andere Systeme, die in der Infrastruktur unserer Bank verwendet werden, beispielsweise über eine API erforderlich ist.

Die am besten geeignete Lösung war ManageIQ . Dies ist ein Projekt, das Red Hat 2012 erworben hat und auf dessen Grundlage das kommerzielle Red Hat CloudForms-Produkt erstellt wurde . Gleichzeitig blieb ManageIQ im Status eines Open-Source-Produkts und entwickelt sich parallel zu CloudForms.
ManageIQ ist in Ruby geschrieben und unterstützt eine Vielzahl verschiedener Anbieter von Virtualisierung, öffentlichen Clouds und Containerisierung. Im Moment verwenden wir eine Version von Gaprindashvili in der Hochverfügbarkeitskonfiguration in Home.
Wie sich der Prozess verändert hat
Zuvor benötigte jedes Team separate Einstellungen in seinem Verantwortungsbereich. Nach der vorläufigen Vorbereitung wurden alle Daten gesammelt und an den Administrator gesendet, der die virtuelle Maschine bereitgestellt und konfiguriert hat. Dann musste beispielsweise das Überwachungsteam darüber informiert werden, dass ein neuer Host erschienen war, der zur Überwachung hinzugefügt werden musste. Verzögerungen in der Kommunikation, die Arbeitsbelastung von Spezialisten und Fehler, die durch den menschlichen Faktor verursacht werden, können diesen Prozess auf mehrere Tage ausdehnen.
Nachdem wir den gesamten Prozess in ManageIQ integriert haben, haben wir die folgenden Ergebnisse erhalten:
Der Zeitunterschied ist darauf zurückzuführen, dass im zweiten Fall zusätzliche Zeit erforderlich ist, um den Host auf die Arbeit mit Docker vorzubereiten, Images für Infrastrukturcontainer von Artifactory herunterzuladen und zu integrieren, da zu diesem Zeitpunkt noch kein Zugriff auf den Docker Hub besteht. Im Fall von Windows wird der Unterschied dadurch erzielt, dass zum einen die Erstellungszeit einer Linux-VM ohne Anpassung ungefähr 2 Minuten und die einer Windows-VM 6 Minuten beträgt. Zweitens dauert das Anpassen von Windows selbst etwa 10 Minuten gegenüber 2 Minuten für Linux.
10 Minuten sind nicht so schnell, da ungefähr 2-3 Minuten direkt für die Erstellung einer VM aufgewendet werden. Für die verbleibende Zeit schafft ManageIQ Folgendes:
- Das System sammelt die vom Benutzer im Bestellformular angegebenen Parameter und zerlegt sie in Variablen.
- Im Incident Management System wird eine neue Änderungsanforderung erstellt, die Daten zur neuen Ressource anzeigt.
- Das ManageIQ-Ressourcennamen-Abfragesystem sendet einen Wert für eine neue Ressource.
- Das IP-Adressverwaltungssystem gibt basierend auf den eingegebenen Parametern eine neue Adresse aus.
- Ein neuer DNS-Eintrag wird auf dem lokalen DNS-Server registriert.
- Basierend auf den Parametern, der Umgebung und der Ressourcenlast werden der Virtualisierungstyp und der Cluster für die Platzierung ausgewählt.
- Als Nächstes wird eine virtuelle Maschine mit den angegebenen Parametern erstellt.
- Wenn die virtuelle Maschine über die Vorlage bereitgestellt wird, müssen Sie Skripts ausführen, mit denen die endgültigen Einstellungen vorgenommen werden:
- Festplattenerweiterung auf eine bestimmte Größe,
- Generieren eines neuen Root-Passworts, Ändern auf einem Linux-Host und Schreiben in einen Passwort-Manager,
- Erstellen einer Konfigurations-YAML-Datei für Puppet in GitLab,
- Führen Sie Runbooks aus, die die erforderlichen Einstellungen und Updates für Windows-VMs oder bringen
- Starten Sie Puppet, mit dem Linux-Computer aktualisiert und konfiguriert werden.
- Danach wird die in Schritt 2 erstellte Änderungsanforderung geschlossen. Es werden neue Daten hinzugefügt, z. B. die IP-Adresse und der Hostname.
- Eine neue Einheit wird in der Compute Resource Management Base (CMDB) registriert.
- Die virtuelle Maschine wird in Zabbix registriert und zur Überwachung hinzugefügt.
- Der Kunde und andere Interessenten erhalten eine E-Mail mit Informationen zu der neuen Einheit, die mit ManageIQ erstellt wurde.
Was ist drin?
Lassen Sie uns die technischen Details des Produkts untersuchen. Standardmäßig kann ManageIQ eine virtuelle Maschine aus einer Vorlage erstellen. Wie unterscheidet sich dies von dem, was wir beispielsweise in vCenter tun? Die richtige Antwort ist nichts. ManageIQ verwendet dieselben Methoden wie Virtualisierungssysteme, jedoch von einem einzigen Ort aus. Darüber hinaus können Sie eigene Skripte hinzufügen, die nicht in die Standardfunktionen passen. Wenn Sie also über Ressourcen verfügen, z. B. in öffentlichem Azure, in vCenter, das auf Ihrer eigenen Hardware bereitgestellt wird, und der Kubernetes-Cluster sich an einem anderen Ort dreht, kann dies alles bequem über ManageIQ verwaltet werden.
Neben einer Vielzahl von Anbietern für die Integration verfügt ManageIQ über praktische Tools zur Anpassung. So erstellen Sie beispielsweise praktische Formulare zur Lösung Ihres Problems:

Dank dessen war es möglich, eine vollwertige Schnittstelle für die Bestellung einer virtuellen Maschine zu erstellen, in die alle erforderlichen Parameter eingepasst wurden:

Wir wählen die Menge der Computerressourcen und das Betriebssystem aus und geben alle zusätzlichen Informationen ein, die für die Integration in externe Systeme erforderlich sind. Darüber hinaus wählt das System mithilfe interner Mechanismen (etwas später) aus, wo neue Ressourcen platziert werden sollen: Das Rechenzentrum, der Cluster, der Host und der Datenspeicher werden abhängig von allen eingegebenen Parametern ausgewählt und die Ressourcen geladen.
Vergessen Sie nicht, dass die Leute zu viele Ressourcen bestellen können oder gar nicht, was sie wirklich brauchen. Hier kommt das System der Anfragen und Bestätigungen ins Spiel:

Alle vom Benutzer bestellten Ressourcen müssen von der verantwortlichen Person genehmigt werden. In Home macht das eine Gruppe von Architekten.
Automatisierungsstruktur
Wenn Sie alle Automatisierungsprozesse in ManageIQ in kleine Teile zerlegen, werden Sie eine bestimmte Struktur bemerken.
Domain automatisieren

Der Datenspeicher hostet alle Domänen von ManageIQ.
Standardmäßig gibt es eine ManageIQ-Domäne, die gesperrt ist und so etwas wie ein Referenzmodell darstellt. Wenn Sie Änderungen vornehmen müssen, wird eine andere Domäne erstellt, in die Elemente aus der ManageIQ-Domäne kopiert und für Ihre eigenen Aufgaben geändert werden.
Namespace automatisieren

Innerhalb sind Domänen in Teile unterteilt, die für einzelne Prozesse verantwortlich sind: Dies kann der Abschnitt sein, der für die Verwaltung der Infrastruktur (Infrastruktur) oder für die Arbeit mit Diensten (Dienst) verantwortlich ist. Wir haben unseren eigenen Namespace, der alles enthält, was mit den Systemen der Bank zu tun hat.
Betrachten Sie die Struktur am Beispiel des Bereitstellungsprozesses für eine neue virtuelle Maschine genauer. Es wird in der Automate-Klasse mit dem Namen VMProvision_VM beschrieben .
Klasse automatisieren
Die Klasse hat eine Struktur, die Instanzen , Methoden , Eigenschaften und Schema enthält . Aus Sicht der Automatisierung ist Schema von größtem Interesse:

Das Layout ähnelt der Pipeline in CI / CD-Systemen. Es beschreibt die Schritte, die im Automatisierungsprozess ausgeführt werden.
Instanz automatisieren

Die oben beschriebene Klasse verfügt über zwei Automate Instance. Jeder von ihnen erbt von der Schaltung die Stufen, für die der Standardwert eingestellt ist. Stufen mit Nullwerten werden in der Instanz beschrieben.

In der Instanz wurden Werte für Schritte angezeigt, die in der Schemabeschreibung leer waren. Sie können auch sehen, wer und wann die letzte Änderung vorgenommen hat.
Mal sehen, was einer der Wertwerte darstellt:

Dies ist eine Automate-Klasse namens Methods mit einer Automate-Instanz. Das Diagramm beschreibt das Attribut ipam_base_uri und die Methode execute . Die execute- Methode ruft wiederum die Automate-Methode purchase_ip auf .
Methode automatisieren
Dies ist ein Ruby-Skript, mit dem eine virtuelle Maschine über die REST-API mit anderen Systemen kommunizieren kann. Zum Beispiel wie beim IPAM-Adressraum-Managementsystem. In IPAM erhalten wir die Adresse, Maske, das Subnetz und das VLAN für die VM. Die Schwierigkeit besteht darin, dass der Computer in einer Testumgebung oder produktiv für Anwendungen oder Datenbanken bereitgestellt werden kann. Oder vielleicht hat der Sicherheitsdienst beschlossen, es in die PCI-DSS-Schleife aufzunehmen. Alle diese Informationen werden beim Erstellen der VM gesammelt oder in den Parametern der aufgerufenen Instanz übertragen (im obigen Screenshot sehen Sie, dass der Parameter die URL enthält, über die die Methode auf IPAM zugreift):
Hier ist ein Ruby-Codebase_uri = $evm.object['ipam_base_uri'] prov = $evm.root["miq_provision"] site = prov.get_option(:site) app = prov.get_option(:dialog_dropdown_list_information_system) crq = prov.get_option(:crq) descr = prov.get_option(:dialog_textarea_box_usernotes) owner = $evm.root['user'].name scope = prov.get_option(:dialog_dropdown_scope) environment = prov.get_option(:landscape)
$ evm.root ist eine Methode, die alles zurückgibt, was in ManageIQ gespeichert werden kann. Dies können Informationen über den Benutzer, die Umgebung, Variablen, die aktuelle Anforderung ('miq_request') usw. sein. Wir interessieren uns für den aktuellen Bereitstellungsprozess.

Als nächstes können wir die erforderlichen Werte abrufen : get_option (: site) nimmt den Wert auf, der in einer der vorherigen Phasen übertragen wurde, und get_option (: dialog_dropdown_list_information_system) übernimmt beispielsweise das Formular, das der Benutzer beim Bestellen neuer Ressourcen ausfüllt.
Alle empfangenen Werte werden von Variablen im Anforderungshauptteil im JSON-Format übertragen:
options = { verify: false, headers: {"Content-Type" => "application/json"}, body: { "site" => "#{site}", "env" => "#{env}", "app" => "#{app}", "scope" => "#{scope}", "role" => "#{role}", "crq" => "#{crq}", "descr" => "#{descr}", "owner" => "#{owner}", }.to_json, }
Mit diesem Parametersatz bestimmt IPAM eindeutig, in welchem VLAN sich die virtuelle Maschine befinden soll, und gibt die Netzwerkparameter zurück.
ManageIQ empfängt nicht nur Daten für die richtige VM-Konfiguration, sondern kann auch zusätzliche Informationen generieren, um einige Einstellungen in der Phase der sogenannten Post-Bereitstellung vorzunehmen (nachdem die virtuelle Maschine bereitgestellt und gestartet wurde). In Home verwenden wir Puppet, um Linux-Hostkonfigurationen zu verwalten. Erstellen Sie für jede Recheneinheit eine GAML-Datei in YAML mit einer Reihe von Gruppen:
Noch etwas Ruby-Code options = { headers: {"Private-Token" => "#{api_token}", "Content-Type" => "application/json"}, } body = { "branch" => "#{branch}", "author_email" => "email@your.domain", "author_name" => "ManageIQ Bot", "content" => "", "commit_message" => "New host created by ManageIQ", } descr = prov.get_option(:long_description) if descr.include?('rancher') && descr.include?('test') then body[:content] = "---\ngroups:\n - #{yaml_server}\n - rancher\n - user-devops-UDCR" end unless descr.include?('test') then if descr.include?('rancher') then body[:content] = "---\ngroups:\n - #{yaml_server}\n - rancher\n" end end unless descr.include?('rancher') then body[:content] = "---\ngroups:\n - #{yaml_server}\n - #{$is_id}" end
Gruppen hängen vom Typ der virtuellen Maschine, der Umgebung, in der sie erstellt wird, und dem Informationssystem ab.
Nach erfolgreichem Abschluss des Vorgangs erhält der Benutzer eine E-Mail mit folgenden Informationen:

Der Text des Briefes kann auch durch Hinzufügen der erforderlichen Informationen angepasst werden.
Wenn in einer der kritischen Phasen des Prozesses ein Fehler auftritt, können Sie eine Bedingung hinzufügen, die ausdrücklich angibt, dass der Prozess unterbrochen werden soll. Wenn der Fehler keine schwerwiegenden Folgen hat, geben Sie auch an, was trotz des Problems fortgesetzt werden kann.
Protokollierung
ManageIQ schreibt Protokolle von allem, was verfolgt werden kann. Der Automatisierungsprozess ist in automation.log geschrieben. Darüber hinaus gibt es API-Protokolle, verschiedene Cloud-Anbieter, Sicherheitsprotokolle, sogar die Ausgabe des Befehls top wird protokolliert.
Für jedes Ereignis in der Schaltung können Sie einen Protokolleintrag für deren Start und Ende konfigurieren:

Darüber hinaus können Sie Ihre Nachrichten in die Protokolle schreiben:
$evm.log(:info, "Call job status uri: #{item_uri}/#{job_id}/api/json")
Dies ist sehr nützlich, wenn Sie über eine API auf Systeme zugreifen, um zu verstehen, warum ein Fehler aufgetreten ist. Oder um den aktuellen Status eines längeren Prozesses zu verfolgen, z. B. das Ausführen eines Jenkins-Jobs oder eines SCCM-Runbooks:
$evm.log(:info, "acquire_osname --- naming jobStatus: #{jobStatus}") break if jobStatus.to_s == "Completed"
Sie können die Standardfunktionen für Ausnahmen verwenden, um in die Protokolle zu schreiben:
raise “VM not specified” if vm.nil?
Standardmäßig werden alle Protokolle im Abschnitt / var / log / manageiq / * gespeichert, aber aus eigener Erfahrung kann ich sagen, dass die Suche nach einem Problem über Tail und Grep nicht die bequemste Lösung ist. Da ManageIQ viele verschiedene Protokolle schreibt, sollten Sie darauf achten, Protokolle beispielsweise auf den ELK-Stapel umzuleiten.
ManageIQ API
Neben einer benutzerfreundlichen Weboberfläche verfügt ManageIQ über eine funktionale API. Damit haben wir beispielsweise das Problem gelöst, den Bezeichner der zu spezifizierenden Vorlage dynamisch zu bestimmen
beim Erstellen einer VM: def get_template(vendor, os, ems) user = '#{user}' pass = '#{pass}' options = { verify: false, headers: {"Accept" => "*/*", "accept-encoding" => "gzip, deflate"}, basic_auth: { username: "#{user}", password: "#{pass}" }, } response = HTTParty.get("#{host}/api/templates?filter[]=vendor=%27#{vendor}%27&filter[]=name=%27%2A#{os}%2A%27&filter[]=ems_id=%27#{ems}%27", options).to_s link = JSON.parse(response) link["resources"].each do |r| $url = r["href"] end response = HTTParty.get($url,options).to_s template = ["#{JSON.parse(response)['id']}"+", "+"#{JSON.parse(response)['name']}"] return template end
Mit einer POST-Anfrage und der Angabe von Filtern für die Suche erhalten wir die gewünschte Vorlage.
Zusätzlich zur Lösung interner Probleme können Sie neue API-Methoden zur Verwendung durch externe Systeme erstellen. Zu Beginn des Artikels wurde der Prozess der Bestellung einer neuen virtuellen Maschine über die Weboberfläche gezeigt. Und so sieht es aus, wenn Sie es tun
POST-Anfrage: curl -X POST \ http://Manageiq.hostname/api/service_catalogs/4/service_templates/31 \ -H 'Authorization: Basic Token-Value' \ -H 'Content-Type: application/json' \ -d '{ "action": "order", "resource": { "radio_button_vcpu": "a_2", "radio_button_vram": "a_2", "hdd_size": "40", "dropdown_os": "CentOS", "text_box_filter": "dns", "dropdown_list_information_system": "DNS ", "text_box_validator": "OK (DNS )", "textarea_box_usernotes": " ", "dropdown_env": "production", "date_control_retirement_dt": "2022-05-21", "dropdown_scope": "-" } }'
Fazit
Vorteile:
- Unglaubliche Flexibilität: Mit ManageIQ können Sie nicht nur den Automatisierungsprozess nach Bedarf anpassen, sondern auch seinen visuellen Teil durch Hinzufügen zusätzlicher Schaltflächen, Felder usw. ändern.
- Eingebauter Code-Editor mit Syntaxhervorhebung und Codeüberprüfung. Es schien mir eine sehr gute Lösung zu sein, wenn Sie schnell etwas reparieren müssen.
- Eine große Anzahl von Quellen, mit denen das System arbeiten kann. Clouds: Amazon EC2, Google Compute Engine, Azure, OpenStack und VMware vCloud. Infrastruktur: Microsoft SCVMM, OpenStack Platform Director, Red Hat Virtualization und VMware vCenter. Container: Kubernetes, OpenShift.
Nachteile:
- Die großen Fähigkeiten des Werkzeugs haben auch einen negativen Einfluss. Nicht alle Dokumentationen sind gut strukturiert, und manchmal ist es schwierig herauszufinden, wo Sie nach dem suchen können, was Sie benötigen. Es ist jedoch anzumerken, dass sich die Situation zum Besseren ändert, die Dokumentation ergänzt und verbessert wird.
- Kleine Gemeinde. Wenn Sie auf ein ganz bestimmtes Problem stoßen, können Sie die Antwort möglicherweise nicht schnell „googeln“. Oder überhaupt nicht erfolgreich.
- Ein Absatz, der aus den beiden vorhergehenden folgt. Einige grundlegende Dinge, Einstellungen und Szenarien finden Sie in der Dokumentation oder im Internet, aber spezifischere und engere Fragen erforderten viel Zeit zum Verstehen und Studieren, einschließlich der Methode des wissenschaftlichen Stocherns: Lächeln :.
Wie wir jetzt haben:
Aufgrund der Tatsache, dass ManageIQ die Ruby-Sprache voll ausnutzen kann, konnten wir sie integrieren, um mit den folgenden APIs zu arbeiten:
- Passwort-Manager Es generiert ein Root-Kennwort gemäß den Anforderungen des Sicherheitsdienstes, schreibt es in seine Datenbank und ManageIQ verwendet es im Betriebssystem.
- Service Center Orchestration-Dienste zum Verwalten von DNS-Einträgen und Hostnamen;
- BMC Abhilfe. Der gesamte Prozess wird als Kommentar zur Anfrage aufgezeichnet. Nach erfolgreicher Ausführung wird die Anforderung geschlossen.
- CMDB Informationen zu neuen Konfigurationseinheiten werden in der Datenbank mit allen erforderlichen Daten erstellt.
- Zabbix Abhängig von der Zugehörigkeit zum Informationssystem und zur Umgebung werden Hosts zu den entsprechenden Überwachungsgruppen hinzugefügt.
- Rancher. Implementierung der Erstellung neuer Umgebungen, Installation von Agenten und Registrierung von Hosts in vorhandenen Umgebungen.
- Jenkins Jenkins führt Jobs aus, um VMs in oVirt zu konfigurieren.
- LDAP Erstellen Sie neue Gruppen, mit denen der Zugriff in Rancher-Umgebungen gesteuert und Richtlinien in Vault konfiguriert werden.
- Gewölbe In Home hat die Integration dieses Produkts in Bankprozesse gerade erst begonnen, aber wir haben bereits Methoden zum Erstellen neuer Gruppen, Richtlinien und Abschnitte für die Speicherung entwickelt.
- Marionette und IPAM wurden bereits erwähnt.
Die Funktionen und Fähigkeiten des Systems sind sehr umfangreich, und ich habe viele davon kennengelernt und bin weiterhin mit der Implementierung des Systems vertraut.
Ich habe beispielsweise nicht erwähnt, dass das System eigene Dashboards mit Statistiken, Abrechnungseinstellungen oder Schaltflächen erstellen kann, an die Sie einzelne oder ganze Skripte anhängen können. Sie können eigene Felder hinzufügen, um zusätzliche Informationen zu Diensten und virtuellen Maschinen usw. aufzuzeichnen.
Was Home anstrebt:
- Ein Upgrade auf die Hammer-Version, in der Sie im HA-Modus versuchen können, mit dem integrierten Ansible zu arbeiten.
- Der Übergang von der Koordination für jede Einheit virtueller Ressourcen zum Management. Teams können neue VMs noch schneller erhalten, wenn das Kontingent nicht ausgeschöpft ist.
- Entwicklung neuer Methoden zur weiteren Bereitstellung für externe Systeme.
- Zum Beispiel verschiedene SaaS wie Jenkins, Logstash usw.
- Implementierung neuer API-Methoden in einem bestehenden Portal für Eigentümer von Informationssystemen. Benutzer müssen nicht über die Integration in das neue Infrastrukturelement nachdenken, sondern verwenden es lediglich als Service, um neue Ressourcen zu erhalten oder vorhandene zu ändern.
Ganz am Ende möchte ich Sie daran erinnern, dass Tools großartig sind, aber vergessen Sie nicht, wie wichtig die Interaktion zwischen verschiedenen Teams ist. Die im Artikel beschriebenen Änderungen wären ohne eine gut etablierte Kommunikation und ständige Interaktion zu aufkommenden Themen aller interessierten Parteien nicht möglich gewesen.