zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Objective-C语言的对象、功能和方法
    【Swift语言】可选类型
    静态库调用中“unrecognized selector sent to instance”错误
    Xcode的坑
    Xcode6中变量初始化的问题
    iOS数据存储的方式总结
    KVO
    linux一些工具的安装(三)
    linux一些工具的安装(二)
    linux的基本操作(一)
  • 原文地址:https://www.cnblogs.com/st12345/p/10638554.html
Copyright © 2011-2022 走看看