问题描述: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)终极解决方法
思路:
用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)命令使用绝对路径