Обработка атрибутов в InSpec
Я пытался создать несколько базовых тестов inspec для проверки набора HTTP-URL. Я начал так:
control 'http-url-checks' do
impact 1.0
title 'http-url-checks'
desc '
Specify the URLs which need to be up and working.
'
tag 'http-url-checks'
describe http('http://example.com') do
its('status') { should eq 200 }
its('body') { should match /abc/ }
its('headers.name') { should eq 'header' }
end
describe http('http://example.net') do
its('status') { should eq 200 }
its('body') { should match /abc/ }
its('headers.name') { should eq 'header' }
end
end
Мы заметили, что URL-адреса жестко запрограммированы в элементах управления и не очень забавны. Я хотел бы переместить их в какой-нибудь файл "атрибутов" и перебрать их в контрольном файле.
Я пытался использовать структуру папок 'files' внутри профиля. Я создал файл - httpurls.yml и в нем было следующее содержимое -
- url: http://example.com
- url: http://example.net
..и в моем контрольном файле у меня была конструкция -
my_urls = yaml(content: inspec.profile.file('httpurls.yml')).params
my_urls.each do |s|
describe http(s['url']) do
its('status') { should eq 200 }
end
end
Однако, когда я запускаю профиль соответствия, я получаю сообщение об ошибке - "httpurls.yml not found" (хотя не уверен насчет точного сообщения об ошибке). Ниже приведена структура папок для профиля соответствия.
Что я делаю не так?
Есть ли лучший способ достичь того, что я пытаюсь сделать?
1 ответ
Секрет в том, чтобы использовать атрибуты профиля, как определено в нижней части этой страницы:
https://www.inspec.io/docs/reference/profiles/
Сначала создайте в YML-файле атрибуты профиля. Я называю мой profile-attribute.yml
,
Во-вторых, поместите ваш массив значений в файл YML, например, так:
urls:
- http://example.com
- http://example.net
В-третьих, создайте атрибут в верхней части ваших тестов InSpec:
my_urls = attribute('urls', description: 'The URLs that I am validating.')
В-четвертых, используйте свой атрибут в тесте InSpec:
my_urls.each do |s|
describe http(s['url']) do
its('status') { should eq 200 }
end
end
Наконец, когда вы вызываете свой тест InSpec, укажите на свой файл YML, используя --attrs
:
inspec exec mytest.rb --reporter=cli --attrs profile-attribute.yml
Есть еще один способ сделать это, используя файлы (вместо атрибутов профиля и --attrs
флаг). Вы можете использовать JSON или YAML.
Сначала создайте файл JSON и / или YAML и поместите их в files
каталог. Простой пример файла JSON может выглядеть так:
{
"urls": ["https://www.google.com", "https://www.apple.com"]
}
И простой пример файла YAML может выглядеть так:
urls:
- https://www.google.com
- https://www.apple.com
Во-вторых, включите код в верхней части файла InSpec, чтобы прочитать и проанализировать JSON и / или YAML, например так:
jsoncontent = inspec.profile.file("tmp.json")
jsonparams = JSON.parse(jsoncontent)
jsonurls = jsonparams['urls']
yamlcontent = inspec.profile.file("tmp.yaml")
yamlparams = YAML.load(yamlcontent)
yamlurls = yamlparams['urls']
В-третьих, используйте переменные в ваших тестах InSpec, например:
jsonurls.each do |jsonurl|
describe http(jsonurl) do
puts "json url is " + jsonurl
its('status') { should eq 200 }
end
end
yamlurls.each do |yamlurl|
describe http(yamlurl) do
puts "yaml url is " + yamlurl
its('status') { should eq 200 }
end
end
(Обратите внимание puts
линия для отладки.)
Результат - то, что вы ожидаете:
json url is https://www.google.com
json url is https://www.apple.com
yaml url is https://www.google.com
yaml url is https://www.apple.com
Profile: InSpec Profile (inspec-file-test)
Version: 0.1.0
Target: local://
http GET on https://www.google.com
✔ status should eq 200
http GET on https://www.apple.com
✔ status should eq 200
http GET on https://www.google.com
✔ status should eq 200
http GET on https://www.apple.com
✔ status should eq 200