背景 我写了一本安装Windows功能的食谱。某些功能依赖于父功能。父功能可能没有安装该功能所需的源文件。
在我的配方中,我使用only_if调用Powershell命令来确定源文件是否存在。
(Get-WindowsFeature | Where Name -eq NET-Framework-Core | Select InstallState).InstallState -eq 'Removed'
如果“安装状态”等于“已删除”,则从属功能将没有所需的源文件,并且无法在不提供的情况下进行安装。因此,如果我的食谱确定缺少源文件,则不会尝试安装这些功能。但是,如果源文件确实存在,则cookbook将安装这些功能。这部分工作得很好。
问题 我有InSpec测试来验证是否安装了正确的Windows功能。我想使用Powershell命令的结果运行或跳过特定的测试。我无法找到一种方法来调用上面的Powershell命令,获取结果并运行或跳过InSpec中的测试。
答案 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