我试图创建一些基本的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
我们注意到网址在控件中是硬编码的,并不是很有趣。我想将它们转移到一些“属性”状态。某种文件,并在控制文件中循环它们。
我的尝试是使用'文件' profile中的文件夹结构。我创建了一个文件 - 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未找到' (虽然不确定确切的错误消息)。以下是我的合规性配置文件的文件夹结构。
我做错了什么?
有没有更好的方法来实现我想要做的事情?
答案 0 :(得分: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测试时,请使用--attrs
指向您的YML文件:
inspec exec mytest.rb --reporter=cli --attrs profile-attribute.yml
答案 1 :(得分:0)
还有另一种使用文件的方法(代替配置文件属性和--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