Test

时间:2017-10-18 19:24:40

标签: powershell chef inspec

背景 我写了一本安装Windows功能的食谱。某些功能依赖于父功能。父功能可能没有安装该功能所需的源文件。

在我的配方中,我使用only_if调用Powershell命令来确定源文件是否存在。

(Get-WindowsFeature | Where Name -eq NET-Framework-Core | Select InstallState).InstallState -eq 'Removed'

如果“安装状态”等于“已删除”,则从属功能将没有所需的源文件,并且无法在不提供的情况下进行安装。因此,如果我的食谱确定缺少源文件,则不会尝试安装这些功能。但是,如果源文件确实存在,则cookbook将安装这些功能。这部分工作得很好。

问题 我有InSpec测试来验证是否安装了正确的Windows功能。我想使用Powershell命令的结果运行或跳过特定的测试。我无法找到一种方法来调用上面的Powershell命令,获取结果并运行或跳过InSpec中的测试。

2 个答案:

答案 0 :(得分:0)

有两个主要选择。一种是复制逻辑以检查源文件是否存在于InSpec代码(粗略)中。另一种是写出令牌文件(即只是触摸文件),如果不进行安装,并使用file资源在InSpec中检查它。

答案 1 :(得分:0)

经过一番挖掘后,我发现了InSpec issue on git hub

他们添加了在InSpec中使用only_if的能力(我不知道)。我使用powershell资源来调用我的powershell命令,将stdout转换为布尔值并返回它。我将提供我提出的粗略代码以供参考。我是ruby的新手,所以我确信有更好的方法来编写代码。

control 'Recipe windows_features.rb .NET 3.5 Features' do
  impact 1.0
  title 'Required .NET 3.5 Windows Features Are Installed'
  only_if do
    powershell_command_script = <<-EOH
    (Get-WindowsFeature | Where Name -eq NET-Framework-Core | Select InstallState).InstallState -ne 'Removed'
    EOH
    command_result = powershell(powershell_command_script)
    case command_result.stdout
    when true, "True\r\n" then true
    when false, "False\r\n" then false
    else
      raise ArgumentError, "invalid value: #{command_result.stdout.inspect}"
    end

  end
  describe windows_feature('WAS-NET-Environment') do
    it { should be_installed }
  end
  describe windows_feature('Web-Asp-Net') do
    it { should be_installed }
  end
  describe windows_feature('Web-Net-Ext') do
    it { should be_installed }
  end
  describe windows_feature('Web-Mgmt-Console') do
    it { should be_installed }
  end
end