Maîtriser Ansible sur Windows : Votre guide d’expert incontournable

Même si Ansible est connu pour gérer les nœuds Linux en utilisant SSH, saviez-vous qu’Ansible sur Windows fonctionne tout aussi bien ? En utilisant Windows Remote Management (WinRM), Ansible sur Windows peut gérer efficacement tous vos nœuds Windows également !

Avec Ansible sur Windows, vous pouvez effectuer des tâches telles que le déploiement de correctifs, la gestion des serveurs Windows, l’exécution de scripts PowerShell, et plus encore.

Dans ce tutoriel, vous allez apprendre comment configurer votre premier nœud Windows pour être géré avec Ansible et voir comment exécuter des commandes et des playbooks contre lui.

Prérequis

Si vous souhaitez suivre le tutoriel, assurez-vous d’avoir ce qui suit avant de commencer :

  • Un hôte contrôleur Ansible – Ce tutoriel utilisera Ansible v2.9.18 sur une machine Ubuntu 18.04.5 LTS avec une adresse IP de 10.111.4.53. Notez que Windows n’est pas pris en charge en tant que nœud de contrôle, uniquement en tant que nœud géré.
  • Python installé sur votre hôte contrôleur Ansible – Ce tutoriel utilisera Python v2, mais v3 devrait également fonctionner tout aussi bien.
  • Le paquet pip installé sur le contrôleur Ansible.
  • A Windows 2012 R2 or greater computer for Ansible to manage – This tutorial will use two Windows Server 2012 R2 Standard machines as remote nodes with IP addresses of 52.242.251.213 and 10.111.4.106.
  • A Windows workstation – This tutorial will perform some basic pre-configuration to the node that Windows will manage with Ansible and will require you to sitting at a Windows workstation.
  • Le serveur Windows à gérer a l’activation de l’accès distant PowerShell
  • A user account in the local Administrators group on the Windows computer. This tutorial will use an account called adminuser.

Configuration de l’écouteur WinRM sur Windows

Avant qu’Ansible ne puisse communiquer avec un nœud Windows distant, il doit être capable d’établir une connexion avec celui-ci. Il le fait via le protocole Microsoft WinRM. WinRM est le même protocole que utilise la connexion à distance PowerShell pour exécuter des commandes à distance depuis PowerShell.

Au moment de la rédaction de ces lignes, Ansible ne prend pas en charge SSH en tant que protocole de gestion, mais il s’agit d’une fonctionnalité expérimentale pour le moment.

Pour qu’Ansible utilise WinRM pour communiquer avec le nœud Windows, vous devez configurer WinRM. Pour ce faire, Ansible fournit un script PowerShell qui définit diverses options WinRM.

Bien que le script PowerShell fourni par Red Hat pour configurer WinRM ait été testé et soit sûr, vous devriez le lire et comprendre, dans les grandes lignes, ce qu’il fait.

Votre première tâche sera de télécharger le script de configuration et d’exécuter Ansible sur le nœud Windows. Pour ce faire, en supposant que vous avez déjà activé la Connexion à distance PowerShell sur votre ordinateur Windows cible et que vous êtes sur un poste de travail Windows :

Téléchargez le script PowerShell ConfigureRemotingForAnsible.ps1 sur votre ordinateur Windows local. Ce tutoriel supposera qu’il est enregistré dans ~\Téléchargements.

Exécutez le script de configuration sur le nœud Windows qu’Ansible gérera en utilisant la commande Invoke-Command. La commande ci-dessous exécutera la commande sur les deux machines de démonstration du tutoriel et vous demandera le mot de passe du compte adminuser local sur les nœuds Windows.

Invoke-Command -ComputerName 52.242.251.213, 10.111.4.106 -FilePath '~\Downloads\ConfigureRemotingForAnsible.ps1' -Credential (Get-Credential -UserName adminuser)

Par défaut, le script de configuration configurera WinRM pour une authentification HTTP de base. Si vous souhaitez qu’Ansible utilise une connexion plus sécurisée, apprenez Comment configurer WinRM via HTTPS pour Ansible.

Configuration du contrôleur d’Ansible sur Windows

Maintenant que le nœud Windows est prêt pour Ansible, configurons maintenant le contrôleur Ansible pour montrer à Ansible comment communiquer avec lui.

1. Connectez-vous à votre hôte contrôleur Ansible via SSH en utilisant votre client SSH préféré.

2. Installez le module Python pywinrm. Le module Python pywinrm est requis pour qu’Ansible sur Windows communique avec les hôtes via le protocole WinRM.

pip install pywinrm

Définissez les nœuds Windows distants dans un fichier d’inventaire Ansible. Un inventaire Ansible est une collection d’hôtes distants définis dans un fichier soit par leur nom d’hôte, soit par leur adresse IP. Une fois définis, vous pouvez ensuite cibler les inventaires Ansible avec des commandes et des playbooks, comme vous le verrez bientôt.

Le fichier d’inventaire Ansible par défaut se trouve dans le répertoire /etc/ansible/hosts.

Le fichier d’inventaire exemple ci-dessous crée un groupe d’hôtes windows qui contient chaque nœud Windows. Le tutoriel utilise un groupe d’hôtes ici pour faciliter le ciblage de tous les nœuds Windows (si vous en avez plus d’un) en une seule fois plus tard.

[windows]
 54.242.251.213
 10.111.4.106

4. Ensuite, définissez quelques variables requises qu’Ansible utilisera lors de la connexion aux hôtes Windows dans le fichier d’inventaire en tant que groupe windows:vars.

[windows:vars]
 ansible_user=localadmin ## le nom d'utilisateur Windows pour la communication avec Ansible
 ansible_password=s3crect ## le mot de passe Windows pour la communication avec Ansible
 ansible_connection=winrm ## Le type de connexion qu'Ansible établira avec le nœud Windows distant
 ansible_winrm_server_cert_validation=ignore ## ignorer la validation du certificat car nous utiliserons simplement un certificat auto-signé fourni avec Ansible

5. Maintenant, utilisez le module win_ping d’Ansible pour exécuter un test de connexion simple vers les hôtes à l’intérieur du groupe d’hôtes windows défini à l’étape n°3.

# windows est le groupe d'hôtes
# -m indique à Ansible d'utiliser le module win_ping
 ansible windows -m win_ping

Une fois exécutée, vous pouvez voir ci-dessous qu’Ansible renvoie du texte vert avec un message de SUCCÈS indiquant la tentative de ping réussie.

Successful win_ping connection

La sortie confirme que l’hôte contrôleur Ansible peut communiquer avec l’hôte distant Windows avec succès via WinRM.

Exécution de commandes ad-hoc sur des hôtes Windows

À ce stade, vous êtes prêt à permettre à Ansible de commencer à contrôler vos nœuds Windows. Testons maintenant cela en exécutant une commande ad-hoc sur les nœuds Windows pour les modifier. Les commandes ad-hoc sont utiles lorsque vous devez exécuter une commande simple sur des nœuds sans créer préalablement un playbook.

Démontrons les commandes ad-hoc en installant une fonctionnalité Windows sur les nœuds Windows définis dans le groupe d’hôtes windows du fichier d’inventaire. Pour ce faire, en supposant que vous êtes toujours connecté en SSH à votre nœud contrôleur Ansible :

1. Au lieu du module win_ping cette fois, appelez le module win_feature (-m), en lui passant deux arguments (-a) de name et state indiquant le nom de la fonctionnalité Windows et l’état dans lequel vous souhaitez qu’elle soit.

# windows ici est un groupe d'hôtes
# win_feature est le nom du module
# state=present signifie installer le package ou le service
 ansible windows -m win_feature -a "name=Telnet-Client state=present"

Lorsque vous exécutez la commande ci-dessus, si tout se passe bien, Ansible devrait se connecter à tous les nœuds du groupe d’hôtes windows et exécuter la commande win_feature sur chacun d’eux, vérifiant, et si ce n’est pas le cas, installant la fonctionnalité Windows Telnet-Client.

Ansible Windows Feature

2. Ansible indique le succès, mais pour être sûr, connectez-vous manuellement aux nœuds Windows avec PowerShell et vérifiez que la fonctionnalité client Telnet Windows est maintenant installée. Sur votre poste de travail Windows local, exécutez Invoke-Command pour exécuter la commande PowerShell Get-WindowsFeature sur chaque ordinateur Windows.

Invoke-Command -ComputerName 52.242.251.213, 10.111.4.106 -ScriptBlock { Get-WindowsFeature -Name 'Telnet-Service' } -Credential (Get-Credential -UserName adminuser)

À ce stade, vous pouvez exécuter n’importe quel module Windows que vous aimez sous forme de commandes ad-hoc !

Création et exécution de playbooks Ansible sur Windows

Une fois que vous avez maîtrisé l’art d’exécuter des commandes ad-hoc sur des nœuds Windows gérés, votre prochaine tâche consiste à créer et à exécuter des playbooks. Un playbook Ansible combine des commandes en un seul endroit et vous permet d’écrire une logique complexe pour exécuter des scénarios d’automatisation complexes.

Exécution de commandes Windows à distance avec le module win_command

En supposant que vous êtes toujours connecté à votre hôte contrôleur Ansible :

1. Créez un dossier sous votre répertoire personnel appelé ansible-windows-demo et déplacez-vous dedans. Ce dossier contiendra votre playbook.

mkdir ~/ansible-windows-demo 
cd ~/ansible-windows-demo 

2. Ouvrez votre éditeur de texte favori et créez et enregistrez un fichier appelé ansible-windows.yml dans le ~/ansible-windows-demo répertoire.

Les playbooks Ansible sont écrits en YAML

3. Maintenant, copiez le playbook ci-dessous dans le fichier ansible-windows.yml pour créer une seule tâche. Ce playbook exécutera la commande Windows netstat en utilisant le module Ansible Windows win_command sur tous les hôtes à l’intérieur du groupe d’hôtes windows.

Le module win_command exécute des commandes sur un hôte distant Windows. Il ne permet pas les commandes qui incluent des variables telles que des caractères spéciaux, un saut de ligne, un symbole supérieur, etc.

---
 - name: Ansible win_command module example  
   hosts: windows # groupe d'hôtes sur lequel exécuter le module
   tasks: 
   -  name: run an executable command on a remote Windows system
      win_command: netstat -e # win_command est un module Windows.

4. Invoquez le playbook ansible-windows.yml, qui exécute la tâche sur l’hôte distant en exécutant la commande suivante.

ansible-playbook ansible-windows.yml

Si tout s’est bien passé, vous devriez voir une sortie comme ci-dessous.

Ansible successfully executed the netstat command using win_command module

Exécution de commandes PowerShell à distance avec le module win_shell

Vous avez créé un playbook pour exécuter une commande cmd.exe à distance (netstat) sur des nœuds gérés Windows dans l’exemple précédent. Montons maintenant d’un cran et exécutons des commandes PowerShell en utilisant le module win_shell.

Par défaut, le module win_shell s’exécute en PowerShell sur l’hôte Windows.

Sur votre poste de travail Windows local:

1. Tout d’abord, ouvrez votre éditeur de texte préféré sur votre poste de travail local Windows et créez un script PowerShell de test en copiant le code suivant, enregistré sous one.ps1. Ce tutoriel enregistrera le script sous ~\one.ps1.

Le code ci-dessous crée un fichier texte vierge appelé test2.txt dans le répertoire C:\temp.

Set-Content -Path C:\temp\test2.txt -Value ''

2. Copiez le script PowerShell one.ps1 sur vos nœuds gérés Windows en utilisant votre méthode préférée. Ce tutoriel suppose que vous avez copié le script one.ps1 dans le dossier C:\Temp de chaque nœud Windows.

3. Une fois le script PowerShell de test sur le(s) nœud(s) Windows, connectez-vous à votre hôte contrôleur Ansible et ouvrez à nouveau votre éditeur de texte préféré. Cette fois, créez et enregistrez un autre playbook appelé ansible-windows-shell.yml dans le même répertoire ~/ansible-windows-demo.

4. Copiez et collez le playbook suivant dans le fichier ansible-windows-shell.yml. Ce playbook exécutera deux tâches pour démontrer le module win_shell. Il invoque le script PowerShell juste copié à partir de l’étape n°2 et insère le code PowerShell directement dans le playbook pour démontrer que le script n’est pas nécessaire du tout.

Pour passer plusieurs lignes de code PowerShell au module win_shell, utilisez le caractère | pipe.

---
 - name: Ansible win_shell module example 
   remote_user: localadmin # utilisateur local Windows pour se connecter avec
   hosts: windows # groupe d'hôtes distants
   tasks:
    - name: Single line PowerShell # Exécution d'une seule commande à l'aide du module win_shell
      win_shell: C:\temp\one.ps1
    - name: Run multi-lined shell commands 
      win_shell: |
        $text = ' Iam Author of ATA'
       Set-Content -Path C:\temp\test3.txt -Value $text 

5. Maintenant, invoquez le deuxième playbook ansible-windows-shell.yml, qui s’exécute sur l’hôte distant mais avec PowerShell.

ansible-playbook ansible-windows-shell.yml
ansible-playbook ansible-windows-shell.yml

6. Si nécessaire, sur votre poste de travail Windows local, vérifiez que le playbook a exécuté le script existant et le code PowerShell dans le playbook.

Invoke-Command -ComputerName 52.242.251.213, 10.111.4.106 -ScriptBlock { Test-Path -Path 'C:\Temp\test3.txt','C:\Temp\test2.txt' } -Credential (Get-Credential -UserName adminuser)

Si le playbook Ansible s’est exécuté avec succès, PowerShell devrait renvoyer deux déclarations True indiquant que les fichiers existent maintenant.

Conclusion

Dans ce tutoriel, vous avez appris comment configurer votre premier nœud géré Windows dans Ansible. Même si Ansible a traditionnellement été connu comme un outil Linux, il peut facilement être utilisé pour Windows aussi!

Quels playbooks et modules Windows allez-vous commencer à utiliser pour gérer Windows avec Ansible?

Source:
https://adamtheautomator.com/ansible-windows/