Das Polycrate-Ökosystem: PolyHub, API, MCP und die Zukunft der Automatisierung
TL;DR Polycrate ist längst mehr als ein CLI-Tool: Mit PolyHub, API-Plattform und MCP entsteht 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.
cargo.ayedo.cloud in deinen Workspace ziehen und ohne lokales Ansible-Setup nutzen.workspace.poly und das Ausführen weniger polycrate-Befehle – inklusive sauberem Kubeconfig-Handling und versionierten Blöcken.:0.2.2 statt :latest) in Produktion Pflicht ist und wie du das umfangreiche Ökosystem auf PolyHub für deine eigenen Workspaces nutzt.Wenn du schon einmal einen Ingress-Stack mit plain Ansible oder Helm von Hand aufgebaut hast, kennst du das Muster:
Mit Polycrate und PolyHub drehst du das Prinzip um: Statt alles selbst zu modellieren, startest du mit fertigen, getesteten Bausteinen.
PolyHub unter https://hub.polycrate.io ist eine Registry von Polycrate-Blöcken, die als OCI-Images in cargo.ayedo.cloud liegen – ähnlich wie Container-Images auf Docker Hub, aber speziell für Automatisierung. Für Kubernetes findest du dort u. a.:
cargo.ayedo.cloud/ayedo/k8s/nginx:* – Ingress-Controllercargo.ayedo.cloud/ayedo/k8s/cert-manager:* – TLS-Automatisierungcargo.ayedo.cloud/ayedo/k8s/external-dns:* – DNS-AutomatisierungDie Kernideen dahinter:
In diesem Beitrag nutzen wir genau diese Bausteine und bauen dir einen produktionsnahen Ingress-Stack für einen Beispiel-Cluster.
Wir starten mit einem Workspace acme-corp-automation. Er ist die logische Einheit für deine Automatisierung – egal ob du Linux-Server, Windows-Hosts oder Kubernetes-Cluster verwaltest.
Eine minimale workspace.poly könnte so beginnen:
name: acme-corp-automation
organization: acme
config: {}
blocks: []
workflows: []Das Feld config auf Workspace-Ebene ist für Workspace-/Toolchain-Einstellungen gedacht (z. B. Container-Image unter config.image) – nicht als freie Sammelstelle für beliebige Automatisierungsvariablen; die gehören in Block-config oder secrets.poly. Siehe Konfiguration. Das leere config: {} steht hier nur als Platzhalter, bis du z. B. ein Image setzt.
Wichtig für Kubernetes: Die Kubeconfig deines Clusters liegt in Polycrate immer als Secret-Datei im Workspace:
artifacts/secrets/kubeconfig.ymlDiese Datei wird von Polycrate als Secret behandelt und kann mit der eingebauten Workspace-Verschlüsselung geschützt werden, siehe Workspace-Verschlüsselung.
Zum Aktivieren der Verschlüsselung genügt auf der CLI:
polycrate workspace encryptDu brauchst keinen externen Vault – Polycrate nutzt intern age und integriert das in deine Workflow-Ausführung, was Compliance-Anforderungen oft deutlich vereinfacht.
Die offiziellen ayedo-Blöcke für Kubernetes-Apps liegen als OCI-Images auf cargo.ayedo.cloud. Du kannst dir jeden Block in deinen Workspace ziehen:
polycrate blocks pull cargo.ayedo.cloud/ayedo/k8s/nginx:0.2.2Damit passiert Folgendes:
nginx in Version 0.2.2 aus der Registry.kubectl und kein Helm notwendig – das alles kommt aus dem Polycrate-Container.Wichtig: Die Versionsangabe :0.2.2 ist kein Detail – sie ist ein Best Practice. In Produktion solltest du niemals :latest verwenden, siehe auch die Best Practices in der Dokumentation.
Jetzt binden wir den Block in unseren Workspace ein.
In workspace.poly deklarierst du, welche Block-Instanzen du verwenden willst. Für unseren Ingress-Stack fügen wir drei Blöcke hinzu:
name: acme-corp-automation
organization: acme
blocks:
- name: k8s-nginx
from: cargo.ayedo.cloud/ayedo/k8s/nginx:0.2.2
config:
namespace: "ingress-nginx"
ingress_class: "nginx"
- name: k8s-cert-manager
from: cargo.ayedo.cloud/ayedo/k8s/cert-manager:0.3.0
config:
namespace: "cert-manager"
email: "admin@acme-corp.com"
- name: k8s-external-dns
from: cargo.ayedo.cloud/ayedo/k8s/external-dns:0.4.1
config:
namespace: "external-dns"
provider: "route53"
domain_filter: "acme-corp.com"
workflows: []Ein paar wichtige Punkte:
from: referenziert immer den vollständigen Block-Namen inklusive Version (:0.2.2).name: ist der Instanzname im Workspace – so sprichst du den Block später an (polycrate run k8s-nginx deploy).config: enthält Block-spezifische Werte. Diese landen später als block.config.* in deinem Ansible-Playbook.Das Schöne: Du musst die interne Logik dieser Blöcke nicht kennen, um sie zu nutzen. Sie sind wie fachlich sinnvolle Bausteine in einem Baukasten – sauber gekapselt und versioniert.
Schauen wir uns trotzdem einmal an, wie so ein ayedo-Block innen aussieht. Stell dir vor, du würdest cargo.ayedo.cloud/ayedo/k8s/nginx:0.2.2 lokal entwickeln. Im Block-Verzeichnis läge eine block.poly:
name: k8s-nginx
version: 0.2.2
kind: generic
config:
namespace: "ingress-nginx"
ingress_class: "nginx"
actions:
- name: deploy
playbook: deploy.yml
- name: delete
playbook: delete.ymlWichtige Details:
kubeconfig_path in der block.poly. Polycrate übernimmt die Kubeconfig aus artifacts/secrets/kubeconfig.yml, setzt im Action-Container KUBECONFIG auf den korrekten Pfad – kubectl, Helm und Ansible-Module (z. B. community.kubernetes.helm) nutzen sie damit ohne zusätzliche Block-Konfiguration. In .poly-Dateien gibt es außerdem kein Jinja wie {{ workspace.secrets[...] }}.actions definieren, welche Befehle du über polycrate run ausführen kannst (deploy, delete, …).0.2.2 ist fest in der block.poly kodiert und wird auch in der Registry verwendet.Dazu gehört ein Ansible-Playbook, z. B. deploy.yml:
- name: Deploy ingress-nginx via Helm
hosts: localhost
gather_facts: false
tasks:
- name: Install ingress-nginx Helm chart
community.kubernetes.helm:
name: ingress-nginx
chart_ref: ingress-nginx/ingress-nginx
release_namespace: "{{ block.config.namespace }}"
create_namespace: true
values:
controller:
ingressClassResource:
name: "{{ block.config.ingress_class }}"Dazu ein paar Erklärungen:
hosts: localhost ist hier korrekt, weil das Playbook nur gegen die Kubernetes-API spricht. Es verändert keine lokalen Pakete – es läuft im Polycrate-Container und steuert von dort den Cluster.community.kubernetes.helm kommt aus einer Ansible Collection, die im Polycrate-Container bereits installiert ist. Du musst dich um diese Dependency nicht kümmern. KUBECONFIG ist im Container bereits gesetzt – ein explizites kubeconfig: im Task ist nicht nötig.block.config.* sind die Werte aus deiner workspace.poly-Konfiguration für diese Block-Instanz (hier u. a. namespace, ingress_class). Du steuerst den Deploy also komplett aus dem Workspace.Mit plain Ansible müsstest du für so ein Setup:
kubectl, helm, Ansible plus Collections installierenKUBECONFIG)Mit Polycrate bekommst du eine klar strukturierte Block-Definition, eine standardisierte Ausführungsumgebung im Container und eine konsistente Art, Konfiguration aus dem Workspace in die Playbooks zu reichen. Siehe dazu auch die Ansible-Integration in der Dokumentation.
Ein großer Vorteil der Block-Struktur ist, dass du aus mehreren Blöcken einen reproduzierbaren Workflow bauen kannst. In unserem Beispiel:
k8s-nginx – Ingress-Controllerk8s-cert-manager – TLS-Zertifikatek8s-external-dns – DNS-Einträge für deine IngressesDiesen Stack definieren wir als Workflow in workspace.poly:
name: acme-corp-automation
organization: acme
blocks:
- name: k8s-nginx
from: cargo.ayedo.cloud/ayedo/k8s/nginx:0.2.2
config:
namespace: "ingress-nginx"
ingress_class: "nginx"
- name: k8s-cert-manager
from: cargo.ayedo.cloud/ayedo/k8s/cert-manager:0.3.0
config:
namespace: "cert-manager"
email: "admin@acme-corp.com"
- name: k8s-external-dns
from: cargo.ayedo.cloud/ayedo/k8s/external-dns:0.4.1
config:
namespace: "external-dns"
provider: "route53"
domain_filter: "acme-corp.com"
workflows:
- name: k8s-ingress-stack
actions:
- block: k8s-nginx
action: deploy
- block: k8s-cert-manager
action: deploy
- block: k8s-external-dns
action: deployDamit kannst du den kompletten Stack ausrollen mit:
polycrate workflows run k8s-ingress-stackWas hier passiert:
artifacts/secrets/kubeconfig.yml in den Container gepiped, ohne dass sie unverschlüsselt im Repository liegen muss.deploy, delete, upgrade).Mit plain Ansible würdest du an dieser Stelle typischerweise:
playbooks/k8s/nginx.yml, playbooks/k8s/cert-manager.yml, playbooks/k8s/external-dns.yml anlegenMit Polycrate werden diese Playbooks in wiederverwendbare Bausteine verpackt und über Workflows orchestriert. Das verhindert den Playbook-Wildwuchs, den viele Teams aus gewachsenen Umgebungen kennen, und ist im Detail in den Best Practices beschrieben.
:latest in Produktion tabu istEin zentrales Prinzip in produktiven Kubernetes-Lösungen ist Reproduzierbarkeit. Genau deshalb ist :latest beim Container-Image keine gute Idee – und bei Polycrate-Blöcken ebenso wenig.
Die Registry-URL eines Blocks enthält immer die Version:
cargo.ayedo.cloud/ayedo/k8s/nginx:0.2.2Best Practices dazu:
:0.2.2) in workspace.poly.:0.2.3) und teste den Workflow dort.So kannst du sicherstellen, dass ein Rollout heute, morgen und in drei Monaten das gleiche Verhalten zeigt – unabhängig davon, ob es inzwischen neue Block-Versionen auf PolyHub gibt.
Der eigentliche Mehrwert von PolyHub liegt im Ökosystem:
deploy, configure, backup, …)Für dich als Platform Engineer oder Kubernetes-Verantwortlicher bedeutet das:
Wenn du später individuelle Anforderungen hast, kannst du jederzeit eigene Blöcke bauen, die auf den offiziellen ayedo-Blöcken aufsetzen oder sie um zusätzliche Actions erweitern. Die Block-Dokumentation zeigt dir die Details.
Ein Helm-Chart beschreibt in erster Linie Kubernetes-Ressourcen. Ein Polycrate-Block dagegen:
kubernetes.core.k8s, ansible.builtin.uri, Cloud-Collections).block.config.*), Actions und eine standardisierte Ausführungsumgebung im Container mit.Du kannst also komplexere Workflows abbilden: Cluster-Setup, Zertifikatsrotation, DNS-Management, API-Calls gegen externe Systeme – alles in einem konsistenten Modell. Für viele Teams ist das der nächste Schritt nach „nur Helm“.
Nein. Genau das ist einer der Kernvorteile:
kubectl, Helm, Python, …).Das löst das klassische Dependency-Problem: Kein Python-2-vs-3-Chaos, keine verschiedenen Ansible-Versionen je Entwickler-Laptop, weniger Supply-Chain-Risiken durch wild installierte Tools.
Mehr Details findest du in der CLI-Referenz.
Polycrate hilft an mehreren Stellen:
polycrate workspace encrypt), siehe Workspace-Verschlüsselung.workspace.poly ergibt einen klaren Audit-Trail: Du kannst jederzeit rekonstruieren, welche Automatisierung wann ausgeführt wurde.Weitere Fragen? Siehe unsere FAQ
In diesem Beitrag hast du gesehen, wie du mit PolyHub und Polycrate in kurzer Zeit einen kompletten Kubernetes-Ingress-Stack aus fertigen Bausteinen aufbauen kannst:
cargo.ayedo.cloud pullst und in deiner workspace.poly deklarierst.block.poly, config-Parametern und Ansible-Playbooks, die im Polycrate-Container gegen dein Cluster laufen.:latest) und das Nutzen des Ökosystems auf PolyHub entscheidend für reproduzierbare Kubernetes-Lösungen sind.Für ayedo ist genau diese Kombination aus wiederverwendbaren Blöcken, containerisierter Ausführung und klaren Guardrails der Kern von moderner Platform Automation. Wir entwickeln und pflegen die offiziellen ayedo-Blöcke auf PolyHub, damit du dich auf deine fachlichen Anforderungen konzentrieren kannst – nicht auf das erneute Erfinden derselben Infrastruktur-Bausteine.
Ob du „nur“ einen Ingress-Controller bereitstellen, einen kompletten Cluster-Stack aufbauen oder Polycrate in ein größeres Platform- oder Compliance-Programm integrieren willst: Unsere Expertise und unsere Open-Source-Werkzeuge sind darauf ausgelegt, dich dabei technisch sauber zu unterstützen.
Wenn du den nächsten Schritt gehen willst, schnapp dir einen Workspace, richte deine kubeconfig.yml als Secret ein und starte mit den Kubernetes-Blöcken auf PolyHub. Den Rest übernimmt Polycrate – reproduzierbar, versioniert und teamtauglich.
TL;DR Polycrate ist längst mehr als ein CLI-Tool: Mit PolyHub, API-Plattform und MCP entsteht ein …
TL;DR Sie erstellen in diesem Beitrag einen vollständigen Polycrate-Block für eine eigene …
TL;DR Die Polycrate API macht aus einzelnen Workspaces eine Team-Plattform: alle Workspaces, Action …