Ну, PXE не обязательно должен быть тем случаем, когда вы загружаете образ на каждый сервер во время загрузки. Фактически, более традиционное использование этого (по крайней мере, когда имело дело с системами UNIX) состояло в том, чтобы обеспечить бездисковую загрузку для систем, у которых их корневая файловая система была на NFS (или в наши дни, возможно, какая-то другая сетевая файловая система). Я не совсем уверен, насколько хорошо это может сработать для вас (он обменивает временные проблемы PXE на единственную точку отказа на сервере NFS), но, возможно, стоит посмотреть. Вы также можете делать подобные вещи с iSCSI или NBD, хотя их немного сложнее настроить.
Вы также можете посмотреть на возможность загрузки по цепочке, как это делает SystemRescueCD . При сетевой загрузке ему нужно только загрузить syslinux, ядро и начальный ram-диск по TFTP, а затем загрузить действительный образ системы по другому протоколу (например, там, где я работаю, мы делаем это по HTTP). TFTP - ужасно неэффективный протокол (он требует отдельного подтверждения каждого блока перед отправкой следующего блока и по умолчанию использует очень маленький размер блока), поэтому это может значительно ускорить процесс (у нас есть сеть, в которой я работаю установите netboot SystemRescueCD и загрузите образ системы по HTTP вместо TFTP, что сокращает время загрузки с почти 15 минут до примерно 3 в системах, на которых я тестировал его при настройке).
Учитывая, что вы используете что-то на основе Ubuntu, вы можете использовать комбинацию MAAS и Juju, так как это стандартный стек для таких вещей в Ubuntu.
Помимо всего этого, однако, если вы можете с уверенностью предположить, что массовые простои, подобные тому, что вы видели, редки (и, следовательно, вам вряд ли придется переустанавливать все 40 систем сразу), вы можете просто взглянуть на автоматизированный инструмент управления. Это не поможет при установке систем, но значительно упростит развертывание изменений в конфигурации или пакетах в системах. Мне особенно нравится Ansible для такого рода вещей, в основном из-за того, насколько просто его настроить (вам буквально просто нужен пароль без пароля SSH и один конкретный пакет python, установленный в системах, которыми вы собираетесь управлять), и тем, что что он использует декларативный (в основном) декларативный язык для выполнения задач, которые действительно легко выучить. Puppet, Chef и Salt - три других популярных варианта для такого рода вещей, но у меня никогда не было никакого личного опыта с ними, кроме простой оценки, поэтому я не могу дать какой-либо совет, какой из них может быть лучшим для ваше использование.