Bem, o PXE não precisa ser um caso em que você faz o download da imagem para cada servidor quando eles são inicializados. Na verdade, o uso mais tradicional para ele (pelo menos quando lidando com sistemas UNIX) era fornecer inicialização sem disco para sistemas que tinham seu sistema de arquivos raiz no NFS (ou atualmente possivelmente algum outro sistema de arquivos de rede). Eu não tenho certeza de quão bem isso pode funcionar para você (ele negocia os problemas de tempo do PXE para um único ponto de falha no servidor NFS), mas pode valer a pena olhar. Você também pode fazer coisas parecidas com o iSCSI ou o NBD, embora isso seja um pouco mais complicado de configurar.
Você também pode olhar para a possibilidade de fazer o carregamento de uma cadeia de modo similar ao SystemRescueCD . Quando se está inicializando, ele só precisa carregar o syslinux, o kernel e o disco RAM inicial através do TFTP, e pode então carregar a imagem real do sistema através de outro protocolo (por exemplo, onde eu trabalho, nós o fazemos através do HTTP). O TFTP é um protocolo terrivelmente ineficiente (requer que cada bloco seja reconhecido separadamente antes que o próximo bloco possa ser enviado e use um tamanho de bloco muito pequeno por padrão), portanto, isso pode acelerar significativamente o processo (temos a rede onde trabalho configure para o netboot SystemRescueCD e faça com que ele carregue a imagem do sistema por HTTP em vez de TFTP, o que reduz o tempo de inicialização de quase 15 minutos para cerca de 3 nos sistemas em que eu testei quando o configurei.
Dado que você está executando algo baseado no Ubuntu, você pode usar uma combinação de MAAS e Juju , como essa é a pilha padrão para fazer esse tipo de coisa com o Ubuntu.
Além de tudo isso, se você puder presumir com segurança que as interrupções em massa, como as que você viu, são raras (e, portanto, você provavelmente não precisará reinstalar todos os 40 sistemas de uma só vez), talvez veja um gerenciamento automatizado ferramenta. Não ajudaria na instalação de sistemas, mas simplificaria muito a implementação de alterações na configuração ou pacotes nos sistemas. Eu particularmente gosto de Ansible para esse tipo de coisa, em grande parte por causa de como é simples de montar (você literalmente só precisa login SSH sem senha e um único pacote python específico instalado nos sistemas que você pretende gerenciar) e o fato de que ele usa uma linguagem stateful (principalmente) declarativa para lidar com tarefas que são realmente fáceis de aprender. Marionete , Chef e Salt são as outras três opções populares para esse tipo de coisa, mas eu nunca tive nenhuma experiência pessoal com elas além da avaliação superficial, então eu não posso realmente dê qualquer conselho sobre qual pode ser melhor para o seu uso.