Planejamos automatizar a criação de VMs para nossa infraestrutura de construção, para que possamos:
- Escale os recursos de construção com base na demanda, por exemplo, adicionando mais agentes de construção quando necessário e removendo-os quando não necessário
- Recrie todo ou parte do ambiente de construção se / quando as máquinas morrerem
- Duplique o ambiente de construção quando precisarmos de uma configuração de teste
Uma das etapas deste processo é automatizar a criação das imagens base da VM (no nosso caso, usando o Hyper-V). Para isso, temos um script que:
- Cria um novo VHDX da ISO com o script Convert-WindowsImage . Atualmente, estamos usando o Windows 2012R2, mas pretendemos começar com 2016 assim que disponível.
- Adiciona um script autônomo ao novo VHDX com toda a configuração básica que precisamos
- Atualiza o VHDX com os patches mais recentes do Windows usando o script Apply-WindowsUpdate
- Cria uma nova VM Hyper-V baseada no VHDX e a inicia
- Aguarda a inicialização da VM e aguarda o serviço WinRM estar pronto para aceitar conexões remotas
- Aguarda o Windows concluir a configuração inicial e a configuração dos novos patches
- Aplica outros patches
- Reinicia para concluir a configuração dos patches mais recentes
- Aguarda o Windows concluir a configuração dos patches
- Envia um script sysprep para a máquina e chama esse script. Isso executa o sysprep e depois desliga a máquina
- Exclui a VM, mas mantém o VHDX
- Remove sysprep e arquivos autônomos do VHDX e depois compacta o VHDX
- Move VHDX para o local do modelo e marca como somente leitura
O problema que estamos enfrentando está nas etapas 6 e 9. Idealmente, esperamos que toda a configuração seja concluída antes de reiniciar / desligar a máquina, mas não parece haver uma maneira de detectar se o Windows terminou o estágio de configuração.
Ao percorrer a interface do usuário, fica muito claro quando uma das etapas é concluída porque a interface do usuário de logon não aparece até que o processo esteja pronto. No entanto, ao usar o WinRM para conectar-se remotamente à máquina, isso fica menos claro porque o WinRM fornece acesso à máquina antes de concluir o trabalho de configuração.
Portanto, a questão é qual é a maneira mais segura de detectar através de uma conexão remota que o Windows concluiu a configuração de atualizações etc. para que possamos reiniciar / desligar a máquina sem causar problemas mais tarde.
------ EDIT -----
No final, estamos usando uma versão modificada da resposta de Katherine, pois nosso script também espera windeploy
e ngen
é concluído. Dado que ngen
não é concluído até bem após o término da inicialização do sistema operacional, e como um bônus, o VHDX final terá todo o framework .NET ngen-ed, o que significa que não precisamos lidar com isso quando criarmos novos VMs do disco de modelo. Tanto o script que usamos para criar o modelo VHDX quanto os scripts para criar o ambiente de teste local estão no github, caso alguém esteja interessado.