如何管理数百个 IPMI BMC?

Ste*_*ski 31 ipmi configuration-management

我有 200 多台可以提供IPMI服务的计算机。服务器由几家不同的公司(SuperMicro、Dell 等)制造,大约有 5 家不同供应商的 6-7 种 BMC 型号,每种型号都有自己的特性。

到目前为止,我们一直在使用 DHCP 和手动配置每个 BMC 的组合来配置 BMC。手动配置可以使用可引导 CD-ROM、从 BIOS 配置(如果支持)、从主机操作系统使用ipmitoolfreeipmi等实用程序或远程使用 ipmitool 来完成,如果我们可以确定网络地址的话设备。

但是,这种手动配置相当繁琐。在某些情况下,我们希望在所有 BMC 上全局更改设置,这需要管理员针对数十个框运行命令。由于 BMC 由不同的供应商提供,并且每种型号​​的 BMC 可能都有自己的特性,因此相同的命令并不总是适用于所有 BMC。

是否有任何实用程序可以让我在数十个盒子上批量配置 BMC?假设我想在几十个不同的 BMC 上查询一个参数,或者更改密码,禁用对 WebUI 的 HTTP 访问或禁用臭名昭著的密码零安全漏洞。

任何允许我更新 BMC 固件的实用程序的奖励积分,这是缓解几个安全漏洞所必需的

Tom*_*nor 16

我可能会使用Ansible。这是一个非常简单的配置管理/编排引擎,比 Puppet 更容易上手(Puppet 曾经是我的首选,但现在并非总是如此,因为我发现了 Ansible)。

Ansible 的好处是它直接通过 SSH 进行通信,因此您可以仅使用现有的 SSH 凭据和工作流程开始使用。

如果您当前正在使用 ipmitool 配置 BMC,则可以执行以下操作:

定义一个 Hosts 文件——这会告诉 Ansible 哪些主机在bmc组中(在这种情况下),以及在哪些主机上运行。

[bmc]
192.168.1.100
192.168.1.101
192.168.1.102
Run Code Online (Sandbox Code Playgroud)

依此类推...您也可以在该文件中使用主机名,只要它们是可解析的。

然后创建一个“剧本”,它是在主机组中的每个主机上运行的一组命令。你想要这种自上而下的目录布局:

ansible/
   playbooks/
      bmc.yml
      roles/
        bmcconfig/
           files/
           handlers/
             main.yml
           tasks/
             main.yml
           templates/
   group_vars/
      all
Run Code Online (Sandbox Code Playgroud)

剧本有角色,它们是您可以分解和重用的配置的小部分。

所以我会创建一个名为bmc.yml(所有 Ansible 配置都在 YAML 文件中)的文件

---
- name: Configure BMC on the hosts
  hosts: bmc
  user: root
  roles: 
    - bmcconfig
Run Code Online (Sandbox Code Playgroud)

然后在里面roles/bmcconfig/tasks/main.yml你可以开始列出要在每个主机上运行的命令,以与 ipmi 通信。

---
  - name: Install ipmitool
    apt: pkg=ipmitool state=installed
  - name: Run ipmitool config
    shell: ipmitool -your -options -go -here
Run Code Online (Sandbox Code Playgroud)

当您运行的剧本,用ansible-playbook -i hosts bmc.yml中列出的命令,tasks/main.yml为每个角色将在自上而下的顺序上的每个主机在发现被执行bmc主机组中hosts

group_vars/all 是一个有趣的文件,它允许您定义可在您的剧本中使用的变量和值的键值对。

所以你可以定义类似的东西

ipmitool_password: $512315Adb
Run Code Online (Sandbox Code Playgroud)

在您group_vars/all的结果中,您将能够拥有以下内容:

shell: ipmitool -your -options -go -here --password=${ipmitool_password}
Run Code Online (Sandbox Code Playgroud)

在剧本中。

您可以在Ansible 文档页面找到有关如何使用“模块”的更多信息 - Ansible 的组件,允许您做一些事情,如何编写自己的 :D 等等。


Jen*_*man 13

我写了一个小的 python 工具来在我们的 1000 台机器上运行命令,(以及他们的 bmc、drac、ilo 和 imm)

我所做的是编写了一个名为vsc-manage的 python 框架,我可以在其中运行发送到服务器或 bmc 的命令,然后配置什么类型的机器需要什么命令。

我有几个类结合了这些命令的组合,

因此,对于具有imm 的机器,它将通过 ssh 连接到 imm,并运行power off(以一种期望脚本的方式)

对于我们的imb 刀片机箱,它将在机箱上运行它

power -%(command)s -T system:blade[%(blade)s]
Run Code Online (Sandbox Code Playgroud)

对于某些戴尔 drac,它将在(主节点的)操作系统上运行

idracadm -r %(hostname)s -u root -p '%(password)s' serveraction %(command)s
Run Code Online (Sandbox Code Playgroud)

对于我们执行ipmi 的较新的 hp 系统(我最近看到越来越多),它将在主服务器上运行:

ipmitool -I lanplus -H %(hostname)s -U %(user)s -P '%(password)s' chassis power %(command)s
Run Code Online (Sandbox Code Playgroud)

或更新的戴尔系统需要ipmitool -I open,您可能需要稍微使用该协议。

对于未包含在 ipmi 标准中的设置,我已经从DMTF SMASH CLP实现了一些东西 ,例如打开定位器 led:

start /system1/led1
Run Code Online (Sandbox Code Playgroud)

所有这些都在一个可以从我们的笔记本电脑上运行的命令行工具中完成,该工具将连接到正确的主节点,为正确的节点运行正确的命令,并返回输出,如果有任何错误,还有一个额外的列表(基于在 stderr 和/或 exitcode 上输出)

这已被证明非常方便,现在添加对新硬件类别的支持相对容易(感谢大多数供应商现在完全支持 ipmi 和 DMTFSMASHCLP)

这不适合初始配置(它需要 bmc 具有唯一的 ip 和正确的网关,但这是我们的供应商在交付时需要向我们提供的)但几乎可以做任何其他事情(也可以在主机上运行任意命令系统,并在您重新启动节点时自动安排icinga/nagios 中的停机时间,和/或一次确认 icinga/nagios 中的 1000 台主机和服务)

更新 bmc 固件和添加对我们交换机的支持是计划中的突出问题。

更新

由于至少有些人似乎感兴趣,我今天对其进行了最后润色,并将其开源在 https://github.com/hpcugent/vsc-manage

虽然这非常针对我们自己的工作流程(quattor 和/或 pbs),但我希望它至少会很有趣。