Inspec / Serverspec从命令中获取多个stdouts并描述它们

时间:2016-09-20 18:49:20

标签: ruby chef serverspec inspec

我试图创建一个inspec控件,在/boot/grub/grub.conf中搜索以kernel开头(并忽略空格)的每一行,然后检查每一行以查看它是否有&#39 ; nousb'在某个地方。如果找不到nousb,我希望它返回失败。

我的问题是,如果有一行以内核启动,我无法找到一种从grep中获取/描述多个stdouts的方法。这是我可以用.each完成的事情吗?这是我的代码:

control 'os-disable-usb-pcmcia' do
  impact 0.5
  title 'Disable USB and PCMCIA Devices'
  desc "ensure default kernel in grub has 'nousb' option"

  output = command('egrep "^[[:space:]]*kernel" /boot/grub/grub.conf')
  describe output do
    its('stdout') { should match /^\s*kernel[^#]*nousb\b/ } # match nousb anywhere in the 'kernel' line
  end
end

编辑以澄清。

说我的conf文件中有这些行

kernel 1 nousb
kernel 2
kernel 3
kernel 4

测试将考虑它通过,因为尽管多个内核行没有nousb要求,但最初的测试符合它所寻找的内容。

3 个答案:

答案 0 :(得分:0)

使用file资源和Ruby的RegExp匹配(正如您已经在做的那样)。

describe file('/boot/grub/grub.conf') do
  its(:content) { is_expected.to match /whatever/ }
end

编辑以显示如何使用Ruby代码而不是花哨的正则表达式执行此操作:

describe file('/boot/grub/grub.conf') do
  it do
    # Get all the lines in the file.
    lines = subject.content.split(/\n/)
    # Check for any line that _doesn't_ match the regexp.
    without_nousb = lines.any? {|line| line !~ /^.*?kernel.*?nousb.*?$/ }
    # Make a test assertion.
    expect(without_nousb).to be false
  end
end

答案 1 :(得分:0)

测试您的解析结果,而不是内容匹配

您必须在块中编写一些代码来解析您的grub.conf文件,并确保每条记录都有nousb命令 。您也可以尝试Augeas lens for grub为您验证grub.conf。例如:

describe 'validate kernel parameters' do
  it 'should include a "nousb" parameter on each line' do
    # 1. parse your file however you like, then
    # 2. store result as a Boolean.
    expect(result).to be_true
  end
end

检查正在运行的内核

或者,如果您只关心正在运行的内核的结果,您可以check the value使用类似的内容:

# 1. read the remote's /proc/cmdline however you like, then
# 2. evaluate your match.
expect(command_line_contents).to match /\bnousb\b/

答案 2 :(得分:-1)

我终于得到了这个问题。由于您要检查所有内核:

output = command('egrep "^[[:space:]]*kernel" /boot/grub/grub.conf')
ok = output.split("\n")
           .group_by { |line| line[/(?<=kernel )(\S*)/] }
           .map { |kernel, lines| lines.any? { |line| line =~ /nousb/ } }
           .all?

describe output do
  # OK must be TRUE
end

我们在这里:

  • 按行分割输出
  • 按内核名称分组行(regexp可能需要调整)
  • 将哈希{ kernel ⇒ lines }映射为true / false,具体取决于是否显示nousb
  • 检查所有内核是否都有此nousb行。

上面的代码知道grub.cfg可能包含同一内核的多行。 希望它有所帮助。