Wenn Ihre IT-Infrastruktur zu schnell wĂ€chst, stehen Sie frĂŒher oder spĂ€ter vor der Wahl: linear die Personalressourcen zur UnterstĂŒtzung erhöhen oder mit der Automatisierung beginnen. Bis zu einem gewissen Punkt lebten wir im ersten Paradigma, und dann begann der lange Weg zu Infrastructure-as-Code.

NatĂŒrlich ist NSPK kein Startup, aber in den ersten Jahren seines Bestehens herrschte im Unternehmen eine solche AtmosphĂ€re, und das waren sehr interessante Jahre. Ich heiĂe Ich unterstĂŒtze die Infrastruktur seit ĂŒber 10 Jahren. Linux mit hohen Anforderungen an die Barrierefreiheit. Ich bin im Januar 2016 dem NSPK-Team beigetreten und habe die AnfĂ€nge des Unternehmens leider nicht miterlebt, sondern bin zu einer Zeit groĂer VerĂ€nderungen dazugestoĂen.
Unser Team liefert dem Unternehmen im Allgemeinen zwei Produkte. Das erste ist die Infrastruktur. E-Mail muss funktionieren, DNS muss zuverlĂ€ssig arbeiten und DomĂ€nencontroller mĂŒssen die Verbindung zu Servern gewĂ€hrleisten, die nicht ausfallen dĂŒrfen. Die IT-Landschaft des Unternehmens ist riesig! Es handelt sich um geschĂ€ftskritische Systeme, teilweise mit einer VerfĂŒgbarkeitsanforderung von 99,999 %. Das zweite Produkt sind die Server selbst, sowohl physische als auch virtuelle. Bestehende Server mĂŒssen ĂŒberwacht und neue regelmĂ€Ăig an Kunden in verschiedenen Abteilungen ausgeliefert werden. In diesem Artikel möchte ich mich darauf konzentrieren, wie wir die Infrastruktur entwickelt haben, die diesen Lebenszyklus unterstĂŒtzt. Server.
Beginn einer Reise
Zu Beginn unserer Reise sah unser Technologie-Stack so aus:
OS CentOS 7
FreeIPA-DomÀnencontroller
Automatisierung â Ansible(+Tower), Cobbler
All dies befand sich in drei DomĂ€nen, verteilt auf mehrere Rechenzentren. In einem Rechenzentrum gibt es BĂŒrosysteme und Teststandorte, im Rest gibt es PROD.
Das Erstellen von Servern sah einmal so aus:

In der VM-Vorlage CentOS Minimal und das absolute Minimum, wie eine korrekte /etc/resolv.conf, der Rest kommt ĂŒber Ansible.
CMDB â Excel.
Wenn der Server physisch ist, wurde das Betriebssystem mithilfe von Cobbler darauf installiert, anstatt die virtuelle Maschine zu kopieren. Die MAC-Adressen des Zielservers werden zur Cobbler-Konfiguration hinzugefĂŒgt, der Server erhĂ€lt ĂŒber DHCP eine IP-Adresse und dann das Betriebssystem hinzugefĂŒgt.
Zuerst haben wir sogar versucht, eine Art Konfigurationsmanagement in Cobbler durchzufĂŒhren. Im Laufe der Zeit fĂŒhrte dies jedoch zu Problemen bei der PortabilitĂ€t von Konfigurationen sowohl auf andere Rechenzentren als auch beim Ansible-Code zur Vorbereitung von VMs.
Damals empfanden viele von uns Ansible als praktische Erweiterung von Bash und sparten nicht an Designs mit Shell und Sed. Insgesamt bashsible. Dies fĂŒhrte letztendlich dazu, dass es einfacher war, den Server zu löschen, das Playbook zu reparieren und erneut auszufĂŒhren, wenn das Playbook aus irgendeinem Grund nicht auf dem Server funktionierte. Es gab im Wesentlichen keine Versionierung von Skripten und keine PortabilitĂ€t von Konfigurationen.
Wir wollten zum Beispiel einige Konfigurationen auf allen Servern Àndern:
- Wir Ă€ndern die Konfiguration auf bestehenden Servern im logischen Segment/Rechenzentrum. Manchmal nicht an einem Tag â Barrierefreiheitsauflagen und das Gesetz der groĂen Zahlen erlauben es nicht, alle Ănderungen auf einmal anzuwenden. Und einige Ănderungen sind möglicherweise destruktiv und erfordern einen Neustart â von Diensten bis hin zum Betriebssystem selbst.
- Behebung in Ansible
- Wir beheben es in Cobbler
- Wiederholen Sie den Vorgang N-mal fĂŒr jedes logische Segment/Rechenzentrum
Damit alle Ănderungen reibungslos ablaufen konnten, mussten viele Faktoren berĂŒcksichtigt werden, und es kommt stĂ€ndig zu Ănderungen.
- Refactoring von Ansible-Code und Konfigurationsdateien
- Interne Best Practices Àndern
- Ănderungen basierend auf den Ergebnissen der Analyse von VorfĂ€llen/UnfĂ€llen
- Sich Àndernde Sicherheitsstandards, sowohl intern als auch extern. Beispielsweise wird PCI DSS jedes Jahr mit neuen Anforderungen aktualisiert
Infrastrukturwachstum und der Beginn der Reise
Die Zahl der Server/logischen DomÀnen/Rechenzentren wuchs und damit auch die Zahl der Fehler in Konfigurationen. Irgendwann kamen wir zu drei Richtungen, in die das Konfigurationsmanagement weiterentwickelt werden muss:
- Automatisierung. Menschliche Fehler bei sich wiederholenden VorgÀngen sollten so weit wie möglich vermieden werden.
- Wiederholbarkeit. Es ist viel einfacher, die Infrastruktur zu verwalten, wenn sie vorhersehbar ist. Die Konfiguration der Server und Tools zu ihrer Vorbereitung sollte ĂŒberall gleich sein. Dies ist auch fĂŒr Produktteams wichtig â nach dem Test muss gewĂ€hrleistet sein, dass die Anwendung in einer Produktionsumgebung landet, die Ă€hnlich wie die Testumgebung konfiguriert ist.
- Einfache und transparente DurchfĂŒhrung von Ănderungen am Konfigurationsmanagement.
Es mĂŒssen noch ein paar Tools hinzugefĂŒgt werden.
Wir haben GitLab CE als unser Code-Repository ausgewÀhlt, nicht zuletzt wegen seiner integrierten CI/CD-Module.
Tresor der Geheimnisse â Hashicorp Vault, inkl. fĂŒr die tolle API.
Testkonfigurationen und ansible Rollen â Molecule+Testinfra. Tests gehen viel schneller, wenn Sie eine Verbindung zu Ansible Mitogen herstellen. Gleichzeitig haben wir begonnen, unsere eigene CMDB und unseren eigenen Orchestrator fĂŒr die automatische Bereitstellung zu schreiben (im Bild oben Cobbler), aber das ist eine ganz andere Geschichte, die mein Kollege und Hauptentwickler dieser Systeme in Zukunft erzĂ€hlen wird.
Unsere Wahl:
MolekĂŒl + Testinfra
Ansible + Tower + AWX
World of Servers + DITNET (Eigenentwicklung)
Cobbler
Gitlab + GitLab-LĂ€ufer
Hashicorp-Tresor

Ăbrigens zu ansiblen Rollen. Zuerst gab es nur eine, aber nach mehreren Umgestaltungen waren es 17. Ich empfehle dringend, den Monolithen in idempotente Rollen aufzuteilen, die dann separat gestartet werden können; zusĂ€tzlich können Sie Tags hinzufĂŒgen. Wir haben die Rollen nach FunktionalitĂ€t aufgeteilt â Netzwerk, Protokollierung, Pakete, Hardware, MolekĂŒl usw. Im Allgemeinen folgten wir der unten aufgefĂŒhrten Strategie. Ich behaupte nicht, dass dies die einzige Wahrheit ist, aber es hat bei uns funktioniert.
- Server vom âgoldenen Imageâ zu kopieren ist böse!Der Hauptnachteil besteht darin, dass Sie nicht genau wissen, in welchem ââZustand sich die Bilder gerade befinden, und dass alle Ănderungen fĂŒr alle Bilder in allen Virtualisierungsfarmen gelten.
- Verwenden Sie auf ein Minimum Standardkonfigurationsdateien und vereinbaren Sie mit anderen Abteilungen, dass Sie fĂŒr die Hauptsystemdateien verantwortlich sindzum Beispiel:
- Lassen Sie /etc/sysctl.conf leer, die Einstellungen sollten sich nur in /etc/sysctl.d/ befinden. Ihr Standardwert in einer Datei, benutzerdefiniert fĂŒr die Anwendung in einer anderen.
- Verwenden Sie Override-Dateien, um Systemd-Einheiten zu bearbeiten.
- Erstellen Sie Vorlagen fĂŒr alle Konfigurationen und beziehen Sie sie vollstĂ€ndig ein; wenn möglich, kein Sed oder dessen Analoga in Playbooks
- Refactoring des Codes des Konfigurationsmanagementsystems:
- Teilen Sie Aufgaben in logische Einheiten auf und schreiben Sie den Monolithen in Rollen um
- Verwenden Sie Linters! Ansible-lint, yaml-lint usw
- Ăndern Sie Ihren Ansatz! Kein Bashable. Es ist notwendig, den Zustand des Systems zu beschreiben
- FĂŒr alle Ansible-Rollen mĂŒssen Sie einmal tĂ€glich Tests in MolekĂŒlen schreiben und Berichte erstellen.
- In unserem Fall wurden nach der Vorbereitung der Tests (von denen es mehr als 100 gibt) etwa 70000 Fehler gefunden. Es dauerte mehrere Monate, das Problem zu beheben.

Unsere Umsetzung
Die Ansible-Rollen waren also fertig, wurden mit Vorlagen erstellt und von Linters ĂŒberprĂŒft. Und sogar Idioten werden ĂŒberall groĂgezogen. Die Frage der zuverlĂ€ssigen Codebereitstellung an verschiedene Segmente blieb jedoch offen. Wir haben uns fĂŒr die Synchronisierung mit Skripten entschieden. Sieht so aus:

Nachdem die Ănderung eintrifft, wird CI gestartet, ein Testserver erstellt, Rollen ausgerollt und vom MolekĂŒl getestet. Wenn alles in Ordnung ist, geht der Code an den prod-Zweig. Wir wenden jedoch keinen neuen Code auf vorhandene Server in der Maschine an. Dabei handelt es sich um eine Art Stopper, der fĂŒr eine hohe VerfĂŒgbarkeit unserer Systeme notwendig ist. Und wenn die Infrastruktur riesig wird, kommt das Gesetz der groĂen Zahlen ins Spiel â selbst wenn man sicher ist, dass die VerĂ€nderung harmlos ist, kann sie schlimme Folgen haben.
Es gibt auch viele Möglichkeiten, Server zu erstellen. Am Ende haben wir uns fĂŒr benutzerdefinierte Python-Skripte entschieden. Und fĂŒr CI ansible:
- name: create1.yml - Create a VM from a template
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 ist es, was wir erreicht haben, das System lebt und entwickelt sich weiter.
- 17 Ansible-Rollen zum Einrichten des Servers. Jede der Rollen ist darauf ausgelegt, eine separate logische Aufgabe zu lösen (Protokollierung, Auditierung, Benutzerautorisierung, Ăberwachung usw.).
- Rollentest. MolekĂŒl + TestInfra.
- Eigene Entwicklung: CMDB + Orchestrator.
- Die Servererstellungszeit betrÀgt ca. 30 Minuten, ist automatisiert und praktisch unabhÀngig von der Aufgabenwarteschlange.
- Der gleiche Zustand/die gleiche Benennung der Infrastruktur in allen Segmenten â Playbooks, Repositories, Virtualisierungselemente.
- TĂ€gliche ĂberprĂŒfung des Serverstatus mit Erstellung von Berichten ĂŒber Abweichungen vom Standard.
Ich hoffe, dass meine Geschichte denjenigen nĂŒtzlich sein wird, die am Anfang ihrer Reise stehen. Welchen Automatisierungsstack verwenden Sie?
Source: habr.com

