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é.
la source
Chaque correctif de mise à jour Windows écrit plusieurs événements dans le journal des événements d'installation.
Une façon de déterminer si tous les correctifs ont été appliqués serait de boucler une vérification sur l'ID d'événement 4. Comparez l'heure de cet événement à l'heure actuelle. Si aucun ID d'événement 4 n'a été écrit pendant 5 ou 10 minutes, tous les patches sont probablement terminés et prêts à redémarrer.
Je ne sais pas si vous voulez faire le premier redémarrage lorsque l'installation des correctifs est terminée (event4), ou le deuxième redémarrage après avoir terminé la configuration (événement 2). Ce code fait le premier. Changez simplement le filterHashTable en id d'événement 2 pour l'autre redémarrage avant votre étape 10.
la source
J'ai eu un bon succès avec l'approche suivante: Attendez que Windows modifie le type de démarrage du service Windows Module Installer (aka TrustedInstaller) en Manuel (Demand Start) - après un redémarrage. À ce stade, l'installation des mises à jour est terminée.
Le processus Trusted Installer continue parfois de s'exécuter après l'installation des correctifs? Cependant, le type de démarrage du service est toujours réinitialisé sur Manuel.
Vous pouvez vérifier par vous-même, si l'observation ci-dessus est cohérente / correcte, en consultant les messages du journal des événements précédents et en corrélant les événements entre les journaux système et de configuration.
La modification de démarrage de Windows Module Installer est enregistrée en tant qu'événement système 7040 et est corrélée au dernier événement 2 du journal d'installation, après un redémarrage.
Je pense que lorsque les mises à jour sont installées pour la première fois, ce service est défini sur «Démarrage automatique» au cas où un redémarrage serait nécessaire. Il est remis à «Manuel» lorsque le dernier correctif est installé (indépendamment du fait qu'un redémarrage ait été requis).
Sur certains serveurs, j'ai remarqué que le démarrage du programme d'installation de confiance est rapidement basculé de Manuel à Automatique et inversement, et cela peut se produire toutes les heures environ. Je soupçonne que c'est une application qui vérifie régulièrement les mises à jour. Mais, selon mon expérience, il semble généralement sûr de supposer que si le démarrage est manuel, aucun correctif ne se produit.
la source