Wie Sie ein PowerShell-Modul im Azure-Funktion
Muss ich das AWS-Modul, das von der PS-Galerie, aber wenn ich versuche, führen Sie die Installation Schritt innerhalb einer Azure-Funktion, es funktioniert nicht. Die -verbose argument flag nicht schriftlich etwas an die Konsole.
Was ist der richtige Weg, um nutzen und zusätzliche PowerShell-Module innerhalb einer Azure-Funktion?
Funktion code
[Console]::WriteLine("PowerShell Timer trigger function executed at:$(get-date)");
if (-not (Get-Module -Name "AWSPowerShell")) {
[Console]::WriteLine("AWSPowerShell not installed");
Install-Module -Name AWSPowerShell -Scope CurrentUser -ErrorAction Continue -Verbose
}
if (-not (Get-Module -Name "AWSPowerShell")){
[Console]::WriteLine("AWSPowerShell install step failed");
}
Funktion log
2016-06-09T11:24:31.108 Function started (Id=e09be687-2e13-4754-942e-eab75c8516e5)
2016-06-09T11:24:32.788 Powershell Timer trigger function executed at:06/09/2016 11:24:32
AWSPowerShell not installed
AWSPowerShell install step failed
2016-06-09T11:24:32.788 Function completed (Success, Id=e09be687-2e13-4754-942e-eab75c8516e5)
Update
Pro @travis' Antwort ich habe den vorgeschlagenen code, einschließlich des nuget-Paket-manager Linie. Dies funktioniert immer noch nicht. Ich fügte hinzu, ein anderes debug-Zeile und festgestellt, dass gab es keine Modul-Anbietern, sogar nach dem Versuch, hinzufügen von nuget!
Überarbeitete code
[Console]::WriteLine("Powershell Timer trigger function executed at:$(get-date)");
Get-PackageProvider -Name nuget -ForceBootstrap
$pkg=Get-PackageProvider -ListAvailable
if ($pkg.Count -lt 1){ [Console]::WriteLine("No providers")}
if (-not (Get-Module -listavailable -Name "AWSPowerShell")) {
[Console]::WriteLine("AWSPowerShell not installed");
Install-Module -Name AWSPowerShell -Scope CurrentUser -ErrorAction Continue -Verbose -force
}
if (-not (Get-Module -listavailable -Name "AWSPowerShell")){
[Console]::WriteLine("AWSPowerShell install step failed");
}
Import-Module AWSPowerShell
Überarbeitete Protokoll
2016-06-09T17:54:03.859 Powershell Timer trigger function executed at:06/09/2016 17:54:02
No providers
AWSPowerShell not installed
AWSPowerShell install step failed
2016-06-09T17:54:03.859 Function completed (Success, Id=80efb9fc-5e91-45f9-ab58-3b71fcd764af)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Azure-Funktionen, Unterstützung für PowerShell-scripting ist derzeit in einem experimentellen Stadium. Die folgenden Szenarien werden unterstützt:
modules
ist, die sich im gleichen Verzeichnis, in dem das PowerShell-Skript befindet. In der Kudu Konsole für eine Beispielfunktion, die Verzeichnis-Struktur würde wie folgt Aussehen,Werden wir nicht unterstützen Kunden bei der Installation auf Ihren eigenen Module mit der
Install-Module
cmdlet, jedoch können die Kunden laden Ihre Module in dermodules
Ordner.Alle Module in der
modules
Ordner werden automatisch geladen, so dass Kunden nicht haben, um explizit dieImport-Module
cmdlet.Unterstützen wir Skript, binäre und manifest Module. Diese Module befinden sich in einer flachen Struktur innerhalb der
modules
Ordner. Ein Beispiel-layout ist wie folgt:In den Kontext von dem, was Sie versuchen zu erreichen, hier sind einige empfohlene Schritte, um sicherzustellen, dass die
AWSPowerShell
Modul geladen ist.Installieren
AWSPowerShell
lokal auf Ihrem Entwicklungscomputer. Sie benötigen zum hochladen alle Inhalte unter\AWSPowerShell\3.3.5.0
Mit dem Kudu-Schnittstelle, upload der installierten Abhängigkeiten von
AWSPowerShell
zu einemmodules
Ordner mit Wohnsitz in Ihrer Funktion directory. Dies zu tun, öffnen Sie das Portal-Benutzeroberfläche für die Funktion der App und klicken Sie auf die Funktion App-Einstellungen - Taste.Weiter, klicken Sie auf die Gehen Kudu Taste, um die Kudu-Konsole. Sie sollten sehen, eine Momentaufnahme, die der folgenden ähnelt,
In der cmd-Konsole Eingabeaufforderung, navigieren Sie zur Funktion " Ordner, erstellen Sie eine
modules
Verzeichnis und laden Sie alle Inhalte aus\AWSPowerShell\3.3.5.0
zu denmodules
Verzeichnis.Sollten Sie am Ende mit einem Ordner Module, die eine Liste von Dateien, ähnlich wie auf dem Bild unten:
Führen Sie Ihre Funktion. Für den Fall, da das folgende Skript für meine Funktion,
if (-not (Get-Module -Name "AWSPowerShell"))
{
Write-Output "AWSPowerShell not installed";
}
else
{
Write-Output "AWSPowerShell installed";
}
wenn ausgeführt, die log-Ausgabe ist wie folgt,
Hinweis: Die Funktion nimmt Zeit in Anspruch, aufgrund der Tatsache, dass alle Module werden zur Laufzeit geladen.
Ist es wichtig zu Bedenken, dass im Gegensatz zu den meisten IaaS-setup, ein Azure-Funktion ausführt, die in einer multi-tenant-Umgebung. Als solche, es bleibt die folgenden bekannten Einschränkungen:
Unserer Infrastruktur Wachen gegen jegliche Funktion Ausführung low-level-APIs, die wir halten, wie Sicherheits-Risiken (z.B. interaktive Modi, host-Anmeldeinformationen zugreifen, registry-änderungen, usw.). Wenn das PowerShell-Skript oder Modul ruft jede dieser blockiert APIs, Sie werden nicht in der Lage zum ausführen dieser Aufgaben im Funktionen. Dennoch, unser Ziel ist es, so viele Szenarien wie möglich, damit wir priorisieren Freigabe-Szenarien basieren auf der Nachfrage-Volumen von unseren Kunden.
Wir haben derzeit PowerShell version 4.0 und Azure PowerShell 1.4 installiert in unsere Infrastruktur. Wir aktualisieren diese Versionen bald. So fügen wir weitere Unterstützung für PowerShell in Azure-Funktionen, Modul-Suiten, die aktualisiert werden können oder im Laufe der Zeit Hinzugefügt. Gibt es eine Möglichkeit, dass diese pre-installierten Module kann es zu Konflikten mit vorhandenen Module.
if (-not (Get-Module -Name "ScriptName"))
. Ich arbeite immer noch durch den Versuch, um dann wahlweise laden der DLL ' s per Add-Typ in das Modul.Müssen Sie sicherstellen, dass Sie sich für alle Module, nicht nur die geladenen Module durch das hinzufügen von
-listavailable
zu denget-module
nennen.Müssen Sie möglicherweise bootstrap nuget installieren-Modul für die Arbeit in nicht-interaktiven Umgebungen. Der Befehl ist:
Get-PackageProvider -Name nuget -ForceBootstrap
Wenn das repository aus, das Sie installieren, ist nicht vertrauenswürdig sind, müssen Sie möglicherweise zu zwingen, die
install-module
Befehl.Beispiel
FYI: [Console]::WriteLine wird nicht als gute Praxis in der PowerShell zur automatisierten scripts. Versuchen Sie, zu bleiben, um zu
Write-Verbose
können Sie erzwingen, dass es soWrite-Verbose -message 'my message' -verbose
Was über die Aktualisierung der azurerm powershell-Module, es gibt eine Menge Module, um auf die neueste version 4.1.0, die, wenn wir hochladen wird ein Problem in einem flachen Verzeichnis.
C:\Program Files (x86)\Microsoft SDKs\Azure\PowerShell\ResourceManager\AzureResourceManager
enthält 46 Ordnern.
Ich vermute, der Grund ist, dass Sie nicht die Angabe einer Lage für die Module, die geladen werden. Die aktuelle
$env:PSModulePath
aufgeführt, wieIch kann nicht ganz herausfinden, wo es in Bezug auf das erste aus, also konnte ich Sie nicht dort. Also ich setze diese gemeinsam statt
Dies lädt das Modul (befindet sich auf d:\home\modules) und funktioniert wie erwartet
Dem Grund, dass
Get-PackageProvider -Name nuget -ForceBootstrap
nicht funktioniert, ist, dass diePackageManagement
- Modul ist nicht installiert. Allerdings nuget ist bereits installiert. Sie müssten, um die Interaktion mit kudu direkt um Pakete zu installieren, die Art und Weise.Ich bin froh zu sehen, ich bin nicht der einzige, der getrieben wird leicht Nüsse von Funktionen obwohl 😉