Результат команды PowerShell Chef / InSpec в Test
Предыстория Я написал кулинарную книгу, которая устанавливает функции Windows. Некоторые функции зависят от родительских функций. Родительские функции могут не иметь исходных файлов, необходимых для установки функции.
В своем рецепте я использую only_if для вызова команды Powershell, чтобы определить, существуют ли исходные файлы.
(Get-WindowsFeature | Where Name -eq NET-Framework-Core | Select InstallState).InstallState -eq 'Removed'
Если состояние установки равно удаленному, зависимая функция не имеет необходимых исходных файлов и не может быть установлена без их предоставления. Таким образом, если моя кулинарная книга определит, что исходные файлы отсутствуют, она не будет пытаться установить компоненты. Однако, если исходные файлы существуют, поваренная книга установит эти функции. Эта часть работает отлично.
Проблема У меня есть тесты InSpec для проверки правильности установленных функций Windows. Я хочу запустить или пропустить определенные тесты, используя результат команды Powershell. Я не могу найти способ вызвать команду Powershell выше, получить результаты и запустить или пропустить тесты в InSpec.
2 ответа
После некоторых копаний я обнаружил эту проблему InSpec на git hub
Они добавили возможность использовать only_if в InSpec (я не знал). Я использую ресурс powershell, чтобы вызвать мою команду powershell, преобразовать стандартный вывод в логическое значение и вернуть его. Я предоставлю приблизительный код, который я придумал для справки. Я новичок в 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
Есть два основных варианта. Одним из них является дублирование логики, чтобы проверить, существуют ли исходные файлы в вашем коде InSpec (брутто). Другой способ - выписать файл токена (т.е. просто коснуться файла), если вы не выполняете установку, и проверить это в InSpec с помощью file
ресурс.