Ansible 被管理機需要使用代理上網時yum不能聯網的問題

被管理服務器需要使用http和https代理才能上網,如在/etc/profile中設置了
export http_proxy=http://172.16.16.80:8080
export https_proxy=http://172.16.16.80:8080

此時通過ssh連接到服務器,執行yum,會走這個代理,安裝軟件沒有問題。
但是在ansible服務器端,通過ansible在客戶端執行yum會發現,命令執行時yum連接不到外網,導致命令執行失敗。
#ansible app -m yum -a "name=iftop state=present"

此時需要在客戶端 /etc/bashrc 文件添加代理配置
export http_proxy=http://172.16.16.80:8080

之後執行成功。

原因
login shell 和 non-login shell

  • 我們登錄執行的是login shell,會加載/etc/profile,~/.bash_profile
  • ansible這類ssh遠程執行是non-login shell,不會加載etc/profile,~/.bash_profile,而是加載etc/bashrc和~/.bashrc

  • login shell:取得bash時需要完整的登入流程的,就稱爲login shell。舉例來說,你要由tty1~tty6登入,需要輸入用戶的賬號和密碼,此時取得的bash就稱爲『login shell』囉;
  • non-login shell:取得bash接口的方法不需要重複登入的舉動,舉例來說,(1)你以Xwindow登入Linux後,再以X的圖形化接口啓動終端機,此時那個終端接口並沒有需要再次的輸入賬號和密碼,那個bash的環境就稱爲non-login shell了。(2)你在原本的bash環境下再次下達bash這個命令,同樣的也沒有輸入賬號密碼,那第二個bash (子程序)也是non-login shell 。

結論
ansible這類遠程執行的non-login shell 並不會加載/etc/profile和~/.bash_profile下的環境變量,只是加載~/.bashrc和/etc/bashrc
如果需要在ansible中執行需要特定環境變量的命令,可以在執行前source一下~/.bash_profile, 或者將環境變量寫在~/.bashrc 。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章