背景
項目中使用到了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
微信公眾號:測試生財(定期分享獨家內容和資源)

