Wenn Ihre IT-Infrastruktur zu schnell wĂ€chst, stehen Sie irgendwann vor der Wahl â entweder die personellen Ressourcen zur UnterstĂŒtzung linear erhöhen oder mit der Automatisierung beginnen. Bis zu einem bestimmten Punkt lebten wir im ersten Paradigma, und dann begann der lange Weg zu Infrastructure-as-Code.

NatĂŒrlich ist NSPK kein Startup, aber eine solche AtmosphĂ€re herrschte in den ersten Jahren des Unternehmens, und es waren sehr interessante Jahre. Mein Name ist , seit ĂŒber 10 Jahren unterstĂŒtze ich eine Linux-Infrastruktur mit hohen VerfĂŒgbarkeitsanforderungen. Ich bin im Januar 2016 zum NSPK-Team gestoĂen und habe leider nicht den Anfang des Unternehmens miterlebt, kam aber in einer Phase groĂer VerĂ€nderungen.
Insgesamt kann man sagen, dass unser Team zwei Produkte fĂŒr das Unternehmen liefert. Das erste ist die Infrastruktur. Die E-Mail muss funktionieren, DNS muss arbeiten und die DomĂ€nencontroller mĂŒssen Ihnen den Zugang zu den Servern ermöglichen, die nicht ausfallen dĂŒrfen. Die IT-Landschaft des Unternehmens ist riesig! Es sind business- und mission-critical Systeme, deren VerfĂŒgbarkeitsanforderungen teilweise bei 99,999 liegen. Das zweite Produkt sind die Server selbst, sowohl physische als auch virtuelle. Die bestehenden mĂŒssen ĂŒberwacht werden, wĂ€hrend neue regelmĂ€Ăig an Kunden aus verschiedenen Abteilungen geliefert werden. In diesem Artikel möchte ich den Fokus darauf legen, wie wir die Infrastruktur entwickelt haben, die den Lebenszyklus verantwortet Server.
Der Beginn des Weges
Zu Beginn unseres Weges sah unser Technologie-Stack so aus:
Betriebssystem CentOS 7
DomÀnencontroller FreeIPA
Automatisierung â Ansible (+Tower), Cobbler
All dies war in 3 DomĂ€nen verteilt, die ĂŒber mehrere Rechenzentren verteilt waren. In einem Rechenzentrum â BĂŒro- und Testsysteme, in den anderen PROD.
Die Erstellung von Servern sah irgendwann so aus:

Im VM-Vorlage CentOS minimal und das notwendigste wie ein korrektes /etc/resolv.conf, der Rest kommt ĂŒber Ansible.
CMDB â Excel.
Wenn der Server physisch ist, wurde statt der Kopie einer virtuellen Maschine das Betriebssystem mit Cobbler installiert â die MAC-Adressen des Zielservers werden zur Cobbler-Konfiguration hinzugefĂŒgt, der Server erhĂ€lt ĂŒber DHCP eine IP-Adresse, und dann wird das Betriebssystem installiert.
ZunÀchst haben wir sogar versucht, eine Art Konfigurationsmanagement in Cobbler zu implementieren. Mit der Zeit brachte das jedoch Probleme bei der PortabilitÀt der Konfigurationen sowohl zu anderen Rechenzentren als auch zum Ansible-Code zur Vorbereitung von VMs.
Zu dieser Zeit betrachteten viele von uns Ansible als praktische Erweiterung von Bash und scheuten sich nicht, Konstruktionen mit Shell und sed zu verwenden. Im Grunde war es Bashsible. Dies fĂŒhrte letztendlich dazu, dass es einfacher war, einen Server zu löschen, das Playbook zu korrigieren und es erneut auszufĂŒhren, wenn das Playbook aus irgendeinem Grund nicht auf dem Server funktionierte. Es gab im Grunde kein Versionsmanagement fĂŒr Skripte, auch nicht fĂŒr die PortabilitĂ€t von Konfigurationen.
Zum Beispiel wollten wir eine bestimmte Konfiguration auf allen Servern Àndern:
- Wir Ă€ndern die Konfiguration auf bestehenden Servern im logischen Segment/Rechenzentrum. Manchmal nicht an einem Tag â die Anforderungen an die VerfĂŒgbarkeit und das Gesetz der groĂen Zahlen lassen nicht zu, dass alle Ănderungen auf einmal angewendet werden. Einige Ănderungen sind zudem potenziell destruktiv und erfordern einen Neustart von etwas, sei es von Diensten bis hin zum Betriebssystem selbst.
- Korrektur in Ansible
- Korrektur in Cobbler
- Wiederholen Sie N-mal fĂŒr jedes logische Segment/Rechenzentrum
Um sicherzustellen, dass alle Ănderungen reibungslos verlaufen, mussten viele Faktoren berĂŒcksichtigt werden, und Ănderungen sind stĂ€ndig im Gange.
- Refactoring des Ansible-Codes, der Konfigurationsdateien
- Ănderung interner Best Practices
- Ănderungen aufgrund der Analyse von VorfĂ€llen/Störungen
- Ănderung der Sicherheitsstandards, sowohl intern als auch extern. Beispielsweise werden die Anforderungen des PCI DSS jedes Jahr um neue Anforderungen ergĂ€nzt.
Wachstum der Infrastruktur und Beginn des Weges
Anzahl der Server/logischen DomÀnen/Rechenzentren wuchs, ebenso die Anzahl der Fehler in den Konfigurationen. Irgendwann kamen wir auf drei Richtungen, in die das Configuration Management entwickelt werden musste:
- Automatisierung. Wo immer möglich, sollte der menschliche Faktor in wiederkehrenden Operationen vermieden werden.
- Wiederholbarkeit. Es ist viel einfacher, Infrastruktur zu verwalten, wenn sie vorhersehbar ist. Die Konfiguration der Server und der Werkzeuge zu ihrer Vorbereitung sollte ĂŒberall identisch sein. Dies ist auch fĂŒr die Produktteams wichtig â die Anwendung sollte garantiert nach dem Testen in die Produktionsumgebung gelangen, die Ă€hnlich wie die Testumgebung konfiguriert ist.
- Einfachheit und Transparenz bei der Umsetzung von Ănderungen im Configuration Management.
Es bleibt, ein paar Werkzeuge hinzuzufĂŒgen.
Als Code-Repository haben wir GitLab CE gewÀhlt, nicht zuletzt wegen der integrierten CI/CD-Module.
Das Geheimnis-Repository â Hashicorp Vault, auch wegen seiner ausgezeichneten API.
Die Testkonfigurationen und Ansible-Rollen â Molecule+Testinfra. Die Tests laufen viel schneller, wenn Sie Ansible mit Mitogen verbinden. Parallel dazu haben wir begonnen, unsere eigene CMDB und einen Orchestrator fĂŒr automatische Deployments (auf dem Bild ĂŒber Cobbler) zu schreiben, aber das ist eine ganz andere Geschichte, ĂŒber die mein Kollege und Hauptentwickler dieser Systeme in Zukunft berichten wird.
Unsere Auswahl:
Molecule + Testinfra
Ansible + Tower + AWX
Welt der Server + DITNET (Eigene Entwicklung)
Cobbler
Gitlab + GitLab Runner
Hashicorp Vault

Ăbrigens zu den Ansible-Rollen. ZunĂ€chst gab es nur eine, nach mehreren Refactorings sind es 17 geworden. Ich empfehle dringend, das Monolithische in idempotente Rollen zu unterteilen, die man dann separat ausfĂŒhren kann; zusĂ€tzlich können Tags hinzugefĂŒgt werden. Wir haben die Rollen nach FunktionalitĂ€t unterteilt â Netzwerk, Logging, Pakete, Hardware, Molecule usw. Insgesamt haben wir uns an die folgende Strategie gehalten. Ich behaupte nicht, dass dies die einzige Wahrheit ist, aber es hat bei uns funktioniert.
- Das Kopieren von Servern aus dem 'Golden Image' â ein Ăbel!Zu den Hauptnachteilen â Sie wissen genau nicht, in welchem Zustand sich die Images jetzt befinden und dass alle Ănderungen in alle Images fĂŒr alle Virtualisierungsfarmen kommen werden.
- Verwenden Sie Standardkonfigurationsdateien nur im Minimum und einigen Sie sich mit anderen Abteilungen darauf, dass Sie fĂŒr die wichtigsten Systemdateien verantwortlich sind., zum Beispiel:
- Halten Sie /etc/sysctl.conf leer, die Einstellungen sollten nur in /etc/sysctl.d/ liegen. Ihr Standard in eine Datei, das Custom fĂŒr die Anwendung in eine andere.
- Verwenden Sie Override-Dateien zur Bearbeitung von systemd-Einheiten.
- Template alle Konfigurationen und legen Sie sie ganz bei, wenn möglich, keine sed und Àhnliche Befehle in den Playbooks.
- Refaktorisierung des Codes des Konfigurationsmanagementsystems:
- Teilen Sie Aufgaben in logische Einheiten auf und schreiben Sie das Monolith in Rollen um.
- Verwenden Sie Linter! Ansible-lint, yaml-lint usw.
- Ăndern Sie den Ansatz! Kein Bashsible. Der Systemzustand muss beschrieben werden.
- Zu allen Ansible-Rollen mĂŒssen Tests in Molecule geschrieben werden und einmal tĂ€glich Berichte generiert werden.
- In unserem Fall wurden nach der Vorbereitung von Tests (von denen es mehr als 100 gab) etwa 70000 Fehler gefunden. Die Behebung hat mehrere Monate gedauert.

Unsere Implementierung
So, die Ansible-Rollen waren bereit, templatisiert und von Linter ĂŒberprĂŒft. Und sogar die Gits sind ĂŒberall angehoben. Aber die Frage der zuverlĂ€ssigen Bereitstellung von Code in verschiedene Segmente blieb offen. Wir haben beschlossen, mithilfe von Skripten zu synchronisieren. Es sieht so aus:

Nachdem die Ănderung eingetroffen ist, wird CI gestartet, ein Testserver erstellt, Rollen angewendet und mit Molecule getestet. Wenn alles in Ordnung ist, geht der Code in den Produktionsbranch. Aber wir wenden den neuen Code nicht automatisch auf bestehende Server an. Das ist eine Art Stopper, der fĂŒr die hohe VerfĂŒgbarkeit unserer Systeme notwendig ist. Und wenn die Infrastruktur riesig wird, kommt ein weiteres Gesetz ins Spiel â selbst wenn Sie sicher sind, dass die Ănderung harmlos ist, kann sie zu unglĂŒcklichen Folgen fĂŒhren.
Es gibt viele Möglichkeiten zur Erstellung von Servern. Letztendlich haben wir uns fĂŒr benutzerdefinierte Skripte in Python entschieden. Und fĂŒr CI Ansible:
- name: create1.yml - Erstelle eine VM aus einer Vorlage
vmware_guest:
hostname: "{{datacenter}}".domain.ru
username: "{{ username_vc }}"
password: "{{ password_vc }}"
validate_certs: no
cluster: "{{cluster}}"
datacenter: "{{datacenter}}"
name: "{{ name }}"
state: poweredon
folder: "\/{{folder}}"
template: "{{template}}"
customization:
hostname: "{{ name }}"
domain: domain.ru
dns_servers:
- "{{ ipa1_dns }}"
- "{{ ipa2_dns }}"
networks:
- name: "{{ network }}"
type: static
ip: "{{ip}}"
netmask: "{{netmask}}"
gateway: "{{gateway}}"
wake_on_lan: True
start_connected: True
allow_guest_control: True
wait_for_ip_address: yes
disk:
- size_gb: 1
type: thin
datastore: "{{datastore}}"
- size_gb: 20
type: thin
datastore: "{{datastore}}"Das haben wir erreicht, das System lebt und entwickelt sich weiter.
- 17 Ansible-Rollen zur Serverkonfiguration. Jede Rolle dient der Lösung einer spezifischen logischen Aufgabe (Protokollierung, Auditing, Benutzerauthentifizierung, Monitoring usw.).
- Testen der Rollen. Molecule + TestInfra.
- Eigene Entwicklung: CMDB + Orchestrator.
- Die Servererstellungszeit betrÀgt etwa 30 Minuten, ist automatisiert und hÀngt kaum von der Aufgabenwarteschlange ab.
- Gleicher Zustand/Namen der Infrastruktur in allen Segmenten â Playbooks, Repositories, Virtualisierungselemente.
- TĂ€gliche ĂberprĂŒfung des Serverzustands mit Erstellung von Berichten ĂŒber Abweichungen vom Standard.
Ich hoffe, meine ErzĂ€hlung ist fĂŒr diejenigen nĂŒtzlich, die am Anfang stehen. Welchen Automatisierungs-Stack verwenden Sie?
Quelle: habr.com

