Beheer van Ansible op Windows: Uw Go-To Expertgids

Hoewel Ansible bekend staat om het beheren van Linux-nodes via SSH, wist je dat Ansible op Windows net zo goed werkt? Door gebruik te maken van Windows Remote Management (WinRM) kan Ansible op Windows effectief al je Windows-nodes beheren!

Met Ansible op Windows kun je taken uitvoeren zoals het implementeren van patches, het beheren van Windows-servers, het uitvoeren van PowerShell-scripts en meer.

In deze tutorial ga je leren hoe je je eerste Windows-node kunt instellen om te worden beheerd met Ansible en hoe je opdrachten en playbooks er tegen kunt uitvoeren.

Vereisten

Als je de tutorial wilt volgen, zorg er dan voor dat je het volgende hebt voordat je begint:

  • Een Ansible-controllerhost – Deze tutorial zal Ansible v2.9.18 gebruiken op een Ubuntu 18.04.5 LTS-machine met een IP-adres van 10.111.4.53. Merk op dat Windows niet wordt ondersteund als een controleknooppunt, alleen als een beheerd knooppunt.
  • Python geïnstalleerd op je Ansible-controllerhost – Deze tutorial zal Python v2 gebruiken, maar v3 zou net zo goed moeten werken.
  • De pip-pakket geïnstalleerd op de Ansible-controller.
  • 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.
  • De Windows-server die moet worden beheerd heeft PowerShell Remoting ingeschakeld
  • A user account in the local Administrators group on the Windows computer. This tutorial will use an account called adminuser.

WinRM-listener instellen op Windows

Voordat Ansible kan communiceren met een externe Windows-node, moet het in staat zijn om er verbinding mee te maken. Dit doet het via het Microsoft-protocol WinRM. WinRM is hetzelfde protocol dat PowerShell Remoting gebruikt om externe opdrachten uit te voeren binnen PowerShell.

Ten tijde van dit schrijven ondersteunt Ansible SSH als een beheerprotocol, maar het is op dit moment een experimentele functie.

Voor Ansible om WinRM te gebruiken om te communiceren met de Windows-node, moet je WinRM configureren. Om dit te doen, biedt Ansible een PowerShell-script dat verschillende WinRM-opties instelt.

Hoewel het PowerShell-script dat Red Hat biedt om WinRM te configureren is getest en veilig is, moet je het doorlezen en op een hoog niveau begrijpen wat het doet.

Je eerste taak zal zijn om het configuratiescript te downloaden en Ansible uit te voeren op de Windows-node. Om dat te doen, ervan uitgaande dat je al PowerShell Remoting ingeschakeld hebt op je doel-Windows-computer en je op een Windows-werkstation bent:

Download het PowerShell-script ConfigureRemotingForAnsible.ps1 naar je lokale Windows-computer. Deze tutorial gaat ervan uit dat het is opgeslagen in ~\Downloads.

Voer het configuratiescript uit op de Windows-node die Ansible zal beheren met behulp van het Invoke-Command-commando. Het onderstaande commando zal het commando uitvoeren op de twee demomachines van de tutorial en zal je om het wachtwoord vragen voor het lokale adminuser-account op de Windows-nodes.

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

Standaard configureert het configuratiescript WinRM voor basis HTTP-authenticatie. Als je wilt dat Ansible een veiligere verbinding gebruikt, leer dan Hoe WinRM over HTTPS te configureren voor Ansible.

Het configureren van de controller van Ansible op Windows

Nu de Windows-node gereed is voor Ansible, laten we de Ansible-controller nu configureren om Ansible te laten zien hoe ermee te communiceren.

1. Maak verbinding met je Ansible-controllerhost via SSH met behulp van je favoriete SSH-client.

2. Installeer de pywinrm-Python-module. De pywinrm-Python-module is vereist voor Ansible op Windows om te communiceren met hosts via het WinRM-protocol.

pip install pywinrm

3. Definieer de externe Windows-nodes in een Ansible-inventarisbestand. Een Ansible-inventaris is een verzameling externe hosts die gedefinieerd zijn in een bestand, met hun hostnaam of IP-adres. Nadat ze zijn gedefinieerd, kun je vervolgens commando’s en playbooks richten op Ansible-inventarissen, zoals je binnenkort zult zien.

Het standaard Ansible-inventarisbestand bevindt zich in de /etc/ansible/hosts map.

Het onderstaande voorbeeldinventarisbestand is een windows hostgroep die elke Windows-node bevat. In deze tutorial wordt een hostgroep gebruikt om het gemakkelijker te maken om later alle Windows-nodes (indien er meer dan één is) tegelijkertijd te richten.

[windows]
 54.242.251.213
 10.111.4.106

4. Definieer vervolgens een paar vereiste variabelen die Ansible zal gebruiken bij het verbinden met de Windows-hosts in het inventarisbestand als een windows:vars groep.

[windows:vars]
 ansible_user=localadmin ## de gebruikersnaam voor Windows waarmee Ansible communiceert
 ansible_password=s3crect ## het wachtwoord voor Windows waarmee Ansible communiceert
 ansible_connection=winrm ## Het type verbinding dat Ansible zal maken met de externe Windows-node
 ansible_winrm_server_cert_validation=ignore ## negeer certificaatvalidatie omdat we gewoon een zelfondertekend certificaat zullen gebruiken dat bij Ansible wordt geleverd

5. Gebruik nu de Ansible win_ping module om een eenvoudige verbindings test uit te voeren naar de hosts binnen de windows hostgroep gedefinieerd in stap #3.

# windows is de hostgroep
# -m vertelt Ansible om de win_ping module te gebruiken
 ansible windows -m win_ping

Zodra uitgevoerd, kunt u hieronder zien dat Ansible groene tekst teruggeeft met een SUCCES bericht dat de succesvolle ping poging aangeeft.

Successful win_ping connection

De uitvoer bevestigt dat de Ansible controller host succesvol kan communiceren met de Windows externe host via WinRM.

Het uitvoeren van ad-hoc commando’s op Windows hosts

Op dit moment bent u klaar voor Ansible om uw Windows nodes te gaan besturen. Laten we dit nu testen door een ad-hoc commando uit te voeren op de Windows nodes om ze te wijzigen. Ad-hoc commando’s zijn handig wanneer u een eenvoudig commando op nodes moet uitvoeren zonder eerst een playbook te maken.

Laten we ad-hoc commando’s demonstreren door een Windows functie te installeren op de Windows nodes gedefinieerd in het inventaris bestand in de windows hostgroep. Om dat te doen, ervan uitgaande dat u nog steeds ingelogd bent op uw Ansible controller node:

1. In plaats van de win_ping-module deze keer, roep de win_feature-module aan (-m), waarbij je twee argumenten (-a) doorgeeft met name en state om de naam van de Windows-functie en de gewenste status aan te geven.

# windows hier is een groep hosts
# win_feature is de naam van de module
# state=present betekent dat het pakket of de service geïnstalleerd moet worden
 ansible windows -m win_feature -a "name=Telnet-Client state=present"

Wanneer je bovenstaand commando uitvoert, zou Ansible, als alles goed gaat, verbinding moeten maken met alle knooppunten in de hostgroep windows en het win_feature-commando op elk knooppunt moeten uitvoeren, controlerend op, en zo nodig installeren van de Telnet-Client-Windows-functie.

Ansible Windows Feature

2. Ansible toont succes, maar om zeker te zijn, maak handmatig verbinding met de Windows-knooppunten met PowerShell en controleer of de Telnet Client Windows-functie nu is geïnstalleerd. Op je lokale Windows-werkstation voer je Invoke-Command uit om het Get-WindowsFeature-PowerShell-commando op elk Windows-computer uit te voeren.

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

Op dit punt kun je elk willekeurig Windows-module als ad-hoc commando uitvoeren!

Creëren en uitvoeren van Ansible op Windows Playbooks

Zodra je de kunst van het uitvoeren van ad-hoc commando’s op beheerde Windows-nodes onder de knie hebt, is je volgende taak het maken en uitvoeren van playbooks. Een Ansible playbook combineert commando’s op één plek en stelt je in staat om complexe logica te schrijven om complexe automatiseringsscenario’s uit te voeren.

Het uitvoeren van externe Windows-commando’s met de win_command-module

Als je nog steeds verbonden bent met je Ansible-controllerhost:

1. Maak een map aan onder je thuismap genaamd ansible-windows-demo en ga er naartoe. Deze map zal je playbook bevatten.

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

2. Open je favoriete teksteditor en maak een bestand genaamd ansible-windows.yml in de map ~/ansible-windows-demo en sla het op.

Ansible-playbooks worden geschreven in YAML

3. Kopieer nu het onderstaande playbook naar het bestand ansible-windows.yml om een enkele taak te maken. Dit playbook zal het netstat Windows-commando uitvoeren met behulp van de win_command-module voor Windows Ansible op alle hosts binnen de windows-hostgroep.

De module win_command voert commando’s uit op een Windows externe host. Het staat geen commando’s toe die variabelen bevatten, zoals speciale tekens, regelonderbrekers, groter-dan-symbolen, enz.

---
 - name: Ansible win_command module example  
   hosts: windows # hostgroep om de module op uit te voeren
   tasks: 
   -  name: run an executable command on a remote Windows system
      win_command: netstat -e # win_command is een Windows-module.

4. Roep het playbook ansible-windows.yml aan, dat de taak op de externe host uitvoert door het volgende commando uit te voeren.

ansible-playbook ansible-windows.yml

Als alles goed is gegaan, zou je output moeten zien zoals hieronder.

Ansible successfully executed the netstat command using win_command module

Uitvoeren van externe PowerShell-commando’s met de win_shell-module

Je hebt een playbook gemaakt om een extern cmd.exe-commando (netstat) uit te voeren op beheerde knooppunten van Windows in het vorige voorbeeld. Laten we nu de lat iets hoger leggen en PowerShell-commando’s uitvoeren met de win_shell-module.

Standaard wordt de win_shell-module uitgevoerd in PowerShell op een Windows-host

Op je lokale Windows-werkstation:

1. Eerst, open uw favoriete teksteditor op uw lokale Windows-werkstation en maak een voorbeeld PowerShell-script en kopieer de volgende code erin, sla het op als one.ps1. Deze tutorial zal het script opslaan als ~\one.ps1.

De onderstaande code maakt een leeg tekstbestand genaamd test2.txt in de map C:\temp.

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

2. Kopieer het one.ps1 PowerShell-script naar uw beheerde Windows-nodes met uw voorkeursmethode. Deze tutorial gaat ervan uit dat u het one.ps1 script naar de C:\Temp map op elke Windows-node heeft gekopieerd.

3. Zodra het voorbeeld PowerShell-script op de Windows-node(s) staat, maak verbinding met uw Ansible-controllerhost en open opnieuw uw favoriete teksteditor. Maak deze keer een ander playbook genaamd ansible-windows-shell.yml in dezelfde ~/ansible-windows-demo map en sla het op.

4. Kopieer en plak het volgende playbook in het bestand ansible-windows-shell.yml. Dit playbook voert twee taken uit om de win_shell module te demonstreren. Het roept het PowerShell-script aan dat zojuist is gekopieerd vanuit stap #2 en voegt de PowerShell-code rechtstreeks in het playbook in om te demonstreren dat het script helemaal niet nodig is.

Om meerdere regels PowerShell code door te geven aan de win_shell module, gebruik de | pijplijnkarakter.

---
 - name: Ansible win_shell module example 
   remote_user: localadmin # lokale Windows-gebruiker om mee te verbinden
   hosts: windows # groep van externe hosts
   tasks:
    - name: Single line PowerShell # Uitvoeren van een enkel commando met behulp van het win_shell-module
      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. Roep nu het tweede playbook ansible-windows-shell.yml aan, dat op de externe host wordt uitgevoerd maar met PowerShell.

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

6. Indien nodig, op uw lokale Windows-werkstation, verifieer of het playbook het bestaande script en de PowerShell-code in het playbook heeft uitgevoerd.

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)

Als het Ansible-playbook succesvol is uitgevoerd, zou PowerShell twee True-uitspraken moeten retourneren die aangeven dat de bestanden nu bestaan.

Conclusie

In deze tutorial heb je geleerd hoe je je eerste Windows-beheerde knooppunt instelt in Ansible. Hoewel Ansible traditioneel bekend staat als een Linux-tool, kan het ook gemakkelijk voor Windows worden gebruikt!

Welke playbooks en Windows-modules ga je gebruiken om Windows te beheren met Ansible?

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