Actions¶
Actions sind die ausführbaren Einheiten eines Blocks. Sie definieren, was ein Block tatsächlich tun kann – z.B. install, uninstall, status oder backup.
Action-Schema¶
Eine Action wird in der block.poly unter der actions: Liste definiert:
# block.poly
actions:
- name: install # Pflicht: Eindeutiger Name
description: "Installiert die Anwendung" # Optional: Beschreibung
playbook: install.yml # Entweder playbook ODER script
# script: # Alternative zu playbook
# - echo "Hello"
prompt: # Optional: Benutzerbestätigung
message: "Möchten Sie die Installation starten?"
interactive: false # Optional: TTY-Modus
labels: # Optional: Metadaten
category: deployment
risk: low
config: # Optional: Action-spezifische Config
timeout: 300
Felder im Detail¶
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
name | string | ✅ | Eindeutiger Identifier; die CLI validiert Action-Namen als Slug (siehe Namenskonventionen) |
description | string | ❌ | Menschenlesbare Beschreibung der Action |
playbook | string | ⚠️ | Pfad zum Ansible-Playbook (relativ zur block.poly) |
script | list | ⚠️ | Liste von Shell-Befehlen |
prompt | object | ❌ | Benutzerbestätigung vor Ausführung |
interactive | bool | ❌ | TTY-Modus für interaktive Befehle (default: false) |
labels | map | ❌ | Key-Value-Paare für Metadaten |
config | map | ❌ | Action-spezifische Konfiguration |
⚠️ = playbook und script schließen sich gegenseitig aus. Eines von beiden ist erforderlich.
Playbook vs Script¶
Playbook (empfohlen)¶
Ansible-Playbooks bieten die beste Integration mit Polycrate:
Vorteile:
- Zugriff auf
workspace,block,actionVariablen via Jinja2 - Idempotente Ausführung
- Strukturierte Fehlerbehandlung
- Umfangreiche Module für Cloud, K8s, etc.
Script (nicht empfohlen)¶
Für triviale Befehle ohne Variablenzugriff:
Kein Templating in Scripts
Scripts haben keinen Zugriff auf Workspace-Informationen.
- Kein Inline-Templating (
{{ workspace... }},{{ block.config... }}) - Keine automatische Integration mit Workspace/Block-Konfiguration
- Alle Logik zur Verarbeitung von Konfigurationswerten muss selbst implementiert werden
- Konfiguration nur über Umgebungsvariablen (
$CONFIG_*) möglich, die vom Entwickler selbst ausgewertet werden müssen
Verwenden Sie stattdessen playbook: - Ansible-Playbooks erhalten automatisch Zugriff auf:
{{ workspace.name }},{{ workspace.config }},{{ workspace.secrets }}{{ block.name }},{{ block.config }},{{ block.artifacts }}{{ action.name }},{{ transaction.id }}- Alle weiteren Workspace-Daten via Jinja2-Templating
Einschränkungen:
- Keine strukturierte Fehlerbehandlung
- Keine idempotente Ausführung
- Nur für Befehle ohne Konfigurationsabhängigkeit geeignet
Prompt (Benutzerbestätigung)¶
Actions können eine Bestätigung vom Benutzer anfordern:
actions:
- name: destroy
playbook: destroy.yml
prompt:
message: "⚠️ Diese Aktion löscht alle Ressourcen unwiderruflich. Fortfahren?"
Verhalten:
- Polycrate zeigt die Nachricht und wartet auf
y/n - Bei
nwird die Action abgebrochen - Bei
ywird die Action ausgeführt
Prompt überspringen¶
# Einzelne Action automatisch bestätigen
polycrate run my-block destroy --force
# Global für alle Actions
polycrate --force run my-block destroy
Prompt in Workflows
Prompts können auch auf Workflow-Step-Ebene definiert werden. Wenn sowohl Action als auch Step einen Prompt haben, muss der Benutzer zweimal bestätigen.
Interactive Mode¶
Für Actions die TTY-Interaktion benötigen (z.B. Passwort-Eingaben, vim):
Script-Ausnahme für Interactive
Bei interaktiven Shell-Sessions ist script: akzeptabel, da keine Konfigurationswerte benötigt werden:
Use Cases:
- Debug-Shells
- Interaktive Editoren
- Passwort-Prompts in Playbooks
Labels¶
Metadaten für Kategorisierung und Filterung:
actions:
- name: backup
labels:
category: maintenance
risk: low
duration: long
playbook: backup.yml
- name: destroy
labels:
category: cleanup
risk: high
requires-confirmation: "true"
playbook: destroy.yml
Labels können in Workflows oder externen Tools zur Filterung verwendet werden.
Action-spezifische Config¶
Actions können eigene Konfigurationsparameter haben:
Im Playbook verfügbar als {{ action.config.retention_days }}.
Vollständiges Beispiel¶
# blocks/my-app/block.poly
name: my-app
kind: k8sapp
version: 1.0.0
config:
namespace: production
replicas: 3
actions:
- name: install
description: "Installiert die Anwendung im Kubernetes-Cluster"
playbook: install.yml
labels:
category: deployment
- name: uninstall
description: "Entfernt die Anwendung aus dem Cluster"
playbook: uninstall.yml
prompt:
message: "Soll die Anwendung wirklich deinstalliert werden?"
labels:
category: cleanup
risk: medium
- name: status
description: "Zeigt den aktuellen Status der Anwendung"
playbook: status.yml
- name: shell
description: "Öffnet eine Shell im ersten Pod"
interactive: true
playbook: shell.yml
- name: logs
description: "Zeigt die Logs der Anwendung"
config:
tail: 100
follow: false
playbook: logs.yml
Actions ausführen¶
# Standard
polycrate run my-block install
# Mit Workspace-Angabe
polycrate run my-block install -w /path/to/workspace
# Mit Force (überspringt Prompts)
polycrate run my-block destroy --force
# Mit erhöhtem Log-Level
polycrate run my-block install --loglevel 2
# Interaktiv
polycrate run my-block shell
Runtime Config Overrides (--set)¶
Mit dem --set Flag können action.config-Werte zur Laufzeit überschrieben werden, ohne workspace.poly oder block.poly zu verändern. Die Syntax folgt dem Helm-Standard.
# Einfacher Wert
polycrate run my-block migrate --set database.host=prod-db.internal
# Mehrere Overrides
polycrate run my-block deploy \
--set replicas=5 \
--set namespace=production \
--set image.tag=v2.1.0
# Array-Werte
polycrate run my-block backup \
--set targets[0]=cluster-a \
--set targets[1]=cluster-b
Priorität (von niedrig zu hoch)¶
block.poly– Defaults in der Block-Definitionworkspace.poly– Partielle Overrides im Workspace--setFlag – Runtime-Overrides bei Ausführung (höchste Priorität)
Hinweise¶
- Alle Werte sind Strings (wie bei Helm):
--set replicas=3→"3"im Playbook. Typisierung in Ansible via| int,| booletc. - Maps werden deep-merged:
--set db.host=xüberschreibt nurdb.host, andere Schlüssel unterdbbleiben erhalten. - Listen werden vollständig ersetzt:
--set items[0]=xersetzt die gesamte Liste durch["x"]. - Punkte im Key escapen:
--set 'key\.name=value' --setschreibt ausschließlich inaction.config–block.configwird nicht beeinflusst.
# Playbook-Zugriff
- name: Deploy
ansible.builtin.debug:
msg: "Host: {{ action.config.database.host }}, Replicas: {{ action.config.replicas | int }}"
Namensregeln¶
Action-Namen folgen in der CLI dem Slug-Muster (Kleinbuchstaben, Ziffern, einfache Bindestriche). Details, Regex und Beispiele: Namenskonventionen – Slug.
Datenpersistenz¶
Daten werden zwischen Action-Runs nicht automatisch persistiert, außer:
- Workspace-Directory: Änderungen in
/workspace(gemountet) - Artefakte: Empfohlener Weg für persistente Daten
# Beispiel: Daten als Artifact speichern
# block.artifacts.path wählt automatisch local_path oder container_path (je nach --local / Container)
- name: Generate state in Ansible
copy:
content: "{{ state_data | to_nice_yaml }}"
dest: "{{ block.artifacts.path }}/state.yml"
Zusammenhang mit anderen Konzepten¶
- Namenskonventionen: Slug-Regeln für
name - Blocks: Actions sind Teil von Blocks
- Workflows: Orchestrieren mehrere Actions
- Artefakte: Persistenz zwischen Action-Runs
- Ansible: Playbook-Integration