短的:
我正在寻找一种 PXE 引导 Ubuntu 20.04 的方法,并使用新的自动安装进行完全无人值守的安装。但我希望user-data
根据客户端的 MAC 在服务器端修改 YAML
我发现了什么
- 我有启动内核选项,
nocloud-net;s=http://...
但我看不到将自定义字符串作为 URL 的一部分发送(或完全基于本地 MAC 更改 URL)的方法 - 我看到
early-commands
哪个说autoinstall
运行后会刷新,但我没有产生任何有效的方法来使用它来将修改后的数据注入新的自动安装;例如。然后执行wget http://myurl/$MAC
该文件并修改已经运行的自动安装 - 使用
late-commands
是最后的选择,我确实可以这样做wget http://myurl/$MAC && .. && ...
。设置静态 IP/GW/网络掩码,但似乎更容易出错 - 编辑:似乎我可以有另一种方式,但也需要在我预期的 Web 管理之外进行手动处理,即为每个客户端提供不同的 pxelinux.cfg 并更改其中的 URL,但这是通过 TFTP 提供的,因此没有服务器端脚本(除非有解决方法?) Edit#2:这可以工作,将 TFTP 和 HTTP 服务器指向同一个文件夹,并告诉 PHP 在 /pxelinux.cfg/AA-BB-CC-DD-EE- 下生成自定义文件01 ... -02 ... -03 .. 等用于我的数据库中的每个 MAC,并在保存 DB 中的条目时检查/重新生成文件。至少保持单一管理点的概念。但如果有人知道更好的解决方案,我会留下问题(见上面的选项)
最终目标
我想要一个“主”PXE 服务器,它是 HTTPS 服务器和 Web 管理的所在地,在那里我可以有一个包含所有设备的表(例如在 MySQL 中),以及与每个设备相关的所有设置。然后,当我们部署新客户端(主要是一些愚蠢的信息亭之类的东西)时,我会选择它们的 MAC,启用 PXE 引导,标记它们,然后将它们发送到远程位置。该 MAC 和位置将通过 Web 管理输入 MySQL,以及静态 IP、GW、DNS、浏览器主页、屏幕旋转等内容。一旦它们到达并有人连接它们,它们将启动到无人值守的 PXE 安装,通过它,在处理过程中,他们将从 Web 服务器中提取配置(例如user-data
,实际上将由 PHP 处理,并根据需要注入所需的配置),它会 - 嗯......只是工作。它可以适用于live
图像也是如此,只是以不同的方式。
我大部分时间都坚持autoinstall
和nocloud-net
启动,一开始看起来很棒,我可以为每个客户端提供一个自定义的无人值守文件,除了我无法从另一个客户端识别一个客户端的事实。获取http://myserver/user-data?AA-BB-CC-DD-EE-FF
似乎不在规范中,仅通过 IP 选择它是行不通的,因为那些将是随机的 DHCP,不幸的是,使用 DHCP 保留修复它是一场噩梦,因为我们正在谈论 100 多个位置,每个位置都有自己的本地DHCP等
我的想法已经不多了,所以希望有人能加入。任何能让我前进的想法(来自late-commands
)都会很棒!它不必是 MAC,也可以是 UIID 或其他一些硬件 ID(序列号等),但它应该是唯一且易于获取的。MAC通常是盒子外面的贴纸。
哦,如果你想知道我为什么这么反对late-commands
......好吧.. 事情是我不反对它,只是动态修改无人参与的文件会更加灵活。我可以从一开始就设置主机名、IP、用户名、密码、磁盘大小等等。比使用某些默认值引导更干净,然后尝试使用 bash 脚本尝试修复它(特别是磁盘/分区)。毕竟,这就是为什么我们首先要有autoinstall
脚本,而不是在第一次启动后重新执行所有操作。
所以看来我终于解决了。它既简单又充满了错误和障碍。答案是肯定的——使用早期命令。但真相在细节中,如此详细的答案。
首先,准备好其余的环境,您可以查看我的另一篇文章,了解我执行 20.04 和 20.10 的 BIOS/UEFI PXE 启动的详细步骤: https ://askubuntu.com/a/1292097/1080682
现在,当您的环境正常工作时(祝您好运),让我们根据通过 HTTP 中间安装提供的配置更改进行自定义自动安装。
因此,如果您按照我在链接上发布的指南进行操作,我会将 Ubuntu 用户数据保存在这里:
用这样的东西修改文件(注意我已经缩短了它的可读性):
现在,这个用户数据可以是真正的基本数据,我们真正需要的只是启用网络并
curl
在early-commands
. IP10.10.2.1
是我的 HTTP 服务器的本地 IP(也是我的 PXE 服务器,因为我通过它提供其他配置文件和 ISO 映像以及所有这些,但没关系)。使用您想要修改的任何内容,并根据请求提供此文件。上面使用 curl 完成的方式实际上会从服务器请求如下内容:
这部分
fa:fa:fa:00:0e:07
是服务器在查询自己的接口后发送的内容。如果您有多个界面,您可能需要调整脚本,或者确保在早期安装步骤中只启动一个界面。我打算通过 PHP + MySQL 使用它,并在 PHP 中使用
$_GET["mac"]
类似的操作SELECT * FROM autoinstall-configs WHERE mac = '$_GET["mac"]';
和从数据库表中的数据中获取它之后,构建新的autoinstall.yaml
并将其返回给 subiquity。无论如何,您的回复必须没有线路
autoinstall:
!这是 HTTP/PHP 将回复的最小示例,我只更改了主机名和用户名,并对其进行了修改,使其通过 subiquity 语法检查,哦并排除了早期命令,以免陷入循环:
为了清楚起见,这是两个文件的差异:
所以它几乎是一样的,只是不是。这些更改(删除
autoinstall:
和early-commands:
)需要传递到安装的其余部分。您可以自行测试其他调整。之后,安装将继续使用通过 answer to request 提供的任何新信息
/user-data?mac=<installer-mac-address>
。现在,这为为您的虚拟机或服务器场或其他任何东西进行自己的 Web 管理打开了大门。您不再需要为每个服务器或服务器组手工制作的用户数据文件。您可以向他们发送各自独特的配置,包括准确的静态 IP 地址、分区大小、不同的主机名、密码等。
规范,如果您从中选择一个想法,请至少将我放在学分中:)
结案,加油!
根据您用于 PXE 的内容,您可以在引导参数中使用变量。例如,使用 GRUB(通常用于 UEFI 机器)将提供
${net_default_mac}
MAC 地址作为变量。一般来说,我认为
early-commands
是最好的选择。我不确定您尝试时失败的原因。我认为您可以获取动态生成user-data
的文件并覆盖该/autoinstall.yaml
文件。尽管我使用 Ansible/Ansible Tower 作为我的事实来源,但我实现了类似的事情。本质上,我将 iPXE 脚本设置为使用存储在 OpenShift (kubernetes) 中的简单烧瓶应用程序,其中机器的 MAC 地址请求自动安装配置。Ansible 然后运行并生成一个特定于机器的自动安装(使用 Jinja2 模板)配置文件并提供它。没有早期的剧本。
我对早于 20.04 的 Ubuntu 版本的 preseeds 做了类似的事情。
_isknownhost
是一个调用 ansible-inventory 来查找具有匹配 mac 地址的系统的函数。