• 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

  • 相关阅读:
    leetcode 14 Longest Common Prefix
    leetcode 20 Valid Parentheses 括号匹配
    leetcode 67 Add Binary
    ios swift 实现饼状图进度条,swift环形进度条
    【设计总结】DiDi
    【交互】退出弹窗思考
    【交互】导航栏设计
    【插件】Office
    【算法】聚类评价指标
    【Math】PCA与LDA
  • 原文地址:https://www.cnblogs.com/st12345/p/10638554.html
Copyright © 2020-2023  润新知