Spec-Zone.ru › Chef 18

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

[редактировать на GitHub]

Используйте command ресурс аудита 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