Ansible et Windows

De Justine's wiki
Aller à la navigation Aller à la recherche

Ansible et Windows

https://www.it-connect.fr/debutez-avec-ansible-et-gerez-vos-serveurs-windows/#III_Preparer_les_hotes_Windows https://docs.ansible.com/ansible/latest/user_guide/windows.html

Bien que l'on ne puisse exécuter Ansible que depuis un système Linux, celui-ci peut gérer des hôtes Windows. En effet, celui-ci utilise :

  • WinRM : au lieu de SSH, Ansible utilise WinRM, qui est le protocole de contrôle à distance de Microsoft, basé sur HTTP.
  • Les modules sont écrit en PowerShell plutôt qu'en Python. Ils sont moins nombreux que pour Linux.

Nous allons ici essayer de lancer des playbooks sur un hôte Windows.

Préparer la machine cible

https://docs.ansible.com/ansible/latest/user_guide/windows_setup.html

Il nous faut PowerShell version 3.0 et .NET 4.0, sur du Win2008 ou Win7. Ansible nous fournit des scripts qui font cela pour nous :

$url = "https://raw.githubusercontent.com/jborean93/ansible-windows/master/scripts/Upgrade-PowerShell.ps1"
$file = "$env:temp\Upgrade-PowerShell.ps1"
$username = "Administrator"
$password = "Password"

(New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force

# Version can be 3.0, 4.0 or 5.1
&$file -Version 5.1 -Username $username -Password $password -Verbose

# This isn't needed but is a good security practice to complete
Set-ExecutionPolicy -ExecutionPolicy Restricted -Force
#Deuxième partie
$reg_winlogon_path = "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Winlogon"
Set-ItemProperty -Path $reg_winlogon_path -Name AutoAdminLogon -Value 0
Remove-ItemProperty -Path $reg_winlogon_path -Name DefaultUserName -ErrorAction SilentlyContinue
Remove-ItemProperty -Path $reg_winlogon_path -Name DefaultPassword -ErrorAction SilentlyContinue

Enfin, il faut également mettre en place WinRM si ce n'est pas fait. La page donnée en lien ci-dessus donne les dernières informations à ce propos.

TrustedHosts

Si le serveur WinRM ne veut pas nous laisser venir, il faudra peut-être ajouter la amchine ansible aux TrustedHosts :

Set-Item WSMan:\localhost\Client\TrustedHosts machineansible.justine.com

Préparation côté Ansible

Tout devrait être dispo, à part peut-être:

pip install "pywinrm>=0.2.2" --user

Je commence par un classique fichier d'inventaire :

[winserv]
193.51.101.108

Cependant, nous avons un problème : WinRM ne fonctionne pas par clef SSH ! Nous allons devoir stocker des mots de passe. Nous allons donc créer avec Ansible-vault un fichier pour cela :

[justine@localhost playbookwindows]$ mkdir group_vars [justine@localhost playbookwindows]$ export EDITOR='/usr/bin/vim' #Sinon vault ne sait pas avec quoi j'édite [justine@localhost playbookwindows]$ cd group_vars/ [justine@localhost group_vars]$ ansible-vault create winserv.yml #winserv comme le groupe d'hotes #Puis rentrer les mots de passe

Voici le contenu que je lui donne :

ansible_ssh_user: Administrateur ansible_ssh_pass: password123 ansible_ssh_port: 5986 #5986 correspond a la version https, 5985 a la version non securisee ansible_connection: winrm

Je peux éditer avec:

ansible-vault edit monfichier

Tests sur une machine hors domaine

https://docs.ansible.com/ansible/latest/user_guide/windows_setup.html#host-requirements

Sur une machine Windows Server 2012 hors domaine, mon butest d'obtenir un win_ping. Voici les étapes suivies pour y arriver :

ExecutionPolicy:

<syntaxhighlight lang='powershell'> Set-ExecutionPolicy Unrestricted </syntaxhighlight>

Upgrade PowerShell et .NET:

<syntaxhighlight lang='powershell'> $url = "https://raw.githubusercontent.com/jborean93/ansible-windows/master/scripts/Upgrade-PowerShell.ps1" $file = "$env:temp\Upgrade-PowerShell.ps1" $username = "Administrator" $password = "Password"

(New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file) Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force

  1. Version can be 3.0, 4.0 or 5.1

&$file -Version 5.1 -Username $username -Password $password -Verbose </syntaxhighlight>

Suppression du autologon :

<syntaxhighlight lang='powershell'>

$reg_winlogon_path = "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" Set-ItemProperty -Path $reg_winlogon_path -Name AutoAdminLogon -Value 0 Remove-ItemProperty -Path $reg_winlogon_path -Name DefaultUserName -ErrorAction SilentlyContinue Remove-ItemProperty -Path $reg_winlogon_path -Name DefaultPassword -ErrorAction SilentlyContinue </syntaxhighlight>

Setup de WinRM

<syntaxhighlight lang='powershell'> $url = "https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1" $file = "$env:temp\ConfigureRemotingForAnsible.ps1"

(New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)

powershell.exe -ExecutionPolicy ByPass -File $file </syntaxhighlight>

Enumération des listeners

winrm enumerate winrm/config/Listener

A ce stade, j'ai deux listeners WinRM fonctionnels :

<syntaxhighlight lang='powershell'> Listener

   Address = *
   Transport = HTTP
   Port = 5985
   Hostname
   Enabled = true
   URLPrefix = wsman
   CertificateThumbprint
   ListeningOn = 10.0.2.15, 127.0.0.1, 192.168.56.155, ::1, fe80::5efe:10.0.2.15%6, fe80::5efe:192.168.56.155%8, fe80::

ffff:ffff:fffe%2, fe80::203d:7d97:c2ed:ec78%3, fe80::e8ea:d765:2c69:7756%7

Listener

   Address = *
   Transport = HTTPS
   Port = 5986
   Hostname = SERVER2016
   Enabled = true
   URLPrefix = wsman
   CertificateThumbprint = E6CDAA82EEAF2ECE8546E05DB7F3E01AA47D76CE
   ListeningOn = 10.0.2.15, 127.0.0.1, 192.168.56.155, ::1, fe80::5efe:10.0.2.15%6, fe80::5efe:192.168.56.155%8, fe80::

ffff:ffff:fffe%2, fe80::203d:7d97:c2ed:ec78%3, fe80::e8ea:d765:2c69:7756%7 </syntaxhighlight>

Ce n'est pas la peine d'en faire d'autres. Quoi qu'il en soit, j'arrive désormais à avoir un pong de la façon suivante :

ansible all -i "192.168.1.28," -u "administrator" --ask-pass -e "ansible_connection=winrm ansible_winrm_server_cert_validation=ignore" -m win_ping

Lancer un playbook sur des machines windows : exemple

Voici un exemple d'inventaire fonctionnel:

[windoze]
winserv.domain.tld

[windoze:vars]
ansible_user=adm-truc@domain.tld
ansible_password=changemoi
ansible_connection=winrm
ansible_winrm_transport=ntlm
ansible_winrm_server_cert_validation=ignore
ansible_winrm_message_encryption=auto

Derrière, il n'y a plus qu'à lancer un playbook avec cet inventaire.