
Dies ist die Textversion der Performance 2018-04-25 bei der Saint-Petersburg Linux User Group . Beispielcode hier: https://github.com/ultral/ansible-role-testing
Ich glaube, dass Sie Konfigurationsmanagement verwenden, nicht Bash . Das heißt, Ihre Konfiguration ist Code. Wenn wir sagen, dass Infrastruktur Code ist, sollte bei ihrer Erstellung dieselbe Philosophie angewendet werden wie bei der Softwareentwicklung. Hast du darüber nachgedacht? Wie machst du das Und andere?
Voraussetzungen
Im beschriebenen Fall gab es viele einleitende:
- Viele ansible Rollen.
- Hyper-V als primärer Hypervisor.
- Private Cloud mit eingeschränkten Funktionen zum Erstellen virtueller Maschinen im laufenden Betrieb.
- Proxy für den Zugang zum Internet.
- Die Unfähigkeit, Tests von ansiblen Rollen in Docker auszuführen, da die Rolle die Konfiguration der gesamten VM ist, einschließlich beispielsweise der Netzwerkeinstellungen.
- Sie möchten die Richtlinie des grünen Assistenten für ein Repository mit ansiblen Rollen verwenden.
Bevor wir das tun, was wir tun, vergleichen wir vorhandene Lösungen.
Projekt | Küche testen | Molekül | Eigen |
---|
Sprache | Rubin | Python | Bash / Rubin |
Beobachter | 132 | 126 | 0 |
Sterne | 1413 | 1154 | 1 |
Gabeln | 502 | 174 | 2 |
Lizenz | Apache 2.0 | MIT | Beliebig |
Commits | 1929 | 1264 | 0 |
Veröffentlichungen | 101 | 121 | 0 |
Mitwirkende | 109 | 82 | 5 |
Wir haben beschlossen, das Rad nicht neu zu erfinden und eine schlüsselfertige Lösung zu finden. Unser Infrastruktur-Team kennt sich mit Ruby aus, daher wurde Test Kitchen & Inspec ausgewählt
Küche-ci

Die Idee ist hässlich einfach. Wir erstellen eine neue virtuelle Maschine, verwenden die Rolle und führen einen Rauchtest durch.
Grüne Baupolitik

Aber wir beschlossen, weiterzumachen. Verwenden Sie einen Github-Fluss, d.h. Rollen in einzelnen Brunchs und nach der Überprüfung von Merjim im Master. Wenn die Tests in Ordnung sind, rollen wir die Rollen auf die Infrastruktur.
Verschachtelte Virtualisierung
Wie Sie sich erinnern, hatten wir Einschränkungen bei der Erstellung virtueller Maschinen, sodass wir eine unangenehme Entscheidung in Form einer verschachtelten Virtualisierung treffen mussten.

Zunächst haben wir versucht, Virtualbox x32 nicht mit verschachtelter Unterstützung zu versehen. Dies stellte sich aufgrund der Stabilität der Kernel-Panik als nicht sehr ideell heraus. Der zweite wichtige Faktor ist, dass wir auf x86_64 sitzen, also wurde die Forschung fortgesetzt (hi libvirt), entschied sich jedoch für virtualbox, wie es auf unterstützten Betriebssystemen häufiger vorkommt.
Schwierigkeiten
Während des Starts war alles gut.
Überspringen Sie die Proxy-Einstellungen vom Host zum Gast
In einigen Testszenarien wurden Proxy-Einstellungen verwendet, während auf dem Host mit Testkitchen ein transparenter Proxy verwendet wurde und der Ansible-Bonus keine zusätzlichen Variablen mit leeren Werten akzeptierte.
Lösung: kitschig - erstellen Sie eine ERB-Vorlage.
<%= ENV['http_proxy'].to_s.empty? ? 'http://proxy.example.com:3128' : ENV['http_proxy'] %>
Verwaltung der Netzwerkeinstellungen über ansible
In einigen Rollen wurde das Netzwerk konfiguriert, in Tests sah es folgendermaßen aus:
- Wir konfigurieren das Netzwerk durch Kopieren der Datei.
- Wenden Sie die Netzwerkeinstellungen an.
- Alles ist schlecht.
Lösung: Fügen Sie der virtuellen Maschine eine Schnittstelle hinzu
Wenn der Testsatz "_" enthält, fällt alles
Virtualbox kann "_" nicht im Namen der virtuellen Maschine verwenden. Und die virtuelle Maschine verwendete den Namen des Skripts.
Lösung: Benennen Sie die Testsätze "vm_" => "vm-" um
Testfälle mit der Installation von Oracle ohne "." am Ende des Namens der virtuellen Maschine fallen
Die Rolle wurde in einem bedingten Verkauf verwendet, als sie beschlossen, sie mit Tests abzudecken. Wenn Sie es in eine vorbereitete VM rollen, erfüllt es die Rolle, es fällt durch die Testküche.
Kleiner Hinweis
[root@vm-oracle vagrant]# getent ahosts vm-oracle 127.0.0.1 STREAM vm-oracle 127.0.0.1 DGRAM 127.0.0.1 RAW [root@vm-oracle vagrant]# getent ahosts vm-oracle. fe80::a00:27ff:febd:bd6a STREAM vm-oracle fe80::a00:27ff:febd:bd6a DGRAM fe80::a00:27ff:febd:bd6a RAW 10.0.2.15 STREAM 10.0.2.15 DGRAM 10.0.2.15 RAW [root@oracle vagrant]# getent ahosts oracle.example.com. 192.168.128.182 STREAM oracle.example.local 192.168.128.182 DGRAM 192.168.128.182 RAW
Irgendeine Idee, was los ist?
Es war ein lustiges Szenario:
- Wir haben die IPv4-Bindung nur in den Oracle Listener-Einstellungen aktiviert.
- Orakel verwendet den FQDN.
- Linux enthält eine spezielle Basis "myhostname" zum Auflösen von Domainnamen, die nach / etc / hosts & dns Servern verwendet wurde.
- Vagrant erstellt VM & Updates
/etc/hosts
.
Ich werde ein wenig erklären:
Was passiert bei vm-oracle ?
- Vagrant erstellt eine virtuelle Maschine.
- vagabundierende Updates
/etc/hosts
( vm-oracle x2) - Oracle Listener hört IPv4.
- Oracle Listener löst den VM-Oracle- Domänennamen auf . & bekommt IPv6.
- FEHLGESCHLAGEN
Was passiert bei vm-oracle? ?
- Vagrant erstellt eine virtuelle Maschine.
- vagabundierende Updates / etc / hosts ( vm-oracle & vm-oracle. ).
- Oracle Listener hört IPv4.
- Oracle Listener löst den VM-Oracle- Domänennamen auf . & bekommt IPv4
- Ok
OOM kommt uns besuchen
OOM hat virtuelle Maschinen zufällig getötet. Gleichzeitig gab Testkitchen alle möglichen seltsamen Nachrichten in seine Protokolle.
Lösung: Erhöhen Sie den Speicherplatz.
Langsame Builds
Dieses ganze Schema arbeitete langsam, zehn Minuten lang, manchmal länger als eine Stunde.
Lösungen:
- Packer . Stellen Sie Images der virtuellen Maschine vorab zusammen.
- Führen Sie mehrere Testfälle gleichzeitig aus
Fazit
Wenn wir sagen, dass Infrastruktur Code ist, sollte bei ihrer Erstellung dieselbe Philosophie angewendet werden wie bei der Softwareentwicklung. Einerseits haben wir eine funktionierende Lösung, aber es gibt einige unangenehme Momente:
- Nicht freundlich, es sieht alles so aus.
- Eine Mischung aus Rubin und Python.
- Es gibt keine Prüfungen und Rollenrollen.
- Es funktioniert langsam.
- Schwierig ....
Am Ausgang sieht das Molekül mit Docker interessant und nativer aus. Wir denken darüber nach.
Referenzen