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

如何使用Chef检查Windows上是否安装了Java,java,windows,chef-infra,Java,Windows,Chef Infra,我正在尝试更新我们的食谱,以确认Windows服务器上是否有Java可用。我不在乎它是Oracle Java、OpenJDK还是其他什么。无论哪个Java存在都是不相关的,我需要在运行服务块之前知道Java存在,因为我的cookbook安装的应用程序是依赖的,用户群可以决定安装的Java。用户群现在可以选择的Java是Oracle Java和Azul Zulu Java,这在未来可能会改变 我想到了not_if、only_if等,但cookbook仍然失败,因为它试图启动服务,并且我知道我的测试

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

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

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

  service 'MyApp' do
    action %i[enable start]
    not_if { ::File.exist?("#{install_dir}\\scripts\\instance-stopped") }
  end
如果服务器上有Java,这很好,但是一旦删除Java元素,cookbook就会失败。执行“安装”步骤有效,实际安装软件不需要Java,但运行应用程序需要Java


你能提供的任何帮助都会很好。

你可以采取两种方法

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


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

不幸的是,我不能选择部署java,因为我所处理的各个项目团队可以选择部署四个独立包中的任何一个,每个包都由我们的内部合规团队定义为有效,为了他们个人的项目需要

我一直在使用shell\u out运行“java-version”。这是通过进一步挖掘可用选项发现的:

我没有创建ohai函数,我使用了我在那里看到的东西,创建了一个名为java\u version的变量,在配方开始时初始化为“none”。然后运行ohai函数的一个修改后的代码段,用shell out调用中的version值(如果有)覆盖java\u versionvar的值

然后我有一个防护,使用除非,检查java\u版本是否设置为“无”。如果是,请跳过处理,否则请启动我的应用程序