Import-Module und der „-Prefix“ Parameter

Eine Sache die ich aus der Aufzeichnung der Präsentation „How to Position Yourself for the Future“ mit Jeffrey Snover und Jason Helmick (genauer, der Frage- und Antwortrunde bei 1:01:17) entnommen habe: man kann einen Präfix für die Befehle eines Moduls beim Import angeben!

In der Frage- und Antwortrunde erwähnt ein Teilnehmer, dass ein PowerShell Modul (vermutlich PowerCLI von VMWare) andere Befehle „überschreibt“, da Funktionen/Cmdlets in dem Modul gleich benannt sind wie Cmdlets von PowerShell Core oder anderen Modulen.

Importiert man das PowerCLI Modul wird einem der Befehl Get-VM zur Verfügung gestellt, was eine gute Idee ist, wenn man virtuelle Maschinen auf vSphere verwalten möchte, aber heutzutage kann es durchaus sein, dass man auch noch einen Hyper-V Server verwalten möchte, welches auch das Cmdlet Get-VM hat; und das vom gleichen Computer (z.B. mittels RSAT). Nach dem Import des Moduls ist es aber nicht länger möglich die virtuellen Maschinen des Hyper-V Servers zu verwalten (mindestens Get-VM funktioniert nicht mehr) ohne das PowerCLI Modul aus der PowerShell Instanz wieder zu entfernen (oder man spezifiziert genau, dass man jetzt diesen Befehl aus dem Hyper-V Modul verwenden möchte).

Es ist nicht sehr wahrscheinlich dass VMWare ihre Befehle zeitnah ändern wird, damit es nicht andere Cmdlets/Funktionen überschreibt/kollidiert. Was also tun, wenn man beide Hypervisoren in einem Skript verwalten möchte?

Man kann das Modul, das dafür sorgt, dass der Code nicht korrekt funktioniert mit dem Parameter -Prefix laden.

Schauen wir uns an wie das funktioniert. Zu Demo-Zwecken werde ich das BitsTransfer Modul verwenden.

Wenn man das Modul „wie gewohnt“ importiert und sich die verfügbaren Befehle anzeigen lässt bekommt man was man erwartet.

Import-Module und der "-Prefix" Parameter

Aber importiert man das Modul mit einem Präfix wird dieser vor jedem einzelnen Befehl (nach dem Verb-) des Moduls eingefügt.

Import-Module und der "-Prefix" Parameter

Ein sehr cooles Feature das ich bis jetzt noch nicht kannte.

ConvertTo-Influxdb.ps1

Als ich meine Daten von zwei Influx Datenbanken in eine zusammenführen wollte, war ich überrascht, dass man nicht beides (Export und Import) mit dem CLI influx direkt machen kann.

Influx Measurement exportieren

Um die Daten aus einer Influx Datenbank auszulesen nimmt man folgenden Befehl:
influx -database home -format csv -execute "select * from temperature" > /tmp/temperature.csv
Es wird hier aus der Datenbank home das Measurement temperature in eine CSV-Datei gespeichert.

Import fehlgeschlagen

Der Versuch diese zu importieren scheitert jedoch:
influx -database private -format csv -path /tmp/temperature.csv -import
2018/02/17 12:33:03 error writing batch: {"error":"unable to parse '
...
ERROR: 11397 points were not inserted

Ich habe mir nur kurz die Parameter angesehen und daraus geschlossen, dass es sinnvoll wäre, wenn man die Daten so einlesen könnte. Wie naiv von mir!

Formatierung für den Import

Die Daten müssen für den Import wie bei einem Insert aufgebaut sein; also in meinem Beispiel:
temperature,sensor=livingroom temperature=21
Man muss also die Daten vom CSV-Format in dieses überführen …

Alternative Skripte

Auf github fand ich mehrere Skripte die CSV-Dateien nach Influx konvertieren (oder direkt importieren) diese waren aber alle in Programmiersprachen die nicht installiert waren und vor allem in Programmiersprachen die ich (noch) nicht kann. Ein Bash-Skript hätte ich liebend gerne genommen, das habe ich aber nicht gefunden. Und Bash-Skripte schreiben macht mir keinen Spass, deshalb hab‘ ich mich daran gemacht das PowerShell-Skript ConvertTo-Influxdb zu schreiben.

ConvertTo-Influx ausführen

Eine CSV-Datei kann mit dem Skript wie folgt in eine Datei überführt werden, die man direkt mit dem influx CLI importieren kann.
ConvertTo-Influx.ps1 -Path /tmp/temperature.csv -Database private > /tmp/temperature.influx

Daten in Influx Datenbank einlesen

Die konvertierten Daten importiert man mit folgendem Befehl:
influx -path /tmp/temperature.influx -import

MediaWiki Update Skript „mediawiki-updater“

Weil mich in erster Linie jede sich wiederholende Aufgabe anödet (mein Leitsatz ist: „Wenn du etwas zwei Mal tun musst, automatisiere es. Die Wahrscheinlichkeit dass du es erneut tun musst steigt mit jedem weiteren Mal.“) habe ich die sich in regelmäßigen Abstand wiederholende Aufgabe „MediaWiki aktualisieren“ in ein zwei Skripte gepackt.

Da ich Installationen sowohl auf Linux als auch auf Windows betreue wurden es ein Bash- und ein PowerShell-Skript.

Die Dateien (und Voraussetzungen) findet ihr in folgendem Repo:

https://github.com/gpunktschmitz/mediawiki-updater

Hier kurz was die Skripte tuen:
1. Prüfen ob eine neue Version verfügbar ist
2. MySQL Datenbank sichern
3. Backup (Kopie) der derzeitigen Installation anlegen
4. neue MediaWiki Version herunterladen
5. neue MediaWiki Version in temporäres Verzeichnis extrahieren
6. vorhandene Installation (Dateien) mit neuer Version überschreiben
7. Löschen des Verzeichnisses „vendor“
8. mittels Git neue externe Bibliotheken in das Verzeichnis „vendor“ klonen
9. alte Backups löschen (die letzten 3 werden beibehalten)
10. das Skript „maintenance/update.php“ ausführen

Beim Erstellen hatte ich auch im Hinterkopf das Skript im Cron/eine geplante Aufgabe zu packen. Dahingehend habe ich es aber noch nicht ausgelegt – meine Installationen habe ich durch manuelles Ausführen der Skripte erfolgreich von 1.28.2 auf 1.29.0 gebracht.

Hoffe die Skripte helfen auch dir diese Aufgabe zu automatisieren.