Anstatt die Benutzerdaten mit dem Tag <powsershell>
aufzurufen, rufen Sie PowerShell selbst mit dem Tag <script>
auf. Sie gewinnen ihre Beschwörung Befehlszeile Kontrolle über und kann Ausführungsrichtlinie und andere Befehlszeileneinstellungen direkt steuern:
<script>
PowerShell -ExecutionPolicy Bypass -NoProfile -File c:\scripts\github-download.ps1 -user USER -password PASSWORD
</script>
in Ihrem Skript-Setup den Anfang und das Ende Abschnitte des Skripts wie folgt:
# Server script called from userdata in this format
# <script>
# PowerShell -ExecutionPolicy Bypass -NoProfile -File c:\scripts\github-download.ps1 -user USER -password PASSWORD
# </script>
param (
[string]$user = $(throw "-user is required."),
[string]$password = $(throw "-password is required."),
)
Start-Transcript -Path C:\userscriptlog.txt
Import-Module WebAdministration
if ([System.Diagnostics.EventLog]::SourceExists("Userdata") -eq $False) {
New-Eventlog -Logname Application -Source 'Userdata'
}
Write-Eventlog -Logname Application -Source 'Userdata' -EventId 1 -EntryType Information -Message 'Begining post-deployment configuration script'
-- YOUR MAIN SCRIPT HERE --
Write-Eventlog -Logname Application -Source 'Userdata' -EventId 1 -EntryType Information -Message 'Post-deployment configuration script complete'
Stop-Transcript
Für die Fehlerbehandlung in Ihrem Skript müssen Sie für jeden Befehl eine robuste Ausnahmebehandlung und Protokollierung verwenden, um die Fehlerbehebung und das Debugging erneut zu vereinfachen. Dieser Block wird einfach die aktuelle ID Instanz, aber beachten Sie die Ausnahmebehandlung und Protokollierung eingebaut:
# get instance-id
try {
$InstanceId = (Invoke-WebRequest http://169.254.169.254/latest/meta-data/instance-id).content
} catch {
$_.Exception.message | out-file c:\InstanceId_error.log
Write-Host "FATAL: InstanceId exception"
Exit
}
if (!$InstanceId) {
Write-Host "FATAL: InstanceId is null"
Exit
} else {
$InstanceId | out-file C:\InstanceId.txt
Write-Host "InstanceId: $InstanceId"
}
diesen Ansatz Versuchen Sie, jeden Befehl oder Shell-Aufruf, die Sie implementieren müssen.
Dieser Powershell-Skript-Wrapper für Benutzerdatenskripts ermöglicht optionale Befehlszeilenparameter, erstellt ein Transkript der Ausführung und protokolliert Ereignisse im Windows-Ereignisprotokoll, um die grundlegende Ausführung des Skripts zu bestätigen.
Es wird ein flexibles Framework für jedes Powershell-basierte Benutzerdatenskript bereitstellen, das ein einfaches Debugging und Testen ermöglicht.
Nicht genug Details, um dies wirklich noch zu beheben. Wie übertrage ich die Benutzerdaten in die Instanz (Konsole/CLI? Ist Base 64 codiert? Alle Details wären hier hilfreich.)? Ist die Instanz so konfiguriert, dass sie mit dem Internet kommuniziert? Haben Sie in diesem Skript versucht, ExecutionPolicy als RemoteSigned zu setzen, um sicherzustellen, dass andere Skripts ausgeführt werden können? Haben Sie das ec2 Config-Protokoll unter 'C: \ Programme \ Amazon \ Ec2ConfigService \ Logs \ Ec2ConfigLog.txt' für irgendwelche Details überprüft? Hast du versucht, das Skript selbst einzuloggen? –
vielleicht nicht '| out-null' den Befehl, damit Sie sehen können, was los ist? Haben Sie ein funktionierendes Set von Git-Binärdateien? –
Haben Sie eine Chance bekommen, meine Antwort zu versuchen? –