ansible远程执行寻找不到环境变量问题
问题:
ansible调用command远程启动服务,找不到JAVA_HOME
。
然而:
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_181 export JRE_HOME=${JAVA_HOME}/jre |
---|
都已经写在/etc/profile
中并source生效,登录远端服务器echo $JAVA_HOME又正常。
排查过程:
首先,在脚本中添加echo $JAVA_HOME ,which java ,echo $(whoami),然后用ansible远程执行,发现为root用户但输出为空和找不到java;
其次,在~/.bash_profile中添加环境变量,用ansible远程执行脚本,发现依然输出为空和找不到java环境变量;
最后,考虑ansible执行的环境变量与登录时使用的环境变量不同,所以将JAVA_HOME写在/etc/bashrc中,用ansible远程执行脚本,发现执行正常;
至此,确定ansible执行过程中并未调用/etc/profile和~/.bash_profile
原因:
ansible远程执行的是non-login shell 并不会加载/etc/profile和~/.bash_profile下的环境变量,只加载~/.bashrc和/etc/bashrc
如果需要在ansible中执行需要特定环境变量的命令,将环境变量写在~/.bashrc ,然后source一下~/.bash_profile。
总结:
为了可持续交付以及让自己能保持优雅的操作帅姿,强烈要求以后都将java/nginx/mvn等环境变量写入~/.bashrc ,然后source一下~/.bash_profile。
eg:
[root@vm172-31-0-2 script]# cat ~/.bashrc # User specific aliases and functions alias rm='rm -i' # Source global definitions |
---|