在最近的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映像挂载,然后将images
, Packages
和repodata
目录重新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