2016-05-14 4 views
0

Ich schreibe ein Skript, um einen AWS-Stack mit einer Cloudformationsvorlage und Ruby zu erstellen, um es zu orchestrieren. Ich mag den Stapel überprüfen, noch nicht vorhanden ist, bevor er den Bau, so habe den folgenden Code-Snippetstring.include? funktioniert nicht, wie ich es erwarte und ich verstehe nicht warum

puts("Checking that stack " + stackName + " doesn't already exist") 
puts 

stackExists = `aws cloudformation describe-stacks --stack-name #{stackName}` 

puts(stackExists) 


unless stackExists.include?("does not exist") 
    puts("Stack " + stackName + " already exists. Exiting.") 
    exit(100) 
end 

Da die Ausgabe von describe-Stacks eine Zeichenfolge, die „nicht vorhanden“, wenn der Stapel enthält existiert nicht, ich würde erwarten, dass ich in den unless-Block blicke, wenn der Stack existiert, und ihn überspringe, wenn dies nicht der Fall ist, die Ausgabe meines Skripts liegt jedoch unterhalb, wenn der Stack noch nicht existiert.

Checking that stack myStack doesn't already exist 


A client error (ValidationError) occurred when calling the DescribeStacks operation: Stack with id myStack does not exist 

Stack myStack already exists. Exiting. 

Wenn ich im Grunde die gleiche Sache in irb mache, habe ich den Ausgang, den ich erwarte, wie unten.

irb(main):001:0> a = "A client error (ValidationError) occurred when calling the DescribeStacks operation: Stack with id myStack does not exist" 
=> "A client error (ValidationError) occurred when calling the DescribeStacks operation: Stack with id myStack does not exist" 
irb(main):002:0> a.include?("does not exist") 
=> true 

Was mache ich falsch?

+1

Soweit ich sehen sollte es in Rubin funktionieren. Ich nehme an, dass mit dem ausgeführten Befehl "aws" etwas anderes passieren könnte. Warum probierst du diese Befehlsausführung nicht in irb, anstatt nur mit der Zeichenfolge zu versuchen? do 'stackExists = \' aws cloudformation beschreibst-stacks --stack-name # {stackName} \ '' und 'stackExists.include? (" existiert nicht ")' in deinem irb und schau ob es immer noch wie erwartet funktioniert. Versuchen Sie auch, '.strip' für das Zeichenfolgenobjekt aufzurufen, damit die Zeilenumbruchzeichen entfernt werden. 'stackExists.strip.include? (" existiert nicht ")' – aBadAssCowboy

Antwort

1

Ah vielen Dank, ich kann sehen, was jetzt passiert. Die Zeichenfolge, nach der ich suche, geht nach Standardfehler nicht Standard aus, also ist stackExists tatsächlich gleich null ... Ich weiß, wie ich das jetzt beheben kann, danke!

ich den Code wie folgt verändert Standardfehler auf die Standardausgabe umleiten als wieder scheinbar Zecken nicht zulassen, dass Sie direkt Standardfehler erfassen und diese nun wie erwartet funktioniert ...

stackExists = `aws cloudformation describe-stacks --stack-name #{stackName} 2>&1`.strip 


unless stackExists.include?("does not exist") 
    puts("Stack " + stackName + " already exists. Exiting.") 
    exit(100) 
end 
+0

Anstatt zu sagen "Ich weiß, wie man das jetzt repariert", wäre es für andere Neulinge nützlich, wenn Sie es in der Antwort – aBadAssCowboy

+0

gut posten! Ich werde meine Antwort aktualisieren. Danke für die konstruktive Rückmeldung. –

Verwandte Themen