Результат команды 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 ресурс.

Другие вопросы по тегам