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