使用Ansible进行硬件引导

在最近的Ansible London Meetup上 ,我和某人聊了聊自动化硬件的构建。 “现在全都是云!” 我听你说。 嗯,但是对于许多大型组织而言,却并非如此-他们仍然拥有拥有硬件的大型数据中心。 几乎经常有人在我们的内部邮件列表中弹出并询问: “ Ansible可以进行硬件配置吗?” 是的,您可以使用Ansible来配置硬件…

要求

自举硬件主要与网络服务有关。 在进行任何操作系统(OS)安装之前,我们必须设置一些服务。 我们会需要:

  • DHCP服务器
  • PXE
  • TFTP
  • 操作系统媒体
  • 网络服务器

建立

除了DHCP配置外,本文中的其他所有内容都由该存储库中包含的Ansible脚本处理。

DHCP服务器

我在此假设您可以控制DHCP配置。 如果您无权访问DHCP服务器,则需要要求所有者设置两个选项。 需要将DHCP选项67设置为pxelinux.0下一个服务器 (这是选项66,但是您可能不需要知道;通常DHCP服务器将为“下一个服务器”提供一个字段/选项)到您的TFTP服务器的IP地址。

如果您可以拥有DHCP服务器,建议您使用dnsmasq。 它既小又简单。 我不会在这里介绍如何配置它,而是请看手册页--enable-tftp选项。

TFTP

上面我们的DHCP服务器的next-server设置将指向服务TFTP的计算机。 在这里,我使用了CentOS Linux虚拟机,因为它只需要一个软件包(syslinux-tftpboot)和一项服务即可启动并运行TFTP。 我们将使用默认路径/ var / lib / tftpboot

PXE

如果您还不熟悉PXE,则可以快速浏览Wikipedia页面 。 在本文中,我将简短介绍-我们将通过TFTP提供一些文件,DHCP将我们的硬件引导至TFTP。

您将需要来自OS分发媒体的images / pxeboot / {initrd.img,vmlinuz}用于pxeboot。 这些需要复制到/ var / lib / tftpboot / pxeboot 。 参考的Ansible剧本不会执行此步骤,因此您需要将其复制到自己身上。

我们还需要提供操作系统安装文件。 有两种方法:1)通过HTTP从Internet安装或2)再次通过HTTP从本地服务器安装。 对于我的测试,由于我位于专用LAN上(我想您也是),因此第二个是最快的安装方法。 最简单的方法是将DVD映像挂载,然后将imagesPackagesrepodata目录重新repodata到您的Web服务器位置。 引用的Ansible剧本将安装httpd,但不会复制这些文件,因此在运行该剧本后不要忘记这样做。 在本文中,为简单起见,我们将再次使用默认值-因此需要将文件复制到Apache的标准docroot / var / www / html中

目录

我们应该以这样的目录结构结束:

PXE / TFTP

   
   
[root@c7 ~]# tree  /var/lib/tftpboot/pxe{b*,l*cfg}
/var/lib/tftpboot/pxeboot
└── 6
    ├── initrd.img
    └── vmlinuz
httpd

   
   
[root@c7 ~]# tree -d /var/www/html/
/var/www/html/
├── 6 -> centos/6
├── 7 -> centos/7
├── centos
│   ├── 6
│   │   └── os
│   │       └── x86_64
│   │           ├── images
│   │           │   └── pxeboot
│   │           ├── Packages
│   │           └── repodata
│   └── 7
│       └── os
│           └── x86_64
│               ├── images
│               │   └── pxeboot
│               ├── Packages
│               └── repodata
└── ks

您会发现我的网络设置看起来比上面的文字要简单一些! 我已经粘贴了实际结构,以便给您一些想法。 我使用的硬件确实很旧,甚至使CentOS 7都无法正常工作(如果您有兴趣,这是由于缺少HP Smart Array控制器的cciss驱动程序-是的, 有一个答案 ,但是它需要花大量的精力来完成工作),因此所有示例都是CentOS 6的。我还想要一个可以安装许多版本的灵活设置。 在这里,我已经完成了使用符号链接的操作,例如,这种安排对RHEL也同样适用。 尽管存在基本结构-请注意图像,软件包和存储数据目录。

这些路径与我们将提供的PXE菜单文件以及kickstart文件直接相关

如果没有DHCP

如果您无法管理自己的DHCP服务器,或者基础结构的所有者无法提供帮助,则还有另一种选择。 过去,我曾使用iPXE创建作为虚拟媒体加载的启动映像。 现代硬件上的许多带外/无灯管理(LOM)接口都支持此功能。 您可以使用iPXE在几秒钟内创建自定义的嵌入式PXE菜单。 我不会在这里进行介绍,但是如果发现这对您来说是个问题,那么请在Twitter上给我留言,如果有足够的人要求,我会做一篇后续博客文章。

安装硬件

现在,我们已经有了适当的结构,并且可以启动服务器。 在执行此操作之前,我们必须向TFTP设置中添加一些配置,以使给定的硬件能够使用PXE引导菜单。

在这里,我们遇到了一个小鸡/蛋问题。 我们需要主机的MAC地址来创建指向我们要启动的特定硬件的链接。 如果硬件已经在运行,并且可以使用Ansible进行访问,那就太好了–我们可以通过安装模块找到引导接口MAC地址的方法(请参阅reinstall play )。 但是,如果是一块新的锡,我们需要获取MAC地址并告诉我们的设置如何处理它。 这可能意味着需要进行一些手动干预,例如引导服务器并查看屏幕,或者从清单等获取MAC。 无论您以哪种方式获得它,我们都可以通过清单来告诉我们它的发挥。

让我们将自定义变量放入我们的简单INI格式清单文件中 ,然后运行播放程序来设置TFTP…


   
   
( pip ) iMac:ansible-hw-bootstrap$ ansible-inventory --host hp.box
{
    "ilo_ip" : "192.168.1.68" ,
    "ilo_password" : "administrator"
}
( pip ) iMac:ansible-hw-bootstrap$ ansible-playbook plays/install.yml

PLAY [ kickstart ] *******************************************************************************************************

TASK [ Host inventory entry has a MAC address ] **************************************************************************
failed: [ ks.box ] ( item = hp.box ) = > {
    "assertion" : "hostvars[item]['mac'] is defined" ,
    "changed" : false,
    "evaluated_to" : false,
    "item" : "hp.box" ,
    "msg" : "Assertion failed"
}

PLAY RECAP *************************************************************************************************************
ks.box                     : ok = 0    changed=0    unreachable=0    failed=1

呃,播放失败。 它检查我们将要安装的主机是否确实添加了MAC地址。 让我们修复该问题,然后再次播放该剧…


   
   
( pip ) iMac:ansible-hw-bootstrap$ ansible-inventory --host hp.box
{
    "ilo_ip" : "192.168.1.68" ,
    "ilo_password" : "administrator" ,
    "mac" : "00:AA:BB:CC:DD:EE"
}
( pip ) iMac:ansible-hw-bootstrap$ ansible-playbook plays/install.yml

PLAY [ kickstart ] *******************************************************************************************************

TASK [ Host inventory entry has a MAC address ] **************************************************************************
ok: [ ks.box ] = > ( item = hp.box ) = > {
    "changed" : false,
    "item" : "hp.box" ,
    "msg" : "All assertions passed"
}

TASK [ Set PXE menu to install ] *****************************************************************************************
ok: [ ks.box ] = > ( item = hp.box )

TASK [ Reboot target host for PXE boot ] *********************************************************************************
skipping: [ ks.box ] = > ( item = hp.box )

PLAY RECAP *************************************************************************************************************
ks.box                     : ok = 2    changed=0    unreachable=0    failed=0

可行! 它做了什么? 查看TFTP根目录下的pxelinux.cfg目录,我们可以看到一个符号链接…


   
   
[ root@c7 pxelinux.cfg ] # pwd
/var/lib/tftpboot/pxelinux.cfg
[ root@c7 pxelinux.cfg ] # l
total 12
drwxr-xr-x. 2 root root   65 May 13 14 : 23 ./
drwxr-xr-x. 4 root root 4096 May   2 22 : 13 ../
-r--r--r--. 1 root root   515 May   2 12 : 22 00README
lrwxrwxrwx. 1 root root     7 May 13 14 : 12 01-00-aa-bb-cc-dd-ee -> install
-rw-r--r--. 1 root root   682 May   2 22 :07 install

安装文件被符号链接到以我们的MAC地址命名的文件。 这是关键,有用的部分。 这将确保从其网卡引导时,将将MAC地址为00-aa-bb-cc-dd-ee的硬件提供给PXE菜单。

因此,让我们启动机器。

有用的是,Ansible具有一些远程管理模块 。 我们在这里使用HP服务器,因此我们可以使用hpilo_boot模块使我们不必直接与LOM Web界面进行交互。

让我们在引导的服务器上运行重新安装播放…

您会注意到,关于hpilo_boot模块的整洁之在于它将引导介质设置为网络。 安装完成后,服务器将重新启动并从其硬盘驱动器引导。 你们当中鹰眼的人会发现一个关键问题-如果服务器再次启动到其网卡,会发生什么? 它将显示PXE菜单并立即重新安装。 我建议然后将符号链接删除为“皮带和括号”步骤。 亲爱的读者,我会将其留给您练习。 提示:我将使新服务器在启动时进行“电话回拨”,以运行清理工作。 由于您不需要打开控制台,就像我在这里演示后台发生的事情一样,“电话回家”工作也可以很好地表明过程已完成。 很自然 。 祝好运!

如果您对此过程有任何想法或意见,请告诉我。

翻译自: https://opensource.com/article/19/5/hardware-bootstrapping-ansible

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值