Default cluster workers to Pimox only

This commit is contained in:
juvdiaz 2026-07-01 19:12:37 -06:00
parent 21adbd5628
commit 349ffd006e
5 changed files with 57 additions and 17 deletions

View File

@ -802,10 +802,11 @@ select VM workers. Resume the runtime with:
./jeannie start-cluster
```
To exclude the Raspberry Pi from the Kubernetes cluster, set
`LAB_INCLUDE_RASPBERRY_WORKER=false`. To manage workers manually instead, add
entries to
`bootstrap/cluster/variables.tf` or a `.tfvars` file:
Kubernetes worker generation defaults to automated Pimox workers only. The
Raspberry Pi stays out of the cluster unless `LAB_INCLUDE_RASPBERRY_WORKER=true`
is set. Stale manual workers in `.lab/manual-workers.tsv` are ignored unless
`LAB_INCLUDE_MANUAL_WORKERS=true` is set. To manage workers manually instead,
add entries to `bootstrap/cluster/variables.tf` or a `.tfvars` file:
```hcl
worker_nodes = {

View File

@ -802,10 +802,11 @@ select VM workers. Resume the runtime with:
./{{ main_script }} start-cluster
```
To exclude the Raspberry Pi from the Kubernetes cluster, set
`LAB_INCLUDE_RASPBERRY_WORKER=false`. To manage workers manually instead, add
entries to
`bootstrap/cluster/variables.tf` or a `.tfvars` file:
Kubernetes worker generation defaults to automated Pimox workers only. The
Raspberry Pi stays out of the cluster unless `LAB_INCLUDE_RASPBERRY_WORKER=true`
is set. Stale manual workers in `.lab/manual-workers.tsv` are ignored unless
`LAB_INCLUDE_MANUAL_WORKERS=true` is set. To manage workers manually instead,
add entries to `bootstrap/cluster/variables.tf` or a `.tfvars` file:
```hcl
worker_nodes = {

View File

@ -620,7 +620,9 @@ script name.
: Generated Pimox worker inventory.
`.lab/manual-workers.tsv`
: User-managed manual worker inventory.
: User-managed manual worker inventory. Ignored by default; set
`LAB_INCLUDE_MANUAL_WORKERS=true` to merge it into the generated cluster worker
var file.
`$HOMELAB_STATE_DIR/logs`
: Jeannie command logs.

29
jeannie
View File

@ -759,7 +759,10 @@ doctor_versions() {
}
truthy() {
case "${1,,}" in
local value
value="$(printf '%s' "$1" | tr '[:upper:]' '[:lower:]')"
case "${value}" in
1 | true | yes | on)
return 0
;;
@ -770,7 +773,10 @@ truthy() {
}
disabled_value() {
case "${1,,}" in
local value
value="$(printf '%s' "$1" | tr '[:upper:]' '[:lower:]')"
case "${value}" in
0 | false | no | off | disabled)
return 0
;;
@ -1745,12 +1751,21 @@ prepare_cluster_worker_var_file() {
local manual_spec_file="${REPO_ROOT}/.lab/manual-workers.tsv"
local pimox_spec_file="${REPO_ROOT}/.lab/pimox-workers.tsv"
local var_file="${REPO_ROOT}/.lab/cluster-workers.auto.tfvars.json"
local include_manual="${LAB_INCLUDE_MANUAL_WORKERS:-false}"
local -a spec_files=()
export LAB_INCLUDE_RASPBERRY_WORKER="${LAB_INCLUDE_RASPBERRY_WORKER:-${include_raspberry_default}}"
mkdir -p "${REPO_ROOT}/.lab"
ensure_static_pimox_worker_spec_file "${pimox_spec_file}"
write_cluster_worker_var_file "${var_file}" "${manual_spec_file}" "${pimox_spec_file}"
if truthy "${include_manual}"; then
spec_files+=("${manual_spec_file}")
elif ! disabled_value "${include_manual}"; then
echo "LAB_INCLUDE_MANUAL_WORKERS must be true or false." >&2
return 1
fi
spec_files+=("${pimox_spec_file}")
write_cluster_worker_var_file "${var_file}" "${spec_files[@]}"
export LAB_CLUSTER_VAR_FILE="${var_file}"
}
@ -4703,7 +4718,7 @@ apps() {
ensure_cluster_worker_var_file() {
if [[ -z "${LAB_CLUSTER_VAR_FILE:-}" ]]; then
prepare_cluster_worker_var_file true
prepare_cluster_worker_var_file false
fi
if truthy "${TF_VAR_allow_empty_worker_nodes:-false}"; then
return 0
@ -4865,7 +4880,7 @@ plan_homelab() {
if [[ "${target}" == "all" ]]; then
if [[ -z "${LAB_CLUSTER_VAR_FILE:-}" ]]; then
prepare_cluster_worker_var_file true
prepare_cluster_worker_var_file false
fi
stacks=(
"bootstrap/provisioning"
@ -4877,7 +4892,7 @@ plan_homelab() {
else
stack="$(tofu_stack_from_plan_target "${target}")"
if [[ "${stack}" == "bootstrap/cluster" && -z "${LAB_CLUSTER_VAR_FILE:-}" ]]; then
prepare_cluster_worker_var_file true
prepare_cluster_worker_var_file false
fi
stacks=("${stack}")
fi
@ -4893,7 +4908,7 @@ rebuild_cluster() {
require_debian_server "rebuild-cluster"
export WORKER_SSH_TARGETS="${WORKER_SSH_TARGETS:-}"
export LAB_INCLUDE_RASPBERRY_WORKER="${LAB_INCLUDE_RASPBERRY_WORKER:-true}"
export LAB_INCLUDE_RASPBERRY_WORKER="${LAB_INCLUDE_RASPBERRY_WORKER:-false}"
export LAB_PIMOX_TEMPLATE_REPLACE_EXISTING="${LAB_PIMOX_TEMPLATE_REPLACE_EXISTING:-true}"
export LAB_PIMOX_WORKER_COUNT="${LAB_PIMOX_WORKER_COUNT:-2}"
export LAB_PIMOX_WORKER_REPLACE_EXISTING="${LAB_PIMOX_WORKER_REPLACE_EXISTING:-true}"

View File

@ -168,6 +168,7 @@ test_cluster_worker_targets_include_pimox_and_manual_workers() {
test_prepare_cluster_worker_var_file_merges_manual_and_pimox_workers() {
unset LAB_INCLUDE_RASPBERRY_WORKER
LAB_INCLUDE_MANUAL_WORKERS=true
LAB_PIMOX_WORKER_NODE_LABELS_JSON='{"homelab.dev/node-role":"app","homelab.dev/storage":"ssd"}'
LAB_MANUAL_WORKER_NODE_LABELS_JSON='{"homelab.dev/node-role":"manual","homelab.dev/storage":"custom"}'
prepare_cluster_worker_var_file false
@ -190,7 +191,26 @@ if labels["manual01"]["homelab.dev/node-role"] != "manual":
raise SystemExit("manual labels were not applied")
PY
pass "worker var file merges manual and Pimox workers"
unset LAB_PIMOX_WORKER_NODE_LABELS_JSON LAB_MANUAL_WORKER_NODE_LABELS_JSON LAB_CLUSTER_VAR_FILE LAB_INCLUDE_RASPBERRY_WORKER
unset LAB_INCLUDE_MANUAL_WORKERS LAB_PIMOX_WORKER_NODE_LABELS_JSON LAB_MANUAL_WORKER_NODE_LABELS_JSON LAB_CLUSTER_VAR_FILE LAB_INCLUDE_RASPBERRY_WORKER
}
test_prepare_cluster_worker_var_file_excludes_manual_by_default() {
unset LAB_INCLUDE_RASPBERRY_WORKER LAB_INCLUDE_MANUAL_WORKERS
prepare_cluster_worker_var_file false
python3 - "${LAB_DIR}/cluster-workers.auto.tfvars.json" <<'PY'
import json
import sys
with open(sys.argv[1], encoding="utf-8") as handle:
document = json.load(handle)
nodes = document["worker_nodes"]
if "manual01" in nodes:
raise SystemExit("manual worker was included without LAB_INCLUDE_MANUAL_WORKERS=true")
if set(nodes) != {"pimox01", "pimox02", "pimox03"}:
raise SystemExit(f"unexpected worker keys: {sorted(nodes)}")
PY
pass "worker var file excludes manual workers by default"
unset LAB_CLUSTER_VAR_FILE LAB_INCLUDE_RASPBERRY_WORKER LAB_INCLUDE_MANUAL_WORKERS
}
test_prepare_cluster_worker_var_file_can_include_raspberry_worker() {
@ -380,6 +400,7 @@ test_configured_worker_count_cannot_hide_existing_workers
test_configured_worker_count_can_expand_target_set
test_cluster_worker_targets_include_pimox_and_manual_workers
test_prepare_cluster_worker_var_file_merges_manual_and_pimox_workers
test_prepare_cluster_worker_var_file_excludes_manual_by_default
test_prepare_cluster_worker_var_file_can_include_raspberry_worker
test_prepare_cluster_worker_var_file_rebuilds_static_pimox_spec
test_report_renderer_hides_ok_links