Methode zur Integration von Powershell-Skripten in Nicht-Windows-Workflows?


16

Ich liebe den Geruch von neuen Maschinen am Morgen.

Ich automatisiere einen Workflow für die Erstellung von Maschinen, der mehrere separate Systeme in meiner Infrastruktur umfasst, von denen einige 15 Jahre alte Perl-Skripts auf Solaris-Hosts, PXE-Boot-Linux-Systemen und Powershell unter Windows Server 2008 umfassen.

Ich kann die einzelnen Teile einzeln skripten, und die Integration der Linux- und Unix-Automatisierung ist recht einfach, aber ich bin nicht sicher, wie ich die Powershell-Skripte zuverlässig mit den übrigen Prozessen verbinden kann.

Ich würde es vorziehen, wenn der Prozess auf einem Linux-Host beginnen würde, da ich mir vorstelle, dass er als Webanwendung auf einem Apache-Server enden wird, aber wenn er unter Windows beginnen muss, bin ich damit nur zögernd einverstanden.

Ich möchte im Idealfall, dass etwas in der Art von psexec für Linux gegen Windows läuft, aber die Antwort in diese Richtung scheint Cygwin zu sein , und so sehr ich die harte Arbeit schätze, die sie leisten, hat es sich nie richtig angefühlt . wenn du weißt, was ich meine. Es ist großartig für einen Desktop und bietet viele Funktionen, aber ich bin der Meinung, Windows-Server sollten wie Windows-Server und nicht wie bastardisierte Unix-Maschinen behandelt werden (was übrigens auch mein Argument gegen OSX-Server ist und eigentlich Unix). . Wie auch immer, ich möchte nicht mit Cygwin gehen, es sei denn, dies ist die letzte und einzige Option.

Ich frage mich also, ob es eine Möglichkeit gibt, Jobs auf Windows-Rechnern unter Linux auszuführen. Ohne Cygwin. Ich bin offen für Ideen und Vorschläge, einschließlich "Schauen Sie Idiot, jeder verwendet Cygwin, also saugen Sie es auf und beschäftigen Sie sich damit". Danke im Voraus!

Antworten:


5

Ich habe Stunden damit verbracht, mich mit diesem Problem auseinanderzusetzen, und es kam schließlich auf zwei realisierbare Optionen hinaus (es gibt eine Menge nicht realisierbarer Optionen):

  1. Erstellen Sie eine Windows-Box mit einem IIS-Dienst, der eine WebAPI hostet, die sowohl domäniert als auch so eingerichtet ist, dass WinRM-Sitzungen damit funktionieren.
  2. Cygwin

Mit der zweiten Option kämpfen Sie sich durch die GNU / Posix-Abstraktionsschicht, um die tatsächlichen Windows-Bits zu finden. Das schränkt ein, was Sie damit machen können.

Die erste Option erstellt so ziemlich eine webbasierte Abstraktionsschicht, die Sie selbst auf Ihrer vollständigen Windows-Installation mit nativem Stack schreiben. Wenn Sie bereit sind, sich an die Arbeit zu machen, muss der Linux-Master-Server nur ein paar Curl-Aufrufe ausführen, um das zu tun, was getan werden muss. Dies funktioniert am besten, wenn Skripte nur zum Löschen und Vergessen verwendet werden, da der Aufbau eines Rückrufsystems sehr viel aufwendiger ist.


Ich hatte Angst vor dieser ersten Option :-) Da ist ein großes Haifischbecken voller Probleme, das nur darauf wartet, mich zu beißen, wenn ich es auch falsch mache. Authentifizierung, Fehleranalyse, allgemeine Anwendungssicherheit ... usw. usw. usw. Aber danke für die Eingabe. Ich bin froh, dass ich nicht die einzige Person bin, die sich aufgehängt hat.
Matt Simmons

2
@MattSimmons Ich habe bei $ Job-1 etwas Ähnliches gemacht. IIS-IP-Einschränkungen erleichtern dies erheblich. Wenn API-Aufrufe nur von einem Host kommen können, wird die Angriffsfläche erheblich reduziert.
sysadmin1138

Ich habe es nicht verwendet, aber von dem, was ich gelesen habe, kann WinRM selbstständig ausgeführt werden (ohne IIS oder eine benutzerdefinierte API). Verwenden Sie restriktives Routing und Kerberos-Authentifizierung und es klingt (SOUNDS), als ob es ziemlich sicher sein könnte. Gedanken?
Laughingbovine

@laughingbovine Das Problem war schon immer die WinRM-Unterstützung. Die von mir vorgeschlagene IIS-Methode ermöglicht es, PowerShell mit einer REST-API zu versehen, die von nahezu allem unterstützt wird. Die WinRM-Unterstützung wird an einigen Stellen kaum unterstützt. In den fast drei Jahren, seit ich das geschrieben habe, hat sich die Unterstützung wahrscheinlich gegenüber dem nicht vorhandenen Stand von 2012 verbessert.
sysadmin1138

3

Sie können auch plattformübergreifende Planungs- oder Workflow-Automatisierungssoftware erwerben, mit der systemeigene Skripts auf vielen Hosts abhängig von vorherigen Aktionen oder sogar den zurückgegebenen Ergebnissen gestartet werden können. Große Unternehmen verwenden Software wie Tivoli, UC4, Espresso (CA dSeries, jetzt), die dies tut, und ich habe sie bei großen Unternehmen verwendet, die dies tun mussten. Zu Ihrer Information, diese haben oft native Unterstützung für Dinge wie Oracle-Jobs, um Ihnen eine Vorstellung von dem Preis zu geben, den Sie sich vielleicht ansehen.

(In meinem letzten Job, sie Cygwin auch verwendet sowieso , so dass sie den gleichen Perl - Skripte ohne Modifikation verwendet werden könnten , wenn Workloads zwischen Plattformen verschoben. Vielen Spaß.)

Sie können auch versuchen, eine eigene zu erstellen, wie @ sysadmin1138 vorschlägt. Das wäre ein unterhaltsames Projekt und könnte sogar robust genug sein, um nutzbar zu sein und Sie nicht um 2 Uhr morgens auslagern zu lassen, wenn die finanziellen Exporte beim ersten Versuch scheitern.


1
Zum Glück gebe ich keine Finanzdaten mehr weiter :-) Das ist Automatisierung für ein College. Viel niedrigerer Puckerfaktor.
Matt Simmons

3

Ich würde die in Powershell v3.0 eingeführte Powershell Web Access-Funktion verwenden. Auf diese Weise können Sie Powershell-Skripts von einem Linux-Host aus verwenden.


2

Mit PowerShell-Server können Sie SSH auf einem Windows-Server ausführen und eine PowerShell-Konsole erhalten. Ich habe es nicht über die kostenlose Testversion hinaus verwendet, aber meine informelle Verwendung hat mir gezeigt, dass es ein ziemlich zuverlässiges Produkt ist.


Bleh, ihre Preise sind so bemessen, dass sie eher für die Verwendung auf Deployment-Servern ausgelegt sind, als für die Bereitstellung auf allem, was remote verwaltet werden muss. Funktioniert, nur ein anderes Modell als Linux.
sysadmin1138

2

Wie ekelhaft möchtest du dich danach fühlen, weil es immer Telnet gibt :)

Im Ernst, warum benötigen Sie den Linux-Server, um das PowerShell-Skript aufzurufen? Können Sie Ihren Workflow so umgestalten, dass der Linux-Server einfach das richtige boot.wim-Image über tftp an einen PXE-gestarteten Host liefert? Ich hatte in der Vergangenheit viel Glück, ein Windows-Abbild mit verschiedenen Antwortdateien auf einem Windows-Dateiserver zu speichern und ein benutzerdefiniertes WinPE-Startabbild mit tftpd von einem Linux-Host bereitzustellen. Dann können Sie die Antwortdatei das richtige PowerShell-Skript aufrufen lassen und müssen sich nicht mit plattformübergreifenden Problemen wie Cygwin auseinandersetzen.


Oh, wenn es nur so einfach wäre. Ich machte keine Witze über den 15-jährigen Perl-Teil. Ich bin seit 3 ​​Monaten hier und weiß noch nicht, wie alle Zusammenhänge "funktionieren", aber ich weiß, dass sie vielfältig sind, mit einer Subtilität, die Menschen, die schon seit Jahren hier sind, dazu bringt, sich zu vervollständigen Ignorieren Sie dokumentierte Funktionen in vorhandenen Tools, die im eigenen Haus entwickelt wurden, da niemand sicher ist, ob / wann / wie sie debuggt wurden. Es ist haarig. Es wird ein mehrjähriges Projekt sein, um alles zu reparieren.
Matt Simmons

@MattSimmons Ich nehme an, dass ich die Anforderungen dann nicht vollständig verstehe :-) Warum muss der Linux-Server das PowerShell-Skript aufrufen? In der Vergangenheit habe ich diese Anforderung umgangen, indem ich Informationen zur Computerbereitstellung in einer Datenbank gespeichert habe (die vom * nix-Server aktualisiert werden kann) und dann WinPE diese Datenbank abfragt, um zu bestimmen, welche Antwortdatei angewendet werden soll. Sicherlich kann etwas Ähnliches an fast jede Umgebung angepasst werden, oder? Es ist im Grunde nur MDT von Grund auf neu zu
erstellen,

Es gibt Dinge, die (in einigen Fällen) auf der Windows-Seite passieren müssen, wenn das Skript für den neuen Computer ausgeführt wird. Ich KÖNNTE die Dinge von der Windows-Seite aus starten, müsste dann aber einen neuen Webanwendungsserver für die Frontschnittstelle erstellen, und ich fühle mich mit PHP unter Linux viel wohler als mit C # (oder was auch immer) unter Windows . Aber wie gesagt, wenn ich muss, muss ich.
Matt Simmons

2

Sie können so etwas wie nrpe verwenden, um das Powershell-Skript remote auf dem Windows-Host auszuführen. Möglicherweise möchten Sie Ihre Powershell-Skripte so ändern, dass sie die von nrpe erwarteten Exit-Codes zurückgeben. Es gibt jedoch keinen Grund, warum Sie check_nrpe nicht von Ihren Skripten auf Ihrem Linux-Host aus aufrufen können.


1
Das ist köstlich kontraintuitiv. Ich mag das. Es ist ein großer Hack, aber trotzdem kreativ! Vielen Dank.
Matt Simmons

2

Haben Sie beim Thema kontraintuitive Hacks erwogen, Continuous Integration als plattformübergreifendes Orchestrierungswerkzeug zu missbrauchen?

Installieren Sie den CI-Master, wo immer es am bequemsten ist, installieren Sie den Agenten auf Ihrer Windows-Box ( dies oder das ), konfigurieren Sie einen Job zum Ausführen Ihres Powershell-Skripts (entweder durch direktes Aufrufen mit der Windows Batch Command-Konfiguration oder mit einem Plugin, wenn Sie möchten um Ihr Skript in der CI-App zu schreiben / beizubehalten) und den Auftrag per Curl oder ähnlichem aus der Ferne auszulösen .


0

Ich arbeite in einem großen Unternehmen, in dem dieses Problem häufig auftritt. Für die Prozesse, die wir derzeit unterstützen, besteht unser Ansatz darin, dass die Unix-Systeme Webaufrufe an einen "admin" Windows-Server senden, auf dem ColdFusion unter IIS ausgeführt wird. Wir haben Klassen und Funktionen, die von GET-Anforderungen ausgelöst werden, die die Direktive "cfexecute" verwenden, um bestimmte Powershell-Skripte zu starten. Es ist hässlich, aber es funktioniert. Wir sehen uns die Webservicefunktionen von Powershell v3 an, um zu verhindern, dass ColdFusion als Vermittler fungiert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.