ansible远程执行指令,/bin/sh: java: command not foundnon-zero return code

问题描述:ansible远程执行指令,初选指令加载不全,

[root@VM-0-6-centos ~]# ansible all -m shell -a "java -version"
10.206.0.15 | FAILED | rc=127 >>
/bin/sh: java: command not foundnon-zero return code

解决方案:【ansible问题处理】远程执行用户环境变量加载问题_ansible 加载环境变量_一边学习一边哭的博客-CSDN博客

终极解决方法(1): 

#cd /application 
#tar xzf jdk-8u144-linux-x64.tar.gz -C /application/
mv /application/jdk1.8.0_144  /application/jdk
cat >> /etc/profile.d/java.sh << EOF
export JAVA_HOME=/application/jdk
export PATH=$JAVA_HOME/bin:$PATH
EOF
source /etc/profile.d/java.sh

经过测试,这个可以直接在ansible中使用,自动加载,不过需要在宿主机中source一下

(2)终极解决方法

思路:

ansible远程执行指令,/bin/sh: java: command not foundnon-zero return code_第1张图片

 

       用SSH客户端(比如Putty)登陆Linux系统时,要求输入用户名/密码登录或根据SSH key登录时,就是login shell。
       运行man bash可以查看环境配置文件的说明,以CentOS7为例:
       1. /etc 下的是系统环境配置,对所有用户有效,但是/etc/profile只对login shell有效,而/etc/bashrc对login shell和non-login shell都有效。
       2.  ~下的是当前用户环境配置,当前用户环境配置会继承/etc系统环境配置。 
      login shell加载环境变量的顺序是:
           ①/etc/profile
           ②~/.bash _profile
           ③~/.bashrc
           ④/etc/bashrc
    而non-login shell加载环境变量的顺序是:
           ①~/.bashrc
           ②/etc/bashrc
        ansible这类远程执行的non-login shell 并不会加载/etc/profile和~/.bash_profile下的环境变量,只是加载~/.bashrc和/etc/bashrc。
        测试1:  三台机器,用ansible管理,其中1台直接在vim /etc/bashrc,添加java环境变量,然后ansible批量执行,发现设置/etc/bashrc的那台执行成功。直接账号密码中shell登录,使用java环境变量,也会报错没有。

直接

cat >> /etc/bashrc << EOF
export JAVA_HOME=/application/jdk
export PATH=$JAVA_HOME/bin:$PATH
EOF

(3)命令使用绝对路径

你可能感兴趣的:(java,ansible,linux)