Träumen YML-Programmierer von ansiblen Tests?

Küchen-CI-Schema


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.


ProjektKüche testenMolekülEigen
SpracheRubinPythonBash / Rubin
Beobachter1321260
Sterne141311541
Gabeln5021742
LizenzApache 2.0MITBeliebig
Commits192912640
Veröffentlichungen1011210
Mitwirkende109825

NametestinfraServerspezinspecGoss
Githubphilpep / testinframizzy / serverspeckoch / inspecaelsabbahy / goss
SprachePythonRubinRubingeh
Beobachter9314516567
Sterne997210511672170
Gabeln138361330156
LizenzApache 2.0MITApache 2.0Apache 2.0
Commits38018544609309
Veröffentlichungen3528234647
Mitwirkende4311015931

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


Küchen-CI-Schema


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


Grüne Baupolitik


Grünes Build-Richtlinienschema


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.


wir müssen tiefer gehen


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:


  1. Wir haben die IPv4-Bindung nur in den Oracle Listener-Einstellungen aktiviert.
  2. Orakel verwendet den FQDN.
  3. Linux enthält eine spezielle Basis "myhostname" zum Auflösen von Domainnamen, die nach / etc / hosts & dns Servern verwendet wurde.
  4. Vagrant erstellt VM & Updates /etc/hosts .

Ich werde ein wenig erklären:
Was passiert bei vm-oracle ?


  1. Vagrant erstellt eine virtuelle Maschine.
  2. vagabundierende Updates /etc/hosts ( vm-oracle x2)
  3. Oracle Listener hört IPv4.
  4. Oracle Listener löst den VM-Oracle- Domänennamen auf . & bekommt IPv6.
  5. FEHLGESCHLAGEN

Was passiert bei vm-oracle? ?


  1. Vagrant erstellt eine virtuelle Maschine.
  2. vagabundierende Updates / etc / hosts ( vm-oracle & vm-oracle. ).
  3. Oracle Listener hört IPv4.
  4. Oracle Listener löst den VM-Oracle- Domänennamen auf . & bekommt IPv4
  5. 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


Source: https://habr.com/ru/post/de437004/


All Articles