docs: cover macOS libssh and stale operator key - #1072
Open
jklare wants to merge 2 commits into
Open
Conversation
✅
|
| Descriptor | Linter | Files | Fixed | Errors | Max errors | Warnings | Elapsed time |
|---|---|---|---|---|---|---|---|
| ✅ ACTION | actionlint | 5 | 0 | 0 | 0.04s | ||
| ✅ JSON | jsonlint | 4 | 0 | 0 | 0.08s | ||
| ✅ JSON | prettier | 4 | 0 | 0 | 0.34s | ||
| ✅ JSON | v8r | 4 | 0 | 0 | 9.21s | ||
| ✅ MARKDOWN | markdownlint | 168 | 0 | 0 | 2.61s | ||
| ✅ MARKDOWN | markdown-table-formatter | 168 | 0 | 0 | 0.43s | ||
| ✅ REPOSITORY | betterleaks | yes | no | no | 0.72s | ||
| ✅ REPOSITORY | checkov | yes | no | no | 19.29s | ||
| ✅ REPOSITORY | git_diff | yes | no | no | 0.05s | ||
| ✅ REPOSITORY | secretlint | yes | no | no | 3.45s | ||
| ✅ REPOSITORY | trufflehog | yes | no | no | 4.69s | ||
| ✅ SPELL | codespell | 178 | 0 | 0 | 0.55s | ||
| lychee | 178 | 1 | 0 | 23.43s | |||
| ✅ YAML | prettier | 6 | 0 | 0 | 0.41s | ||
| ✅ YAML | v8r | 6 | 0 | 0 | 7.57s | ||
| ✅ YAML | yamllint | 6 | 0 | 0 | 0.45s |
Detailed Issues
⚠️ SPELL / lychee - 1 error
📝 Summary
---------------------
🔍 Total.........1045
🔗 Unique.........802
✅ Successful.....983
⏳ Timeouts.........2
🔀 Redirected.......5
👻 Excluded........60
❓ Unknown..........0
🚫 Errors...........0
⛔ Unsupported......0
Errors in docs/release-notes/osism-10.md
[TIMEOUT] https://gateway-api.sigs.k8s.io/ (at 831:3) | Request timed out
[TIMEOUT] https://headlamp.dev/ (at 834:70) | Request timed out
Hint: Followed 5 redirects. You might want to consider replacing redirecting URLs with the resolved URLs. Use verbose mode (`-v`/`-vv`) to see redirection details.
See detailed reports in MegaLinter artifacts
Your project could benefit from a custom flavor, which would allow you to run only the linters you need, and thus improve runtime performances. (Skip this info by defining FLAVOR_SUGGESTIONS: false)
- Documentation: Custom Flavors
- Command:
npx mega-linter-runner@10.0.0 --custom-flavor-setup --custom-flavor-linters ACTION_ACTIONLINT,JSON_JSONLINT,JSON_V8R,JSON_PRETTIER,MARKDOWN_MARKDOWNLINT,MARKDOWN_MARKDOWN_TABLE_FORMATTER,REPOSITORY_CHECKOV,REPOSITORY_GIT_DIFF,REPOSITORY_BETTERLEAKS,REPOSITORY_SECRETLINT,REPOSITORY_TRUFFLEHOG,SPELL_LYCHEE,SPELL_CODESPELL,YAML_PRETTIER,YAML_YAMLLINT,YAML_V8R

Show us your support by starring ⭐ the repository
The local venv path of environments/manager/run.sh installs ansible-pylibssh, and that package publishes wheels only for Linux and for x86_64 macOS. On macOS with Apple Silicon there is no matching wheel, so uv falls back to the source distribution and compiles it, which fails on a missing libssh. The seed chapter listed only the Ubuntu packages, so the Homebrew equivalent is added there, together with the CFLAGS/LDFLAGS fallback for the Homebrew prefix in case the build still does not find the library. The manager upgrade guide points at that section, because the same venv is built when steps 2 and 3 run outside the seed container. Running the playbooks in the seed container avoids the build entirely, so that is named as the easier route on macOS. The workaround was tested by hand on macOS with Apple Silicon. Assisted-by: Claude:claude-opus-5[1m] Signed-off-by: Jan Klare <klare@osism.tech>
run.sh authenticates against the manager with environments/manager/id_rsa.operator. It writes that file from operator_private_key in environments/secrets.yml, but only when the file does not exist yet, and id_rsa.operator is listed in .gitignore. A copy dropped there by an earlier run therefore survives every git pull unnoticed, and after the operator key has been rotated run.sh keeps offering the revoked key until the file is deleted by hand. This is noted in the manager upgrade guide, where the failure shows up as an SSH login error in steps 2 and 3, and added as an explicit step to the operator key rotation guide, which is where the file has to be removed from every checkout that is used with run.sh. Fixing the generation in osism/generics instead, so that run.sh rewrites id_rsa.operator whenever it does not match operator_private_key, would make the stale key unusable in the first place and would allow both notes to be dropped again. Assisted-by: Claude:claude-opus-5[1m] Signed-off-by: Jan Klare <klare@osism.tech>
jklare
force-pushed
the
manager-upgrade-guide-macos-and-operator-key
branch
from
August 19, 2026 08:20
5d3d204 to
33ecb72
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Two problems that came up while actually walking through the manager
upgrade guide. Both of them are in the local venv path of
environments/manager/run.sh.macOS: the venv build fails on a missing libssh
The venv installs
ansible-pylibssh, and that package publishes wheelsonly for Linux and for
x86_64macOS — there is noarm64wheel. OnmacOS with Apple Silicon
uvtherefore falls back to the sourcedistribution and compiles it, which fails on a missing
libssh. Theseed chapter listed only the Ubuntu packages (
libssh-dev), so theHomebrew equivalent is added there, together with the
CFLAGS/LDFLAGSexports for the Homebrew prefix, and the upgrade guide pointsat that section.
I ran into this myself and worked out the fix by hand. Installing the
two Homebrew packages was not enough on its own — the build only
started once
CFLAGSandLDFLAGSwere exported as well:Worth deciding during review: the seed chapter currently presents the two
exports as a fallback ("if the build still does not find them"), but in
the run above they were required, so it may be better to promote them to
a normal part of the macOS steps.
Running the playbooks in the seed container avoids the build entirely, so
the docs now name that as the easier route on macOS.
A stale
id_rsa.operatorsurvives an operator key rotationrun.shauthenticates against the manager withenvironments/manager/id_rsa.operator. It writes that file fromoperator_private_keyinenvironments/secrets.yml, butonly when the file does not exist yet.
Since
id_rsa.operatoris listed in.gitignore, a copy dropped thereby an earlier run survives every
git pullunnoticed, andrun.shkeepsoffering the revoked key after the operator key has been rotated. I hit
this after rotating my own key — the local checkout still had the old one
lying around.
This is now noted in the upgrade guide and added as an explicit step to
the operator key rotation guide.
Alternative: fix the key generation instead
Documenting
rm -f environments/manager/id_rsa.operatoris a workaroundfor what is arguably a bug in osism/generics
(
environments/manager/run.sh). Ifrun.shregenerated the fileunconditionally, or compared it against
operator_private_keyandrewrote it on a mismatch, the stale key could never be used in the first
place — and the note added here could be dropped from the docs again.
Happy to open an issue or a patch there if we prefer that route.
Checks
markdownlintandcodespellcleanon all three files
yarn buildsucceeds, so the new cross-guide links and the#option-2-manual-installationanchor resolvecombined diff is identical to the original squashed change, and
markdownlintis clean against the intermediate tree