问题
ansible调用playbook远程mvn执行打包时发现执行出错,找不到JAVA_HOME
。
我们的exporter JAVA_HOME=/usr/java/jdk1.8.0
写在/etc/profile
中,登录时可以正常执行打包并打印JAVA_HOME
。
排查过程
- 在playbook中执行
echo $JAVA_HOME > /tmp/test.log
,为空 - 在playbook中添加
echo $PATH > /tmp/test.log
,同时在远端服务器登录执行echo $PATH > /tmp/test.log
,结果不同,ansible执行的要少很多路径 - 在
~/.bash_profile
中添加环境变量,与/etc/profile
结果一致 - 考虑ansible执行的环境变量与登录时使用的环境变量不同,所以将
JAVA_HOME
写在/etc/bashrc
中,再次测试echo $JAVA_HOME > /tmp/test.log
,正常打印 - 至此,确定ansible执行过程中并未调用
/etc/profile和~/.bash_profile
原因
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 与 non-login shell
《鸟哥的Linux私房菜基础学习篇》里这样描述/etc/profile及/etc/bashrc的区别:
* login shell:取得bash时需要完整的登入流程的,就称为login shell。举例来说,你要由tty1~tty6登入,需要输入用户的账号和密码,此时取得的bash就称为『login shell』啰;
* non-login shell:取得bash接口的方法不需要重复登入的举动,