【发布时间】: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