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.
Polycrate baut auf Ansible auf, gibt der Automatisierung aber eine klarere Form. Drei Konzepte stehen im Zentrum:
block.poly, Playbooks, Templates und Artefakten.configure, patch, deploy), der genau ein Playbook ausführt.Wichtig: Polycrate führt Ansible immer in einem Container aus. Das löst das klassische Dependency-Problem:
Statt komplexer Ansible-CLI-Aufrufe wie:
ansible-playbook -i inventory.yml site.yml -e "env=prod" --tags "patch"startest du eine definierte Action:
polycrate run linux-baseline patchDie Action kennt ihr Playbook, die Konfiguration und den Container-Kontext. Das ist gute DX/UX – auch Kolleg:innen ohne tiefes Ansible-Know-how können Automatisierungen sicher ausführen.
Ausführlich beschrieben sind Blöcke in der offiziellen Dokumentation zu Polycrate-Blöcken.
Schauen wir uns einen konkreten Block an, der Linux-Basiskonfiguration und Patches ausrollt. Directory-Struktur im Workspace:
acme-corp-automation/
workspace.poly
inventory.yml
blocks/
linux-baseline/
block.poly
patch.yml
harden.yml
templates/
motd.j2
artifacts/
baseline-report.md# blocks/linux-baseline/block.poly
name: linux-baseline
version: 0.1.0
kind: generic
config:
os:
family: linux
reboot_after_patch: true
packages:
common:
- vim
- curl
- htop
motd:
enabled: true
text: "Managed by Polycrate – ACME Corp"
actions:
- name: patch
playbook: patch.yml
description: "Installiert Updates und optional Reboot"
- name: harden
playbook: harden.yml
description: "Setzt Basis-Hardening (SSH, Sysctl, MOTD)"Wesentliche Punkte:
config: Default-Werte des Blocks. Diese werden später im Workspace überschrieben oder ergänzt.actions: Jede Action verweist genau auf ein Playbook im selben Verzeichnis.version: Version des Block-Templates – wichtig, sobald der Block über eine Registry geteilt wird.Das Inventory liegt immer im Workspace-Root als YAML-Datei inventory.yml. Polycrate setzt ANSIBLE_INVENTORY automatisch.
# inventory.yml
all:
hosts:
server01.acme-corp.com:
ansible_user: ubuntu
server02.acme-corp.com:
ansible_user: ubuntuDas Inventory ist YAML im Workspace-Root (kein klassisches INI-Format).
Das patch.yml greift auf die Block-Konfiguration zu:
# blocks/linux-baseline/patch.yml
- name: Linux patchen mit Polycrate
hosts: all
become: true
gather_facts: true
vars:
reboot_after_patch: "{{ block.config.os.reboot_after_patch }}"
tasks:
- name: APT Cache aktualisieren
ansible.builtin.apt:
update_cache: true
when: ansible_facts.os_family == "Debian"
- name: Alle Pakete aktualisieren (Debian/Ubuntu)
ansible.builtin.apt:
upgrade: dist
autoremove: true
when: ansible_facts.os_family == "Debian"
- name: YUM/DNF Updates installieren (RHEL/CentOS)
ansible.builtin.yum:
name: "*"
state: latest
when: ansible_facts.os_family in ["RedHat", "Rocky", "AlmaLinux", "CentOS"]
- name: Optionaler Reboot nach Patches
ansible.builtin.reboot:
msg: "Reboot triggered by Polycrate linux-baseline.patch"
reboot_timeout: 600
when: reboot_after_patch | boolDie Magie passiert bei block.config.os.reboot_after_patch: Diese Variable kommt nicht aus vars_files oder -e, sondern direkt aus block.poly bzw. Workspace-Konfiguration.
Damit ein Block wirklich wiederverwendbar wird, braucht er sinnvolle Defaults – aber auch die Möglichkeit, projektspezifisch übersteuert zu werden. Genau hier setzt Polycrate mit Config-Vererbung (Deep-Merge) an.
Wir haben oben gesehen:
config:
os:
family: linux
reboot_after_patch: true
packages:
common:
- vim
- curl
- htop
motd:
enabled: true
text: "Managed by Polycrate – ACME Corp"Im Workspace definierst du, wie der Block für ACME Corp konkret aussehen soll:
# workspace.poly
name: acme-corp-automation
organization: acme
blocks:
- name: linux-baseline
from: cargo.ayedo.cloud/ayedo/infra/linux-baseline:0.3.1
config:
os:
reboot_after_patch: false
packages:
common:
- vim
- curl
- htop
- jq
motd:
text: "ACME Corp – Managed Linux Server"Wichtig:
from: ist die OCI-Registry-Referenz inkl. Version im Tag (:0.3.1). Sobald der Block lokal vorliegt (beim ersten polycrate run … können Sie die automatische Installation aus der Registry bestätigen; polycrate blocks pull bleibt optional), liegt er unter blocks/cargo.ayedo.cloud/ayedo/infra/linux-baseline/ (Pfad unter blocks/ entspricht der URL).config: überschreibst und erweiterst du die Block-Defaults.Polycrate mergen Block-Config und Workspace-Config tief. Das heißt:
Für unser Beispiel ergibt sich zur Laufzeit folgende effektive Konfiguration:
# Effektive block.config.* in der Action linux-baseline.patch
os:
family: linux # aus block.poly
reboot_after_patch: false # im Workspace überschrieben
packages:
common: # Liste komplett ersetzt
- vim
- curl
- htop
- jq
motd:
enabled: true # aus block.poly
text: "ACME Corp – Managed Linux Server" # im Workspace überschriebenSo erreichst du:
Mehr Details zur Vererbung findest du in der Dokumentation zur Vererbung in Polycrate.
Polycrate stellt in jeder Action eine Reihe von Variablen zur Verfügung, ohne dass du sie explizit übergeben musst:
block.config.* – die gemergte Block-Konfiguration (wie oben gezeigt)workspace.* – Infos und Konfiguration deines Workspacesaction.* – Metadaten zur aktuell laufenden ActionEin erweitertes Beispiel:
# blocks/linux-baseline/harden.yml
- name: Linux-Baseline-Hardening mit Polycrate
hosts: all
become: true
gather_facts: false
tasks:
- name: SSH Root-Login deaktivieren
ansible.builtin.lineinfile:
path: /etc/ssh/sshd_config
regexp: '^PermitRootLogin'
line: 'PermitRootLogin no'
create: false
backup: true
- name: MOTD setzen, wenn aktiviert
ansible.builtin.copy:
content: "{{ block.config.motd.text }}"
dest: /etc/motd
when: block.config.motd.enabled | bool
- name: Workspace-Name im Log vermerken
ansible.builtin.lineinfile:
path: /var/log/polycrate.log
line: "Hardened by workspace {{ workspace.name }} via action {{ action.name }}"
create: yesHier kommen alle drei Ebenen zusammen:
block.config.motd.* – block- bzw. workspace-spezifische Konfigurationworkspace.name – z. B. acme-corp-automationaction.name – z. B. hardenWenn du mit Secrets arbeitest (z. B. SSH-Keys, Zertifikate), landen diese typischerweise unter artifacts/secrets/ im Workspace und werden über die integrierte Workspace-Verschlüsselung mit age geschützt. Im Playbook stehen sie dir über workspace.secrets['dateiname'] zur Verfügung.
Die harden-Action oben startest du einfach:
cd acme-corp-automation
polycrate run linux-baseline hardenPolycrate sorgt dann für:
ANSIBLE_INVENTORY)block, workspace, action im Playharden.yml im Verzeichnis des gezogenen Blocks, typisch blocks/cargo.ayedo.cloud/ayedo/infra/linux-baseline/) gegen das definierte InventoryMit plain Ansible müsstest du:
ansible.cfg und Inventory-Pfade manuell verwaltenMit Polycrate ist dieser Kontext in Block und Workspace modelliert.
Mehr zur Ansible-Integration beschreibt die offizielle Ansible-Integration von Polycrate.
Dieselbe Registry-Referenz (cargo.ayedo.cloud/...) nutzen Sie zum Teilen und Versionieren von Blöcken – im Team oder über den PolyHub.
Polycrate verwendet OCI-Registries – das gleiche Protokoll wie Docker/OCI-Container-Images. Die from-Zeile im Workspace ist die kanonische Quelle; die Version steht immer als Tag am Ende (:0.3.1).
Wichtige Punkte:
:latest verwenden – Sie wollen reproduzierbare Automatisierung und kontrollierte Updates.blocks/<name>/ an – in workspace.poly referenzieren Sie ihn trotzdem über die volle Registry-URL, sobald der Block publiziert ist (siehe Vererbung).Als Block-Autor möchtest du deine Arbeit teilen:
# Im Block-Verzeichnis
cd acme-corp-automation/blocks/linux-baseline
# In die Registry pushen (Version steht in block.poly)
polycrate blocks push cargo.ayedo.cloud/acme/infra/linux-baselineAuf einem anderen System oder in einem anderen Workspace kannst du denselben Block dann einsetzen:
# Block aus Registry lokal verfügbar machen (optional – oft reicht der erste polycrate run)
polycrate blocks pull cargo.ayedo.cloud/acme/infra/linux-baseline:0.1.0Ein explizites polycrate blocks pull brauchst du im Alltag oft nicht: Fehlt der Block lokal, erkennt Polycrate das beim ersten polycrate run … und fragt, ob der Block automatisch installiert werden soll. Anschließend referenzierst du ihn in workspace.poly mit dieser URL. Das ist Sharable Automation in Reinform: einmal gebaut, vielfach nutzbar – in deinem Team oder öffentlich über den PolyHub.
Im Vergleich zu Ansible Galaxy:
Der PolyHub ist die zentrale Anlaufstelle für wiederverwendbare Blöcke:
from: in deinen Workspace einbindestBeispiele für Einsatzszenarien:
Polycrate bietet mit dem Block-Modell Guardrails: Du konsumierst vorgefertigte Actions, statt beliebige Playbooks auszuführen. Das reduziert Risiken und erleichtert Auditierbarkeit.
Eine Übersicht zu Block-Struktur und Best Practices findest du in der Dokumentation zu Polycrate-Blöcken.
Ein Block repräsentiert eine logische Einheit, aber reale Abläufe bestehen oft aus mehreren Schritten. Dafür gibt es Workflows auf Workspace-Ebene.
Ein Beispiel: Du möchtest nacheinander Hardening und Patching ausführen.
# workspace.poly
name: acme-corp-automation
organization: acme
blocks:
- name: linux-baseline
from: cargo.ayedo.cloud/ayedo/infra/linux-baseline:0.3.1
workflows:
- name: linux-hardening-and-patch
description: "Erst Hardening, dann Patches auf allen Linux-Servern"
steps:
- block: linux-baseline
action: harden
- block: linux-baseline
action: patchAusführung:
polycrate workflows run linux-hardening-and-patchPolycrate führt dann sequentiell:
linux-baseline.hardenlinux-baseline.patchim gleichen Workspace-Kontext aus. Du bekommst:
Mehr zu Workflows gibt es in der Workflows-Dokumentation.
Ansible Roles sind ein starkes Konzept, aber sie lösen nicht alle praktischen Probleme in Teams.
ansible-galaxy install ...)Container-Isolation & Dependency-Management
kubectl, helm etc. sind im Block-Image bzw. Workspace-Image definiert.Eingebaute Konfiguration und Vererbung
defaults/main.yml, vars/main.yml, group_vars, host_vars.config-Sektion in block.poly, die im Workspace per Deep-Merge überschrieben wird.Sharable Automation über OCI-Registry
from: registry/space/block:1.2.3).Guardrails & UX
Workspace-Verschlüsselung
age direkt mit – inklusive guter UX für Teams (kein HashiCorp Vault erforderlich).Ansible bleibt das Herz der Ausführung – Polycrate bringt Struktur, Container-Isolation, Distribution und Konfigurationsmodell oben drauf. Weitere Details zur Plattform findest du auf der Seite zu Polycrate.
Ja. Polycrate ändert nichts an Ansible selbst – du kannst innerhalb eines Blocks ganz normal Roles verwenden:
# Beispiel-Playbook in einem Block
- name: Webserver deployen
hosts: all
roles:
- role: geerlingguy.nginxDu packst deine Playbooks und Roles einfach in das Block-Verzeichnis, definierst Actions in block.poly und lässt Polycrate sich um Container-Umgebung, Inventory und Konfiguration kümmern. Damit kombinierst du vorhandenes Galaxy-Know-how mit den Vorteilen des Block-Modells. Brauchst du zusätzliche Systempakete oder Ansible-Collections dauerhaft im Polycrate-Container, erweiterst du das Workspace-Image über eine Dockerfile.poly (z. B. apt-get oder ansible-galaxy install in RUN-Schritten) – siehe Custom Dockerfile in der Konfigurationsdokumentation.
Sensible Daten (SSH-Keys, Zertifikate, API-Tokens) legst du im Workspace unter artifacts/secrets/ ab und verschlüsselst den Workspace mit der integrierten Workspace-Verschlüsselung. Polycrate nutzt dafür age:
workspace.poly, block.poly) und Secrets (verschlüsselte Artefakte)Im Playbook greifst du über workspace.secrets['datei'] darauf zu. So kombinierst du Automatisierung, Nachvollziehbarkeit und Datenschutzanforderungen (z. B. nach DSGVO) auf einer Plattform.
Polycrate lässt sich schrittweise einführen:
inventory.yml ab.Durch die Container-Ausführung kollidiert Polycrate nicht mit deinem bestehenden Python-/Ansible-Setup. Polycrate funktioniert gut neben klassischen CI/CD-Systemen und kann z. B. über deren Shell-Schritte aufgerufen werden. Details zu CLI-Befehlen findest du in der CLI-Referenz.
Weitere Fragen? Siehe unsere FAQ
Mit Blöcken, Actions und Workspaces bringt Polycrate Ordnung in Ansible-basierte Automatisierung – vom Einzel-Admin bis zum Enterprise-Platform-Team. Du hast gesehen, wie:
block.config.*, workspace.*, action.*) direkt im Ansible-Playbook nutzbar sind.Als Maintainer von Polycrate sorgt ayedo dafür, dass dieses Baukasten-Prinzip in der Praxis funktioniert: mit einer stabilen CLI, klaren Best Practices und einem wachsenden Ökosystem an offiziellen Blöcken für Betrieb, Sicherheit, Compliance und Plattform-Themen. Der PolyHub ist dabei dein Einstieg in wiederverwendbare Automatisierung – egal, ob du zunächst konsumieren oder eigene Blöcke teilen willst.
Wenn du die hier vorgestellten Konzepte konkret ausprobieren möchtest, ist der nächste logische Schritt, bestehende Playbooks in einen ersten Block zu heben und dazu passende Actions und Workflows zu definieren. Die offiziellen ayedo-Blöcke im PolyHub dienen dir dabei als Vorbild, wie wiederverwendbare Automatisierung in Polycrate aussieht – von Linux-Baselines bis zu komplexeren Plattformaufgaben.
Nutze diese Bausteine, um deine eigene Automatisierungs-Landschaft strukturierter, sicherer und besser teilbar zu machen – und entdecke Schritt für Schritt, welche Aufgaben du aus deinem Alltag in wiederverwendbare Blöcke überführen kannst: PolyHub erkunden
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, …