ansible遠程執行shell報錯:command not found


背景

項目中使用到了pm2,用於管理微服務的啟停,我在相關機器上安裝好了pm2,然后使用ansible進行批量啟動服務。在使用ansible的shell模塊執行遠程命令時候卻報了錯:/bin/sh: pm2 :command not found,如下圖

 

問題定位

1. 在被執行機器上查看pm2命令,看看是不是沒有添加到環境變量(PATH)里。

登陸到這台機器上,執行:which pm2

可以看到pm2已安裝到機器上了。

再看看是否已添加到環境變量中。

如下圖,我已經把pm2的路徑添加到環境變量~/.bash_profile,是不是有可能ansible的shell模塊執行時候沒有讀取到環境變量?

 

2. 嘗試在ansible的shell的執行參數加上. ~/.bash_profile,保證執行命令前先讀取到環境變量。

執行成功!看來ansible在執行shell命令的時候,沒有正確加載到~/.bash_profile。

那到底為什么沒法正確加載到~/.bash_profile呢? 

原因

我在網上搜索了一下~/.bash_profile,發現linux里面有多個讀取環境變量的配置文件,並且有加載順序和不同的場景。

首先介紹兩個概念:login shell和non-shell shell,顧名思義,一個是交互式的shell,一個是非交互式的shell。

login shell:通常指的是常規登錄到某shell環境后,能夠在當前命令行中輸入shell命令這種情況。

non-login shell:不用登陸的,比如ssh遠程執行,是非交互式的。

如下是login shell和non-login shell的環境變量文件的加載順序。

由圖片我們可知,ansible這種非交互式的shell執行應該讀取的是~/.bashrc,而我這里配置到了~/.bash_profile 

解決方案

1. 將~/.bash_profile中ansible所需要的環境變量配置到~/.bashrc中

2. 在使用pm2的時候加上pm2的絕對路徑

3. 在執行pm2的時候,在前面加上. ~/.bash_profile

比較推薦的是第一種方式,這樣ansible后續有其他的環境變量也可以預先配置到~/.bashrc,減小我們改造或者書寫ansible命令的成本。

 

備注:圖片引用博客地址:https://blog.csdn.net/gatieme/article/details/45064705

 

博主:測試生財(一個不為996而996的測開碼農)

座右銘:專注測試開發與自動化運維,努力讀書思考寫作,為內卷的人生奠定財務自由。

內容范疇:技術提升,職場雜談,事業發展,閱讀寫作,投資理財,健康人生。

csdn:https://blog.csdn.net/ccgshigao

博客園:https://www.cnblogs.com/qa-freeroad/

51cto:https://blog.51cto.com/14900374

微信公眾號:測試生財(定期分享獨家內容和資源)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM