You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于无法使用不同控制项针对多目标运行Inspec的技术咨询

解决Inspec不同控制项对应多目标运行的问题

我明白你的痛点——同一个Inspec配置里既有云资源控制又有操作系统控制,只能指定一个目标导致其中一组控制没法正常跑。这里有几个实用的解决方案,你可以根据自己的场景选:

方案1:拆分控制到不同子Profile,分别运行后合并报告

这是最直观的方式,把AWS相关的控制和操作系统相关的控制拆成两个独立的子Profile,然后分别针对对应目标运行,最后合并结果:

  1. 拆分你的控制文件:

    • 创建aws-controls/controls/aws.rb,放AWS的控制代码:
      control "aws" do
        describe aws_ec2_instance(name: 'Terraform Test Instance') do
          it { should exist }
        end
      end
      
    • 创建os-controls/controls/os.rb,放操作系统的控制代码:
      control 'operating_system' do
        describe command('lsb_release -a') do
          its('stdout') { should match (/Ubuntu/) }
        end
      end
      
  2. 分别运行两个Profile并生成JSON报告:

    # 运行AWS控制,指定AWS目标
    inspec exec ./aws-controls -t aws://us-east-1 --reporter json:aws-results.json
    # 运行操作系统控制,指定SSH目标
    inspec exec ./os-controls -t ssh://user@your-host-ip --reporter json:os-results.json
    
  3. 合并两个报告:

    inspec report merge aws-results.json os-results.json --output combined-results.json
    

    这样你就能得到一份包含所有控制结果的统一报告了。

方案2:在控制块内直接指定目标(Inspec 4.0+支持)

如果你不想拆分Profile,可以在每个控制块里用inspec.with_target方法指定该控制要使用的目标,这样一次运行就能覆盖所有控制:

修改你的控制代码如下:

# AWS控制项,指定AWS目标区域
control "aws" do
  inspec.with_target("aws://us-east-1") do
    describe aws_ec2_instance(name: 'Terraform Test Instance') do
      it { should exist }
    end
  end
end

# 操作系统控制项,指定SSH目标
control 'operating_system' do
  inspec.with_target("ssh://user@your-host-ip") do
    describe command('lsb_release -a') do
      its('stdout') { should match (/Ubuntu/) }
    end
  end
end

然后直接运行你的Profile即可,不需要加-t参数:

inspec exec your-profile-directory

⚠️ 注意:要确保对应的认证信息已经配置好——AWS目标需要提前设置好AWS凭证(比如环境变量AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY,或者~/.aws/credentials文件);SSH目标要确保能无密码登录,或者在目标字符串里指定密钥路径(比如ssh://user@host -i ~/.ssh/your-key.pem)。

方案3:使用Targets文件结合标签匹配

如果你的控制项更多、目标更复杂,可以用Targets文件来定义多目标,再给控制项加标签,让Inspec自动匹配执行:

  1. 创建targets.yml文件,定义目标和对应的标签:
- name: aws-cloud-target
  target: aws://us-east-1
  tags: [aws]
- name: ubuntu-server-target
  target: ssh://user@your-host-ip
  tags: [os]
  1. 给你的控制项添加对应的标签:
control "aws", tags: ['aws'] do
  describe aws_ec2_instance(name: 'Terraform Test Instance') do
    it { should exist }
  end
end

control 'operating_system', tags: ['os'] do
  describe command('lsb_release -a') do
    its('stdout') { should match (/Ubuntu/) }
  end
end
  1. 运行时指定Targets文件:
inspec exec your-profile --targets targets.yml

Inspec会自动把带有aws标签的控制项拿到AWS目标上执行,带有os标签的控制项拿到SSH目标上执行。

内容的提问来源于stack exchange,提问作者Brian Carpio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:39:49