Nous prévoyons d'automatiser la création de machines virtuelles pour notre infrastructure de génération afin de pouvoir:
- Faites évoluer les ressources de build en fonction de la demande, par exemple en ajoutant plus d'agents de build lorsque cela est nécessaire et en les supprimant quand ce n'est pas nécessaire
- Recréez tout ou partie de l'environnement de construction si / quand les machines meurent
- Dupliquez l'environnement de construction lorsque nous avons besoin d'une configuration de test
L'une des étapes de ce processus consiste à automatiser la création des images de base de la machine virtuelle (dans notre cas, en utilisant Hyper-V). Pour cela, nous avons un script qui:
- Crée un nouveau VHDX à partir d'ISO avec le script Convert-WindowsImage . Nous utilisons actuellement Windows 2012R2, mais nous envisageons de commencer 2016 dès qu'il sera disponible.
- Ajoute un script sans assistance au nouveau VHDX avec toute la configuration de base dont nous avons besoin
- Met à jour le VHDX avec les derniers correctifs Windows à l'aide du script Apply-WindowsUpdate
- Crée une nouvelle machine virtuelle Hyper-V basée sur le VHDX et la démarre
- Attend le démarrage de la machine virtuelle et attend que le service WinRM soit prêt à accepter les connexions à distance
- Attend que Windows termine la configuration initiale et la configuration des nouveaux correctifs
- Applique tout autre patch
- Redémarre pour terminer la configuration des derniers correctifs
- Attend que Windows termine la configuration des correctifs
- Envoie un script sysprep à la machine et appelle ce script. Cela exécute sysprep puis éteint la machine
- Supprime la machine virtuelle mais conserve le VHDX
- Supprime sysprep et les fichiers sans assistance du VHDX, puis compacte le VHDX
- Déplace le VHDX à l'emplacement du modèle et le marque en lecture seule
Le problème que nous rencontrons est dans les étapes 6 et 9. Idéalement, nous attendons que toute la configuration soit terminée avant de redémarrer / arrêter la machine, mais il ne semble pas y avoir de moyen de détecter que Windows a terminé la phase de configuration.
Lorsque vous parcourez l'interface utilisateur, il est très clair lorsque l'une ou l'autre étape est terminée car l'interface utilisateur de connexion n'apparaît que lorsque le processus est prêt. Cependant, lorsque vous utilisez WinRM pour vous connecter à distance à la machine, cela est moins clair car WinRM fournit un accès à la machine avant de terminer le travail de configuration.
La question est donc de savoir quel est le moyen le plus infaillible de détecter sur une connexion à distance que Windows a fini de configurer les mises à jour, etc. afin que nous puissions redémarrer / arrêter la machine sans causer de problèmes plus tard.
------ ÉDITER -----
En fin de compte, nous utilisons une version modifiée de la réponse de Katherine dans la mesure où notre script attend windeploy
et ngen
se termine également. Étant donné que ngen
cela ne se termine que bien après la fin de l'initialisation du système d'exploitation, et en bonus, le VHDX final aura tout le framework .NET ngen-ed, ce qui signifie que nous n'avons pas à gérer cela lorsque nous créons de nouveaux VM du disque modèle. Les scripts que nous utilisons pour créer le modèle VHDX et les scripts pour créer l' environnement de test local sont sur github au cas où quelqu'un serait intéressé.