# Checkmk deployment and UniFi settings ## 1. Controller maintenance versus host deployment AIM's top-level Maintenance downloads agent packages and updates the external monitoring repository directly. No separate Bash helper is installed or required. These operations are separate from customer playbooks. The package directory and stable filenames remain: ```text /etc/ansible/roles/checkmk_agent/files/ check_mk_agent.msi check-mk-agent.deb check-mk-agent.rpm ``` `checkmk_install_agent.yml` installs the selected platform package, then deploys checks/configuration and ensures the agent service is running. `checkmk_update_scripts_config.yml` does not install packages. `checkmk_cleanup_scripts.yml` previews obsolete managed paths by default. AIM passes its two non-secret controller paths through environment variables used at role-default precedence. Inventory overrides still win. Manual execution uses the documented `/etc/...` defaults unless you configure the role variables. ## Controller-wide Checkmk agent source AIM stores controller-wide settings in `/etc/ansible/scripts/aim.yml`. The Checkmk agent source is structured rather than stored as a complete URL: ```yaml maintenance: checkmk_agent: protocol: https base_url: monitoring.domain.de site_name: monitoring version: 2.4.0 patchlevel: 46 revision: 1 role_files_dir: /etc/ansible/roles/checkmk_agent/files ``` AIM builds the download root as `https://monitoring.domain.de/monitoring/check_mk/agents` and the package version as `2.4.0p46-1`. `/check_mk/agents` is always appended automatically. These values are edited in the top-level Settings menu and reused by Maintenance without asking again. ## 2. Known external script sources The repository remains `/etc/checkmk_monitoring_scripts`. AIM performs the Git update itself. Because this is a managed shadow checkout, AIM uses `git fetch --prune` followed by `git reset --hard @{u}` rather than invoking an external `git pull` wrapper. Tracked local drift is discarded after explicit confirmation; untracked files are retained. File contents are not included in this bundle and were not supplied for this review; they are not rewritten, renamed, or executed by the build tests. | File | Selection | | --- | --- | | `Scripts Windows/check-ping.ps1` | Detected domain controller, as before | | `Scripts Windows/veeam_config_backup_status.ps1` | Detected Veeam VBR, as before | | `Scripts Windows/veeam_backup_license_status.ps1` | Detected Veeam VBR; local check → `$CUSTOM_LOCAL_PATH$` | | `Scripts Windows/veeam_o365_status.ps1` | Detected Veeam VBO; custom plugin → `$CUSTOM_PLUGINS_PATH$` | | `Scripts Windows/citrix_sessions_customized.ps1` | `want_windows_citrix`; custom plugin → `$CUSTOM_PLUGINS_PATH$` | | `Scripts Windows/veeam_surebackup_status.ps1` | `want_windows_surebackup` | | `Scripts Windows/windows-backup.ps1` | `want_windows_backup` | | `Scripts Windows/check-nsp-mailqueue.ps1` | `want_windows_nsp_mailqueue` | | `Scripts Windows/win_check_cert.ps1` | `want_windows_certificate` | | `Scripts Windows/veeam_cloud_connect_status.ps1` | `want_windows_veeam_cloud_connect` | | `Scripts Windows/veeam_backup_status.ps1` | `want_windows_veeam_backup`; custom plugin → `$CUSTOM_PLUGINS_PATH$` | | `Scripts Linux/check_certificate_directory.sh` | `want_linux_check_certificate` | | `Scripts Linux/check_unifi-controller/check_unifi-controller.sh` | UniFi network mode | | `Scripts Linux/check_unifi-controller/check_unifi-os.sh` | UniFi OS mode | All optional switches default to false. Auto-detected existing behavior is retained. The repository Veeam backup local check is a separate opt-in from the built-in agent plugin to avoid silently duplicating it. `citrix_sessions_customized.ps1`, `veeam_o365_status.ps1`, and `veeam_backup_status.ps1` are custom plugins, not local checks. AIM enables their exact `$CUSTOM_PLUGINS_PATH$` rules before the general custom-plugin deny rule. When selected, deployment removes the legacy AIM-managed copy from `C:\ProgramData\checkmk\agent\local` after the plugin copy is in place. Unknown files remain untouched. Source-file preflight checks that each selected file exists before deployment. A filename does not establish the check's internal parameters, privileges or credentials: configure those according to the maintained script repository. No new script-specific credential format was guessed from the filenames. ## 3. Single UniFi configuration ```yaml # host_vars//main.yml checkmk_unifi_mode: network # auto, network, os, disabled checkmk_unifi_username: bf-monitoring checkmk_unifi_password: "{{ vault_checkmk_unifi_password }}" ``` In the encrypted customer Vault, set: ```yaml vault_checkmk_unifi_password: "REPLACE_WITH_THE_REAL_MONITORING_PASSWORD" ``` This is the UniFi monitoring password, not the Ansible Windows/SSH login password. Existing Vaults are not silently modified. Vault creation/consolidation can prepare an empty optional key; an empty value or `CHANGEME` fails deployment preflight. Different hosts can override the reference, without exposing the secret in AIM: ```yaml checkmk_unifi_password: "{{ vault_unifi_site_a_password }}" ``` The AIM run-option field accepts the **variable name** `vault_unifi_site_a_password`, not a password value. Persist long-lived per-host choices in host vars; run options are temporary extra variables for the selected execution only. ### Mode and endpoint defaults | Mode | Check | Default BASEURL | | --- | --- | --- | | `network` | `check_unifi-controller.sh` | `https://127.0.0.1:8443` | | `os` | `check_unifi-os.sh` | `https://127.0.0.1:11443` | | `auto` | Detected variant; OS wins if both are detected | Variant default | | `disabled` | Neither selected for deployment | No config replacement | An explicit `checkmk_unifi_baseurl` overrides the endpoint. In selected network/OS mode, the role writes one `/etc/check_mk/unifi.cfg`, deploys the matching check, and removes only the opposite UniFi check. An explicitly disabled mode does not silently remove existing files during a normal update: review the cleanup action. ### Supplied config schema preserved ```yaml checkmk_unifi_curl_options: " --insecure --tlsv1.2" checkmk_unifi_status_provisioning: 1 checkmk_unifi_status_upgrading: 1 checkmk_unifi_status_upgradable: 0 checkmk_unifi_status_heartbeat_missed: 1 checkmk_unifi_status_noautobackup: 0 ``` Statuses are 0 OK, 1 WARN, 2 CRIT, 3 UNKNOWN. The template emits USERNAME, PASSWORD, BASEURL, CURLOPTS and the five STATUS_* settings with shell-safe quoting, validates shell syntax and sets mode `0600`. Secret-bearing tasks have `no_log: true` and `diff: false`. The source repository's `unifi.cfg` is no longer copied to the host. The supplied insecure TLS option remains unchanged; enabling certificate validation is a separate operational decision, not hidden in this refactor. ## 4. Read current Windows user configuration Before or after a rollout, `checkmk_read_windows_config.yml` can display the host's current `check_mk.user.yml` without changing it. This is intended for verifying existing `global`, `local`, `mrpe`, plugin, or custom sections before AIM touches the managed `plugins:` section. ```bash ansible-playbook -i inventories/CUSTOMER/hosts.yml \ playbooks/checkmk_read_windows_config.yml --limit HOST \ --vault-id CUSTOMER@prompt ``` The default path is `C:\ProgramData\checkmk\agent\check_mk.user.yml`. Set `checkmk_windows_user_cfg` only for hosts using a different location. The playbook reports a missing file without creating it and makes no Checkmk changes. ## 5. Cleanup AIM always starts cleanup in preview mode. It requires explicit deletion enablement and a second confirmation before running with `checkmk_cleanup_enabled=true`. Only the known managed filenames are considered; unrelated custom files stay. The preview is a list of paths considered obsolete by the selected desired state, not proof each path currently exists. This is distinct from the approved opposite- UniFi removal during normal mode replacement. Manual examples: ```bash ansible-playbook -i inventories/CUSTOMER/hosts.yml \ playbooks/checkmk_cleanup_scripts.yml --limit HOST \ --vault-id CUSTOMER@prompt # Destructive: enable only after reviewing the intended checks/mode. ansible-playbook -i inventories/CUSTOMER/hosts.yml \ playbooks/checkmk_cleanup_scripts.yml --limit HOST \ --vault-id CUSTOMER@prompt -e '{"checkmk_cleanup_enabled": true}' ``` ## 6. Windows execution policy AIM now treats `C:\ProgramData\checkmk\agent\check_mk.user.yml` as a shared operator configuration file, not as an AIM-owned file. On Windows, AIM owns only the top-level `plugins:` section. The existing `global`, `winperf`, `fileinfo`, `logwatch`, `local`, `mrpe`, unknown top-level sections, and their comments are preserved. This is important for older or manually customized Checkmk agents where those sections may contain host-specific behavior. AIM keeps an ownership notice on the first line and places another ownership comment immediately before the `plugins:` section. Only the marked `plugins:` section may be replaced on later runs. If no `plugins:` section exists, AIM appends one without rewriting the rest of the file. The effective AIM plugin timeout remains 120 seconds. Settings live in role defaults so host/group overrides work. Optional plugin rules are typed list entries such as: ```yaml checkmk_extra_plugin_patterns: - pattern: '$CUSTOM_PLUGINS_PATH$\example.ps1' run: true async: true timeout: 90 cache_age: 600 ``` AIM deliberately does not manage `local:` or `mrpe:`. Existing local-check execution policy and MRPE definitions remain exactly under operator/Checkmk control. The same applies to any other non-plugin user configuration. The `plugins:` section retains the standard AIM ordering: explicit/custom rules first, then known built-in rules, custom-plugin catch-alls, the built-in deny rule, and the final safety deny. Checkmk reads the user configuration after default and Bakery configuration, so section-scoped ownership avoids unintentionally overriding unrelated settings. Actual behavior of the Windows agent and external checks still requires a representative pilot. ## Structured reports in 3.3.0rc8 Install reports query registry/package database version and current service state after the existing management roles. Config-update reports list changed sections/check files and the narrowly approved opposite-UniFi deletion. They do not expose raw config diffs, guess unknown-file counts or alter unmanaged sections. The reporting-only checkmk_report role does not install/configure services itself. The read playbook now limits paths to basename check_mk.user.yml and 512 KiB. Native terminal readout remains explicit; API reports parse sections and redact recognized secret/command fields, including MRPE commands. Comments are not parsed YAML data. See OPERATION_RESULTS.md for exact semantics and VALIDATION.md for acceptance limits. ## Windows AIM-managed file ACLs AIM normalizes ACLs only on persistent files it manages directly: selected Windows Checkmk scripts in `$CUSTOM_LOCAL_PATH$` / `$CUSTOM_PLUGINS_PATH$` and `check_mk.user.yml`. Unknown files are not touched and directory trees are not rewritten recursively. For each AIM-managed persistent file, `checkmk_windows_acl` enables parent inheritance and guarantees these well-known SID permissions independent of Windows display language: | SID | Principal | Rights | |---|---|---| | `S-1-5-18` | SYSTEM | FullControl | | `S-1-5-32-544` | local Administrators | FullControl | | `S-1-15-2-1` | ALL APPLICATION PACKAGES | ReadAndExecute | | `S-1-15-2-2` | ALL RESTRICTED APPLICATION PACKAGES | ReadAndExecute | AIM does not add customer-specific administrator/user ACEs. Parent or explicit ACEs that already exist are not blindly purged; the goal is to guarantee the standard Checkmk-style administrative/application access while preserving operator ACL intent.