Einweg-VM zur Runtime erstellen

Puppet Support im Vagrant-Binding

Neben der Basiskonfiguration verfügt das API über Puppet Support. So kann eine Puppet-Konfiguration ebenfalls über Builderklassen realisiert werden. Die Konfiguration einer VM, die ein Puppet-Skript nutzt, sieht wie folgt aus:

PuppetProvisionerConfig puppetConfig = PuppetProvisionerConfigBuilder.create().withManifestFile("myPuppetManifest.pp").withManifestPath("manifests").build();
VagrantVmConfig vmConfig = VagrantVmConfigBuilder.create().withLucid32Box().withName("demoVm").withPuppetProvisionerConfig(puppetConfig).build();
VagrantEnvironmentConfig environmentConfig = VagrantEnvironmentConfigBuilder.create().withVagrantVmConfig(vmConfig).build();

VagrantEnvironment vagrantEnvironmet = new Vagrant().createEnvironment(new File("my/Vagrant/path"), environmentConfig);

vagrantEnvironmet.up();
vagrantEnvironmet.destroy();

Der Code setzt momentan allerdings voraus, dass die Puppet-Dateien bereits im Vagrant-Ordner („my/Vagrant/path“) vorhanden sind. Da dies eher selten der Fall sein wird, bietet das Vagrant-Binding zusätzlich die Möglichkeit, beliebige Dateien bei der Erstellung in den Vagrant-Ordner zu kopieren. Hierbei kann man mit VagrantFileTemplateConfiguration eine einzelne Datei und mit VagrantFolderTemplateConfiguration auch einen kompletten Ordner kopieren. Das obige Beispiel lässt sich so einfach erweitern, um das benötigte Puppet-Manifest zur Laufzeit in den Vagrant-Ordner zu kopieren:

PuppetProvisionerConfig puppetConfig = PuppetProvisionerConfigBuilder.create().withManifestFile("myPuppetManifest.pp").withManifestPath("manifests").build();
VagrantFileTemplateConfiguration fileConfig = VagrantFileTemplateConfigurationBuilder.create().withUrlTemplate(new URL("http://localServer/puppet/myPuppetManifest.pp")).withPathInVagrantFolder("manifests/myPuppetManifest.pp").build();

VagrantVmConfig vmConfig = VagrantVmConfigBuilder.create().withLucid32Box().withName("demoVm").withPuppetProvisionerConfig(puppetConfig).build();
VagrantEnvironmentConfig environmentConfig = VagrantEnvironmentConfigBuilder.create().withVagrantVmConfig(vmConfig).build();

VagrantEnvironment vagrantEnvironmet = new Vagrant().createEnvironment(new File("my/Vagrant/path"), environmentConfig, Collections.singleton(fileConfig));

vagrantEnvironmet.up();
vagrantEnvironmet.destroy();

Will man vorgefertigte Puppet-Module im Vagrant-Binding nutzen, kann man zusätzlich einfach den Modul-Ordner innerhalb des Vagrant-Ordners konfigurieren:

PuppetProvisionerConfig puppetConfig = PuppetProvisionerConfigBuilder.create().withManifestFile("myPuppetManifest.pp").withManifestPath("puppet/manifests").withModulesPath("puppet/modules").build();

Fertige Module können dann mit Hilfe der „VagrantFolderTemplateConfiguration“ einfach vom lokalen Dateisystem ins Vagrant Directory kopiert werden.

VagrantFolderTemplateConfiguration folderConfig = VagrantFolderTemplateConfigurationBuilder.create().withLocalFolder("/path/to/my/modules/moduleA").withPathInVagrantFolder("puppet/modules/moduleA").build();

Aktuell befindet sich in einem extra Repository auch eine Webservice-Anbindung an das Puppet Forge Repository in Arbeit. Hierdurch kann man Module des Repositories direkt lokal deployen. Bis dieses API fest ins Vagrant-Binding eingebunden wird, muss man allerdings noch einen kleinen Umweg über einen Temp-Folder gehen:

File tempFolder = .
PuppetForgeClient forgeClient = new PuppetForgeClient();
PuppetForgeModule module = forgeClient.findModule("puppetlabs", "mongodb");
forgeClient.installToModulesDir(tempFolder, module);
VagrantFolderTemplateConfiguration folderConfig = VagrantFolderTemplateConfigurationBuilder.create().withLocalFolder(tempFolder).withPathInVagrantFolder("puppet/modules").build();

Wie man im Beispiel sehen kann, wird jedes Puppet-Modul durch zwei Strings definiert. Hierbei steht der erste immer für den Hersteller des Moduls und der zweite für den Modulnamen. Diese kann man auch direkt in Puppet Forge nachschlagen.

Durch das API ist es zusätzlich möglich das Repository nach Modulen zu durchsuchen:

List allDescriptions = client.findModules("mongodb");

Die genaue Nutzung der Module und deren Einbindung und Konfigurationsmöglichkeiten im eigenen Manifest muss unter der jeweiligen Dokumentation des Moduls auf der Puppet-Forge-Webseite nachgelesene werden.

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.