<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>PowerShell on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/powershell/</link><description>Recent content in PowerShell on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr-fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Tue, 02 Oct 2018 11:45:54 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/powershell/index.xml" rel="self" type="application/rss+xml"/><item><title>Minikube sur Hyper-V part 2 : troubleshooting de l’installation</title><link>https://blog.zwindler.fr/2018/10/02/minikube-sur-hyper-v-part-2-troubleshooting-de-linstallation/</link><pubDate>Tue, 02 Oct 2018 11:45:54 +0000</pubDate><guid>https://blog.zwindler.fr/2018/10/02/minikube-sur-hyper-v-part-2-troubleshooting-de-linstallation/</guid><description>&lt;img src="https://blog.zwindler.fr/2018/09/minikube.webp" alt="Featured image of post Minikube sur Hyper-V part 2 : troubleshooting de l’installation" /&gt;&lt;h2 id="minikube-le-retour"&gt;Minikube, le retour
&lt;/h2&gt;&lt;p&gt;Il y a deux semaines, j’ai fais un article sur l’installation de Minikube sur un poste Windows 10. Petite subtilité, l’article en question explique comment installer Minikube sur Hyper-V, nativement présent avec Windows 10, plutôt qu’avec Virtual Box, le choix par défaut mais qui nécessite un téléchargement et une installation complémentaire. Si vous l’avez loupé, &lt;a class="link" href="https://blog.zwindler.fr/2018/09/12/installer-minikube-sur-windows-10-et-hyper-v-part-1/" &gt;c’est par ici&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="option-2--expectations-meet-life"&gt;Option 2 : Expectations meet life
&lt;/h2&gt;&lt;p&gt;On s’était arrêté dans l’article précédent à un monde merveilleux ou tout marche du premier coup.&lt;br&gt;
Mais, vous vous en doutez, dans la vie (et particulièrement dans l’IT), rien ne se passe jamais comme prévu.&lt;/p&gt;
&lt;p&gt;Voilà donc un petit florilège des problèmes que vous pourriez (ou avez) rencontrer (et leur résolution !)&lt;/p&gt;
&lt;h3 id="vboxmanage-not-found"&gt;VBoxManage not found
&lt;/h3&gt;&lt;p&gt;Si vous en venez à vous demander comment l’installer sur Hyper-V, c’est probablement que vous avez commencé par lancer la commande « minikube start » sans arguments&amp;hellip; L’installeur a donc bêtement assumé que vous utilisiez Virtual Box (pourquoi ?) et vous vous retrouvez avec l’erreur suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Error getting state for host: VBoxManage not found. Make sure VirtualBox is installed and VBoxManage is in the path.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pourtant, vous avez beau forcer le start avec le flag suivant, rien y fait, ce n’est pas pris en compte.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;--vm-driver hyperv
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pour trouver comment résoudre ce problème, vous pouvez jeter à œil à cette &lt;a class="link" href="https://github.com/kubernetes/minikube/issues/2901" target="_blank" rel="noopener"
&gt;issue sur github&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;En réalité, une fois le premier « start » lancé, les fichiers de configuration sont générés dans &lt;strong&gt;C:\users[votrelogin].minikube&lt;/strong&gt; (et en particulier dans profiles\minikube\config.json).&lt;/p&gt;
&lt;p&gt;Impossible d’expliquer à l’installeur que vous avez changé d’avis (oui oui&amp;hellip;), il faut donc de supprimer tout le dossier &lt;em&gt;.minikube&lt;/em&gt; et recommencer avec les bons paramètres la prochaine fois (enfin c’est le plus simple, on va dire).&lt;/p&gt;
&lt;h3 id="minikube-v0xxxiso-le-chemin-daccès-spécifié-est-introuvable"&gt;minikube-v0.xx.x.iso: Le chemin d’accès spécifié est introuvable&amp;hellip;
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;minikube-v0.28.1.iso: Le chemin d’accès spécifié est introuvable...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ok, ça ne marche toujours pas. On passe en mode verbose pour avoir l’erreur exacte :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;PS C:\windows\system32&amp;gt; minikube start --vm-driver hyperv --hyperv-virtual-switch &amp;#34;Primary Virtual Switch&amp;#34; -v=7
Starting local Kubernetes v1.10.0 cluster...
Starting VM...
[...]
[stderr =====&amp;gt;] :
Downloading D:\Users\zwindler\.minikub\cache\boot2docker.iso from file://D:/Users/zwindler/.minikub/cache/iso/minikube-v0.28.1.iso...
E0906 15:10:27.568262 14484 start.go:174] Error starting host: Error creating host: Error executing step: Creating VM.: open /Users/zwindler/.minikub/cache/iso/minikub-v0.28.1.iso: Le chemin d’accès spécifié est introuvable..
Retrying.
E0906 15:10:27.873612 14484 start.go:180] Error starting host: Error creating host: Error executing step: Creating VM.
: open /Users/zwindler/.minikube/cache/iso/minikube-v0.28.1.iso: Le chemin d’accès spécifié est introuvable.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pourtant le fichier existe. Et c’est reparti pour un tour sur Github pour avoir plus de détails !&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/kubernetes/minikube/issues/1310" target="_blank" rel="noopener"
&gt;github.com/kubernetes/minikube/issues/1310&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/kubernetes/minikube/issues/2564" target="_blank" rel="noopener"
&gt;github.com/kubernetes/minikube/issues/2564&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ici, c’est donc tout simplement le script Minikube qui ne sait pas que vous avez un disque **D:**&amp;hellip; Alors qu’il vient de le déposer lui même dans *&lt;em&gt;D:*&lt;/em&gt; une ligne plus haut !!! La solution donc :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;you can specify the path for the .minikub directory by setting the MINIKUBE_HOME env variable&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Bon en vrai la bonne syntaxe sous Windows (dans Powershell en tout cas) c’est :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$MINIKUBE_HOME=&amp;#34;D:\Users\[votrelogin]\&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On oublie pas de nettoyer la tentative précédente avec un :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;minikube delete
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="flmnh--error-deleting-machine-profile-config"&gt;FLMNH : « Error deleting machine profile config »
&lt;/h3&gt;&lt;p&gt;Si jamais en essayant de nettoyer votre environnement (pour recommencez, vous essayez un « minikube delete » et que vous vous prenez une erreur).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;minikube delete
Deleting local Kubernetes cluster...
Machine deleted.
Error deleting machine profile config
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Rebelotte, on supprime le dossier &lt;strong&gt;D:\Users[votrelogin].minikube&lt;/strong&gt; à la main.&lt;/p&gt;
&lt;h3 id="error-starting-host-error-starting-stopped-host-exit-status-1"&gt;Error starting host: Error starting stopped host: exit status 1
&lt;/h3&gt;&lt;p&gt;Tout à l’air de fonctionner. Vous croyez que vous vous en êtes sortis ? Pauvres fous ;)&lt;/p&gt;
&lt;p&gt;Au moment où tout se termine, le script vérifie que le cluster est opérationnel. Et après avoir boucler un moment : PAF !&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Error starting host: Error starting stopped host: exit status 1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;L’erreur n’est pas très explicite. En gros, vous êtes dans le cas où tout est bien installé, mais le curl pour vérifier que le cluster est UP échoue, pour un souci réseau. La plupart du temps, il s’agit de l’erreur suivante :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/kubernetes/minikube/issues/1967" target="_blank" rel="noopener"
&gt;github.com/kubernetes/minikube/issues/1967&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/kubernetes/minikube/issues/1945" target="_blank" rel="noopener"
&gt;github.com/kubernetes/minikube/issues/1945&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;After some troubleshooting and head banging, it became apparent that the external network adapter had an ethernet adapter selected that was not connected to a network. (ethernet selected, instead of the wireless adapter). Of course an IP wont be allocated on an external network if none is connected.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Vérifiez donc dans les paramètres d’Hyper-V que vous ne vous êtes pas trompé d’adaptateur réseau lors de la configuration du réseau virtuel (cf &lt;a class="link" href="https://blog.zwindler.fr/2018/09/12/installer-minikube-sur-windows-10-et-hyper-v-part-1/" &gt;l’article précédent&lt;/a&gt;) !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/09/minikube04.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h3 id="unable-to-authenticate-attempted-methods-publickey-none"&gt;unable to authenticate, attempted methods [publickey none]
&lt;/h3&gt;&lt;p&gt;Ok, cette fois ci tout est censé être bon. Pourtant, à la fin, ça plante encore (désespoir).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Error dialing TCP: ssh: handshake failed: ssh: unable to authenticate, attempted methods [publickey none], no supported methods remain
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Là je ne suis pas sûr à 100% ni de la cause, ni du fix, mais a priori, c’était un problème lié au client/serveur OpenSSH fourni par Microsoft, qui serait pourri. L’installation d’une autre version via Chocolatey semble avoir résolu le problème.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/kubernetes/minikube/issues/2329" target="_blank" rel="noopener"
&gt;github.com/kubernetes/minikube/issues/2329&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;PS D:\&amp;gt; minikube ip
172.16.25.217
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;choco install openssh
Chocolatey v0.10.11
Installing the following packages:
openssh
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Sécuriser l’émission de vos certificats avec un CAA (Azure)</title><link>https://blog.zwindler.fr/2018/06/12/securiser-lemission-de-vos-certificats-azure-avec-un-caa/</link><pubDate>Tue, 12 Jun 2018 11:45:10 +0000</pubDate><guid>https://blog.zwindler.fr/2018/06/12/securiser-lemission-de-vos-certificats-azure-avec-un-caa/</guid><description>&lt;img src="https://blog.zwindler.fr/2018/06/azure.webp" alt="Featured image of post Sécuriser l’émission de vos certificats avec un CAA (Azure)" /&gt;&lt;h2 id="caa--azure-"&gt;CAA ? Azure ?!?
&lt;/h2&gt;&lt;p&gt;Et oui, je travaille sur Azure ! Je crois bien que c’est le premier article que je vais faire à ce sujet donc je commence par quelque chose de léger, créer un CAA.&lt;/p&gt;
&lt;p&gt;Au-delà de toute considération purement dogmatique, le cloud de Microsoft fait quand même partie des plus grands, avec une richesse fonctionnelle et une API aussi riche que ce qu’on trouve chez les autres. J’aurai l’occasion de faire d’autres articles sur Azure car j’utilise énormément les modules Ansible développés par les équipes de Microsoft (qui s’appuient sur l’API d’Azure).&lt;/p&gt;
&lt;h2 id="et-donc-le-caa-"&gt;Et donc, le CAA ?
&lt;/h2&gt;&lt;p&gt;Mais cet article parle de CAA. Pour ceux qui ne connaitraient pas, un CAA est un « nouveau » (2017) type d’enregistrement DNS :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;La CAA est une mesure de sécurité qui permet aux propriétaires d’un nom de domaine de préciser dans leur DNS (Domain Name System) les autorités de certification (AC) qui sont autorisées à émettre des certificats pour leur nom de domaine.&lt;/p&gt;
&lt;p&gt;Global Sign (lien mort, pas disponible sur Internet Archive)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Concrètement, si je possède un domaine avec un grand nombre de sites web signés, que je n’utilise qu’une ou deux (ou un nombre fini) autorités de certifications, je peux maintenant spécifier lesquelles (parmi la centaine des AC existantes) sont autorisées à émettre un certificat pour mon domaine. Cela permettra d’éviter que des personnes mal intentionnées génèrent un certificat pour une URL dans un de vos sous domaines.&lt;/p&gt;
&lt;h2 id="comment-ça-fonctionne-"&gt;Comment ça fonctionne ?
&lt;/h2&gt;&lt;p&gt;Il existe donc un nouveau type d’entrée dans votre DNS qui devrait ressembler à ça :&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;
Name
&lt;/th&gt;
&lt;th&gt;
Type
&lt;/th&gt;
&lt;th&gt;
Value
&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td rowspan="2"&gt;
zwindler.fr.
&lt;/td&gt;
&lt;td rowspan="2"&gt;
CAA
&lt;/td&gt;
&lt;td rowspan="1"&gt;
0 issue « letsencrypt.org »
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td rowspan="1"&gt;
0 iodef « mailto:zwindler@zwindler.fr »
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Pour l’entrée zwindler.fr., j’ai donc un CAA qui dispose de 2 variables (issue et iodef) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La première indiquant que seul letsencrypt.org peut générer des certificats pour mon domaine. On peut en avoir plusieurs si on a plusieurs autorités de certification.&lt;/li&gt;
&lt;li&gt;La seconde indiquant qu’il faut m’envoyer un email si jamais quelqu’un qui n’a pas les droits essaye de générer un certificat.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;A noter :&lt;/strong&gt; iodef n’est pas respecté par toutes les autorités de certifications, donc vous n’aurez potentiellement pas d&amp;rsquo;emails en cas de tentative de génération de certificat chez une AC non autorisé.&lt;/p&gt;
&lt;h2 id="ok-comment-je-créé-un-caa-"&gt;Ok, comment je créé un CAA ?
&lt;/h2&gt;&lt;p&gt;Normalement, c’est trivial. Il s’agit d’un enregistrement DNS comme un autre. Par exemple chez OVH, vous pouvez directement le créer depuis l’interface :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/06/caa01.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="et-sur-azure-"&gt;Et sur Azure ?
&lt;/h2&gt;&lt;p&gt;Il faut bien que ce soit rigolo. Dans le portail d’Azure, il n’est pas possible de créer (ni même de voir !!!) les champs de types CAA, pourtant disponibles depuis mi 2017.&lt;/p&gt;
&lt;p&gt;La seule solution est d’utiliser l’API REST, la CLI azure, ou Powershell :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/cli/azure/network/dns/record-set/caa?view=azure-cli-latest" target="_blank" rel="noopener"
&gt;Page de documentation azure cli&lt;/a&gt; (record-set)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/fr-fr/azure/dns/dns-operations-recordsets" target="_blank" rel="noopener"
&gt;Gérer les enregistrements DNS avec Powershell&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="avec-azure-cli"&gt;Avec Azure cli
&lt;/h2&gt;&lt;p&gt;Du coup je suis parti de la doc pour faire ça :&lt;/p&gt;
&lt;p&gt;En partant du principe que vous avez un compte sur Azure, que vous gérez les DNS de la zone &lt;strong&gt;zwindler.fr&lt;/strong&gt; depuis Azure DNS (dans un resource group appelé &lt;strong&gt;dns-rg&lt;/strong&gt;), voilà ce qu’il faut faire pour créer une protection pour le sous domaine *&lt;strong&gt;.test.zwindler.fr&lt;/strong&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;az network dns record-set caa add-record --resource-group dns-rg --zone-name zwindler.fr --record-set-name test --flags 0 --tag &amp;#34;issue&amp;#34; --value &amp;#34;letsencrypt.org&amp;#34;
az network dns record-set caa add-record --resource-group dns-rg --zone-name zwindler.fr --record-set-name test --flags 0 --tag &amp;#34;iodef&amp;#34; --value &amp;#34;zwindl3r@zwindler.fr&amp;#34;
az network dns record-set caa list --resource-group dns-rg --zone-name zwindler.fr
{
&amp;#34;caaRecords&amp;#34;: [
{
&amp;#34;flags&amp;#34;: 0,
&amp;#34;tag&amp;#34;: &amp;#34;iodef&amp;#34;,
&amp;#34;value&amp;#34;: &amp;#34;zwindl3r@zwindler.fr&amp;#34;
},
{
&amp;#34;flags&amp;#34;: 0,
&amp;#34;tag&amp;#34;: &amp;#34;issue&amp;#34;,
&amp;#34;value&amp;#34;: &amp;#34;letsencrypt.org&amp;#34;
}
],
&amp;#34;etag&amp;#34;: &amp;#34;aaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaa&amp;#34;,
&amp;#34;fqdn&amp;#34;: &amp;#34;test.zwindler.fr.&amp;#34;,
&amp;#34;id&amp;#34;: &amp;#34;/subscriptions/aaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaa/resourceGroups/dns-rg/providers/Microsoft.Network/dnszones/zwindler.fr/CAA/test&amp;#34;,
&amp;#34;metadata&amp;#34;: null,
&amp;#34;name&amp;#34;: &amp;#34;test&amp;#34;,
&amp;#34;resourceGroup&amp;#34;: &amp;#34;dns-rg&amp;#34;,
&amp;#34;ttl&amp;#34;: 3600,
&amp;#34;type&amp;#34;: &amp;#34;Microsoft.Network/dnszones/CAA&amp;#34;
}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="et-si-je-veux-le-domaine-entier-"&gt;Et si je veux le domaine entier ?
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Et là c’est la blague !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Si vous créez un record-set « &lt;em&gt;test&lt;/em&gt;« , il va vous créer un CAA pour &lt;em&gt;test&lt;/em&gt;.zwindler.fr (voire le champ &lt;strong&gt;fqdn&lt;/strong&gt; dans la réponse du list). Vous n’avez pas la main sur le &lt;strong&gt;fqdn&lt;/strong&gt; directement (que ce soit en création ou en mise à jour), il est créé à partir du nom.&lt;/p&gt;
&lt;p&gt;Or, vous avez très probablement envie de protéger &lt;strong&gt;zwindler.fr&lt;/strong&gt;, pas seulement &lt;strong&gt;test.zwindler.fr&lt;/strong&gt;, car ça n’aurait pas vraiment de sens (on rappelle que le but de la manœuvre et d&amp;rsquo;empêcher des gens de générer des certificats pour des sous domaine de votre domaine) sinon.&lt;/p&gt;
&lt;p&gt;Créer une liste exhaustive de tous les sous domaines possibles me semble complexe ;-).&lt;/p&gt;
&lt;p&gt;L’astuce, que vous ne trouverez pas dans la documentation (en tout cas dans les pages que j’ai lues), est de créer un recordset avec comme nom « @ » (j’avais testé, vide, « * », « . », mais pas « @ »&amp;hellip;).&lt;/p&gt;
&lt;p&gt;Et là, un recordset sera créé pour l’ensemble de votre zone DNS (&lt;strong&gt;zwindler.fr&lt;/strong&gt; dans mon exemple).&lt;/p&gt;
&lt;p&gt;Magie-magie&amp;hellip;&lt;/p&gt;
&lt;h2 id="liens-utiles"&gt;Liens utiles
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.ssllabs.com/ssltest/" target="_blank" rel="noopener"
&gt;Un site pour tester son site en HTTPS (Qualys)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://sslmate.com/caa/" target="_blank" rel="noopener"
&gt;Un site pour générer les CAA records (SSLmate)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Utiliser PowerCLI pour créer un template de VM VMware</title><link>https://blog.zwindler.fr/2017/03/07/utiliser-powercli-pour-creer-un-template-de-vm-vmware/</link><pubDate>Tue, 07 Mar 2017 13:00:52 +0000</pubDate><guid>https://blog.zwindler.fr/2017/03/07/utiliser-powercli-pour-creer-un-template-de-vm-vmware/</guid><description>&lt;img src="https://blog.zwindler.fr/2017/03/PowerCLI.webp" alt="Featured image of post Utiliser PowerCLI pour créer un template de VM VMware" /&gt;&lt;h2 id="vmware-et-powercli"&gt;VMware et PowerCLI
&lt;/h2&gt;&lt;p&gt;Ça fait un long moment que j’ai cet article dans les tiroirs et aujourd’hui je n’ai plus vraiment l’intention d’utiliser PowerCLI pour automatiser ce genre de choses.&lt;/p&gt;
&lt;p&gt;Pour autant, il y a quelques années, on m’a demandé de réaliser une copie complète quotidienne d’une machine virtuelle donnée. N’ayant à l’époque qu’une vieille version de DataProtector (youpi&amp;hellip;) sur site, je n’avais pas d’outil pour sauvegarder simplement une machine complète, et encore moins donner les moyens de la restaurer rapidement en cas de crash.&lt;/p&gt;
&lt;p&gt;Ayant &lt;a class="link" href="https://blog.zwindler.fr/2010/06/09/sauvegarder-automatiquement-et-proprement-ses-vms-sur-esxi/" &gt;déjà bidouillé avec GhettoVCB&lt;/a&gt;, qui permet notamment de sauvegarder à chaud des machines virtuelles VMware même quand on a pas de vCenter, je savais qu’il y avait des possibilités.&lt;/p&gt;
&lt;p&gt;Dans mon cas précis, il y avait un cluster vSphere avec un vCenter installé sur un serveur Windows (à l’ancienne). Et comme je souhaitais automatiser cette tâche de copie depuis le vCenter, je ne voulais pas utiliser le VIPerl. A ce moment là, Microsoft mettait en avant Powershell, ce qui incitait les éditeurs à fournir leurs modules compatibles. C’est ainsi que naquit PowerCLI.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A noter, dans le cas présent, il sera nécessaire d’avoir le vCenter car le module PowerShell PowerCLI se base sur la même API fournie par VMware que celle utilisée par VIPerl.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Quand on a un vCenter, on peut faire beaucoup de choses via l’API (et donc via PowerCLI). Le plus simple pour résoudre le problème posé était de déclencher chaque jour la création d’un clone ou d’un template. Et c’est donc ce que j’ai fais !&lt;/p&gt;
&lt;p&gt;Bon&amp;hellip; du coup, je n’ose pas vraiment parler de « sauvegarde » car il s’agit de tout sauf ça. Mais ça permettait aux administrateurs de disposer rapidement d’une machine à J-1 en cas de corruption, sans passer une sauvegarde réelle, ce qui était le besoin.&lt;/p&gt;
&lt;h1 id="installation-de-powercli"&gt;Installation de PowerCLI
&lt;/h1&gt;&lt;p&gt;Oui parce que bon. Ce n’est pas si simple ! Le VIPerl était casse pied à installer avec toutes les dépendances Perl, il n’y avait pas de raisons que le PowerCLI le soit plus. Merci VMware&amp;hellip; ou Microsoft je ne sais pas ;-). Voici la marche à suivre&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Récupérez l’installer sur le site de VMware (ex VMware-PowerCLI-5.1.0-793510.exe)&lt;/li&gt;
&lt;li&gt;Exécutez l’installation en tant qu’administrateur de la machine.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Une fois installé, ouvrez le panneau de configuration pour désactiver la révocation des certificats :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Panneau de configuration&lt;/strong&gt;/&lt;strong&gt;Options Internet&lt;/strong&gt;/Onglet &lt;strong&gt;Avancé&lt;/strong&gt;/Section &lt;strong&gt;Sécurité&lt;/strong&gt;/Décocher &lt;strong&gt;Vérifier la révocation du certificat des éditeurs&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A partir de là PowerCLI est « utilisable ». Pour autant, à l’époque sur les serveurs 2008 R2 (ça date !) il y avait un gros soucis de performance sur PowerCLI (VMware ou Microsoft, je n’ai jamais su), qui mettait plusieurs secondes (voire dizaines) avant de s’exécuter. La seule méthode permettant de gagner du temps était de précompiler le module PowerCLI (&amp;hellip;) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;C:\Windows\Microsoft.NET\Framework\v2.0.50727\ngen.exe install &amp;#34;VimService51.XmlSerializers, Version=5.1.0.0, Culture=neutral, PublicKeyToken=10980b081e887e9f&amp;#34;
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\ngen.exe install &amp;#34;VimService51.XmlSerializers, Version=5.1.0.0, Culture=neutral, PublicKeyToken=10980b081e887e9f&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et avant de pouvoir exécuter des scripts PowerShell personnels, il faut modifier la politique de sécurité bloquant l’exécution dédits scripts. Personnellement je vous conseille de laisser en &lt;strong&gt;RemoteSigned&lt;/strong&gt; mais à vous de voir.&lt;/p&gt;
&lt;p&gt;Attention, comme il y a une partie x86 et une partie x64, il faudra lancer un prompt &lt;strong&gt;PowerShell en 32 bits et un en 64 bits&lt;/strong&gt; avec les droits Administrateur (clic droit, lancer en tant qu’administrateur), puis exécuter la commande suivante dans les 2 terminaux :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Set-ExecutionPolicy RemoteSigned
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Enfin, pour contourner 2 problèmes rencontrés IRL, on doit également lancer un prompt &lt;strong&gt;PowerCLI&lt;/strong&gt; &lt;strong&gt;en 32 bits et un en 64 bits&lt;/strong&gt; avec les droits Administrateur, puis exécuter les commandes suivantes (méthodes de contournement respectivement pour des problèmes de connexions dans les scripts et les problèmes de certificats) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Set-PowerCLIConfiguration -ProxyPolicy NoProxy -Confirm:$False
Set-PowerCLIConfiguration -InvalidCertificateAction ignore -Confirm:$False
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="commandes-à-exécuter-manuellement-pour-voir"&gt;Commandes à exécuter manuellement, pour voir
&lt;/h2&gt;&lt;p&gt;Dans un premier temps (c’est à dire avant d’exécuter un script en priant pour que ça marche), le mieux est quand même de lancer les commandes à la main pour vérifier qu’on arrive à le faire au moins une fois manuellement.&lt;/p&gt;
&lt;p&gt;Exemple de connexion au serveur vCenter (windows_vcenter) avec le login compte_privilegie présent dans le même domaine AD le vCenter.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Connect-VIServer -server windows_vcenter
Name Port User
---- ---- ----
windows_vcenter 443 DOMAINEAD\compte_privilegie
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Normalement, après quelque s secondes la connexion devrait se faire. A partir de là, toutes les commandes suivantes seront authentifiées sur le vCenter.&lt;/p&gt;
&lt;p&gt;Maintenant qu’on a réussi à se connecter, on démarrage d’une copie d’une VM vers un template. Ici je prends l’exemple du serveur vm_a_copier.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;New-Template -Name vm_copie -VM vm_a_copier -Datastore DATASTORE_COPIE -Location VMWARE
Name
----
vm_copie
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans la console, la copie devrait être en cours. Mission accomplie !&lt;/p&gt;
&lt;p&gt;Je vous invite à aller sur le site de &lt;a class="link" href="https://web.archive.org/web/20140125145011/https://www.vmware.com/support/developer/PowerCLI/PowerCLI50/html/New-Template.html" target="_blank" rel="noopener"
&gt;documentation VMware pour plus d’informations sur cette commande (lien mort, j&amp;rsquo;utilise Internet Archive)&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="mise-en-place-de-la-copie-de-la-vm-à-proprement-parler"&gt;Mise en place de la copie de la VM à proprement parler
&lt;/h2&gt;&lt;h3 id="le-script-powershell"&gt;Le script PowerShell
&lt;/h3&gt;&lt;p&gt;Ce sera donc un script PowerShell qui gèrera la copie de la VM (C:\scripts\vm_copie.ps1). Voici les étapes de ce script « exemple », à adapter à votre besoin.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chargement du module PowerShell pour VMware&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Add-PSSnapin -Name &amp;#34;VMware.VimAutomation.Core&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;Connexion au vCenter en local (pas d’authentification nécessaire dans ce cas là)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$Server = Connect-VIServer -Server windows_vcenter -User vmwaresvc -Password mot_de_passe
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;Vérification préalable de l’existence ou non du template en question (on l’exécute tous les jours) et suppression le cas échant. Attention à ce que vous faites ici, en fonction de votre contexte !&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$BackupTemplate = Get-Template -Name backup_srsmvm-supervision01 -Location VMWARE
If ($BackupTemplate){
Remove-Template -Template vm_copie -DeletePermanently -Confirm:$false
}
New-Template -Name vm_copie -VM vm_a_copier -Datastore DATASTORE_COPIE -Location VMWARE
Start-Sleep -s 10
Disconnect-VIServer -Server $Server -Confirm:$false
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et on se déconnecte proprement parce qu’on est sympa (et propres).&lt;/p&gt;
&lt;h2 id="permettre-lexécution-automatique"&gt;Permettre l’exécution automatique
&lt;/h2&gt;&lt;p&gt;On est contents, on a notre script. Pour autant ce n’est pas encore totalement terminé&amp;hellip; Si vous connaissez un peu PowerShell (à voir si c’est toujours vrai sur les Windows Server récent, j’ai un doute&amp;hellip;), vous savez qu’il était nécessaire de passer par un .bat ou un .vbs pour l’exécuter, ce qui n’était pas très pratique.&lt;/p&gt;
&lt;p&gt;Avant de pouvoir créer une tâche planifiée Windows pour pouvoir automatiser notre copie, il va donc falloir créer un fichier vbs C:\scripts\vm_copie.vbs qui ne fera que lancer le fichier .ps1.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;#39;Script VBScript de lancement des backups de VM
Set objShell = CreateObject(&amp;#34;Wscript.Shell&amp;#34;)
objShell.Run(&amp;#34;powershell.exe C:\scripts\vm_copie.ps1&amp;#34;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ce script vbs sera lancé par un compte de service (vmwaresvc par exemple) dans une tâche planifiée. Ce compte de service devra donc préalablement être autorisé à se connecter au vCenter et à réaliser des créations de templates.&lt;/p&gt;
&lt;h2 id="création-dun-profil-de-sécurité-et-dun-compte-pour-la-copie"&gt;Création d’un profil de sécurité et d’un compte pour la copie
&lt;/h2&gt;&lt;p&gt;Pour se faire, connectez vous au vCenter avec un compte administrateur VMware, puis créez un rôle disposant uniquement des autorisations nécessaires.&lt;/p&gt;
&lt;p&gt;Menu &lt;strong&gt;Administration/Rôle/Ajouter…&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/03/powercli1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Nom **« Compte de service copie_template »&lt;br&gt;
**&lt;/p&gt;
&lt;p&gt;Sélectionnez les privilèges suivants&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Banque de données/Allouer espace&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Machine virtuelle/Provisionnement/Créer un modèle à partir d’une machine virtuelle&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Machine virtuelle/Inventaire/Créer à partir d’un modèle/d’une machine virtuelle existante&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Machine virtuelle/Inventaire/Supprimer&lt;/strong&gt; (attention danger !)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;[Clic droit]Ajouter une autorisation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ajouter…&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/03/powercli2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Dans le menu déroulant &lt;strong&gt;Domaine&lt;/strong&gt;, sélectionner &lt;strong&gt;VMWARE&lt;/strong&gt;, puis ajouter l’utilisateur &lt;strong&gt;vmwaresvc&lt;/strong&gt;. Dans &lt;strong&gt;Rôle assigné&lt;/strong&gt;, sélectionner &lt;strong&gt;« Compte de service copie_template »&lt;/strong&gt;, et valider.&lt;/p&gt;
&lt;p&gt;Et si vous avez bien suivi la logique, vous irez de vous même vous connecter au vCenter avec le compte &lt;strong&gt;vmwaresvc&lt;/strong&gt; pour vérifier par vous même que l’opération fonctionne manuellement (car vous ne croyez que ce que vous voyez, et vous avez bien raison).&lt;/p&gt;
&lt;h2 id="restauration"&gt;Restauration
&lt;/h2&gt;&lt;p&gt;Je ne pouvais pas terminer l’article sans au moins dire comment revenir en arrière une fois que vous avez besoin de repartir du template.&lt;/p&gt;
&lt;p&gt;Comme il ne s’agit pas vraiment d’une VM mais d’un template, pour « restaurer » la machine virtuelle, il faut cliquer sur le template créé par le script et sélectionner &lt;strong&gt;Convertir en machine virtuelle&lt;/strong&gt; ou &lt;strong&gt;Déployer machine virtuelle à partir de ce modèle&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/03/powercli3.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Et voilà ! Je vous laisse le soin d’aller plus loin dans PowerShell / PowerCLI. Soyez créatifs ;-)&lt;/p&gt;</description></item><item><title>Administrer des serveurs Windows avec Ansible</title><link>https://blog.zwindler.fr/2016/11/15/administrer-des-serveurs-windows-avec-ansible/</link><pubDate>Tue, 15 Nov 2016 13:00:11 +0000</pubDate><guid>https://blog.zwindler.fr/2016/11/15/administrer-des-serveurs-windows-avec-ansible/</guid><description>&lt;img src="https://blog.zwindler.fr/2016/09/ansible-windows.webp" alt="Featured image of post Administrer des serveurs Windows avec Ansible" /&gt;&lt;h2 id="ansible-sur-windows"&gt;Ansible sur Windows
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Depuis que j’ai découvert Ansible, ma vie d’Ops a changée.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Tout doit pouvoir être géré par Ansible. Tous les playbooks doivent être &lt;strong&gt;idempotent&lt;/strong&gt; (je reviendrais la dessus très probablement). Et du coup, ça vaut aussi pour les serveurs Windows qu’il nous reste !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/11/73068978.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Il n’existe pas encore de version compatible Windows pour l’exécution locale des playbooks. Cependant, il existe tout de même des modules pour administrer via &lt;em&gt;PowerShell remoting&lt;/em&gt; des serveur Windows.&lt;/p&gt;
&lt;p&gt;La liste des modules pour Windows est disponible &lt;a class="link" href="https://docs.ansible.com/ansible/2.9/modules/list_of_windows_modules.html#windows-modules" target="_blank" rel="noopener"
&gt;sur cette page&lt;/a&gt;. La plupart ne sont pas intégrés au cœur d’Ansible mais font partis des &lt;em&gt;extra-modules&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="prérequis-côté-serveur"&gt;Prérequis côté serveur
&lt;/h2&gt;&lt;h3 id="configuration-de-base-connexion-distante-avec-des-comptes-locaux"&gt;Configuration de base (connexion distante avec des comptes locaux)
&lt;/h3&gt;&lt;p&gt;Il est nécessaire d’installer un module Python permettant la connexion aux Windows via PowerShell sur le serveur Linux qui servira a exécuter les playbooks.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pip install &amp;#34;pywinrm&amp;gt;=0.1.1&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="configuration-kerberos-connexion-distante-avec-des-comptes-de-domaine-ad"&gt;Configuration Kerberos (connexion distante avec des comptes de domaine AD)
&lt;/h3&gt;&lt;p&gt;La configuration de base ne permet pas d’utiliser des comptes de domaine. Dans un environnement d’entreprise, la plupart des serveurs Windows sont intégrés à un domaine Active Directory.&lt;/p&gt;
&lt;p&gt;Il est donc intéressant d’installer les clients kerberos qui permettront au serveur Linux avec Ansible de s’authentifier sur un domaine AD.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;yum -y install python-devel krb5-devel krb5-libs krb5-workstation
pip install kerberos
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On peut ensuite configurer le fichier &lt;strong&gt;/etc/krb5.conf&lt;/strong&gt; en fonction du contexte. Voici les variables à renseigner :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[...]
[realms]
ZWINDLER.INFO = {
kdc = dc01.zwindler.info
kdc = dc02.zwindler.info
kdc = dc03.zwindler.info
}
[domain_realm]
.zwindler.info = ZWINDLER.INFO
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On peut tester que la configuration fonctionne avec la commande &lt;strong&gt;kinit&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kinit zwindler@ZWINDLER.INFO
Password for zwindler@ZWINDLER.INFO:
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;ATTENTION : Il faut obligatoirement donner le nom du domaine en majuscules, et indiquer le nom complet du domaine et pas le nom Netbios. Ca vaut pour le fichier de configuration krb5.conf ET lors de l’appel de la commande kinit.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La commande ne doit pas retourner d’erreur et on peut vérifier que tout fonctionne avec la commande &lt;strong&gt;klist&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;klist
Default principal: zwindler@ZWINDLER.INFO
Valid starting Expires Service principal
23/08/2016 15:15:33 24/08/2016 01:15:33 krbtgt/ZWINDLER.INFO@ZWINDLER.INFO
renew until 30/08/2016 15:15:30
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="ajout-dun-serveur-windows"&gt;Ajout d’un serveur Windows
&lt;/h3&gt;&lt;h4 id="méthode-1--compte-local-variables-de-connexion-dans-un-fichier-chiffré"&gt;Méthode 1 : Compte local, variables de connexion dans un fichier chiffré
&lt;/h4&gt;&lt;p&gt;A la différence d’Ansible sous Linux où l’authentification peut se faire sans mot de passe à l’aide de certificats, sous Windows, il sera nécessaire de stocker à un moment donné le mot de passe d’un compte qui pourra se connecter sur les serveurs Windows.&lt;/p&gt;
&lt;p&gt;On ajoute d’abord les serveurs windows dans le fichiers hosts dans un groupe séparé&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[zwindler_windows_prod]
antivirus
wsus
[zwindler_prod:children]
zwindler_ansible_prod
zwindler_linux_prod
zwindler_windows_prod
[zwindler_windows:children]
zwindler_windows_prod
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On sécurise l’accès au fichier des variables qui contiendra les comptes d’accès aux machines Windows avec l’utilitaire &lt;strong&gt;ansible-vault&lt;/strong&gt;. Le fichier ne pourra alors être lu/édité qu’avec le mot de passe.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible-vault create group_vars/zwindler_windows.yml
New Vault password:
cat group_vars/zwindler_windows.yml
$ANSIBLE_VAULT;1.1;AES256
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
1111
ansible-vault edit group_vars/zwindler_windows.yml
Vault password:
---
ansible_user: local_admin
ansible_password: xxxxxxxx
ansible_port: 5986
ansible_connection: winrm
#Decommenter si vous utiliser Python 2.7.9+ et des certificats WinRM autosignes (defaut)
#ansible_winrm_server_cert_validation: ignore
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Comme les serveurs qui ont été ajoutés dans le groupe &lt;em&gt;zwindler_windows_prod&lt;/em&gt; héritent des variables définies pour &lt;em&gt;zwindler_windows&lt;/em&gt; dans &lt;em&gt;group_vars/zwindler_windows.yml&lt;/em&gt;, Ansible les utilisera pour s’y connecter.&lt;/p&gt;
&lt;h4 id="méthode-2--utiliser-kinit-pour-la-connexion"&gt;Méthode 2 : utiliser kinit pour la connexion
&lt;/h4&gt;&lt;p&gt;Plutôt que d’utiliser un compte local et stocker le mot de passe dans des variables (de préférence chiffré donc) mais quand même devoir taper le mode de passe du vault à chaque fois, il est possible d’utiliser le binaire &lt;strong&gt;kinit&lt;/strong&gt; pour gérer l’authentification AD via un ticket Kerberos.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# kinit domain_admin@ZWINDLER.INFO
Password for domain_admin@ZWINDLER.INFO:
# klist
Ticket cache: KEYRING:persistent:0:krb_ccache_B82OOxI
Default principal: domain_admin@ZWINDLER.INFO
Valid starting Expires Service principal
23/08/2016 16:37:37 24/08/2016 02:37:37 krbtgt/ZWINDLER.INFO@ZWINDLER.INFO
renew until 30/08/2016 16:36:57
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Cependant ce n’est pas suffisant. Pour que l’authentification Kerberos soit tentée par Ansible, il est tout même nécessaire que les variables &lt;strong&gt;ansible_user&lt;/strong&gt;, &lt;strong&gt;ansible_port&lt;/strong&gt; et &lt;strong&gt;ansible_connection&lt;/strong&gt; soient renseignées (bizarrement&amp;hellip;).&lt;/p&gt;
&lt;p&gt;On doit dont créer un fichier de variable similaire à celui de la méthode précédente, mais sans pour autant nécessiter de le chiffrer puisqu’on ne stockera pas le mot de passe.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vi group_vars/zwindler_windows.yml
---
ansible_user: auth@by.kerberos
ansible_port: 5986
ansible_connection: winrm
#Decommenter si vous utiliser Python 2.7.9+ et des certificats WinRM autosignes (defaut)
#ansible_winrm_server_cert_validation: ignore
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A noter, la valeur &lt;strong&gt;ansible_user&lt;/strong&gt; n’est pas du tout utilisée. C’est écrit sur le site d’Ansible :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ansible will first attempt Kerberos authentication. This method uses the principal you are authenticated to Kerberos with on the control machine and not ‘ansible_user’.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="prérequis-côté-client"&gt;Prérequis côté client
&lt;/h2&gt;&lt;p&gt;Pour pouvoir se connecter il est également nécessaire de réaliser des modifications sur les serveurs que l’on souhaite administrer avec Ansible.&lt;/p&gt;
&lt;p&gt;La commande &lt;strong&gt;win_ping&lt;/strong&gt; permet de vérifier la connectivité avec les serveurs Windows. Ici la commande échoue car l’exécution de commande PowerShell à distance nécessite l’autorisation explicite sur l’ensemble des serveurs concernés.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible wsus03 -m win_ping --ask-vault-pass
Vault password:
wsus03 | UNREACHABLE! =&amp;gt; {
&amp;#34;changed&amp;#34;: false,
&amp;#34;msg&amp;#34;: &amp;#34;kerberos: 500 WinRMTransport. [Errno 111] Connection refused, ssl: 500 WinRMTransport. [Errno 111] Connection refused&amp;#34;,
&amp;#34;unreachable&amp;#34;: true
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;De plus, les serveurs dont le pare-feu est activés doivent laisser passer les connexions vers le port 5986 défini dans le fichier &lt;em&gt;group_vars/zwindler_windows.yml&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="powershell-3-pour-windows-2008"&gt;Powershell 3 (pour Windows 2008)
&lt;/h3&gt;&lt;p&gt;Sur les serveurs antérieurs à Windows 2012, seul Powershell 2 est installé et c’est Powershell 3 qu’il faut !&lt;/p&gt;
&lt;p&gt;Ansible fournit un script pour aider à l’installation si la machine a accès à Internet&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;powershell https://raw.githubusercontent.com/cchurch/ansible/devel/examples/scripts/upgrade_to_ps3.ps1
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="optionnel-ajouter-une-exception-au-pare-feu-pour-le-port-5986"&gt;(Optionnel) ajouter une exception au pare-feu pour le port 5986
&lt;/h3&gt;&lt;p&gt;Cette exception n’est plus nécessaire car le script Ansible qui suit l’ajoute de lui même. Cependant si vous souhaitez gérer cela vous même, voici quoi faire.&lt;/p&gt;
&lt;p&gt;Se connecter sur le serveur, puis lancer un prompt Powershell avec les droits administrateurs&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/ansible_windows_firewall1.png"
loading="lazy"
&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;netsh advfirewall firewall add rule name=&amp;#34;WinRM pour Ansible&amp;#34; dir=in localport=5986 protocol=TCP action=allow
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/09/ansible_windows_firewall2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h3 id="autoriser-ansible-à-réaliser-des-actions-à-distance-winrm"&gt;Autoriser Ansible à réaliser des actions à distance (WinRM)
&lt;/h3&gt;&lt;p&gt;Récupérer le script disponible sur la branch « devel » et l’exécuter sur le serveur en question via un prompt Powershell administrateur.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/ansible/ansible-documentation/blob/devel/examples/scripts/ConfigureRemotingForAnsible.ps1" target="_blank" rel="noopener"
&gt;github.com/ansible/ansible-documentation/blob/devel/examples/scripts/ConfigureRemotingForAnsible.ps1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/09/ansible_windows_winrm.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Autoriser l’exécution de script Powershell si nécessaire.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Set-ExecutionPolicy Unrestricted
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="tests-et-troubleshooting"&gt;Tests et troubleshooting
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;ansible wsus03 -m win_ping --ask-vault-pass
Vault password:
wsus03 | SUCCESS =&amp;gt; {
&amp;#34;changed&amp;#34;: false,
&amp;#34;ping&amp;#34;: &amp;#34;pong&amp;#34;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans le cas où on souhaite réinitialiser les tickets kerberos pour valider le bon fonctionnement, on peut utiliser les commandes &lt;strong&gt;klist&lt;/strong&gt; et &lt;strong&gt;kdestroy&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;klist
Ticket cache: KEYRING:persistent:0:krb_ccache_B82OOxI
Default principal: domain_admin@ZWINDLER.INFO
Valid starting Expires Service principal
23/08/2016 16:38:45 24/08/2016 02:37:37 HTTP/wsus03.zwindler.info@ZWINDLER.INFO
renew until 30/08/2016 16:36:57
23/08/2016 16:37:37 24/08/2016 02:37:37 krbtgt/ZWINDLER.INFO@ZWINDLER.INFO
renew until 30/08/2016 16:36:57
kdestroy -A
klist
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Have fun !&lt;/p&gt;
&lt;h2 id="sources"&gt;Sources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="http://www.it-connect.fr/debutez-avec-ansible-et-gerez-vos-serveurs-windows/" target="_blank" rel="noopener"
&gt;www.it-connect.fr/debutez-avec-ansible-et-gerez-vos-serveurs-windows/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.ansible.com/ansible/2.9/modules/list_of_windows_modules.html#windows-modules" target="_blank" rel="noopener"
&gt;docs.ansible.com/ansible/2.9/modules/list_of_windows_modules.html#windows-modules&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.ansible.com/ansible/devel/os_guide/intro_windows.html" target="_blank" rel="noopener"
&gt;docs.ansible.com/ansible/devel/os_guide/intro_windows.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Installer le pilote ODBC d’Oracle 11g 12c sur Windows 2k8/2k12</title><link>https://blog.zwindler.fr/2015/07/02/installer-le-pilote-odbc-doracle-11g-12c-sur-windows-2k82k12/</link><pubDate>Thu, 02 Jul 2015 10:45:02 +0000</pubDate><guid>https://blog.zwindler.fr/2015/07/02/installer-le-pilote-odbc-doracle-11g-12c-sur-windows-2k82k12/</guid><description>&lt;img src="https://blog.zwindler.fr/2015/07/oracle-microsoft.webp" alt="Featured image of post Installer le pilote ODBC d’Oracle 11g 12c sur Windows 2k8/2k12" /&gt;&lt;p&gt;Lorsqu’un progiciel installé sur un serveur Windows nécessite une connexion à une base Oracle, il n’est pas toujours nécessaire d’installer un client Oracle (même Runtime). Des fois, c’est simplement le pilote ODBC qui est nécessaire.&lt;/p&gt;
&lt;p&gt;Seulement, pour ceux qui comme moi ne sont ni à l’aise avec Windows 2012, ni à l’aise avec ce genre de considérations, j’ai trouvé que c’était un peu nébuleux.&lt;/p&gt;
&lt;p&gt;Voici la page où on peut télécharger tous les bouts de clients Oracle pour Windows qu’on veut &lt;a class="link" href="http://www.oracle.com/technetwork/topics/winx64soft-089540.html" target="_blank" rel="noopener"
&gt;ici&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Quoi faire avec? A vous de le savoir (ou alors, il faut trouver la bonne doc, ce qui n’a pas été mon cas pour l’instant) ! [Edit]En fait c’est écrit touuuuuut en bas de la page, après la longue liste de téléchargements[/Edit]&lt;/p&gt;
&lt;p&gt;Il ne faut pas se contenter de télécharger l’archive, qui est insuffisante en soit, il faut aussi récupérer l’archive « basic », qui contient grosso modo le cœur du pilote ODBC. Dans mon cas il me fallait un pilote en version Oracle 11.2, mais le principe reste le même pour d’autres versions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;instantclient-basic-windows.x64-11.2.0.4.0.zip&lt;/li&gt;
&lt;li&gt;instantclient-odbc-windows.x64-11.2.0.4.0.zip&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dézipppez dans le MÊME dossier les deux archives. Dans mon cas, je les ai mis dans &lt;strong&gt;C:\Program Files\instantclient_11_2&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Enfin, lancez un shell PowerShell en tant qu’administrateur, puis, dans le dossier en question, exécutez la commande odbc_install (.exe).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/07/01_odbc.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Pour finir, avant que le pilote soit totalement opérationnel, il faut aussi modifier la variable d’environnement globale de Windows « Path » pour y ajouter le chemin vers le pilote ODBC.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/07/02_odbc.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Une fois toutes ces opérations réalisées, le pilote ODBC devrait être visible dans l’administrateur de sources de données, via le binaire « &lt;em&gt;C:\Windows\SysWOW64\odbcad32.exe&lt;/em&gt; »&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/07/03_odbc.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Quelques infos trouvées sur les sites suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="http://www.oracle.com/technetwork/topics/winx64soft-089540.html" target="_blank" rel="noopener"
&gt;www.oracle.com/technetwork/topics/winx64soft-089540.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://itkbs.wordpress.com/2014/07/28/how-to-install-odbc-driver-for-oracle-in-windows-7" target="_blank" rel="noopener"
&gt;itkbs.wordpress.com/2014/07/28/how-to-install-odbc-driver-for-oracle-in-windows-7&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>SQL Server 2005 : PowerShell &gt; Batch – Episode 3</title><link>https://blog.zwindler.fr/2010/04/28/sql-server-2005-powershell-batch-episode-3/</link><pubDate>Wed, 28 Apr 2010 16:52:16 +0000</pubDate><guid>https://blog.zwindler.fr/2010/04/28/sql-server-2005-powershell-batch-episode-3/</guid><description>&lt;img src="https://blog.zwindler.fr/2010/04/4846.logo-powershell.webp" alt="Featured image of post SQL Server 2005 : PowerShell &gt; Batch – Episode 3" /&gt;&lt;p&gt;Dernier article là-dessus et on en parle plus (jusqu’à ce que je change d’avis). Dans l’article précédent, je vous indiquais mon désespoir quand j’ai découvert que je faisais tout mal &lt;a class="link" href="https://web.archive.org/web/20211207075523/https://www.databasejournal.com/features/mssql/article.php/3693606/Microsoft-Windows-PowerShell-and-SQL-Server-2005-SMO-150-Part-6.htm" target="_blank" rel="noopener"
&gt;(lien mort, j&amp;rsquo;utilise Internet archive)&lt;/a&gt;. En regardant de plus près, je me suis aperçu que ça ne marchait pas vraiment comme il le disait, surtout pour ce qui est des sauvegardes incrémentales, et je me suis empressé d’écrire une nouvelle version de mon script pour qu’il soit plus beau, plus fort, plus efficace&amp;hellip;&lt;/p&gt;
&lt;p&gt;Une petite note aussi, les problèmes que j’ai eu avec le script du monsieur de databasejournal est peut-être dû au fait que j’ai une version Express et non pas complète comme je le pensais au début.&lt;/p&gt;
&lt;p&gt;En fait, quand vous faites un backup complète, un fichier .bak est créé, et celui ci est autosuffisant et peut être restauré facilement. Cependant, pour pouvoir utiliser les sauvegardes incrémentales, il faut que la sauvegarde soit faite dans le même fichier, qui est concaténé (en quelque sorte). Or, le script donné à la fin de l’article créé des backups .diff qui sont séparées de leur backup complète, que je n’ai pas réussi à réimporter avec MS SQL Server 2005 Express.&lt;/p&gt;
&lt;p&gt;Pour ceux d’entre nous qui ont les mêmes problèmes que j’ai eus avec les « differential backups », voici un
&lt;a class="link" href="misc/MSSQLBackup2.ps1" &gt;nouveau script&lt;/a&gt; qui permet de faire proprement ce que je voulais faire depuis le début, c&amp;rsquo;est-à-dire:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;disposer d’un script qui automatise la sauvegarde de la base de donnée de mon vCenter (mais aussi de n’importe quelle autre base de données compatible MS SQL Server 2005)&lt;/li&gt;
&lt;li&gt;avoir la possibilité de faire des backups complètes, datées pour pouvoir être différenciées&lt;/li&gt;
&lt;li&gt;avoir la possibilité de faire des backups incrémentales&lt;/li&gt;
&lt;li&gt;toutes les opérations et éventuelles erreurs sont journalisées (ça se dit?)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour ce qui est des contrôles du script:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;dans le cas où une backup complète n’est pas trouvée, le script fait une backup complète plutôt qu’une incrémentale&lt;/li&gt;
&lt;li&gt;dans le cas où plusieurs backup complètes existent, la backup incrémentale se greffe sur la backup complète la plus récente (ça m’a paru assez logique comme façon de faire, mais vous n’êtes pas obligés d’être d’accord)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il s’utilise de la façon suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;powershell.exe C:\Scripts\MSSQLBackup2.ps1 HOMESQLSERVER MyDB \\SERVER\BackupFolder FULL
powershell.exe C:\Scripts\MSSQLBackup2.ps1 HOMESQLSERVER MyDB C:\Backup DIFF
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;La première ligne exécute le script pour une backup complète de MyDB depuis l’ordinateur HOME (en local svp, je n&amp;rsquo;ai pas testé à distance, mais il doit y avoir des problèmes d’authentification) qui dispose d’un serveur SQLSERVER vers un dossier partagé BackupFolder sur le réseau par l’ordinateur SERVER. La seconde ligne fait plus ou moins là même chose (sauvegardé localement et pas dans un dossier partagé) mais avec une sauvegarde incrémentale.&lt;/p&gt;
&lt;p&gt;Je suis vengé :-D&lt;/p&gt;
&lt;p&gt;Internet 1 - Zwindler 1&lt;/p&gt;</description></item><item><title>SQL Server 2005 : PowerShell &gt; Batch – Episode 2</title><link>https://blog.zwindler.fr/2010/04/27/sql-server-2005-powershell-batch-episode-2/</link><pubDate>Tue, 27 Apr 2010 13:09:43 +0000</pubDate><guid>https://blog.zwindler.fr/2010/04/27/sql-server-2005-powershell-batch-episode-2/</guid><description>&lt;img src="https://blog.zwindler.fr/2010/04/4846.logo-powershell.webp" alt="Featured image of post SQL Server 2005 : PowerShell &gt; Batch – Episode 2" /&gt;&lt;p&gt;A quoi ça sert de faire du PowerShell si on continue à utiliser de vieux exécutables tout pourris ?&lt;/p&gt;
&lt;p&gt;Dans le précédent article, je vous ai donné un script  home-made qui permet de faire une backup automatisée d’une base de données SQL Server 2005, en me basant sur l’appel du mécanisme de backup par l’interpréteur de T-SQL (beurk!) SQLCMD.EXE. Ceci est un bon exemple des dangers d’être autodidacte. Si seulement j’avais gratté un peu plus avant de foncer tête baissée, j’aurai découvert (ce que je viens de faire par hasard) qu’il existe des objets pour ça : SMO!&lt;/p&gt;
&lt;p&gt;SMO?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;La collection d’objets SMO (SQL Server Management Objects) est conçue pour la programmation de tous les aspects de la gestion de Microsoft SQL Server. La collection d’objets RMO (SQL Server Replication Management Objects) encapsule la gestion de la réplication SQL Server.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;En fouillant un peu sur cette piste, je suis tombé sur &lt;a class="link" href="https://web.archive.org/web/20110415102629/http://www.databasejournal.com/features/mssql/article.php/10894_3681061_2/Microsoft-Windows-PowerShell-and-SQL-Server-2005-SMO--Part-I.htm" target="_blank" rel="noopener"
&gt;cet article de Database journal (lien mort, j&amp;rsquo;utilise Internet archive)&lt;/a&gt;. Il nous explique cordialement que toute cette ligne de commande moche que j’utilisais pour enclencher la backup peut être évité en utilisant des objets manipulables dans PowerShell. « Cool, me dis-je, je vais pouvoir proprifier mon script. C’est dommage de ne pas avoir trouvé ça dès le début! »&lt;/p&gt;
&lt;p&gt;En fouillant un peu plus, je suis tombé sur &lt;a class="link" href="https://web.archive.org/web/20211207075523/https://www.databasejournal.com/features/mssql/article.php/3693606/Microsoft-Windows-PowerShell-and-SQL-Server-2005-SMO-150-Part-6.htm" target="_blank" rel="noopener"
&gt;le dernier article (lien mort, j&amp;rsquo;utilise Internet archive)&lt;/a&gt;. En gros, tout l’article explique pas à pas comment faire pour faire mieux en moins de lignes (backups incrémentales for dummies).&lt;/p&gt;
&lt;p&gt;Pour garder la tête haute, je vais quand même héberger une nouvelle version du script, qui proposera de faire des backups incrémentales ou non, en m’inspirant fortement du code disponible sur databasejournal pour améliorer le mien.&lt;/p&gt;
&lt;p&gt;Zwindler 0 - Internet 1&lt;/p&gt;</description></item><item><title>SQL Server 2005 : PowerShell &gt; Batch</title><link>https://blog.zwindler.fr/2010/04/23/powershell-batch/</link><pubDate>Fri, 23 Apr 2010 17:38:58 +0000</pubDate><guid>https://blog.zwindler.fr/2010/04/23/powershell-batch/</guid><description>&lt;img src="https://blog.zwindler.fr/2010/04/4846.logo-powershell.webp" alt="Featured image of post SQL Server 2005 : PowerShell &gt; Batch" /&gt;&lt;p&gt;Il y a quelques jours, j’ai commencé la rénovation de notre vCenter (il tournait en machine virtuelle avec très peu de RAM sur un vieux VMWare server 2.0, lui même hébergé par un PC toussotant).&lt;/p&gt;
&lt;p&gt;Outre les opérations de migration, je me suis penché sur les conséquences de la perte de ce vCenter, et donc les moyens à mettre en œuvre pour s’assurer de vite pouvoir remettre le système en marche. Si on met de côté le débat machine physique/machine virtuelle pour héberger le vCenter, la communauté semblait unanime sur le fait que pour le vCenter, les 2 choses importantes à sauvegarder sont les fichiers de licences et la base de données.&lt;/p&gt;
&lt;p&gt;Dans notre cas, la base de données est simplement un Microsoft SQL Server 2005 (configuration des plus classiques). La version complète du SQL Server Management Studio permet en quelques clics de programmer une sauvegarde. N’étant pas capable de mettre la main sur les fichier d’installation de la version complète du Manager, j’ai cherché une solution alternative.&lt;/p&gt;
&lt;p&gt;J’ai trouvé assez facilement un script batch qui utilise sqlcmd.exe, un programme fournit dans toutes les versions de SQL Server 2005 (même la version Express) et qui est en fait un interpréteur de requête T-SQL (si j’ai bien compris). La solution pour automatiser la sauvegarde de la base de données du vCenter (où de n’importe quelle autre base SQL Server d’ailleurs) consiste simplement à créer une tâche planifiée qui lance ce script aussi souvent que vous le souhaitez.&lt;/p&gt;
&lt;p&gt;J’aurai pu m’arrêter là, mais pour plusieurs raisons, j’ai préféré réécrire ce script :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;D’abord, batch, ça commence à dater un peu, il serait temps de passer à autre chose!&lt;/li&gt;
&lt;li&gt;Ensuite, je ne suis pas du tout à l’aise avec les scripts batch. Comme je voulais améliorer ce script, cela impliquait que je m’y mette sérieusement, et je n’avais pas vraiment envie :-p&lt;/li&gt;
&lt;li&gt;Enfin, certaines actions relativement complexe en batch sont grandement simplifiées par les usines à gaz que sont VBScript et PowerShell.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les deux problèmes majeurs de ce script batch sont le gaspillage d’espace disque et l’absence de contrôle sur ce qui est fait. Certes, on vérifie certaines choses pour éviter des erreurs bêtes lors de l’exécution, mais bon, j’en attendais un peu plus.&lt;/p&gt;
&lt;p&gt;J’ai donc sorti mon interpréteur PowerShell, un papier et un crayon, et je me suis créé un petit script qui permet de sauvegarder une base de données MS SQL exactement de la même manière, mais également qui ne garde que les fichiers backups de la veille et des 2 derniers « 1er jour du mois », qui vérifie que le fichier a bien été copié, et qui journalise le tout.&lt;/p&gt;
&lt;p&gt;Ainsi, pas de gaspillage avec 200 versions pratiquement similaires de la base de données (le vCenter n’en a pas besoin, et on pourrait même se contenter d’une seule backup du mois dernier), et un contrôle un peu plus « propre » de ce qui se passe lors de l’exécution de la tâche planifiée.&lt;/p&gt;
&lt;p&gt;Alors forcément, c’est sûr que c’est loin d’être aussi bien qu’une sauvegarde incrémentale planifiée par un outil tiers ou par le SQL Server Management Studio (je ne sais pas si il le fait, mais j’ai du mal à imaginer que non). C’est sûr aussi qu’on pourrait contrôler de façon encore plus complète tout ce qui se passe lors de l’exécution du script (plutôt que simplement vérifier que le fichier existe), notamment en traitant les éventuelles erreurs renvoyées par SQLCMD (qui ne sont pas vraiment prises en compte).&lt;/p&gt;
&lt;p&gt;J’ai voulu écrire rapidement un petit script, et je n’ai pas besoin de plus que ce que j’ai déjà fais. On ne peut pas tout gérer non plus&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/misc/MSSQLBackup.bat" &gt;le lien vers le batch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/misc/MSSQLBackup.ps1" &gt;le lien vers le script powershell&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>