Ansible 2.9.21: Unerwünschtes Escape-Zeichen „\“ wird im Shell-Befehl hinzugefügt

Ansible 2.9.21: Unerwünschtes Escape-Zeichen „\“ wird im Shell-Befehl hinzugefügt

In meinem Playbook sollte die folgende Zeile zurückgeben 1, und wenn sie zurückgibt >1, sollte die Wiedergabe gestoppt werden:

shell: ls -l /opt/tomcat/|grep "[ ]\+{{ newTomcatVer }}$"; echo $?

Mein Spiel ist tatsächlich mit diesem Fehler fehlgeschlagen:

"msg": "There is more than one /opt/tomcat/apache-tomcat-8.x.xx instance on server01, ending play"

Nach dem erneuten Ausführen im Debugmodus sehe ich, dass dieser Shellbefehl in der Debugausgabe folgendermaßen dargestellt wird:

"cmd": "ls -l /opt/tomcat/|grep \"[ ]\\+apache-tomcat-8.5.69$\"; echo $?",

Im obigen Beispiel werden doppelte Anführungszeichen mit \Zeichen maskiert. Die Frage ist, welcher Befehl tatsächlich verwendet wird – der im Playbook oder der, den wir in der Debug-Ausgabe sehen?

Denn wenn ich den Befehl ausführe, der im Notebook steht, also ohne Escapezeichen, ist die Ausgabe 1wie erwartet:

[tomcat@server01 ~]$ ls -l /opt/tomcat/|grep "[ ]\\+apache-tomcat-8.5.69$"; echo $?
1

Wenn ich jedoch den Befehl eingebe, der sich in der Debug-Ausgabe befindet, erhalte ich Folgendes:

[tomcat@server01 ~]$ ls -l /opt/tomcat/|grep \"[ ]\\+apache-tomcat-8.5.69$\"; echo $?
grep: Invalid regular expression
2

Irgendwelche Ideen, wie man das lösen kann?

Antwort1

VerwendeneinzelAnführungszeichen im grepBefehl.

grep "[ ]\+{{ newTomcatVer }}$"

Wenn Sie doppelte Anführungszeichen verwenden, versucht die Shell, Variablen zu erweitern, d. h. sie versucht, einen Sinn daraus zu ziehen $". Dies kommt daher, $\"dass die Shell es nicht $"als Parameter erkennt, den sie erweitern kann. Sie versucht also zu erraten, was Sie wollten und überspringt das Anführungszeichen.

Es gibt keinen wirklichen Grund, hier eine Shell-Parametererweiterung durchzuführen, daher können Sie den regulären Ausdruck in einfache Anführungszeichen setzen, um das Problem zu lösen. Die Shell wird keine Parametererweiterung durchführen und den $Ausdruck wörtlich behandeln.

grep '[ ]\+{{ newTomcatVer }}$'

verwandte Informationen