Spec-Zone.ru › Chef 17

ресурс команды

[править на GitHub]

Используйте ресурс аудита Chef InSpec, чтобы проверить произвольную команду, выполняемую на системе.

Доступность

Установка

Этот ресурс распространяется вместе с самим Chef InSpec. Вы можете использовать его автоматически.

Версия

Этот ресурс стал доступен в версии v1.0.0 InSpec.

Синтаксис

Блок ресурсов command объявляет команду для выполнения, одно (или несколько) ожидаемых значений и местоположение, куда отправляется этот вывод:

describe command('command') do
  it { should exist }
  its('property') { should eq 'value' }
end

где

  • 'command' должен указать команду для выполнения
  • 'property' является одним из exit_status, stderr, или stdout
  • 'output' проверяет вывод команды, выполняемой на системе, относительно значения вывода, указанного в тесте

Примеры свойств

В следующих примерах показано, как использовать этот ресурс аудита Chef InSpec.

exit_status

Свойство exit_status проверяет код завершения команды:

its('exit_status') { should eq 123 }

stderr

Свойство stderr проверяет результаты команды, возвращаемые в стандартной ошибке (stderr):

its('stderr') { should eq 'error' }

stdout

Свойство stdout проверяет результаты команды, возвращаемые в стандартном выводе (stdout). Следующий пример демонстрирует сопоставление вывода с помощью регулярного выражения:

describe command('echo 1') do
   its('stdout') { should match (/[0-9]/) }
end

Тестирование стандартного вывода (stdout)

describe command('echo hello') do
  its('stdout') { should eq "hello\n" }
  its('stderr') { should eq '' }
  its('exit_status') { should eq 0 }
end

Тестирование стандартной ошибки (stderr)

describe command('>&2 echo error') do
  its('stdout') { should eq '' }
  its('stderr') { should eq "error\n" }
  its('exit_status') { should eq 0 }
end

Тестирование кода возврата

describe command('exit 123') do
  its('stdout') { should eq '' }
  its('stderr') { should eq '' }
  its('exit_status') { should eq 123 }
end

Проверка существования оболочки команды

describe command('/bin/sh').exist? do
  it { should eq true }
end

Проверка отсутствия команды

describe command('this is not existing').exist? do
  it { should eq false }
end

Проверка работы базы данных PostgreSQL в версии RC, разработки или бета

describe command('psql -V') do
  its('stdout') { should eq '/RC/' }
  its('stdout') { should_not eq '/DEVEL/' }
  its('stdout') { should_not eq '/BETA/' }
end

Верификация NTP

В следующем примере показано, как использовать ресурс аудита file для проверки наличия файлов ntp.conf и leap-seconds, а затем ресурс command для проверки установки и работы NTP:

describe file('/etc/ntp.conf') do
   it { should be_file }
end

describe file('/etc/ntp.leapseconds') do
  it { should be_file }
end

describe command('pgrep ntp') do
   its('exit_status') { should eq 0 }
end

Верификация WiX

WiX включает несколько инструментов, таких как candle (предварительная обработка и компиляция исходных файлов в объектные файлы), light (связывание и привязка объектных файлов к базе данных установщика) и heat (сбор файлов из различных входных форматов). Следующий пример использует массив пробелов и ресурс аудита file для проверки наличия этих трёх инструментов:

%w(
  candle.exe
  heat.exe
  light.exe
).each do |utility|
  describe file("C:/wix/##{utility}") do
    it { should be_file }
  end
end

Время ожидания длительных команд

На целевых платформах, поддерживающих эту функцию, ресурс команды принимает необязательный параметр timeout:, который указывает, сколько времени команда может выполняться в секундах, прежде чем она вызовет ошибку и приведёт к провалу проверки.

describe command("find / -owner badguy", timeout: 300) do
  its("stdout") { should be_empty }
end

В этом примере команда find будет выполняться не более 300 секунд, после чего будет прервана и проверка завершится неудачей, если это время будет превышено. На поддерживаемых целевых платформах значение таймаута по умолчанию составляет 3600 секунд (один час).

Помимо настройки значения для каждого ресурса, вы также можете использовать параметр --command-timeout командной строки для глобальной настройки таймаута команд. Параметр командной строки имеет приоритет над любыми параметрами таймаута timeout: для отдельных ресурсов.

В настоящее время поддерживаются следующие целевые платформы:

  • Локальные Unix-подобные ОС, включая macOS
  • SSH-цели
  • Целевые платформы Windows через WinRM

Целевые платформы, не указанные в списке, в настоящее время не поддерживаются.

На платформах, не поддерживающих таймаут, его значение игнорируется, и команда будет выполняться неограниченное время.

Скрытие конфиденциальных команд

По умолчанию команда, которая выполняется, отображается в выводе Chef InSpec. Это может быть проблематично, если команда содержит конфиденциальные аргументы, такие как пароль. Эти конфиденциальные части могут быть скрыты, передав redact_regex и регулярное выражение для скрытия. Необязательно, вы можете использовать 2 группы захвата для точной настройки скрытия.

Следующие примеры демонстрируют, как использовать redact_regex.

# Example without capture groups
describe command('myapp -p secretpassword -d no_redact', redact_regex: /-p .* -d/) do
  its('exit_status') { should cmp 0 }
end

# Result (no capture groups used)
Command: `myapp REDACTED no_redact`
   ✔  exit_status should cmp == 0

# Example with capture groups
# Each set of parenthesis is a capture group.
# Anything in the two capture groups will not be 'REDACTED'
describe command('myapp -p secretpassword -d no_redact', redact_regex: /(-p ).*( -d)/) do
  its('exit_status') { should cmp 0 }
end

# Result (capture groups used)
Command: `myapp -p REDACTED -d no_redact`
   ✔  exit_status should cmp == 0

Для получения дополнительной информации/помощи по регулярным выражениям рекомендуется использовать RegExr

Сопоставители

Полный список доступных сопоставителей можно найти на нашей странице сопоставителей.

exist

Сопоставитель exist проверяет, может ли команда выполняться на системе:

it { should exist }

© Chef Software, Inc.
Licensed under the Creative Commons Attribution 3.0 Unported License.
The Chef™ Mark and Chef Logo are either registered trademarks/service marks or trademarks/servicemarks of Chef, in the United States and other countries and are used with Chef Inc's permission.
We are not affiliated with, endorsed or sponsored by Chef Inc.
https://docs.chef.io/inspec/resources/command/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API