Archiv der Kategorie: PowerShell Core

PowerShell unter Linux installieren – bei einem traditionellen Provider als Alternative zu einer Azure-VM

Die PowerShell unter Linux zu installieren macht inzwischen richtig Spaß und setzt dank einer nahezu idiotensicheren Anleitung für die wichtigsten Linux-Disributionen unter https://github.com/PowerShell/PowerShell auch keinerlei Linux- oder Bash-Kenntnisse voraus. Ein wenig PowerShell-Kenntnisse genügen;)

Auch wenn es naheliegend ist, die Linux VM unter Azure anzulegen, diese Variante besitzt einen Nachteil, der sich mal mehr oder weniger auswirkt: Azure ist aus meiner Sicht relativ teuer. Eine einfache Linux-VM mit 2 Core CPU und 3.5 GB RAM kostet ca. 50€ pro Monat. Natürlich gibt es preiswertere Varianten, aber das Arbeiten soll ja auch etwas Spaß machen. Deutlich preiswerter sind die meisten traditionellen Provider. Hier gibt es eine virtuellen Linux-Server mit vollen Root-Rechten ab 9.99€ (etwa bei Host Europe, bei dem ich z.B. diesen Blog hoste).

Wer jahrelang den Komfort von Azure gewöhnt war, muss bei einem traditionellen Provider erst einmal umdenken. Man bestellt den Server, bekommt kurz danach die Auftragsbestätigung, muss dann einen Auftrag zur Startkonfiguration starten und bekommen dann etwas später die Zugangsdaten (eine gewisse Überraschung war es, dass es aufgrund interner Hardwareprobleme ein paar Tage gedauert hat – dies ist zwar die absolute Ausnahme, kann aber offenbar passieren).

Sobald man die Zugangsdaten in Gestalt einer IP-Adresse und einem generierten Kennwort für das root-Konto erhalten hat, geht es genauso weiter wie bei einer Azure-VM. Als SSH-Client verwende ich seit kurzem das hervorragende MobaXTerm (https://mobaxterm.mobatek.net).

Eine Besonderheit ist noch erwähnenswert: Auf einem nackten Linux-System fehlt am Anfang einiges, u.a. auch curl und das Package für den Download via HTTPS. Beide Packages müssen per apt-get install nachinstalliert werden:

Anschließend wird die PowerShell nach Anleitung installiert. Der Programmname lautet neuerdings pwsh und nicht mehr „powershell“.

Aktuell (Stand: November 2017) ist immer noch die Beta-9. Ich bin gespannt, ob die Version 1.0, wie es auf der PowerShell-Konferenz in Hannover im Mai angedeutet wurde, tatsächlich noch in diesem Jahr kommt.

PowerShell Core in einer Asp.Net Core-Anwendung hosten – die ersten Schritte

Gleich vorweg: Dies ist noch kein vollständiger Blog-Eintrag, es sind vielmehr nur mehr oder weniger zusammenhanglose Notizen, die allen weiterhelfen sollen, die an einem ähnlichen Projekt arbeiten und mir als eine Art „Notizzettel“ dienen sollen.

*** Letzte Aktualisierung: 11/11/2017 ***

Ich will in den nächsten Wochen ein umfangreicheres PowerShell-Skript über einen Websevice anbieten. Technisch ist das sehr einfach, wenn das Projekt auf ASP.NET basiert. Ich möchte das Projekt aber nur unter Asp.Net Core umsetzen, damit es theoretisch auch in einem Container unter Linux laufen kann. Warum nicht, auch wenn es für das Projekt im Moment keine konkreten Vorteile bietet?

Die Herausforderung besteht darin, dass PowerShell Core noch nicht immer nicht offiziell ist und es daher noch keine offiziellen Packages gibt. Ein Pendant zu System.Management.Automation ist das PowerShell Core SDK.

Einen guten Einstieg in die etwas komplizierte Thematik gibt der folgende Artikel:

https://github.com/PowerShell/PowerShell/tree/master/docs/host-powershell#net-core-sample-application

Im Folgenden beschreibe ich die Umsetzung des Projekts.

Ausgangspunkt ist ein leeres Verzeichnis. Vorausgesetzt werden VisuaL Studio Code (mit Visual Studio 2017 Community Edition ginge es zwar leichter, aber es soll ja nicht zu leicht sein) und die neueste Version des .NET Core SDKs, z.B. 2.02.

Die Downloaadresse ist https://www.microsoft.com/net/learn/get-started/windows

Schritt 1: Anlegen eines ASP.NET Core-Projekts vom Typ WebApi

Schritt 2:: Hinzufügen des PowerShell Core SDK-Package

*** Fortsetzung folgt ***

Meine ersten Schritte mit Docker und wie man einen Linux-Admin von der PowerShell überzeugen kann (Teil 1)

Docker ist das Hype-Wort der Stunde. Zum allergrößten Teil steckt hinter Docker natürlich eine solide Technik und wenig Hype, aber wer die Ankündigungen der Hersteller, inklusive Microsoft, in den letzten 1-2 Jahren verfolgt hat, wird festgestellt haben, dass das Wort Container bzw. Docker als wichtigste Container-Technik Pflichtbestandteil von strategischen Ankündigungen geworden ist. Die IT-Branche braucht alle paar Jahren ihr „next bing thing“ und das ist auch ja grundsätzlich in Ordnung.

Docker ist eine Container-Technik. Eine Container ist eine virtuelle Umgebung, in der eine Anwendung alle für die Ausführung benötigten „Abhängigkeiten“ in Gestalt der entsprechenden Dateien inklusive Dateisystem und Netzwerkschnittstelle vorfindet. Im Unterschied zur Virtualisierung ist der Aufwand deutlich geringer, da alle Container unter einem bestimmten Betriebssystem ausführen – ein Container kann aber auch sein eigenes Betriebssystem mitbringen. Container bieten daher zahlreicher Vorteile für die Bereitstellung, von der vor allem Webanwendungen und generell Anwendungen ohne eigene Benutzeroberfläche profitieren. Sie benötigen weniger Arbeitsspeicher, weniger Festplattenspeicher, starten schneller als eine VM, sind offenbar deutlich besser skalierbar, können im Verbund (Stichwort: Kubernetes, das nächste Hype-Wort nach Container) eingesetzt, lassen sich schnell erstellen. Sozusagen eine Wegwerfverpackung für eine Anwendung.

Mit der PowerShell gibt es zunächst keine Berührungspunkte. PowerShell-Skripte sind bekanntlich keine Anwendungen, sie werden auf einfachste Weise bereitgestellt und es gibt nur selten Abhängigkeiten, die vor ihrer Ausführung aufgelöst werden müssten – Module und DSC-Ressourcen fallen mir natürlich ein. Die Ausführung eines Skripts in einem Container könnte daher eine Option sein, wenn mehrere Module verwendet oder eine Abhängigkeit zu einer bestimmten Version des .NET Framework oder in Zukunft auch .NET Core besteht. In diesem Fall gibt man einen Container weiter, aus dem das Skript gestartet wird.

Im Folgenden geht es um eine naheliegende Anwendung: Ich möchte die PowerShell unter Ububtu, Cent OS oder Suse ausprobieren, habe aber eine Lust für jedes OS eine VM einzurichten.

Die gute Nachricht ist, Microsoft bietet ein fertiges Image für einen Container an, in dem Ubuntu 16.04 und eine Beta der PowerShell 6.0 enthalten sind.

Wie das Ganze umgesetzt wird, ist auf der Projektseite der PowerShell Core beschrieben:

https://github.com/PowerShell/PowerShell/tree/master/docker

Die Umsetzung ist sehr einfach. Voraussetzung sind allerdings Windows 10 64 Bit bzw. Windows Server 2016, da sich Docker für Windows nur auf diesen Betriebssystemen installieren lässt.

Die Downloadadresse ist von Docker CE (Community Edition) ist:

https://store.docker.com/editions/community/docker-ce-desktop-windows

Eine weitere Einschränkung besteht darin, dass Docker auch unter Windows einen Linux-Kernel erfordert. Dieser wird bei Docker for Windows über eine Hyper V-VM zur Verfügung gestellt. Es muss daher möglich sein, Hyper V zu aktivieren. Wer bereits VMware Workstation verwendet, müsste VMware Workstation vorübergehend deinstallieren, damit Hyper V aktiviert werden kann.

Wurde Docker for Windows installiert, dauert es einen kurzen Augenblick ist der Dienst zur Verfügung steht. Anschließend steht das Docker-Befehlszeilentool zur Verfügung.

Der folgende Befehl lädt ein Docker-Image mit installierter PowerShell:

Tipp: Sollte es zwischendurch zu „Verbindungsproblemen“ kommen, die dazu führen, dass das Image nicht oder nur unvollständig geladen wird, die folgende kleine Änderung hat bei mir immer geholfen: Trage für den DNS-Server in der Netzwerkverbindung die Adresse 8.8.8.8 ein, der Google-DNS-Server bietet eine sehr schnelle Namensauflösung.

Etwas später startet die PowerShell Core unter Ubuntu in einem Container. Wie lässt sich das feststellen? Gar nicht, denn es ist ja gerade der Sinn und Zweck eines Containers, dass die Anwendung in ihrer vertrauten Umgebung ausführt.

PowerShell Core läuft unter Windows in einem Container mit Linux Ubuntu als OS

PowerShell Core läuft unter Windows in einem Container mit Linux Ubuntu als OS

Jetzt würde es mich doch interessieren, unter welcher Linux-Version die PowerShell ausführt. Als absoluter Linux-Noob fällt mir spontan keine Lösung ein. Unter Linux gibt es kein WMI, sonst wäre es sehr einfach, den Titel und die Version des OS per Win32_OperatingSystem abzufragen. Aber wozu gibt es das Internet? Eine kurze Recherche ergibt, dass man sich nur den Inhalt einer Datei ausgeben lassen muss:

Die Ausgabe besteht aus einer Reihe Zeilen, die alle gleich aufgebaut sind: Name = Wert. Für einen Linux-Admin ist das Zerlegen von Text mit Tools wie Awk und Sed sein tägliches Brot. Doch wenn selbst eine einfache Lösung aus zwei bis drei Zeilen Text besteht, der jede Menge „Spezialzeichen“ enthält, stellt sich die Frage, ob es nicht eine einfachere Lösung gibt. Die gibt es natürlich und besteht darin, den split-Operator im Rahmen einer ForEach-Wiederholung für jede Zeile auszuführen und das Ergebnis der besseren Weiterverarbeitbarkeit zu Liebe als Objekte auszugeben.

Der folgende PowerShell-Befehl macht genau das:

Oder

Ich bin mir sicher, dass Beispiele wie dieses auch bei Linux-Admins schnell ein gewisses Interesse an der PowerShell wecken dürften. Ob sie dabei in einem Container läuft oder nicht spielt dafür natürlich keine Rolle.

Der Inhalt einer Textdatei unter Linux per PowerShell in Objekte zerlegt

Der Inhalt einer Textdatei unter Linux per PowerShell in Objekte zerlegt