rename dmc12 inventory to cloudlorean and vault admin_password

- replace inventory/dmc12.yml with cloudlorean.yml (+ group_vars) and update
  all README/AGENTS call examples and the inventory table
- move admin_password hash into encrypted vault.yml; remove plaintext copies
  from roles/bootstrap/defaults and group_vars/external.yml
- bootstrap.yml loads vault.yml via vars_files (same pattern as monitoring)
- monitoring: PSK config/registration updates, docker role defaults,
  os-updates logging/reboot refinements, ansible.cfg/execute.sh tweaks
- add .project-wiki knowledge base and .github agent instructions
This commit is contained in:
DerLinkman
2026-09-09 14:14:18 +02:00
parent a31751af1d
commit 30f3e9a4c6
96 changed files with 3602 additions and 138 deletions
+20
View File
@@ -0,0 +1,20 @@
# Requirements
This section stores explicit product intent, constraints, and open questions.
## When To Read
- Understand confirmed project behavior, scope, constraints, or unresolved product intent.
## Key Files
- [Product brief](./product-brief.md)
- [Functional requirements](./functional/INDEX.md)
- [Non-functional requirements](./non-functional/INDEX.md)
- [Constraints](./constraints.md)
- [Open questions](./open-questions.md)
## Placeholders Or Stale Areas
- `product-brief.md` is still a placeholder (project identity lives in
[PROJECT.md](../PROJECT.md)); fill or remove during the next update.
+47
View File
@@ -0,0 +1,47 @@
---
id: CONSTRAINTS
type: note
status: active
title: Constraints
created: '2026-09-09'
updated: '2026-09-09'
tags:
- requirements
- constraints
related:
- PROJECT
source_paths:
- AGENTS.md
confidence: confirmed
---
# Constraints
Explicitly documented constraints for this repository (source: `AGENTS.md`).
## Technical Constraints
- **Debian-only**: every playbook must check
`ansible_facts['os_family'] == "Debian"` and abort on non-Debian hosts.
- **LXC containers**: tasks affecting `sysctl` or `reboot` must check
`virtualization_type != "lxc"` and be skipped there.
- **Ansible style**: modules use FQCN (`ansible.builtin.apt`, ...);
variable defaults live in `roles/<name>/defaults/main.yml`, never hardcoded
in tasks; role logic is split into `tasks/<name>.yml` subtask files with
`tasks/main.yml` containing only imports.
- **Templates** use `# {{ ansible_managed }}` as header.
- **Execution environment**: changes to collections require updating
`docker/requirements.yml` and rebuilding the Docker image.
## Process Constraints
- **Documentation duty**: every new feature, parameter, or variable must be
documented in the corresponding README before commit (see `AGENTS.md`
mapping table).
- **Code language**: documentation in German, code (variable names, task
names) in English.
- **Secrets**: sensitive values belong in encrypted `vault.yml`; `.vault_pass`,
`setenv.sh`, `logs/`, and `.zabbix-psk/` are git-ignored and must never be
committed. No plaintext secrets in `defaults/` or `group_vars/`.
- **Testing**: changes are tested in the Docker container (`./execute.sh`),
with `ansible-lint` and `--check` dry runs where sensible.
@@ -0,0 +1,15 @@
# Functional Requirements
This index routes to functional requirement topics; atomic REQ records live only in linked topic files.
## When To Read
- Work with product capabilities, workflows, integrations, or other functional behavior.
## Key Files
- [Host lifecycle operations](./host-lifecycle-operations.md) - REQ-001..REQ-006 (provisioning, docker, monitoring, updates, hawser, ssh keys)
## Placeholders Or Stale Areas
- None.
@@ -0,0 +1,163 @@
---
id: REQ-FUNC-HOST-LIFECYCLE
type: requirements
status: active
title: Host Lifecycle Operations
created: '2026-09-09'
updated: '2026-09-09'
tags:
- requirements
- functional
related:
- PROJECT
- PRODUCT-BRIEF
source_paths:
- README.md
- AGENTS.md
confidence: confirmed
---
# Host Lifecycle Operations
Explicitly stated functional scope of the collection (source: root
`README.md` purpose statement and playbook table; evidence linked in
[requirement-evidence.yml](../../traceability/requirement-evidence.yml)).
<a id="req-001"></a>
## REQ-001 - Initial provisioning of Debian hosts
Status: active
Tags: [provisioning, bootstrap]
Related: [MOD-001]
Confidence: confirmed
### Statement
The collection provides a complete initial setup ("Ersteinrichtung") for
Debian hosts via `bootstrap.yml` (packages, admin user, SSH, MOTD, sysctl,
Docker, monitoring).
### Rationale
README.md: "bootstrap.yml | Vollständige Ersteinrichtung eines Debian-Hosts";
README purpose statement: "Bereitstellung, Härtung, Aktualisierung und
Überwachung von Debian-Hosts".
### Acceptance Notes
- Runs against the three sites in `inventory/`; composes docker and
monitoring roles with skip flags.
<a id="req-002"></a>
## REQ-002 - Docker Engine installation
Status: active
Tags: [docker]
Related: [MOD-002]
Confidence: confirmed
### Statement
Install Docker Engine from the official Docker repository
(`playbooks/docker.yml` / role `docker`).
### Rationale
README playbook table: "docker | Docker Engine installieren".
### Acceptance Notes
- Official repository, not distribution packages.
<a id="req-003"></a>
## REQ-003 - Zabbix Agent 2 installation and registration
Status: active
Tags: [monitoring, zabbix]
Related: [MOD-003, TECH-INTEGRATIONS-ZABBIX]
Confidence: confirmed
### Statement
Install Zabbix Agent 2 and register the host on the Zabbix server
(`playbooks/monitoring.yml` / role `monitoring`).
### Rationale
README playbook table: "monitoring | Zabbix Agent 2 installieren &
registrieren".
### Acceptance Notes
- Includes TLS-PSK and Docker plugin support per implementation.
<a id="req-004"></a>
## REQ-004 - Package updates with healthcheck
Status: active
Tags: [updates, healthcheck]
Related: [MOD-004, MOD-005]
Confidence: confirmed
### Statement
Update Debian packages and verify running containers afterwards
(`playbooks/os-updates-deb.yml`: roles `os-updates` + `healthcheck`).
### Rationale
README playbook table: "os-updates, healthcheck | Pakete aktualisieren +
Healthcheck".
### Acceptance Notes
- Mirror switch, reboot and logging are part of the implemented update flow.
<a id="req-005"></a>
## REQ-005 - Hawser stack update
Status: active
Tags: [docker, hawser]
Related: [MOD-006]
Confidence: confirmed
### Statement
Update the Hawser Docker Compose stack (`playbooks/upgrade-hawser.yml` /
role `hawser`).
### Rationale
README playbook table: "hawser | Hawser-Stack aktualisieren".
### Acceptance Notes
- None.
<a id="req-006"></a>
## REQ-006 - SSH key hardening
Status: active
Tags: [ssh, hardening]
Related: [MOD-007]
Confidence: confirmed
### Statement
Manage desired and undesired SSH keys on hosts
(`playbooks/hardening/manage-ssh-keys.yml` / role `manage-ssh-keys`).
### Rationale
README playbook table: "manage-ssh-keys | SSH-Schlüssel hartieren"; role
name/description in README roles table.
### Acceptance Notes
- None.
@@ -0,0 +1,15 @@
# Non-Functional Requirements
This index routes to non-functional requirement topics; atomic NFR records live only in linked topic files.
## When To Read
- Work with quality attributes, operations, security, resilience, performance, or service levels.
## Key Files
- [Operational policies](./operational-policies.md) - NFR-001..NFR-006 (platform, secrets, logging, runtime, documentation, LXC)
## Placeholders Or Stale Areas
- None.
@@ -0,0 +1,167 @@
---
id: NFR-OPERATIONAL-POLICIES
type: requirements
status: active
title: Operational Policies
created: '2026-09-09'
updated: '2026-09-09'
tags:
- requirements
- non-functional
related:
- PROJECT
- CONSTRAINTS
source_paths:
- README.md
- AGENTS.md
confidence: confirmed
---
# Operational Policies
Explicitly stated non-functional requirements (sources: root `README.md`,
`AGENTS.md`; evidence linked in
[requirement-evidence.yml](../../traceability/requirement-evidence.yml)).
<a id="nfr-001"></a>
## NFR-001 - Debian-only target platforms
Status: active
Tags: [platform]
Related: [REQ-001]
Confidence: confirmed
### Statement
All playbooks must target Debian only and verify
`ansible_facts['os_family'] == "Debian"`, aborting on other systems.
### Rationale
README "Voraussetzungen": "Ziel-Hosts: Debian (alle Playbooks prüfen
`os_family == "Debian"`)".
### Acceptance Notes
- Exception observed: `playbooks/hardening/manage-ssh-keys.yml` lacks the
guard (tracked in the scan report).
<a id="nfr-002"></a>
## NFR-002 - Secrets never committed unencrypted
Status: active
Tags: [security, vault]
Related: [TECH-SECURITY, ALERT-20260909-001]
Confidence: confirmed
### Statement
Sensitive values (passwords, API keys) belong in encrypted `vault.yml`;
no plaintext secrets in `defaults/`, `group_vars/`, or commits.
### Rationale
README "Secrets & Vault" and "Beitragen" rule 3; AGENTS.md "Secrets"
section.
### Acceptance Notes
- Resolved 2026-09-09: `admin_password` moved to encrypted `vault.yml`
(ALERT-20260909-001); no plaintext secrets remain in `defaults/` or
`group_vars/`.
<a id="nfr-003"></a>
## NFR-003 - Per-host update audit log
Status: active
Tags: [logging, audit]
Related: [MOD-004, MOD-005]
Confidence: confirmed
### Statement
The `os-updates` and `healthcheck` roles write one update log per host to
`logs/<inventory>/<hostname>/update.log` on the controller as a local
audit trail.
### Rationale
README "Logging" section.
### Acceptance Notes
- `logs/` is git-ignored.
<a id="nfr-004"></a>
## NFR-004 - Docker-based execution environment
Status: active
Tags: [runtime, docker]
Related: [TECH-DEPLOYMENT]
Confidence: confirmed
### Statement
Playbooks must be runnable from the provided Docker environment without a
local Ansible installation (`execute.sh`, `docker/Dockerfile`).
### Rationale
README "Docker-Ausführungsumgebung": "Damit Playbooks nicht lokal
installiert werden müssen, liefert das Repository ein fertiges Docker-Image."
### Acceptance Notes
- Collections pinned in `docker/requirements.yml`; image rebuild on
collection changes.
<a id="nfr-005"></a>
## NFR-005 - Documentation duty for every change
Status: active
Tags: [documentation, process]
Related: [CONSTRAINTS]
Confidence: confirmed
### Statement
Every new feature, parameter, and variable must be documented in the
corresponding role README before commit; playbook changes update the root
README.
### Rationale
README "Beitragen" rule 2; AGENTS.md "WICHTIG: Dokumentationspflicht bei
Änderungen".
### Acceptance Notes
- None.
<a id="nfr-006"></a>
## NFR-006 - LXC-aware execution
Status: active
Tags: [platform, lxc]
Related: [MOD-004]
Confidence: confirmed
### Statement
Tasks affecting `sysctl` or `reboot` must be skipped on LXC containers
(`virtualization_type != "lxc"`).
### Rationale
AGENTS.md "OS-Unterstützung": "LXC-Container: Tasks, die `sysctl` oder
`reboot` betreffen, müssen ... übersprungen werden."
### Acceptance Notes
- Implemented in `roles/os-updates/tasks/reboot.yml`.
@@ -0,0 +1,110 @@
---
id: OPEN-QUESTIONS
type: note
status: active
title: Open Questions
created: '2026-09-09'
updated: '2026-09-09'
tags:
- requirements
- open-questions
related:
- SCAN-20260909
- ALERT-20260909-001
- ALERT-20260909-002
source_paths:
- AGENTS.md
- README.md
- inventory/group_vars/external.yml
confidence: confirmed
---
# Open Questions
Reconciliation state after the 2026-09-09 scan (workflow: Open Questions
Reconciliation). Anchors are stable; statuses follow the schema
(`open`, `partially-resolved`, `resolved`, ...).
<a id="oq-001"></a>
## OQ-001 - Who are the stakeholders/owners of this repository?
Status: partially-resolved
Updated: 2026-09-09
Related: [SCAN-20260909]
Resolution (partial): Operators appear to be "Niklas" and "Dennis"
(SSH key comments in `roles/bootstrap/defaults/main.yml`,
`confidence: inferred`). Formal ownership and roles remain undocumented.
Remaining question: Who formally owns and operates the playbooks, and who
approves changes?
<a id="oq-002"></a>
## OQ-002 - What are the explicit success criteria?
Status: partially-resolved
Updated: 2026-09-09
Related: [SCAN-20260909], MOD-005
Resolution (partial): For update runs, success is defined by the
`healthcheck` quality gate (all Docker containers running; fails the play
only when `healthcheck_fail_on_unhealthy` is true). No success criteria for
the overall project are documented.
Remaining question: What defines success beyond a passing update-run gate?
<a id="oq-003"></a>
## OQ-003 - Is `AGENTS.md`/`README.md` stale regarding `inventory/dmc12.yml`?
Status: resolved
Updated: 2026-09-09
Related: [ALERT-20260909-002], SCAN-20260909
Resolution: Yes. Git status shows `D inventory/dmc12.yml` (uncommitted) and
untracked `inventory/cloudlorean.yml`; `dmc12` is now a Proxmox host inside
the `cloudlorean` site. `README.md` (inventory table, examples) and
`AGENTS.md` still reference `dmc12.yml`. Documentation updates and the
commit of the rename are tracked in ALERT-20260909-002.
<a id="oq-004"></a>
## OQ-004 - Is the external site's Zabbix passive server correct?
Status: open
Created: 2026-09-09
Related: [SCAN-20260909], MOD-003
`inventory/group_vars/external.yml` sets
`monitoring_zabbix_passive_servers: ["2a01:4f8:1c1e:62dd::1"]`, which is the
`healthcheck` host's own address. Is a Zabbix server/proxy intentionally
running on that host, or is this a misconfiguration? (`confidence: unknown`)
<a id="oq-005"></a>
## OQ-005 - Which Docker template name exists on the Zabbix server?
Status: open
Created: 2026-09-09
Related: [SCAN-20260909], MOD-003
Role default `monitoring_zabbix_docker_templates: ["Docker by Zabbix agent2"]`
(no space) vs group_vars `["Docker by Zabbix agent 2"]` (with space). One of
the two will fail host linking at registration. Which name does the Zabbix
server actually use? (`confidence: unknown`)
<a id="oq-006"></a>
## OQ-006 - Is the committed `admin_password` hash intended or a policy violation?
Status: resolved
Updated: 2026-09-09
Related: [ALERT-20260909-001], NFR-002
Resolution: Policy violation. Decrypting `vault.yml` during the alert
resolution confirmed it did not define `admin_password` (no override); the
hash existed only as plaintext in role defaults and group_vars. Resolved with
[ALERT-20260909-001]: hash moved into encrypted `vault.yml`, plaintext copies
removed, `bootstrap.yml` loads the vault via `vars_files`.
@@ -0,0 +1,18 @@
---
id: PRODUCT-BRIEF
type: note
status: placeholder
title: Product Brief
created: '2026-09-09'
updated: '2026-09-09'
tags:
- requirements
- product
related: []
source_paths: []
confidence: unknown
---
# Product Brief
No explicit product brief has been captured yet.