Estou tentando criar um sistema que funcione de curta duração (compilações de CI e teste) de componentes de software; é obrigatório de acordo com meus requisitos que cada um viva em um host privado. Também estou adotando essa definição para incluir opções de paravirtualização , pois parece que isso me poupará muita dor de cabeça.
Estou trabalhando em um Mac, praticamente todas as tecnologias estão disponíveis, libvirt e quemu , etc, simplesmente não funcionam para mim. No entanto, estou planejando implantar no Debian; então tudo o que é executado no Debian está de volta à mesa, desde que eu possa programar o provisionamento da máquina host e de seus domínios convidados.
Minha configuração pretendida era que eu posso usar para inicializar um instalador Debian, que algo deveria significar que, após a inicialização, a máquina é provisionada automaticamente (Chef, Puppet, Babushka, não se importa, realmente) - e parte desse provisionamento deve criar um rootfs de modelo que podem ser usados para inicializar um contêiner. O próprio contêiner também precisa ser provisionado, para que, quando o contêiner for lançado, ele saiba o que o trabalho deve ser feito, possa fazer o trabalho e, em seguida, saia.
Em resumo, aqui está o fluxo de trabalho que eu preciso:
- Inicialize uma máquina (virtual ou não) e deixe-a pronta para o trabalho.
- O trabalho deve ser realizado por um script instalado pelo chef / fantoche / babushka / etc
- Quando o trabalho chegar, uma máquina virtual deve ser iniciada para fazer o trabalho.
- A VM deve fazer o trabalho, sair e liberar seus recursos para a máquina pai / host. (é importante que isso seja dimensionado para pelo menos centenas de VMs convidadas em hardware razoável)
Cheguei a um ponto em que tentei o seguinte e os abandonei pelos motivos descritos abaixo:
Para a máquina host
- Pré-propaga imagens micro ISO do Debian com Instalinux (suportado por LinuxCOE) ( Ruim: Não funcionou de todo ("Nenhum módulo do kernel encontrado" (porque as imagens do Instalinux estão fora de sincronia com os repositórios FTP), aparentemente esta solução é notoriamente frágil, também não permite muito espaço para pós-instalação, e soltar chaves SSH conhecidas, chaves de host etc. na máquina, parece disparar e esquecer, no final, eu teria uma máquina em execução, mas não teria acesso a ela .)
- Pré-propaga o Debian netinst ISO ( Ruim : mesmos problemas, como acima, exceto pelo menos a instalação normalmente é concluída, pois não há disparidade de kernel entre o ISO e o repositório FTP. Escopo ainda limitado para pós-instalação. Bom : Absolutamente confiável e repetível, fácil de jogar em qualquer pilha de tecnologia VM no Mac ou em uma máquina bare metal, funcionaria em qualquer lugar, mas não consigo instalá-lo o suficiente )
- Vários métodos de construção de um rootfs, e compilá-lo como uma imagem de disco rígido inicializável ( Bad : O pouco que eu poderia começar a trabalhar era frágil como o inferno, seria difícil de instalar em uma máquina real, e é um processo de construção complexa. Bom: Se Eu poderia fazê-lo funcionar, isso pareceria fornecer o maior escopo para pré-configurar a máquina para uma determinada especificação com chaves ssh, chaves de host, nome de host, software instalado a partir do Git e qualquer outra coisa, mas a questão seria como empacotar para distribuição ou como roteirizar sua recreação. )
Sinceramente, não tenho certeza de qual tecnologia as pessoas devem usar para criar uma VM do nada para um sistema em execução, funcional e útil. Parece três etapas para mim: a) sistema operacional, b) configuração do sistema (usuários, etc.) ec) mudanças no sistema de arquivos.
Para as máquinas convidadas (virtuais):
- Muitas coisas, principalmente eu acho que a resposta aqui é um rootfs somente leitura criado com
debootstrap
e uma partição especial no contêiner LXC que contém o trabalho a ser feito para esta instância específica (um manifesto de tarefa). Insira todas as advertências usuais sobre a criação do sistema operacional, a inicialização, a criação de usuários, o check-out do git e o trabalho.
Eu realmente não tenho certeza de quais ferramentas buscar, parece que o problema deve ser bem resolvido. Mas não consigo descobrir onde realmente começar.
A maioria das pessoas parece sugerir para a máquina host que eu deva escolher uma tecnologia de virtualização, inicializar uma máquina em um estado de trabalho e depois capturá-la (a libvirt parece ser a favorita lógica disso). Usando a captura instantânea para abrir as instalações subseqüentes para teste ou produção.
Para as máquinas convidadas, o lxc parece oferecer a opção mais fácil, exceto que o background de um contêiner e a conexão mais tarde ao console são interrompidos em todos os kernels atuais, e a versão mais recente do lxc disponível para o Debian estável tem mais de 18 meses e não possui muitos recursos amplamente úteis.
Normalmente, sou desenvolvedor de aplicativos e muitas vezes não trabalho com tecnologia no nível do servidor (e tenho certeza de que o SF sinalizará essa pergunta como "muito subjetiva"), mas estou realmente incerto de quais ferramentas procurar.
A palavra final é que eu conheço um projeto similarmente empilhado (travis-ci.org) que está usando caixas do Vagrant para isso. Isso parece ser um instrumento bastante contundente, ferramentas grandes, lentas e orientadas para rubi, projetadas para o provisionamento de desktops em pequena escala de VMs de teste usadas para infraestrutura crítica de serviços, mas também conheço alguns desses caras e são mais inteligentes do que eu, então talvez eles tenham desistido.
Qualquer ajuda apreciada.