ресурс команды
Используйте 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
Защита конфиденциальных команд
По умолчанию команда, которая выполняется, отображается в выводе 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/