Stiamo programmando di automatizzare la creazione di macchine virtuali per la nostra infrastruttura di build in modo da poter:
- Ridimensionare le risorse di compilazione in base alla domanda, ad esempio aggiungendo più agenti di compilazione quando necessario e rimuovendole quando non sono necessarie
- Ricreare tutto o parte dell'ambiente di costruzione se / quando le macchine muoiono
- Duplica l'ambiente di compilazione quando abbiamo bisogno di una configurazione di prova
Uno dei passaggi di questo processo è l'automazione della creazione delle immagini di base della macchina virtuale (nel nostro caso utilizzando Hyper-V). Per questo abbiamo una sceneggiatura che:
- Crea nuovo VHDX da ISO con lo script Convert-WindowsImage . Attualmente stiamo utilizzando Windows 2012 R2 ma cercheremo di iniziare con il 2016 non appena sarà disponibile.
- Aggiunge uno script automatico al nuovo VHDX con tutta la configurazione di base di cui abbiamo bisogno
- Aggiorna il VHDX con le ultime patch di Windows usando lo script Apply-WindowsUpdate
- Crea una nuova VM Hyper-V basata sul VHDX e la avvia
- Attende l'avvio della macchina virtuale e attende che il servizio WinRM sia pronto per accettare le connessioni remote
- Attende che Windows completi la configurazione iniziale e la configurazione delle nuove patch
- Applica ulteriori patch
- Riavvia per completare la configurazione delle ultime patch
- Attende che Windows completi la configurazione delle patch
- Invia uno script sysprep alla macchina e invoca quello script. Questo esegue sysprep e quindi spegne la macchina
- Elimina la VM ma mantiene il VHDX
- Rimuove i file sysprep e incustoditi dal VHDX e quindi compatta il VHDX
- Sposta VHDX nella posizione del modello e contrassegna come sola lettura
Il problema che stiamo riscontrando è nei passaggi 6 e 9. Idealmente attendiamo che tutta la configurazione sia completa prima di riavviare / spegnere la macchina, ma non sembra esserci un modo per rilevare che Windows ha terminato la fase di configurazione.
Quando si esegue l'interfaccia utente è molto chiaro quando viene eseguita una delle due fasi poiché l'interfaccia utente di accesso non viene visualizzata fino a quando il processo non è pronto. Tuttavia, quando si utilizza WinRM per connettersi in remoto alla macchina, ciò è meno chiaro poiché WinRM fornisce l'accesso alla macchina prima che venga eseguita con il lavoro di configurazione.
Quindi la domanda è qual è il modo più infallibile per rilevare su una connessione remota che Windows ha terminato la configurazione degli aggiornamenti ecc. In modo che possiamo riavviare / spegnere la macchina senza causare problemi in seguito.
------ MODIFICARE -----
Alla fine stiamo usando una versione modificata della risposta di Katherine in quanto anche il nostro script attende windeploy
e si ngen
completa. Dato che ngen
non si completa fino a quando il sistema operativo non ha terminato l'inizializzazione che funziona, e come bonus il VHDX finale avrà tutto il framework .NET ngen-ed, il che significa che non dovremo occuparcene quando creeremo nuovi VM del disco modello. Sia lo script che usiamo per creare il modello VHDX sia gli script per creare l' ambiente di test locale sono su github nel caso qualcuno fosse interessato.