ansible远程执行寻找不到环境变量问题

ansible远程执行寻找不到环境变量问题

问题:

ansible调用command远程启动服务,找不到JAVA_HOME。 

然而:

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_181 

export JRE_HOME=${JAVA_HOME}/jre 
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib 
export PATH=${JAVA_HOME}/bin:$PATH


都已经写在/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
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_181
export JRE_HOME=/usr/lib/jvm/jdk1.8.0_181/jre
export CLASSPATH=.:/usr/lib/jvm/jdk1.8.0_181/lib:/usr/lib/jvm/jdk1.8.0_181/jre/lib
export PATH=/usr/lib/jvm/jdk1.8.0_181/bin:/usr/lib/jvm/jdk1.8.0_181/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

 

posted @ 2019-04-01 20:02  David---wei  阅读(5479)  评论(0编辑  收藏  举报