Ansible: Custom Facts mit Windows Host
Ansible bietet die Möglichkeit, einer Vielzahl von Informationen (Facts) vom Windows Host zu beziehen. Darunter befinden sich unter anderem Facts zur Hardware, sowie dem installierten Betriebssystem oder der Konfiguration der Netzwerkeinstellungen. Dieser Prozess wird als „Facts Gathering“ bezeichnet. Benötigt man allerdings Informationen vom Host, die nicht standardmäßig mitgeschickt werden, kann man auf „Custom Facts“ zurückgreifen. Dabei erstellt man unter Windows ein Powershell Script, welches die notwendigen Daten ausliest und an Ansible bereitstellt. Wie dieser Vorgang im Detail aussieht, schauen wir uns in diesem Beitrag an.
PowerShell Script
Mit der PowerShell lassen sich so gut wie alle Daten & Informationen vom Windows Host beziehen, die man benötigen kann. Wir müssen nur darauf achten, sie in einem Objekt an Ansible zu übergeben. Das ist soweit auch die einzige Voraussetzung.
Da sich die benötigten Informationen natürlich von Fall zu Fall unterscheiden, kann ich hier nur ein Beispiel nennen. In unserem Fall möchte ich den Updatestand, sowie die Verfügbarkeit einzelner Windows Rollen prüfen.
### Get all Windows Roles & Services $winFeatures = Get-WindowsFeature -ErrorAction SilentlyContinue ### CHECK for installed WINDOWS ROLES $Services = @() if(($winFeatures | Where-Object{$_.Name -like "AD-Domain-Services"}).InstallState -eq "Installed"){$Services += "Domain Controller"} if(($winFeatures | Where-Object{$_.Name -like "AD-Certificate"}).InstallState -eq "Installed"){$Services += "Certificate Authority"} if(($winFeatures | Where-Object{$_.Name -like "DHCP"}).InstallState -eq "Installed"){$Services += "DHCP"} if(($winFeatures | Where-Object{$_.Name -like "Print-Services"}).InstallState -eq "Installed"){$Services += "Print Services"} if(($winFeatures | Where-Object{$_.Name -like "Web-Server"}).InstallState -eq "Installed"){$Services += "IIS"} if(($winFeatures | Where-Object{$_.Name -like "Remote-Desktop-Services"}).InstallState -eq "Installed"){$Services += "Remote Desktop Services"} if(($winFeatures | Where-Object{$_.Name -like "ADFS-Federation"}).InstallState -eq "Installed"){$Services += "Federation Services"} if(($winFeatures | Where-Object{$_.Name -like "NPAS*"}).InstallState -eq "Installed"){$Services += "Network Policy Services"} if(($winFeatures | Where-Object{$_.Name -like "UpdateServices"}).InstallState -eq "Installed"){$Services += "WSUS"} ### CHECK for WINDOWS VERSION $WindowsVersion = [PSCustomObject]@{ CurrentBuildNumber = [int](Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\" -Name "CurrentBuildNumber").CurrentBuildNumber UBR = [int](Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\" -Name "UBR").UBR } ### BUILD OBJECT $WindowsFacts = [PSCustomObject]@{ WindowsVersion = $WindowsVersion Services = $Services } return $WindowsFacts
Führt man das Script aus, bekommt man ein Objekt „WindowsFacts“ mit den entsprechenden Daten zurück.
Ansible Task
Damit wir die benutzerdefinierten Facts vom Host beziehen können, verwenden wir das „ansible.builtin.setup“ Modul. Dieses Modul holt sowohl die Standard- als auch Custom-Facts vom Windows Zielsystem ab. Das Script muss zuvor auf dem Zielsystem in einem beliebigen Ordner abgelegt werden. Danach kann das PowerShell Script mit folgenden Ansible Tasks abgerufen werden:
- name: GATHER FACTS TESTING hosts: all gather_facts: no - name: GATHER Facts Windows setup: fact_path: C:\ProgramData\A8N\CustomFacts\A8N_CustomFacts01.ps1 gather_timeout: 15 gather_subset: - '!hardware' - '!network' - '!ohai' - '!facter' register: hosts_windows
Eine kurze Erläuterung zu dem Playbook:
- Mit dem Parameter „gather_facts: no“ teilen wir Ansible mit, dass zu Beginn keine Facts abgefragt werden sollen.
- Anschließend rufen wir mit dem ersten Task sowohl die Standard- als auch Custom-Facts vom System ab.
- Das zuvor genannte PowerShell Script liegt am Zielsystem im Ordner „C:\ProgramData\A8N\CustomFacts\A8N_CustomFacts01.ps1„.
- Damit der Gather Prozess schneller beendet wird, schließe ich alle Facts die Hardware & Network betreffen aus.
Unsere Facts werden dabei nahtlos in das Output-JSON integriert und lassen sich natürlich auch abrufen und weiterverwenden.