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 ./jeannie start-cluster
``` ```
To exclude the Raspberry Pi from the Kubernetes cluster, set Kubernetes worker generation defaults to automated Pimox workers only. The
`LAB_INCLUDE_RASPBERRY_WORKER=false`. To manage workers manually instead, add Raspberry Pi stays out of the cluster unless `LAB_INCLUDE_RASPBERRY_WORKER=true`
entries to is set. Stale manual workers in `.lab/manual-workers.tsv` are ignored unless
`bootstrap/cluster/variables.tf` or a `.tfvars` file: `LAB_INCLUDE_MANUAL_WORKERS=true` is set. To manage workers manually instead,
add entries to `bootstrap/cluster/variables.tf` or a `.tfvars` file:
```hcl ```hcl
worker_nodes = { worker_nodes = {

View File

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

View File

@ -620,7 +620,9 @@ script name.
: Generated Pimox worker inventory. : Generated Pimox worker inventory.
`.lab/manual-workers.tsv` `.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` `$HOMELAB_STATE_DIR/logs`
: Jeannie command logs. : Jeannie command logs.

29
jeannie
View File

@ -759,7 +759,10 @@ doctor_versions() {
} }
truthy() { truthy() {
case "${1,,}" in local value
value="$(printf '%s' "$1" | tr '[:upper:]' '[:lower:]')"
case "${value}" in
1 | true | yes | on) 1 | true | yes | on)
return 0 return 0
;; ;;
@ -770,7 +773,10 @@ truthy() {
} }
disabled_value() { disabled_value() {
case "${1,,}" in local value
value="$(printf '%s' "$1" | tr '[:upper:]' '[:lower:]')"
case "${value}" in
0 | false | no | off | disabled) 0 | false | no | off | disabled)
return 0 return 0
;; ;;
@ -1745,12 +1751,21 @@ prepare_cluster_worker_var_file() {
local manual_spec_file="${REPO_ROOT}/.lab/manual-workers.tsv" local manual_spec_file="${REPO_ROOT}/.lab/manual-workers.tsv"
local pimox_spec_file="${REPO_ROOT}/.lab/pimox-workers.tsv" local pimox_spec_file="${REPO_ROOT}/.lab/pimox-workers.tsv"
local var_file="${REPO_ROOT}/.lab/cluster-workers.auto.tfvars.json" 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}}" export LAB_INCLUDE_RASPBERRY_WORKER="${LAB_INCLUDE_RASPBERRY_WORKER:-${include_raspberry_default}}"
mkdir -p "${REPO_ROOT}/.lab" mkdir -p "${REPO_ROOT}/.lab"
ensure_static_pimox_worker_spec_file "${pimox_spec_file}" 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}" export LAB_CLUSTER_VAR_FILE="${var_file}"
} }
@ -4703,7 +4718,7 @@ apps() {
ensure_cluster_worker_var_file() { ensure_cluster_worker_var_file() {
if [[ -z "${LAB_CLUSTER_VAR_FILE:-}" ]]; then if [[ -z "${LAB_CLUSTER_VAR_FILE:-}" ]]; then
prepare_cluster_worker_var_file true prepare_cluster_worker_var_file false
fi fi
if truthy "${TF_VAR_allow_empty_worker_nodes:-false}"; then if truthy "${TF_VAR_allow_empty_worker_nodes:-false}"; then
return 0 return 0
@ -4865,7 +4880,7 @@ plan_homelab() {
if [[ "${target}" == "all" ]]; then if [[ "${target}" == "all" ]]; then
if [[ -z "${LAB_CLUSTER_VAR_FILE:-}" ]]; then if [[ -z "${LAB_CLUSTER_VAR_FILE:-}" ]]; then
prepare_cluster_worker_var_file true prepare_cluster_worker_var_file false
fi fi
stacks=( stacks=(
"bootstrap/provisioning" "bootstrap/provisioning"
@ -4877,7 +4892,7 @@ plan_homelab() {
else else
stack="$(tofu_stack_from_plan_target "${target}")" stack="$(tofu_stack_from_plan_target "${target}")"
if [[ "${stack}" == "bootstrap/cluster" && -z "${LAB_CLUSTER_VAR_FILE:-}" ]]; then if [[ "${stack}" == "bootstrap/cluster" && -z "${LAB_CLUSTER_VAR_FILE:-}" ]]; then
prepare_cluster_worker_var_file true prepare_cluster_worker_var_file false
fi fi
stacks=("${stack}") stacks=("${stack}")
fi fi
@ -4893,7 +4908,7 @@ rebuild_cluster() {
require_debian_server "rebuild-cluster" require_debian_server "rebuild-cluster"
export WORKER_SSH_TARGETS="${WORKER_SSH_TARGETS:-}" 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_TEMPLATE_REPLACE_EXISTING="${LAB_PIMOX_TEMPLATE_REPLACE_EXISTING:-true}"
export LAB_PIMOX_WORKER_COUNT="${LAB_PIMOX_WORKER_COUNT:-2}" export LAB_PIMOX_WORKER_COUNT="${LAB_PIMOX_WORKER_COUNT:-2}"
export LAB_PIMOX_WORKER_REPLACE_EXISTING="${LAB_PIMOX_WORKER_REPLACE_EXISTING:-true}" 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() { test_prepare_cluster_worker_var_file_merges_manual_and_pimox_workers() {
unset LAB_INCLUDE_RASPBERRY_WORKER 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_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"}' LAB_MANUAL_WORKER_NODE_LABELS_JSON='{"homelab.dev/node-role":"manual","homelab.dev/storage":"custom"}'
prepare_cluster_worker_var_file false 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") raise SystemExit("manual labels were not applied")
PY PY
pass "worker var file merges manual and Pimox workers" 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() { 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_configured_worker_count_can_expand_target_set
test_cluster_worker_targets_include_pimox_and_manual_workers 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_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_can_include_raspberry_worker
test_prepare_cluster_worker_var_file_rebuilds_static_pimox_spec test_prepare_cluster_worker_var_file_rebuilds_static_pimox_spec
test_report_renderer_hides_ok_links test_report_renderer_hides_ok_links