Ich versuche, ein System zu erstellen, das kurzlebige (CI- und Test-Builds) Softwarekomponenten ausführt. Es ist gemäß meinen Anforderungen obligatorisch, dass jedes auf einem privaten Host ausgeführt wird. Ich nehme an, dass diese Definition auch Paravirtualisierungsoptionen enthält , da es mir anscheinend viel Kopfschmerzen ersparen wird.
Ich arbeite an einem Mac, so dass so ziemlich jede Technologie aus ist, libvirt und quemu usw. einfach nicht für mich funktionieren. Ich plane jedoch die Bereitstellung in Debian. Alles, was unter Debian ausgeführt wird, ist wieder auf dem Tisch, vorausgesetzt, ich kann die Bereitstellung des Host-Computers sowie seiner Gastdomänen per Skript ausführen.
Mein beabsichtigtes Setup war, dass ich ein Debian-Installationsprogramm booten kann, dass etwas bedeuten sollte, dass die Maschine beim Booten automatisch bereitgestellt wird (Chef, Puppet, Babushka, eigentlich nichts) - und ein Teil dieser Bereitstellung sollte eine erstellen Template-Rootfs, die zum Booten eines Containers verwendet werden können. Der Container selbst muss ebenfalls bereitgestellt werden, damit er beim Hochfahren des Containers weiß, was zu tun ist, und kann die Arbeit erledigen und dann beenden.
Kurz gesagt, hier ist der Workflow, den ich brauche:
- Starten Sie eine Maschine (virtuell oder anderweitig) und halten Sie sie für die Arbeit bereit.
- Die Arbeit sollte von einem Skript ausgeführt werden, das von Chefkoch / Puppe / Babuschka / etc. Installiert wurde
- Wenn die Arbeit eingeht, sollte eine virtuelle Maschine gestartet werden, um die Arbeit zu erledigen.
- Die VM sollte die Arbeit erledigen, ihre Ressourcen beenden und an den übergeordneten / Host-Computer freigeben. (Es ist wichtig, dass dies auf mindestens Hunderten von Gast-VMs auf angemessener Hardware skaliert wird.)
Ich bin an einem Punkt angelangt, an dem ich Folgendes versucht und sie aus den unten aufgeführten Gründen aufgegeben habe:
Für den Hostcomputer
- Debian-Micro-ISO-Images vor dem Start mit Instalinux (LinuxCOE-unterstützt) ( Schlecht: Funktionierte überhaupt nicht ("Keine Kernelmodule gefunden") (da die Instalinux-Images nicht mit den FTP-Repositorys synchron sind, ist diese Lösung anscheinend notorisch fragil. Es lässt auch nicht viel Spielraum für die Nachinstallation und das Ablegen bekannter SSH-Schlüssel, Host-Schlüssel usw. auf dem Computer. Es scheint wie Feuer und Vergessen, am Ende hätte ich einen laufenden Computer, aber keinen Zugriff darauf .)
- Debian netinst ISO vor dem Start ( schlecht : dieselben Probleme wie oben, außer dass zumindest die Installation normalerweise abgeschlossen ist, da zwischen der ISO und dem FTP-Repository keine Kernelunterschiede bestehen . Nach der Installation immer noch begrenzter Spielraum. Gut : Absolut zuverlässig und wiederholbar, Einfach auf einen VM-Technologie-Stack auf einem Mac oder einer Bare-Metal-Maschine zu werfen, würde überall funktionieren, aber ich kann ihn nicht genug nachinstallieren.
- Verschiedene Methoden zum Erstellen eines Rootfs und zum Kompilieren als bootfähiges Festplatten-Image ( schlecht : Das Wenige, das ich zum Arbeiten bringen konnte, war höllisch zerbrechlich, schwer auf einem realen Computer zu installieren und ist ein komplexer Erstellungsprozess. Gut: Wenn Ich könnte es zum Laufen bringen, dies scheint den größten Spielraum für die Vorkonfiguration des Computers auf eine bestimmte Spezifikation mit SSH-Schlüsseln, Hostschlüsseln, Hostnamen, von Git installierter Software und was auch immer zu bieten, aber dann wäre die Frage, wie zu verpacken ist es für die Verteilung oder wie man seine Neuerstellung per Skript schreibt. )
Ich bin mir ehrlich gesagt nicht sicher, welche Technologie von Menschen erwartet wird, um eine VM von Null auf ein laufendes, funktionierendes und nützliches System zu bringen. Scheint mir drei Schritte zu sein: a) Betriebssystem, b) Systemkonfiguration (Benutzer usw.) und dann c) Dateisystemänderungen.
Für die (virtuellen) Gastmaschinen:
- Viele Dinge, meistens denke ich, dass die Antwort hier ein schreibgeschütztes Rootfs ist, das mit erstellt wurde
debootstrap
, und eine spezielle Partition im LXC-Container, die die für diese bestimmte Instanz auszuführenden Arbeiten enthält (ein Jobmanifest ). Fügen Sie alle üblichen Vorsichtsmaßnahmen zum Erstellen des Betriebssystems, Booten, Erstellen von Benutzern, Auschecken von Software von Git und Arbeiten ein.
Ich bin mir wirklich nicht sicher, nach welchen Tools ich greifen soll. Das Problem sollte wohl gut gelöst sein. Aber ich kann einfach nicht herausfinden, wo ich wirklich anfangen soll.
Die meisten Leute scheinen für den Host-Computer vorzuschlagen, dass ich eine Virtualisierungstechnologie auswählen, einen Computer in einem funktionierenden Zustand starten und dann einen Snapshot erstellen sollte (libvirt scheint der logische Favorit dafür zu sein). Verwenden des Snapshots, um nachfolgende Installationen zum Testen oder in der Produktion aufzurufen.
Für die Gastcomputer scheint lxc die einfachste Option zu sein, außer dass das Hinterlegen eines Containers und das spätere Herstellen einer Verbindung über die Konsole in allen vorhandenen Kerneln unterbrochen ist und die neueste Version von lxc, die für stabiles Debian verfügbar ist, älter als 18 Monate ist und es fehlen viele Funktionen, die weit verbreitet sind.
Normalerweise bin ich ein Anwendungsentwickler und arbeite nicht oft mit Technologie auf Serverebene (und ich bin sicher, dass SF diese Frage als "zu subjektiv" kennzeichnet), aber ich bin mir wirklich nicht sicher, nach welchen Tools ich greifen soll.
Das letzte Wort ist, dass ich ein ähnlich gestapeltes Projekt (travis-ci.org) kenne, das Vagrant-Boxen dafür verwendet. Das scheint ein ziemlich stumpfes Instrument zu sein, große, langsame, rubinrote Tools, die für die kleine Desktop-Bereitstellung von Test-VMs entwickelt wurden, die für kritische Service-Infrastrukturen verwendet werden, aber ich kenne auch einige dieser Typen und sie sind schlauer als ich. Vielleicht haben sie einfach aufgegeben.
Jede Hilfe geschätzt.