Dein erster produktiver Polycrate-Workspace: Eine Checkliste für den Start
TL;DR Ein sauber benannter, klar strukturierter Polycrate-Workspace ist die halbe Miete: ein …
Diese Serie zeigt Schritt für Schritt, wie Ansible mit Polycrate zu einer strukturierten, teilbaren und compliance-fähigen Automatisierungsplattform wird – von den Grundlagen bis zu Enterprise-Szenarien.
pywinrm-Chaos, keine lokalen Installationen, keine Versionsdiskussionen im Team.win_service, win_updates), pywinrm und das passende Ansible-Bundle – ohne eigenes Dockerfile, ohne manuelles ansible-galaxy-Nachinstallieren für den üblichen Einsatz. Du konfigurierst nur noch Workspace, Inventory und Playbooks.secrets.poly und werden über die eingebaute Workspace-Verschlüsselung mit age abgesichert – nicht im inventory.yml.Viele Windows-Admins schauen skeptisch auf Ansible:
pywinrm, OpenSSL – das will ich nicht alles lokal anfassen.“Technisch gesehen ist Ansible ein hervorragendes Werkzeug, gerade für Windows:
ansible.windows und community.windows.Was in der Praxis weh tut, ist etwas anderes:
Dependency-Problem:
Auf jedem Admin-Laptop und jeder Jump-Box dieselben Python-/Ansible-/WinRM-Versionen zu pflegen, ist anstrengend – und sicherheitssensibel.
Playbook-Wildwuchs:
Fünf verschiedene Skript-Ordner, leicht unterschiedliche Playbooks, niemand weiß, was „offiziell“ ist.
Secrets überall:
Passwörter in inventory.yml, in group_vars, in Skripten – und dann kommt der Audit.
Polycrate setzt genau hier an:
ansible.windows.*-Playbooks brauchst du kein zusätzliches Dockerfile.poly und kein manuelles ansible-galaxy collection install ansible.windows. Nur wenn du weitere Collections brauchst, erweiterst du das Image (z. B. community.windows).age sorgt dafür, dass du Passwörter in secrets.poly sicher ablegen kannst, ohne extra Vault-Lösung.In diesem Beitrag bauen wir das Schritt für Schritt auf – mit Fokus auf Windows-Admins ohne Cloud-Native-Vorkenntnisse.
Bevor Ansible über Polycrate mit deinen Windows-Servern sprechen kann, muss WinRM vernünftig konfiguriert sein. Wir konzentrieren uns auf:
Auf dem Ziel-Server (z.B. Windows Server 2022) öffnest du eine PowerShell als Administrator:
winrm quickconfigWenn der Dienst noch nicht läuft, wirst du gefragt, ob er konfiguriert werden soll. Bestätige das.
Das legt in der Regel einen HTTP-Listener auf Port 5985 an. Für Ansible über das Internet oder in sensiblen Netzen solltest du HTTP abschalten und HTTPS nutzen.
Für Test- und kleine Umgebungen reicht ein Self-Signed-Zertifikat. In einer Domäne solltest du besser ein Zertifikat aus eurer Unternehmens-PKI verwenden.
Self-Signed-Beispiel:
$newCert = New-SelfSignedCertificate `
-DnsName "win01.acme-corp.com" `
-CertStoreLocation "Cert:\LocalMachine\My"Merke dir den Thumbprint:
$newCert.ThumbprintIn produktiven Umgebungen ersetzt du diesen Schritt durch ein ausgestelltes Server-Zertifikat aus eurer CA.
Zuerst existierende HTTP-Listener prüfen:
winrm enumerate winrm/config/ListenerHTTPS-Listener mit deinem Zertifikat erstellen (Thumbprint einsetzen):
$thumb = "<DEIN_THUMBPRINT>"
winrm create winrm/config/Listener?Address=*+Transport=HTTPS `
"@{Hostname=`"win01.acme-corp.com`"; CertificateThumbprint=`"$thumb`"}"Falls bereits ein HTTPS-Listener existiert, kannst du ihn alternativ mit winrm set anpassen.
Sicherheitseinstellungen prüfen:
winrm get winrm/configWichtige Punkte:
AllowUnencrypted sollte false sein.Service/Auth sollte Basic im Idealfall false sein, NTLM/Kerberos sind vorzuziehen.Standardport für WinRM über HTTPS ist 5986. Öffne den Port in der Windows-Firewall:
New-NetFirewallRule `
-Name "WINRM_HTTPS_IN" `
-DisplayName "WinRM over HTTPS" `
-Protocol TCP `
-LocalPort 5986 `
-Direction Inbound `
-Action AllowJe nach Umgebung kannst du den Zugriff auf bestimmte Subnetze oder Management-Server beschränken.
Von einem Admin-Rechner (oder einer Jump-Box) kannst du mit PowerShell prüfen, ob HTTPS funktioniert:
Test-WsMan win01.acme-corp.com -UseSSLWenn das klappt, sind die technischen Grundlagen für Ansible gelegt. Mit plain Ansible würdest du jetzt Python, Ansible, pywinrm und SSL-Libraries installieren und passend konfigurieren.
Mit Polycrate überspringst du diesen Teil komplett – das bringt uns zum Workspace.
Wir legen einen einfachen Polycrate-Workspace an, der deine Windows-Server verwaltet.
Im Root-Verzeichnis deines Workspaces liegt die workspace.poly:
name: acme-corp-automation
organization: acme
blocks:
- name: windows-baseline
from: windows-baseline
config:
windows_group: "windows"Was hier passiert:
name: Der Name deines Workspaces, z.B. dein Team oder Projekt.blocks: Liste der Block-Instanzen. Wir haben einen Block windows-baseline, der aus einem lokalen Verzeichnis ./blocks/windows-baseline kommt.config.windows_group: Die Hosts-Gruppe, auf die sich dieser Block standardmäßig bezieht.Mehr zu Workspaces findest du in der Workspace-Dokumentation.
Direkt im Workspace-Root liegt inventory.yml. Wie im Beitrag Multi-Server-Management mit Ansible-Inventories beschrieben, stehen alle Hosts unter all.hosts; unter children verweist die Gruppe windows nur noch per Hostname – gemeinsame WinRM-Parameter liegen in vars der Gruppe (keine Duplikate pro Host):
all:
hosts:
win01.acme-corp.com: {}
win02.acme-corp.com: {}
children:
windows:
hosts:
win01.acme-corp.com:
win02.acme-corp.com:
vars:
ansible_connection: winrm
ansible_winrm_transport: ntlm
ansible_port: 5986
ansible_winrm_server_cert_validation: ignoreWichtig:
ansible_connection: winrm sagt Ansible, dass es WinRM nutzen soll.ansible_winrm_transport: ntlm wählt NTLM als Auth-Methode (passt gut zu vielen klassischen Windows-Umgebungen).ansible_winrm_server_cert_validation: ignore ist für Self-Signed-Zertifikate nützlich. In produktiven Umgebungen solltest du Zertifikate korrekt validieren.Keine Passwörter im Inventory. Die kommen gleich in secrets.poly.
Weitere Details zur Ansible-Integration findest du in der Ansible-Dokumentation für Polycrate.
Polycrate bringt Workspace-Verschlüsselung mit age direkt mit. Du musst kein externes Vault-Tool betreiben, um Passwörter sicher abzulegen.
Im Workspace-Root legst du eine Datei secrets.poly an:
win_admin_user: "acme-admin"
win_admin_password: "SuperSicheresPasswort123!"Bevor du diese Datei in Git eincheckst, verschlüsselst du den Workspace:
polycrate workspace encryptDetails dazu findest du in der Dokumentation zur Workspace-Verschlüsselung.
Polycrate stellt dir diese Secrets im Playbook als workspace.secrets.* zur Verfügung. Das nutzen wir gleich, um ansible_user und ansible_password zu setzen – ohne sie im Inventory zu hinterlegen.
Jetzt definieren wir unseren Windows-Block. Das Verzeichnis ./blocks/windows-baseline enthält mindestens:
block.polybaseline.yml (Windows-Basis-Konfiguration)patches.yml (Windows-Patch-Management)name: windows-baseline
version: 0.1.0
kind: generic
config:
windows_group: "windows"
actions:
- name: baseline
description: "Windows-Basis-Konfiguration (Dienste, Features, Registry, Software)"
playbook: baseline.yml
- name: patches
description: "Windows-Patch-Management mit win_updates"
playbook: patches.ymlkind: generic ist für klassische Ansible-Blöcke passend.actions definierst du sprechende Aktionen, die jeweils ein Playbook ausführen.config.windows_group kannst du die Zielgruppe zentral steuern.Best Practices zu Blöcken findest du in den Block-Best-Practices und in der Blocks-Dokumentation.
Eine Action ausführst du immer mit dem gleichen Schema:
polycrate run windows-baseline baselineoder:
polycrate run windows-baseline patchesPolycrate startet dabei einen Container mit deiner definierten Toolchain, lädt den Workspace inklusive verschlüsselter Secrets und führt Ansible darin aus. Auf deinem Laptop musst du kein Ansible, Python oder pywinrm installiert haben.
Jetzt wird es konkret: Wir schreiben das Playbook baseline.yml und nutzen Module aus ansible.windows und community.windows.
- name: Windows-Baseline anwenden
hosts: "{{ block.config.windows_group }}"
gather_facts: false
vars:
ansible_user: "{{ workspace.secrets.win_admin_user }}"
ansible_password: "{{ workspace.secrets.win_admin_password }}"
ansible_connection: winrm
ansible_winrm_transport: ntlm
ansible_port: 5986
ansible_winrm_server_cert_validation: ignore
tasks:
- name: Sicherstellen, dass der Dienst 'Spooler' läuft
ansible.windows.win_service:
name: Spooler
start_mode: auto
state: started
- name: Feature 'Web-Server' (IIS) installieren
ansible.windows.win_feature:
name: Web-Server
state: present
include_sub_features: true
restart: false
- name: Registry-Key für Remote Desktop erlauben
ansible.windows.win_regedit:
path: HKLM:\System\CurrentControlSet\Control\Terminal Server
name: fDenyTSConnections
data: 0
type: dword
- name: Chocolatey installieren (falls nicht vorhanden)
ansible.windows.win_chocolatey:
state: present
- name: 7zip über Chocolatey installieren
ansible.windows.win_chocolatey:
name: 7zip
state: present
- name: Custom MSI-Paket installieren
ansible.windows.win_package:
path: "\\\\fileserver.acme-corp.com\\software\\MyApp.msi"
product_id: "{12345678-ABCD-1234-ABCD-1234567890AB}"
state: presentWas hier passiert:
hosts: Wir verwenden die Gruppe aus block.config.windows_group, also windows. So kannst du denselben Block in einem anderen Workspace mit anderer Gruppe verwenden.vars: Wir setzen Verbindungsparameter (User/Passwort, WinRM-Details) aus workspace.secrets.*. Das ist der Kern: keine Klartext-Passwörter im Inventory.ansible.windows.win_service: Dienst „Spooler“ muss laufen und automatisch starten. Das Modul gehört zu ansible.windows (nicht zu ansible-core); im Polycrate-Standard-Image ist das bereits enthalten (siehe TL;DR und Abschnitt „Polycrate setzt genau hier an“).ansible.windows.win_feature: Installiert die IIS-Rolle inklusive Subfeatures.ansible.windows.win_regedit: Schaltet Remote Desktop frei (klassisches Beispiel).ansible.windows.win_chocolatey: Installiert Chocolatey und anschließend ein Paket.ansible.windows.win_package: Installiert ein MSI von einem zentralen Share.Mit plain Ansible würdest du das Playbook ähnlich schreiben – Ansible ist hier völlig okay. Der Unterschied liegt im Drumherum:
ansible.windows und community.windows bereitstellen.pywinrm und SSL-Abhängigkeiten sauber installieren.Mit Polycrate steckt all das im mitgelieferten Ansible-Container (siehe python-requirements.txt / Polycrate-Dockerfile: ansible-Bundle, pywinrm, zusätzliche Galaxy-Collections). Nur wenn du weitere Collections brauchst, erweiterst du das Image (z. B. Dockerfile.poly). Deine Kolleg:innen brauchen nur Polycrate und Docker – keine lokale Python-Feinabstimmung.
Patches sind ein typischer Use-Case, den Windows-Admins sauber automatisieren wollen – inklusive kontrolliertem Reboot.
- name: Windows-Patches installieren
hosts: "{{ block.config.windows_group }}"
gather_facts: false
vars:
ansible_user: "{{ workspace.secrets.win_admin_user }}"
ansible_password: "{{ workspace.secrets.win_admin_password }}"
ansible_connection: winrm
ansible_winrm_transport: ntlm
ansible_port: 5986
ansible_winrm_server_cert_validation: ignore
tasks:
- name: Sicherheits- und kritische Updates installieren
ansible.windows.win_updates:
category_names:
- SecurityUpdates
- CriticalUpdates
state: installed
reboot: yes
register: update_result
- name: Bei Bedarf neu starten
ansible.windows.win_reboot:
msg: "System wird für Windows-Updates neu gestartet."
pre_reboot_delay: 60
post_reboot_delay: 120
when: update_result.reboot_requiredErklärung:
ansible.windows.win_updates steuert, welche Updates installiert werden sollen; über category_names kannst du granular filtern.reboot: yes erlaubt win_updates, einen Neustart zu initiieren, falls nötig.ansible.windows.win_reboot behandelt den Neustart sauber im Ansible-Kontext und wartet, bis der Host wieder erreichbar ist.Aus Sicht eines Windows-Admins ist das der Punkt, an dem Ansible glänzt: Du kannst ein reproduzierbares Patch-Playbook bauen, das du z.B. monatlich per Polycrate-Workflow ausrollst.
Mehr zu Workflows findest du in der Workflows-Dokumentation.
Stell dir vor, du willst das gleiche Setup mit plain Ansible aufbauen – ohne Polycrate:
Auf deinem Admin-Laptop:
pip oder Paketmanager).pywinrm und requests-ntlm installieren.ansible.windows und community.windows Collections installieren.ansible.cfg anpassen (z.B. Inventory-Pfad, WinRM-Defaults).Auf dem Laptop deiner Kolleg:innen:
In der Doku:
pip install ...“).Mit Polycrate ändern wir das Bild:
pywinrm, Collections usw. stecken in einem Container-Image.Dockerfile.poly) und teilst sie im Team.Zusätzlich bringt das Block-Modell Ordnung:
baseline, patches).Die technischen Details zu Registry und Sharing findest du in der Registry-Dokumentation und in den Hinweisen zu PolyHub.
Nein. Ansible über WinRM mit ansible_connection: winrm und ansible_winrm_transport: ntlm funktioniert auch mit Workgroup-Servern, solange:
In einer Domänenumgebung kannst du zusätzlich Kerberos nutzen, was in vielen Fällen sogar empfehlenswert ist. Für den Einstieg ist NTLM aber oft einfacher, gerade in gemischten Umgebungen.
Du hast mehrere Möglichkeiten:
inventory.yml eigene Benutzer hinterlegen und nur das Passwort aus secrets.poly beziehen.secrets.poly mehrere Credentials ablegen (z.B. win_admin_user_dmz, win_admin_user_intern) und im Block über block.config steuern, welcher Account verwendet wird.Polycrate gibt dir mit workspace.secrets.* und block.config.* genug Flexibilität, ohne dass du Passwörter in Klartext-Dateien streuen musst. Wie du Variablen am besten strukturierst, beschreibt die Best-Practices-Dokumentation.
Wenn du heute schon ein funktionierendes Ansible-Setup hast, bringt dir Polycrate vor allem:
secrets.poly und verschlüsselten Workspace-Verzeichnissen, ohne zusätzliche Tools.In vielen Teams ist der erste Schritt, vorhandene Playbooks weitgehend unverändert in einen Block zu „heben“ und sie dann nach und nach aufzuräumen. Wie dieser Migrationspfad aussehen kann, beschreiben wir in weiteren Beiträgen dieser Reihe.
Weitere Fragen? Siehe unsere FAQ
Was haben wir in diesem Beitrag erreicht?
inventory.yml, workspace.poly, secrets.poly und einem Windows-Block (block.poly) aufgebaut ist.ansible.windows und community.windows Dienste, Features, Registry-Einträge, Software und Updates automatisiert verwalten – ohne lokale Ansible-Installation.age und Secrets in secrets.poly statt in inventory.yml.Für Windows-Teams ist das oft der Punkt, an dem Automatisierung von „gelegentlichen Skripten“ zu einer belastbaren Plattform wird: reproduzierbar, teilbar, auditierbar.
Als ayedo begleiten wir solche Setups regelmäßig:
Wenn du diesen Weg nicht alleine gehen möchtest oder mit deinem Team in kurzer Zeit einen praxisnahen Einstieg suchst, ist unser Windows-Automatisierung Workshop der richtige Rahmen dafür – von WinRM-Basics bis zu skalierbarem Patch-Management mit Polycrate.
TL;DR Ein sauber benannter, klar strukturierter Polycrate-Workspace ist die halbe Miete: ein …
TL;DR Plain Ansible ist ein starkes Werkzeug für Ad-hoc-Automatisierung, schnelle Skripte und …
TL;DR Die meisten Umgebungen sind hybrid: Windows-Server fürs AD, Fileservices und Fachanwendungen, …