Ssh Bootstrap Workflow
CONCEPT:INFRA-001
Interactive SSH key bootstrap for new infrastructure hosts. Checks existing connectivity, generates RSA keys if missing, and distributes them via tunnel-manager to establish passwordless SSH access for future discovery scans.
Steps
Step 0: inspect-ssh-connectivity [skill: tunnel-manager-mcp]
Agent: discovery-agent
Tools: tun_tm_system, tun_tm_hosts
List all hosts from the inventory file and check current SSH connectivity status
Expected: host, inventory, status
Step 1: Systems Manager Mcp
Agent: deployer-agent
Tools: pt_stack, cnt_cm_compose_operations
Check if SSH keys exist at ~/.ssh/id_rsa. If not, generate a new RSA key pair
Expected: ssh, key, generate
Step 2: distribute-ssh-keys [skill: tunnel-manager-mcp]
Agent: verifier-agent
Tools: pt_docker, cnt_cm_container_operations
For each host that failed connectivity, set up passwordless SSH using the generated key
Expected: ssh, passwordless, setup
Step 3: verify-ssh-connectivity [skill: tunnel-manager-mcp]
Agent: dns-configurator
Tools: adg_rewrites, td_zones
Verify connectivity to all hosts after key distribution
Expected: verify, connectivity
Step 4: KG Persistence [depends_on: Step 0, Step 2, Step 3]
Agent: dns-configurator
Tools: graph_write
Persist workflow results as nodes and edges in the Knowledge Graph. Create appropriate typed nodes with metadata and link to existing domain entities.
Output
- Ssh Bootstrap results persisted in KG
- Structured report (MD/PDF)
- Audit trail with timestamps and agent attributions
Execution
Run this workflow as a dependency-ordered DAG. Steps with no unmet depends_on run in parallel; dependents run after their prerequisites complete.
- Run first (in parallel): Step 0 — inspect-ssh-connectivity; Step 1 — Systems Manager Mcp; Step 2 — distribute-ssh-keys; Step 3 — verify-ssh-connectivity
- After level 0: Step 4 — KG Persistence
Execution: If graph-os is reachable, offload the whole DAG via graph_orchestrate action=execute_workflow (or the kg-delegate skill) for true parallel/swarm execution. Otherwise execute the steps natively in dependency order: run steps with no unmet depends_on in parallel, then their dependents.