如何使用 Chef 检查 Java 是否安装在 Windows 上

How to check if Java is installed on Windows using Chef

我正在尝试更新我们的食谱以确认 Java 在 Windows 服务器上是否可用。我不在乎它是 Oracle Java、OpenJDK 还是其他什么。无论哪个 Java 存在都是无关紧要的,我需要知道 Java 在服务块 运行 之前存在,因为我的食谱安装的应用程序是依赖的,用户群可以决定 Java 已安装。 Java 目前可供用户选择的是 Oracle Java 和 Azul Zulu Java,这在未来可能会改变。

我已经想到了 not_if、only_if 等,但食谱仍然失败,因为它试图启动服务,而且我知道我的测试实例没有 Java(故意作为测试)。

不确定它是否有助于回答,但到目前为止我启动服务的代码是:

  service 'MyApp' do
    action %i[enable start]
    not_if { ::File.exist?("#{install_dir}\scripts\instance-stopped") }
  end

如果服务器上有 Java,这会很好地工作,但是一旦 Java 元素被删除,食谱就会失败。执行“安装”步骤有效,实际安装软件不需要 Java,但 运行 应用程序需要

如果你能提供任何帮助,那就太好了。

您可以采用两种方法...

推荐的是让您的食谱始终安装 java。由于厨师的性质(幂等性),如果 java 已经安装,厨师将跳过 java 安装。

另一种方法是使用 guard(如您所用)检查是否安装了 java。检查是否安装了 java 最直接的方法是测试 java 命令是否有效。

不幸的是,我无法选择部署 Java,因为我处理的各个项目团队可以选择部署四个单独的包中的任何一个,每个包都被我们的内部合规团队定义为有效,因为他们个人项目需求。

我已经沿着使用 shell_out 的路线走到 运行 "java -版本”。这是通过深入挖掘可用选项发现的:How to check which java version is installed

我还没有创建 ohai 函数,我使用了在那里看到的东西并创建了一些东西来设置一个名为 java_version 的变量,初始化为“none”在食谱的开头。然后 运行 ohai 函数的修改片段,仅用 version 值覆盖 java_version var 的值,如果有的话,来自 shell_out 调用。

然后我有一个守卫,使用unless,检查是否java_version 设置为“none”。如果是,则跳过处理,否则启动我的应用程序。