Einige werden schon lange darauf gewartet haben, andere kennen vielleicht immer noch nicht Winget aber...

ich habe es veröffentlicht: Ein Modul, mit welchen es möglich ist mit Puppet und Winget Software zu installieren. Wer mehr über Puppet wissen möchte, den möchte ich auf den letzten Artikel verweisen: Puppet Server unter Windows betreiben

Einige Worte zum Modul

Dieses Projekt war nicht einfach für mich: Ich musste zuallererst die Programmiersprache Ruby lernen, und Ruby macht vieles anders als andere Sprachen. Und ja, ich bin der Meinung Python ist die bessere Sprache. Das könnt Ihr aber gerne unten in den Kommentaren ausdiskutieren. 

Puppet selber erfordert eine steile Lernkurve, aber Module für Puppet zu schreiben, ist nochmal ein ganz anderes Level. Die Dokumentation geht an den meisten Stellen nicht sehr ins Detail, und man muss vieles einfach ausprobieren. Ich konnte Puppet mit Ruby nicht zufriedenstellend in einer IDE ans laufen bringen, was die Fehlersuche auch nicht einfacher macht. Ich habe mir folgendes Buch besorgt, welches mir eine Referenz zu diesem Thema zu sein scheint: Puppet Types and Providers.

Dieses Buch ist sehr effektiv: es geht auf das nötigste ein (und ja einige Details fallen unter den Tisch), aber es verschafft einen schnellen Überblick über den Aufbau und die Funktionsweise von Puppet-Modulen (soweit es Typen und Provider angeht). 

Das Modul ist Open Source, und steht unter Apache 2 Lizenz. Ihr könnt den Code auf meinen GutHub-Account hier einsehen: https://github.com/VoSs2o0o/WinGetPgk

Den Downloadlink findet Ihr bei Puppetforge selber: https://forge.puppet.com/modules/voss2000/wingetpkg/readme

Ihr könnt ganz Oldschool, in der DropDown Box oben auf der Seite den direkten Download auswählen, den RK10 Manager verwenden, oder folgende Kommandozeile verwenden:

puppet module install voss2000-wingetpkg --version 1.0.1

 

Pfad einer modernen App ermitteln (z.B.: Winget)

Eine spezielle Sache möchte ich hier noch erwähnen, da es mich auch einiges an Recherche gekostet hat: Wie bekomme ich den Winget-Pfad, und ebenso wichtig, wie kann ich diesen in einem Puppetmodul verwenden? 

Die "modernen" Windows-Apps sind im speziellen Verzeichnis "<ProgramFiles>\WindowsApps\" gespeichert. Innerhalb des Verzeichnisses, gibt es nun mehrere Unterverzeichnisse, die mit "strong Names" bezeichnet sind. Diese Namen muss man erst erstellen, und bestehen aus Firma, Produktname, Plattform, Versionsnr, Sprache, einer Versionsnummer und einer ID. Bei meinem Rechner lautet dieser Pfad z.B.:

c:\Program Files\WindowsApps\Microsoft.DesktopAppInstaller_1.20.1361.0_x64__8wekyb3d8bbwe\

Man sieht hier, dass das Produkt mal "Desktop App Installer" hieß, die Versionsnr "1.20.1361.0" angegeben ist, es handelt sich um die 64 bBit Version. Die ID lautet "8wekyb3d8bbwe". Der Pfad selber ist erstmal für einen außenstehenden nicht zu ermitteln, aber Microsoft muss ja auch irgrendwie wissen, wo das Programm hingepackt wurde. 

Der "normale" Weg geht über das Verzeichnis: "<USERPROFILE>\AppData\Local\Microsoft\WindowsApps\", dort sind Links zu den Apps gespeichert. Aber erstmal ist der Pfad benutzerabhängig, möglicherweise gibt es den nicht beim Installationsbenutzer. Und auch für Puppet gibts hier ein Problem: Der löst keine Links auf, somit kann das Programm so nicht ausgeführt werden. Aber in der Regel ist das der "gute" Weg, da das Programm sich so im "Pfad" befindet, und von überall mit dem Namen erreicht werden kann.

Der andere Weg geht über die Registry: Unter "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinGet.exe" ist ebenfalls der Pfad gespeichert. Nun musste ich aber feststellen, das einige Rechner (mit Windows 11) diesen Pfad nicht kennen, hier muss man ebenfalls benutzerabhängig unter: "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinGet.exe" schauen.

Puppet alternative zu "Commands"

Normalerweise pflegt man über die Commands - Property einen Hash:

commands :wget => 'winget'

Das Programm führt man dann so aus:

wget('install', package_name)

sieht praktisch aus, aber war in meinem Falle eher umständlich. Ich habe mich deshalb für folgenden weniger gebräuchlichen Weg entschieden:

Ich inkludiere "execution", und verwende meine eigene Routine:

require 'puppet/util/execution'

....

  def self._wgetexec(*args)
    cmd = [self._winget_path] + args
    output = execute(cmd)

    output = output.force_encoding('UTF-8')
  end

self._winget_path, habe ich mal nicht abgebildet, da ist nichts interessantes drin.  Außerdem könnt Ihr das ja selbst im Repo nachschlagen.

ich hoffe es war mal wieder was interessantes dabei,

euer VoSs2o0o

Download: https://forge.puppet.com/modules/voss2000/wingetpkg/readme

 


Keine Kommentare zu “Winget Modul für Puppet”

Kommentar hinterlassen

Als Antwort auf Some User