From 527603bd63c5b32ac8e57a2ac7b2394c84631260 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Thu, 23 Jul 2026 17:43:36 +0200 Subject: [PATCH] Add script for mass-converging E.g. just the new users recipe --- scripts/knife/converge_all.sh | 70 +++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100755 scripts/knife/converge_all.sh diff --git a/scripts/knife/converge_all.sh b/scripts/knife/converge_all.sh new file mode 100755 index 0000000..4a15c83 --- /dev/null +++ b/scripts/knife/converge_all.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +# +# Converge every node in nodes/ with a runlist override (-o). +# +# Usage: +# ./converge_all.sh "recipe[kosmos-base::users]" +# +# Port selection per node: +# - nodes WITH a normal.vm_host attribute (KVM guests): port 22 +# - nodes WITHOUT a normal.vm_host attribute (bare metal): port 2222 +# +# Runs sequentially and aborts on the first failure (set -euo pipefail). + +set -euo pipefail + +if [[ $# -ne 1 ]]; then + echo "Usage: $0 ''" >&2 + echo " e.g. $0 \"recipe[kosmos-base::users]\"" >&2 + exit 1 +fi + +RUNLIST="$1" + +shopt -s nullglob +nodes=( nodes/*.json ) + +if [[ ${#nodes[@]} -eq 0 ]]; then + echo "No nodes found in nodes/" >&2 + exit 1 +fi + +total=${#nodes[@]} +i=0 + +for f in "${nodes[@]}"; do + i=$((i + 1)) + + IFS=$'\x1f' read -r node_name vm_host knife_host < <(python3 -c ' +import json, sys +d = json.load(open(sys.argv[1])) +print("\x1f".join([ + d.get("name", "") or "", + d.get("normal", {}).get("vm_host", "") or "", + d.get("normal", {}).get("knife_zero", {}).get("host", "") or "", +])) +' "$f") + + if [[ -z "$node_name" ]]; then + echo "[$i/$total] $f: could not read node name, skipping" >&2 + exit 1 + fi + + if [[ -z "$knife_host" ]]; then + echo "[$i/$total] $node_name: no knife_zero.host set, skipping" >&2 + exit 1 + fi + + if [[ -n "$vm_host" ]]; then + port=22 + label="vm_host=${vm_host}" + else + port=2222 + label="bare metal" + fi + + echo "[$i/$total] $node_name ($label, port ${port}, host ${knife_host})" + knife zero converge "name:${node_name}" -a knife_zero.host -p"${port}" -o "${RUNLIST}" +done + +echo "Converged ${total} node(s) successfully."