2016-04-26 3 views
1

Ich versuche, ein Powershell-Skript aus dem Benutzerdatenfeld auszuführen, wenn ich eine ec2-Instanz aus einem benutzerdefinierten AMI erstelle. Ich habe die Benutzerdatenausführung in der Konfiguration vor dem Erstellen des AMI aktiviert.Wie behebe ich Powershell-Benutzerdatenskripts in AWS EC2?

Das ist, was ich in Benutzerdaten setzen

<powershell> 
c:\scripts\github-download.ps1 someuser somepassword 
</powershell> 

Das Skript es ruft unten gezeigt.

Param($gituser, $gitpass) 
C:\Users\Administrator\AppData\Local\GitHub\shell.ps1 
git clone https://"$gituser":"$gitpass"@github.com/somegitrepo |out-null 

Ich habe keine Ahnung, warum das nicht funktioniert. Mache ich hier etwas falsch? Jede Hilfe wurde wirklich geschätzt.

+0

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? –

+0

vielleicht nicht '| out-null' den Befehl, damit Sie sehen können, was los ist? Haben Sie ein funktionierendes Set von Git-Binärdateien? –

+0

Haben Sie eine Chance bekommen, meine Antwort zu versuchen? –

Antwort

0

Stille alle Fehler, die mit Git Clone passieren könnte, so dass Sie nicht wissen, was falsch ist, wenn Sie den Fehler woanders verschicken oder einfach nicht | out-null verwenden.

Ich würde den Befehl auf der EC2-Instanz ohne die manuell ausführen, bevor Sie versuchen, Benutzerdaten zu verwenden, um alles zu automatisieren.

3

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.