Ansible et Windows
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
- 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.