我们只需4/30即可调整Futureestack注册。条款和条件适用。 现在注册

使用Ansible作为硬件审核工具

9分钟阅读

Container Fabric团队运行New Relic内部的容器编排和运行时平台。该团队的关键功能之一是确认我们拥有跨容器集群部署的具有一致设置和版本的健康硬件。Container Fabric中主机之间简单的设置不匹配可能导致性能和行为不一致,从而影响高级服务并使故障排除复杂化。

当我们开始构建平台时,我们正在使用Ansible对于我们的基本配置管理CoreOS容器Linux主机,并且我们做出了扩展该功能的早期决定,这样我们也可以使用Ansible对我们的系统执行一些非侵入性审计。

这篇文章将介绍我们如何利用Ansible作为一个基本的审计工具来确保主机满足关于配置、健康和安全的预期需求。在Container Fabric项目的早期阶段,Ansible帮助我们将所需的工具数量降至最低,同时帮助我们确保硬件的所有重要方面都按照预期配置。我们的硬件配置测试检查了很多东西,包括BIOS设置和RAID配置。希望这篇文章能给你一些关于在你的基础设施中使用Ansible运行审计检查的想法。

(注意:此帖子假定Ansible和Task执行的工作知识。)

首先,将我们对Ansible的需求定义为硬件审计工具

在我们开始构建审计解决方案之前,我们定义了我们的需求。

  • 该解决方案必须能够检测和报告我们认为重要的任何不合格配置。这些检查应该是我们没有永久执行的事情Terraform.或Ansible配置管理运行。
  • 集装箱织物是在不同数据中心的多样化主机上建立的,因此我们的解决方案必须能够检测到底层平台并应用正确的检查。
  • 每次运行都必须完全没有困难的错误并产生结果的报告。
  • 该解决方案必须是完全非侵入性的,并且只有在绝对需要正确查询主机时才允许拉出和启动支持容器。
  • 该解决方案必须对人类和自动配置过程有用。

创建一个Ansible剧本角色来运行我们的审计

因为Container Fabric团队已经使用了大量的杠杆Ansible剧本的角色,我们在代码库中添加了两个新角色:validate_barebones,我们将其设计为一收到新提供的主机就在其上运行(尽管它可以在任何时候安全地运行)validate_postansible,建立在validate_barebones并旨在在已经过度配置管理的系统上运行。

所以我们需要做的第一件事就是为我们的新角色创建一个简单的剧本。

--- -包括:bootstrap_ansible。当:no_includes未被定义时- hosts: '{{target_hosts}}'成为:yes become_method: sudo gather_facts: True roles: - validate_barebones

no_includes变量是我们在开发中快速测试剧本的一个技巧,而不需要运行整个Ansible工作流。

我们把主人分配给{{target_hosts}}变量,这样任何启动Ansible的东西都必须在运行中定义目标主机,而不是默认为典型的(也是危险的)所有主机。

我们执行这个剧本时,安西尔布执行了validate_barebones的角色。这个角色由三个文件组成:一个任务YAML文件(任务/ main.yaml),处理程序YAML文件(处理程序/ main.yaml)和一个Jinja 2模板(模板/ barebones_report.j2.),我们在生成报告时使用的。

任务/ main.yaml文件是我们为审计运行定义任务的地方,但是在运行审计任务之前,我们运行了一些任务来确定主机运行在哪个平台上。

- name: 'Detect AWS Instance' shell: "grep -qi amazon /sys/devices/virtual/dmi/id/bios_version" register: in_aws ignore_errors: True changed_when: False failed_when: False
- 名称:'检测Dell Server'shell:“Grep-Qi PowerEdge / Sys / Devely / Virtual / DMI / ID / Product_Name”注册:Dell_Hardware Ignore_Errors:True Crepart_When:False Failed_When:False
- 名称:'检查未知平台'#此检查应该实际上失败运行,如果是真的shell:“echo”failed_when:in_aws |失败和dell_hardware |失败

在前两个小节中,我们检查主机是在Amazon上运行,还是在Dell PowerEdge服务器上运行,然后注册的变量为了in_awsdell_hardware这些检查的结果。如果主机既不在AWS中也不在戴尔硬件上部署,我们就退出运行,如最后一节所述。(不过,我们从未真正期望这种情况发生。)

示例个人审核任务

一旦我们确定了主机运行的平台,就可以开始运行审计检查了。以下检查确保Docker在主机上运行:

# Docker - name: 'Docker daemon正在运行' #这个检查实际上应该失败运行,因为很多依赖于它。-H unix:///var/run/docker。sock ps' register: docker_running changed_when: False

集装箱结构在CoreOS容器Linux上运行,因此必须依赖容器运行大多数软件,包括查询Dell硬件的重要细节所需的工具。因此,如果Docker未运行,我们确保此检查将失败整个运行(通过注册docker_running多变的)。线路换句风:假告诉Ansible这个命令没有对我们想要跟踪的系统做任何更改。

使用多步审计任务

除了进行简单的个人审计外,我们还有更复杂的检查。Dell EMC OpenManage Server Administrator (OMSA)是戴尔工具的名称,用于查询大多数特定于戴尔的设置。下面的检查确定OMSA容器是否已经运行,如果没有启动它,然后检查主机BIOS电源配置文件是否配置正确。我们通过使用单个处理程序运行几个任务来完成这个检查。

任务是这样的:

——unix-socket /var/run/dockersock http://localhost/containers/json?all=true | grep -q /omsa' register: omsa_local changed_when: False ignore_errors: True when: dell_hardware|success failed_when: False args: warn: False
#启动OpenManage Container(睡眠允许进程启动) - 名称:'启动OpenManage Container'#此检查实际上应该失败运行,因为很多取决于它。shell:“docker -h unix:///var/run/docker.sock运行 - 专项-d -p 1311:1311 -p 161:161 / udp - restart = always -v / lib / modules /`uname-r`:/ lib / modules /`uname -r` --name = omsa registry.example.net/dell-openmanage84 :latest &&睡眠40“何时:( omsa_local |失败和dell_hardware |成功)注册:launch_omsa expance_when:Launch_omsa |成功通知:删除omsa
///var/run/docker - h unix:///var/run/dockersock exec omsa omreport chassis biossetup display=shortnames -fmt ssv | grep SysProfile' ignore_errors: True when: dell_hardware|success failed_when: False register: bios_power changed_when: ("PerfOptimized" not in bios_power.stdout)

这些任务展示了我们在Ansible的能力中获得了一些创造性。让我解释一下。

我们希望这些检查能够生成一个全面的报告,所以我们从不希望Ansible运行失败。为了确保它们永远不会失败,我们进行了定义failed_when:假在每项任务中。

我们还希望报告告诉我们的不仅仅是一个系统是否兼容;我们想要了解系统在什么方面不符合规定。

多步骤任务是如何工作的

第一个斯坦扎确定了吗?Dell OpenManage(OMSA)容器已在主机上运行。如果是,我们使用现有容器并避免在运行结束时卸载它。(这参数:警告:假的选项禁用Ansible给我们关于使用的警告卷曲,而不是依赖于Ansible的底层库函数。)

第二节启动了Dell OpenManage容器(如果它还没有运行)(当:omsa_local |失败)系统在戴尔硬件上(当:Dell_Hardware |成功)。如果我们启动了容器,我们还注册了一个处理程序来在末尾运行notify: remove omsa。这样,我们只有在启动容器时才会移除它。

第三个节奏执行使用Dell OpenManage Container的支票。shell命令确定Dell BIOS电源配置文件设置,从而为其创建值注册:bios_power。的输出注册:bios_powerbios_power.stdout)经常会看起来像这样:

{"changed": false, "cmd": "docker -H unix:///var/run/docker. exe "袜子exec omsa omreport底盘biossetup显示=简称fmt科学| grep SysProfile”、“δ”:“0:00:00.153451”、“结束”:“2017-02-16 18:55:53.583467”、“失败”:假的,”failed_when_result”:假的,“钢筋混凝土”:0,“开始”:“2017-02-16 18:55:53.430016”、“stderr”:“”、“标准输出”:“SysProfile; PerfOptimized”、“stdout_lines”:["SysProfile;PerfOptimized"], "warnings": []}

然后我们用换句话说:(“穿过”不在Bios_Power.Stdout中)陈述句,用于第三节。稍后,我们还将此输出添加到更大的报告中。

审计运行完成后,任务中的最后一步是让Ansible触发任何注册的处理程序(处理程序/ main.yaml),包括删除Dell OpenManage容器:

- 名称:删除Omsa shell:“docker -h unix:////war/run/docker.sock rm -f omsa”

生成审计报告

我们的playbook角色中的最后一个任务是只运行一次并生成报告的本地操作。

#报告结果 - 名称:生成报告成为:否local_action:template src = barebones_repones.j2 dest = / tmp / barebones_report.txt run_once:true exputh_when:false

以下是jinga 2模板文件的代表部分(模板/ barebones_report.j2.)我们使用要创建最终报告:

{{“% s”、“% s”、“% s”、“% s”、“% s”|格式(“贫乏的部分”、“测试名称”“改变”,“主机名”,“数据”)}}{%设置部分=“平台”%}{%设置测试= '类型' %}{%我在play_hosts %}{%如果hostvars[我](“in_aws”)是定义和hostvars[我][' in_aws '] [' rc '] = = 0%}{{”“% s”、“% s”、“% s”、“% s”、“% s”|格式(部分、测试“False”,我“AWS实例”)}}{% elif hostvars[我](“dell_hardware”)是定义和hostvars[我][' dell_hardware '] [' rc '] = = 0%}{{”“% s”、“% s”、“% s”、“% s”、“% s”|格式(部分、测试“False”,我,”戴尔硬件”)}}{%其他%}{{”“% s”、“% s”、“% s”、“% s”、“% s”|格式(部分,测试,“真正的”,我“未知/遥不可及的")}}{% endif %} {% endfor %}{%设置部分= bios的%}{%设置测试=“权力模式”%}{%我的play_hosts |排序%}{%如果hostvars[我][' bios_power ']定义和“跳过”不是hostvars[我][bios_power '] %} {{'"% 年代”、“% s”、“% s”、“% s”、“% s”|格式(部分、测试hostvars[我][' bios_power ']['改变'],我,hostvars[我][' bios_power '](“标准输出”)。Strip (' \t\n\r'))}} {% endif %} {% endfor %}

最后,这里是我们在两台主机上运行的部分报告(以逗号分隔值(CSV)格式):

"Barebones Section", "Test Name", "Changed", "Hostname", "Data", "platform", "type", "False", "agent-10.example.net", "Dell hardware", "platform", "type", "False", "agent-11.example.net", "Dell hardware", "bios", "Power Mode", "False", "SysProfile;PerfOptimized" "bios", "Power Mode", "False", "agent-11.example.net",SysProfile;PerfOptimized" "network", "bond0 - Bonding Mode", "False", "agent-11.example.net", 2 "network", "bond0 - Bonding Mode", "True", "agent-11.example.net", 1

第一行是报告其余部分的表头。在Changed列中具有True值的最后一个条目表明我们需要解决的分歧。然后,我们使用这些数据创建罚单并安排任何必要的补救工作。

主动>反应

虽然我们总是希望在预期的状态下将硬件交付给我们,但重要的是遵循“信任但验证”模型,以确保在我们控制之外的早期测试期间“通过裂缝滑移”的内容。

在团队实施这些支票之前,大部分发现过程都会被真实的事件引发,并且在我们有一个之前,我们不会知道存在问题。基于Ansible的审计工作流程帮助我们提前识别问题,并帮助我们跟踪以前发现的问题,以便我们再次击中它们。

设计和扩展这些审计剧本对团队中的每个人来说都非常容易,通过在我们的初始基础架构中定期运行它们,我们了解了很多关于我们需要跟踪和纠正的关键设置。利用这些知识,我们能够继续前进,并使用基于python的方法为我们的产品启动实现一个更加健壮的测试解决方案TestInfra工具。