Ansible

Ansible 2.9.21:在 shell 命令中添加了不需要的轉義字元“”

  • August 12, 2021

在我的劇本中,以下行應該返回1,如果返回>1,則播放應該停止:

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

我的遊戲確實因這個錯誤而失敗:

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

在調試模式下再次執行後,我看到這個 shell 命令在調試輸出中是這樣表示的:

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

在上面,雙引號用\字元轉義。問題是,實際使用的是哪個命令——劇本中的那個,還是我們在調試輸出中看到的那個?

因為如果我執行筆記本中的命令,即沒有轉義字元,則輸出1如預期:

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

但是,如果我發出調試輸出中的命令,我會得到:

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

任何想法如何解決這個問題?

在命令中使用單引號。grep

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

當您使用雙引號時,shell 將嘗試進行變數擴展,這意味著它將嘗試理解$". 這是$\"因為 shell 無法將其辨識$"為可以擴展的參數,因此它會嘗試猜測您想要什麼並轉義引號。

這裡沒有真正的理由做 shell 參數擴展,所以你可以將正則表達式放在單引號中來解決問題。shell 不會嘗試進行參數擴展,而是按$字面意思處理。

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

引用自:https://serverfault.com/questions/1074361