【问题标题】:JAVA_HOME not in Ansible environment when gathering facts remotely [duplicate]远程收集事实时,JAVA_HOME 不在 Ansible 环境中[重复]
【发布时间】:2018-04-23 16:06:18
【问题描述】:

我有一个 Ansible 剧本,希望在 ansible_env 中找到 JAVA_HOME。当我在远程安装了 Oracle Java 8 的 Ubuntu 16.04 主机上运行它时,缺少 JAVA_HOME 和其他 Java 变量。但是,当我使用 ansible -K --become -m setup -c local localhost 在目标主机上本地收集事实时,我看到了它们。我的管理工作站和目标主机都是通过 APT 安装的运行 Ansible 2.5 的 Ubuntu 16.04。是什么导致了hte差异?远程运行时如何使 JAVA_HOME 对 Ansible 可见?

请注意,问题不在于如何在剧本执行期间设置 JAVA_HOME,也不在于调用 shell 的解决方法。我试图理解为什么 JAVA_HOME 不存在于人们期望找到它的地方。

远程收集的环境:

"ansible_env": {
    "HOME": "/root", 
    "LANG": "en_US.UTF-8", 
    "LANGUAGE": "en_US:en", 
    "LC_ADDRESS": "he_IL.UTF-8", 
    "LC_ALL": "en_US.UTF-8", 
    "LC_IDENTIFICATION": "he_IL.UTF-8", 
    "LC_MEASUREMENT": "he_IL.UTF-8", 
    "LC_MESSAGES": "en_US.UTF-8", 
    "LC_MONETARY": "he_IL.UTF-8", 
    "LC_NAME": "he_IL.UTF-8", 
    "LC_NUMERIC": "en_US.UTF-8", 
    "LC_PAPER": "he_IL.UTF-8", 
    "LC_TELEPHONE": "he_IL.UTF-8", 
    "LC_TIME": "en_US.UTF-8", 
    "LOGNAME": "root", 
    "MAIL": "/var/mail/root", 
    "PATH": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin", 
    "PWD": "/home/local/VELOQUANT/yitzikc", 
    "SHELL": "/bin/bash", 
    "SUDO_COMMAND": "/bin/sh -c echo BECOME-SUCCESS-ejewjujifuuqrzzrkbjlmewadhlixwgh; /usr/bin/python /home/local/VELOQUANT/yitzikc/.ansible/tmp/ansible-tmp-1524498140.22-96857206506570/setup.py", 
    "SUDO_GID": "527958529", 
    "SUDO_UID": "527959121", 
    "SUDO_USER": "yitzikc", 
    "TERM": "xterm", 
    "USER": "root", 
    "USERNAME": "root"
}

环境聚集在本地:

    "ansible_env": {
        "DERBY_HOME": "/usr/lib/jvm/java-8-oracle/db", 
        "DISPLAY": "localhost:10.0", 
        "GTK_MODULES": "gail:atk-bridge", 
        "HOME": "/root", 
        "J2REDIR": "/usr/lib/jvm/java-8-oracle/jre", 
        "J2SDKDIR": "/usr/lib/jvm/java-8-oracle", 
        "JAVA_HOME": "/usr/lib/jvm/java-8-oracle", 
        "LANG": "en_US.UTF-8", 
        "LANGUAGE": "en_US:en", 
        "LC_ADDRESS": "he_IL.UTF-8", 
        "LC_ALL": "en_US.UTF-8", 
        "LC_IDENTIFICATION": "he_IL.UTF-8", 
        "LC_MEASUREMENT": "he_IL.UTF-8", 
        "LC_MESSAGES": "en_US.UTF-8", 
        "LC_MONETARY": "he_IL.UTF-8", 
        "LC_NAME": "he_IL.UTF-8", 
        "LC_NUMERIC": "en_US.UTF-8", 
        "LC_PAPER": "he_IL.UTF-8", 
        "LC_TELEPHONE": "he_IL.UTF-8", 
        "LC_TIME": "en_US.UTF-8", 
        "LESSCLOSE": "/usr/bin/lesspipe %s %s", 
        "LESSOPEN": "| /usr/bin/lesspipe %s", 
        "LOGNAME": "root", 
        "MAIL": "/var/mail/yitzikc", 
        "PATH": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin", 
        "PWD": "/home/local/VELOQUANT/yitzikc", 
        "SHELL": "/bin/bash", 
        "SHLVL": "1", 
        "SSH_CLIENT": "172.30.1.183 51808 22", 
        "SSH_CONNECTION": "172.30.1.183 51808 172.30.1.121 22", 
        "SSH_TTY": "/dev/pts/0", 
        "SUDO_COMMAND": "/bin/sh -c echo BECOME-SUCCESS-injqonohmutwfdyspntuiuaanynmjljw; /usr/bin/python /home/local/VELOQUANT/yitzikc/.ansible/tmp/ansible-tmp-1524498257.19-88347143844147/setup.py", 
        "SUDO_USER": "yitzikc", 
        "TERM": "xterm", 
        "USER": "root", 
        "USERNAME": "root", 
        "XDG_DATA_DIRS": "/usr/local/share:/usr/share:/var/lib/snapd/desktop", 
        "XDG_RUNTIME_DIR": "/run/user/527959121", 
        "XDG_SESSION_ID": "73", 
        "_": "/usr/bin/ansible"
    }, 

【问题讨论】:

  • 能否请您指出这个可能重复的问题?我找不到它...无论如何,我的问题的答案是完全避免使用 JAVA_HOME,而是使用此处提出的解决方案:askubuntu.com/a/657468/488782 请重新打开,以便我可以发布更完整的答案。
  • 添加到我上面的评论中,第一个答案是关于在剧本执行期间设置环境变量,在这种情况下这与我无关,第二个使用解决方法并且没有解决为什么 JAVA_HOME 不存在于人们期望找到它的地方的问题。
  • 请注意,第二个答案清楚地向您解释了存在登录和非登录 shell 会话,并且并非所有文件都在所有情况下都是来源的。另请注意,您提出的问题:“我需要如何在 *nix 系统上设置环境变量,以便为登录和非登录 shell 会话提供源代码”是 不是编程问题,因此它与 StackOverflow 无关。
  • 我的问题从来不是关于设置环境变量,而是关于 Ansible 呈现的环境中明显的不一致。我目睹的行为非常令人惊讶和不直观,我相信这是一个合理的问题,可以为其他 Ansible 自动化开发人员节省时间。我确实接受了这个答案,因为它指出了根本问题。我想发布一个补充答案,显示我的实际解决方案,它完全避免使用 ansible_env,但现在我不能再添加答案了。
  • 它与 Ansible 没有任何关系。对你的目标服务器运行ssh -c,你会得到同样的结果。

标签: java ansible environment-variables ubuntu-16.04


【解决方案1】:

在我的 Fedora 上做一个测试,如果你把 JAVA_HOME 放到 .bash_profile 中,Ansible 不会把它捡起来。但是如果你把它放在 .bashrc 文件中,它会显示为ansible_env

PS。当您向localhost 发起收集事实时,它将继承您从 shell 中拥有的所有环境变量。例如,如果您在将剧本运行到 localhost 之前执行了:export MY_VAR=YitzikC,您将在 ansible_env 中看到变量。

【讨论】:

  • 我明白你的意思,改为运行: /usr/bin/env -i ansible -K --become -m setup -c local localhost 会产生一个缺少 JAVA_HOME 的更简约的环境。
  • 我相信你的情况的不同之处在于链接线程中的人措辞更好:Ansible logins via SSH using non-login shell.,这意味着 .bash_profile 不是来源,而 .bashrc 是。当您从 localhost 收集事实时,JAVA_HOME 就在那里,因为您已经在登录 shell 中,所以它被继承了。但是当您执行到远程主机时,由于前面解释的非登录 shell,.bash_profile 没有被获取。至少这是我的理解。
猜你喜欢
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
  • 2021-09-16
  • 1970-01-01
相关资源
最近更新 更多