Commit Graph
91 Commits
Author SHA1 Message Date
volker.raschekandCopilot 95ea71394e fix: make issued certificates readable for unprivileged consumers
The pki directories were created with mode 0700, so cert.pem, chain.pem and fullchain.pem stayed
unreachable for every non root process although they are declared as 0644. That defeats the main purpose of
the role, which is handing a certificate to a service such as nginx or postgres.

The directories are opened up to 0755. To keep that safe, the mode of the private keys is now pinned
explicitly to 0600 instead of relying on the default of community.crypto.openssl_privatekey.

Co-authored-by: Copilot <copilot@github.com>
2026-09-07 22:30:23 +02:00
volker.raschekandCopilot 625e93b524 fix: install cryptography via the distribution package manager
Installing the python cryptography bindings with ansible.builtin.pip is rejected by PEP 668 on distributions
which mark their python installation as externally managed. Fedora 38+, Ubuntu 23.04+ and RHEL 10 are
affected, so the role aborted on its very first task there.

The package names are resolved from vars/ via first_found, which keeps distribution specifics out of the
task file. vars/main.yaml provides python3-cryptography as a fallback for every family without a dedicated
file, Archlinux overrides it with python-cryptography.

Co-authored-by: Copilot <copilot@github.com>
2026-09-07 22:30:23 +02:00
volker.raschekandCopilot e6092685e9 docs: correct copied parameter descriptions
Several parameter descriptions were carried over from unrelated variables and
described the wrong attribute. Both country name parameters claimed to document
a Common Name, the client organizational unit name repeated the Common Name text
and the two client content parameters described a passphrase and a key
algorithm.

The client content parameters now follow the wording already used for their root
and intermediate counterparts. The README tables were regenerated with
readme-generator, which also normalises the column padding of the previously
hand-edited rows.

Additionally fix the misspelled repository owner in the homepage URL and a typo
in the galaxy description.

Co-authored-by: Copilot <copilot@github.com>
2026-09-07 22:30:23 +02:00
volker.raschekandCopilot 8cc33a29ab refactor: remove circular pip installation task
The task named "Upgrade python package manager pip" installed pip with
`state: present`, which never upgrades anything, and it did so through
`ansible.builtin.pip`. That module already requires a working pip on the target,
so the task could only ever run when its own result was already satisfied.

Co-authored-by: Copilot <copilot@github.com>
2026-09-07 22:30:23 +02:00
volker.raschekandCopilot 2cd88df81b fix: report concatenation commands as unchanged
The `awk 1` commands assembling the chain, fullchain and all files declared
`changed_when: chain_content.rc == 0`, which holds on every successful run. As a
result the role never reported a converged state, even when no certificate was
touched.

These commands only read files and write to stdout, so mark them as unchanged.
The subsequent copy task remains responsible for reporting an actual change.

Co-authored-by: Copilot <copilot@github.com>
2026-09-07 22:30:23 +02:00
volker.raschekandCopilot a6e647b842 refactor: drop ineffective remote_src from copy tasks
All tasks writing the concatenated chain, fullchain and all files pass the file
body via `content`. The `remote_src` option only governs how `src` is resolved
and is ignored in that case, so it merely suggested a behaviour the tasks never
had.

Co-authored-by: Copilot <copilot@github.com>
2026-09-07 22:30:23 +02:00
volker.raschekandCopilot ad7b76852b feat: assert that the signing certificate authority is available
Issuing an intermediate certificate authority or a client certificate always
signs against the private key of the parent authority, regardless of whether
that authority is managed in the same run. With `certificate_authority_root_ca_skip`
or `certificate_authority_intermediate_ca_skip` enabled and no previously
provisioned key at the configured path, this surfaced as a generic module error
deep inside the signing task.

Stat the parent private key upfront and assert its presence, so the failure
names the missing path and the variables that control it. Skipping the parent
remains valid when its key already exists, because the check inspects the file
instead of the skip variable.

Co-authored-by: Copilot <copilot@github.com>
2026-09-07 22:30:23 +02:00
volker.raschekandCopilot 9ea26dc23f fix: resolve trust store location per distribution family
The trust store import hardcoded the RHEL anchor directory and
`update-ca-trust`, although `meta/main.yaml` also declares ArchLinux and Ubuntu
as supported platforms. On those distributions the task created a dangling
symlink outside any trust source and then failed on the missing binary.

Resolve both the anchor path and the update command from a map keyed by
`ansible_facts['os_family']`. Debian based systems additionally require the file
extension `crt`, because `update-ca-certificates` ignores anchors named
otherwise.

Note that the role now depends on gathered facts.

Co-authored-by: Copilot <copilot@github.com>
2026-09-07 22:30:23 +02:00
volker.raschekandCopilot 2733f3929a docs: shorten SAN format hint to keep README table aligned
The previous wording exceeded the description column width generated by
readme-generator, so markdownlint reported MD060/table-column-style for all
three parameter tables. Shorten the hint to an `Example:` clause that fits the
existing column width and pad the cells accordingly, keeping the README stable
across regeneration.

Co-authored-by: Copilot <copilot@github.com>
2026-09-07 22:28:52 +02:00
volker.raschekandCopilot 41d06e4e6d feat!: apply subject alternative names to root and intermediate CA
The variables `certificate_authority_root_ca_subject_alternative_names` and
`certificate_authority_intermediate_ca_subject_alternative_names` were
documented but never referenced by any task, so both CA certificates were always
issued without SANs. Wire them into the corresponding CSR tasks and fall back to
`omit` when the list is empty.

SAN entries are now passed to `openssl_csr` unchanged instead of being prefixed
with `DNS:` by the role. This allows other types such as `IP:` or `email:`,
which the previous rewrite would have corrupted into values like `DNS:IP:...`.
The client tasks additionally dropped `join(',') | quote`, because `quote`
performs shell escaping and `openssl_csr` expects a list.

Since both client CSR tasks only differed in `subject_alt_name`, they collapse
into a single task per file.

BREAKING CHANGE: Entries of all `*_subject_alternative_names` variables must now
carry their type prefix, for example `DNS:example.local` instead of
`example.local`.

Co-authored-by: Copilot <copilot@github.com>
2026-09-07 22:28:52 +02:00
volker.raschekandCopilot 38ab2f55bb fix: drop passphrase from CSR task for unencrypted client key
This task file is only included when
`certificate_authority_client_tls_key_passphrase` is empty, so the private key
is created without encryption. Passing the empty passphrase to `openssl_csr`
made the module attempt to decrypt an unencrypted key instead of treating it as
absent. The sibling CSR task for certificates with SANs already omitted the
attribute, so this also aligns both code paths.

Co-authored-by: Copilot <copilot@github.com>
2026-09-07 22:28:52 +02:00
volker.raschekandCopilot 309c5e0e65 fix: use client path instead of certificate content as destination
The task importing the client certificate passed
`certificate_authority_client_tls_crt_content` to `dest`, so the PEM payload
itself was interpreted as a directory path. The certificate was written to a
bogus location derived from its own content instead of the configured client
directory. Use `certificate_authority_client_path` as destination, consistent
with the private key import above.

Co-authored-by: Copilot <copilot@github.com>
2026-09-07 22:28:52 +02:00
volker.raschekandCopilot 32bd44a0a6 fix: use declared variable for client private key destination
The task importing the client private key referenced
`certificate_authority_client_ca_path`, a variable that is declared neither in
`defaults/main.yaml` nor in `meta/argument_specs.yaml`. Every run with
`certificate_authority_client_create: false` therefore aborted with an undefined
variable error before the key was written. Use the actual role variable
`certificate_authority_client_path` instead.

Co-authored-by: Copilot <copilot@github.com>
2026-09-07 22:28:52 +02:00
volker.raschek b112672d5a fix(tasks): create passphrase protected client certificate 2026-09-07 22:28:52 +02:00
CSRBot b54b1774bd Merge pull request 'chore(deps): update ansible/ansible-lint action to v26.8.0' (#33) from renovate/ansible-ansible-lint-26.x into master
Ansible Linter / ansible-lint (push) Successful in 35s
Lint Markdown files / markdown-lint (push) Successful in 12s
2026-08-12 09:04:28 +00:00
CSRBot 12abfefb62 chore(deps): update ansible/ansible-lint action to v26.8.0
Ansible Linter / ansible-lint (push) Successful in 2m12s
Lint Markdown files / markdown-lint (push) Successful in 6s
Ansible Linter / ansible-lint (pull_request) Successful in 35s
Lint Markdown files / markdown-lint (pull_request) Successful in 6s
2026-08-12 09:00:54 +00:00
CSRBot dd3529f21c chore(deps): update dependency markdownlint-cli to ^0.49.0
Lint Markdown files / markdown-lint (pull_request) Successful in 7s
Ansible Linter / ansible-lint (pull_request) Successful in 1m24s
Ansible Linter / ansible-lint (push) Failing after 0s
Lint Markdown files / markdown-lint (push) Failing after 1s
2026-07-20 21:04:16 +00:00
CSRBot 3ea8c4ac71 Merge pull request 'chore(deps): update actions/checkout action to v6.1.0' (#32) from renovate/actions-checkout-6.x into master
Ansible Linter / ansible-lint (push) Successful in 47s
Lint Markdown files / markdown-lint (push) Successful in 8s
2026-07-20 18:03:02 +00:00
CSRBot 770a17eb70 chore(deps): update actions/checkout action to v6.1.0
Lint Markdown files / markdown-lint (push) Successful in 25s
Ansible Linter / ansible-lint (push) Successful in 2m31s
Ansible Linter / ansible-lint (pull_request) Successful in 1m13s
Lint Markdown files / markdown-lint (pull_request) Successful in 9s
2026-07-20 18:00:53 +00:00
CSRBot 08e022f22f Merge pull request 'chore(deps): update ansible/ansible-lint action to v26.6.0' (#31) from renovate/ansible-ansible-lint-26.x into master
Ansible Linter / ansible-lint (push) Successful in 56s
Lint Markdown files / markdown-lint (push) Successful in 6s
2026-07-02 18:10:00 +00:00
CSRBot c45da244e6 chore(deps): update ansible/ansible-lint action to v26.6.0
Ansible Linter / ansible-lint (pull_request) Successful in 1m39s
Ansible Linter / ansible-lint (push) Successful in 1m20s
Lint Markdown files / markdown-lint (pull_request) Successful in 14s
Lint Markdown files / markdown-lint (push) Successful in 13s
2026-07-02 18:00:45 +00:00
CSRBot 10e7eedf7b chore(deps): pin dependencies
Ansible Linter / ansible-lint (pull_request) Successful in 29s
Lint Markdown files / markdown-lint (pull_request) Successful in 11s
Lint Markdown files / markdown-lint (push) Successful in 5s
Ansible Linter / ansible-lint (push) Successful in 1m13s
2026-06-05 12:00:56 +00:00
CSRBot 0aee93b6e5 Merge pull request 'chore(deps): update davidanson/markdownlint-cli2-action action to v23' (#28) from renovate/davidanson-markdownlint-cli2-action-23.x into master
Ansible Linter / ansible-lint (push) Successful in 38s
Lint Markdown files / markdown-lint (push) Failing after 14m38s
2026-06-04 15:05:53 +00:00
CSRBot 963fb67fba chore(deps): update davidanson/markdownlint-cli2-action action to v23
Ansible Linter / ansible-lint (push) Successful in 1m30s
Ansible Linter / ansible-lint (pull_request) Successful in 1m19s
Lint Markdown files / markdown-lint (push) Successful in 11s
Lint Markdown files / markdown-lint (pull_request) Successful in 13s
2026-06-04 15:00:56 +00:00
CSRBot 3021b2ebcc Merge pull request 'chore(deps): update actions/checkout action to v6.0.3' (#27) from renovate/actions into master
Ansible Linter / ansible-lint (push) Successful in 39s
Lint Markdown files / markdown-lint (push) Successful in 5s
2026-06-02 15:04:49 +00:00
CSRBot ec6bc687d1 chore(deps): update actions/checkout action to v6.0.3
Ansible Linter / ansible-lint (push) Successful in 30s
Lint Markdown files / markdown-lint (push) Successful in 11s
Ansible Linter / ansible-lint (pull_request) Successful in 1m18s
Lint Markdown files / markdown-lint (pull_request) Successful in 11s
2026-06-02 15:00:45 +00:00
CSRBot d94d98fe99 Merge pull request 'chore(deps): update ansible/ansible-lint action to v26.4.0' (#26) from renovate/actions into master
Ansible Linter / ansible-lint (push) Successful in 29s
Lint Markdown files / markdown-lint (push) Successful in 4s
2026-04-14 11:02:06 +00:00
CSRBot 79a361d8f6 chore(deps): update ansible/ansible-lint action to v26.4.0
Ansible Linter / ansible-lint (push) Successful in 27s
Lint Markdown files / markdown-lint (push) Successful in 6s
Lint Markdown files / markdown-lint (pull_request) Successful in 4s
Ansible Linter / ansible-lint (pull_request) Successful in 1m59s
2026-04-14 10:46:48 +00:00
CSRBot 07df95ec3e Merge pull request 'chore(deps): update ansible/ansible-lint action to v26.3.0' (#25) from renovate/actions into master
Ansible Linter / ansible-lint (push) Successful in 20s
Lint Markdown files / markdown-lint (push) Successful in 11s
2026-03-05 14:02:06 +00:00
CSRBot b2befe080e chore(deps): update ansible/ansible-lint action to v26.3.0
Ansible Linter / ansible-lint (push) Successful in 20s
Ansible Linter / ansible-lint (pull_request) Successful in 20s
Lint Markdown files / markdown-lint (push) Successful in 6s
Lint Markdown files / markdown-lint (pull_request) Successful in 5s
2026-03-05 14:00:37 +00:00
CSRBot 7515c64989 Merge pull request 'chore(deps): update ansible/ansible-lint action to v26.2.0' (#23) from renovate/actions into master
Ansible Linter / ansible-lint (push) Successful in 21s
Lint Markdown files / markdown-lint (push) Successful in 6s
2026-02-25 17:19:34 +00:00
CSRBot d41201ead2 chore(deps): update ansible/ansible-lint action to v26.2.0
Ansible Linter / ansible-lint (push) Successful in 21s
Ansible Linter / ansible-lint (pull_request) Successful in 22s
Lint Markdown files / markdown-lint (push) Successful in 4s
Lint Markdown files / markdown-lint (pull_request) Successful in 5s
2026-02-25 17:17:19 +00:00
CSRBot 2c940f8026 Merge pull request 'chore(deps): update actions/checkout action to v6.0.2' (#22) from renovate/actions into master
Ansible Linter / ansible-lint (push) Successful in 20s
Lint Markdown files / markdown-lint (push) Successful in 5s
2026-01-22 17:05:51 +00:00
CSRBot 8bbeae0394 chore(deps): update actions/checkout action to v6.0.2
Ansible Linter / ansible-lint (push) Successful in 1m4s
Lint Markdown files / markdown-lint (push) Successful in 10s
Ansible Linter / ansible-lint (pull_request) Successful in 1m3s
Lint Markdown files / markdown-lint (pull_request) Successful in 11s
2026-01-22 17:00:46 +00:00
CSRBot 62e02d0b6e Merge pull request 'chore(deps): update ansible/ansible-lint action to v26.1.1' (#21) from renovate/actions into master
Ansible Linter / ansible-lint (push) Successful in 20s
Lint Markdown files / markdown-lint (push) Successful in 5s
2026-01-16 05:01:58 +00:00
CSRBot de9a2d70b7 chore(deps): update ansible/ansible-lint action to v26.1.1
Ansible Linter / ansible-lint (push) Successful in 19s
Lint Markdown files / markdown-lint (push) Successful in 4s
Ansible Linter / ansible-lint (pull_request) Successful in 19s
Lint Markdown files / markdown-lint (pull_request) Successful in 9s
2026-01-16 05:00:32 +00:00
volker.raschek aca86c74ab docs(meta): add argument_specs
Lint Markdown files / markdown-lint (push) Successful in 5s
Ansible Linter / ansible-lint (push) Successful in 1m4s
Release Ansible Role / Release Ansible Role (push) Successful in 58s
0.2.5
2026-01-14 21:53:45 +01:00
CSRBot 708c02d4b4 chore(deps): update ansible/ansible-lint action to v26
Lint Markdown files / markdown-lint (pull_request) Successful in 10s
Ansible Linter / ansible-lint (pull_request) Successful in 20s
Lint Markdown files / markdown-lint (push) Successful in 5s
Ansible Linter / ansible-lint (push) Successful in 1m7s
2026-01-11 23:00:30 +00:00
volker.raschek 2355a9b3ed fix(ci): add workflow dispatch for releases
Ansible Linter / ansible-lint (push) Successful in 21s
Lint Markdown files / markdown-lint (push) Successful in 5s
2026-01-11 21:15:33 +01:00
CSRBotandvolker.raschek eadc8f6962 chore(deps): update dependency markdownlint-cli to ^0.47.0
Ansible Linter / ansible-lint (push) Successful in 20s
Lint Markdown files / markdown-lint (push) Successful in 44s
2026-01-07 15:21:47 +00:00
volker.raschek 41fc9dd544 fix(ci): use dynamic github repository name
Ansible Linter / ansible-lint (push) Successful in 19s
Lint Markdown files / markdown-lint (push) Successful in 4s
2026-01-07 16:11:05 +01:00
volker.raschek 580ddabd36 fix(ci): add release workflow
Ansible Linter / ansible-lint (push) Successful in 19s
Lint Markdown files / markdown-lint (push) Successful in 4s
2026-01-07 16:05:28 +01:00
volker.raschek f9f3968b68 fix: replace deprecated INJECT_FACTS_AS_VARS
Ansible Linter / ansible-lint (push) Successful in 18s
Lint Markdown files / markdown-lint (push) Successful in 5s
2026-01-05 10:26:11 +01:00
CSRBot e985a8bc3d Merge pull request 'chore(deps): update ansible/ansible-lint action to v25.12.2' (#19) from renovate/actions into master
Ansible Linter / ansible-lint (push) Successful in 18s
Lint Markdown files / markdown-lint (push) Successful in 5s
2025-12-22 20:01:55 +00:00
CSRBot be8286448e chore(deps): update ansible/ansible-lint action to v25.12.2
Ansible Linter / ansible-lint (push) Successful in 19s
Ansible Linter / ansible-lint (pull_request) Successful in 20s
Lint Markdown files / markdown-lint (push) Successful in 5s
Lint Markdown files / markdown-lint (pull_request) Successful in 4s
2025-12-22 20:00:31 +00:00
CSRBot d443cb1a0b Merge pull request 'chore(deps): update ansible/ansible-lint action to v25.12.1' (#18) from renovate/actions into master
Ansible Linter / ansible-lint (push) Successful in 19s
Lint Markdown files / markdown-lint (push) Successful in 4s
2025-12-10 14:02:23 +00:00
CSRBot 2a6292d5db chore(deps): update ansible/ansible-lint action to v25.12.1
Ansible Linter / ansible-lint (pull_request) Successful in 20s
Ansible Linter / ansible-lint (push) Successful in 20s
Lint Markdown files / markdown-lint (pull_request) Successful in 5s
Lint Markdown files / markdown-lint (push) Successful in 5s
2025-12-10 14:00:35 +00:00
CSRBot 94f0cf4bee Merge pull request 'chore(deps): update actions/checkout action to v6' (#17) from renovate/actions-checkout-6.x into master
Ansible Linter / ansible-lint (push) Successful in 1m3s
Lint Markdown files / markdown-lint (push) Successful in 11s
2025-12-02 21:05:22 +00:00
CSRBot c8d44a6d00 chore(deps): update actions/checkout action to v6
Ansible Linter / ansible-lint (push) Successful in 1m3s
Ansible Linter / ansible-lint (pull_request) Successful in 1m5s
Lint Markdown files / markdown-lint (push) Successful in 10s
Lint Markdown files / markdown-lint (pull_request) Successful in 8s
2025-12-02 21:00:44 +00:00
CSRBot 9fd12d9809 Merge pull request 'chore(deps): update ansible/ansible-lint action to v25.12.0' (#16) from renovate/actions into master
Ansible Linter / ansible-lint (push) Successful in 19s
Lint Markdown files / markdown-lint (push) Successful in 4s
2025-12-02 17:01:20 +00:00