1
0
Fork 0
mirror of https://github.com/ansible-collections/community.general.git synced 2026-06-11 18:45:34 +00:00
Commit graph

624 commits

Author SHA1 Message Date
Maksym Hazevych
d3358053a6 Extract fixtures from dnf_config_manager tests 2026-06-10 15:05:42 +03:00
Simon Bouchard
f9d4f0ad6b
Fix incus Windows modules with ansible-core 2.21 (#12163)
* Fix incus Windows modules with ansible-core 2.21

* strip wrapper quotes for payload flags (-enc, -encodedcommand, -command, -c, -file, -f) before incus exec argv handoff, added changelogs

* Fixed some edge cases for powershell parsing

* Fixed changelogs

* Fixed pep8 format

* Added warning message when modifying direct commands

* Fixed changelogs fragement
2026-06-02 21:04:02 +02:00
Alexei Znamensky
6e6199ae3d
parted: ignore MBR partition type codes in flags on SUSE systems (#12121)
* parted: ignore MBR partition type codes reported as flags by SUSE parted

SUSE's patched parted reports MBR partition type codes (e.g., type=8e for
Linux LVM) in the machine-parseable flags output. The module was trying to
unset these pseudo-flags via 'parted set N type=8e off', which is not a
valid parted command, causing the task to fail when using flags: [lvm] on
msdos-labelled disks on SUSE systems.

Fixes #6292

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(changelog): add fragment for PR 12121

* Update changelogs/fragments/12121-parted-suse-msdos-type-code.yml

Co-authored-by: Felix Fontein <felix@fontein.de>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Felix Fontein <felix@fontein.de>
2026-05-31 10:37:26 +12:00
Alexei Znamensky
5d62edc673
pamd: handle non-PAM lines in authselect profile files (#12137)
* fix(pamd): handle non-PAM lines in authselect profile files

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* test(pamd): add test for authselect directive lines

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(changelog): add fragment for PR 12137

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 09:44:49 +12:00
Shreyash
9208cbfd43
xenserver_guest_info: add VDI uuid and vdi_type to disk info (#12119)
* xenserver_guest_info: add VDI uuid and vdi_type to disk info

  Add uuid and vdi_type (VHD/QCOW2) fields to the disk information
  returned by xenserver_guest_info module.

  Fixes #11998

* changelog: add PR URL to changelog fragment

* xenserver_guest_info: add uuid and vdi_type to RETURN example output
2026-05-30 19:43:30 +02:00
Raphaël Droz
8468fea3b0
composer: config file hash to evaluate whether a change occurred (#12084)
* composer: Use config file hash to evaluate whether a change occurred (instead of unreliable output). Ensure `--working-dir` option consistently comes first (sudo-friendly)

* Update plugins/modules/composer.py

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>

* whitespace fixes + changelog fragment

* Update changelogs/fragments/composer-working-dir-and-config-sha256.yaml

Co-authored-by: Felix Fontein <felix@fontein.de>

* Update changelogs/fragments/composer-working-dir-and-config-sha256.yaml

Co-authored-by: Felix Fontein <felix@fontein.de>

* Update plugins/modules/composer.py

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>

* fragment

* ruff format  plugins/modules/composer.py

---------

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
Co-authored-by: Felix Fontein <felix@fontein.de>
2026-05-30 13:47:09 +02:00
felix-grzelka
2d89fb1c15
keycloak_user: fix email_verified is not idempotent (#11749)
* fix: email_verified is not idempotent

* autopep8

* fix import-before-documentation

* address reviewer comments

* rever formatting

* revert more stuff

* fix whitespace

* clean up

* fix diff mode

* nox -Re formatters

* Update plugins/modules/keycloak_user.py

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>

* add deprecation warning

* keycloak_default_behavior

* Apply suggestions from code review

Co-authored-by: Felix Fontein <felix@fontein.de>

* Update plugins/modules/keycloak_user.py

Co-authored-by: Felix Fontein <felix@fontein.de>

* fix is_struct_included

* ignore keycloak_default_behavior and fix is_struct_included

* fix diff for groups

* fix changed flag in check mode

* nox -Re formatters

* fix group diff

* nox -Re formatters

* fix comment logic

* add todos

* fix user_profile_metadata in diff

* refactor diff

* rm default for required_actions

* update required_actions docstring

* fix before_user group handling

* nox -Re formatters

* fix yaml indent in doc strings

* use f-strings

* fix tests

* fix test_add_new_user

* rename keycloak_default_behavior to email_verified_behavior

* fix stupid

* nox -Re formatters

* remove typing from docstring

* remove user_profile_metadata parameter

* Update plugins/module_utils/_keycloak.py

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>

* improve docs

* precompute ignored_arguments list

* nox -Re formatters

* simplify diff logic

* add more tests

* nox -Re formatters

* fix docs

* clean up more

* fix endstate when user does not change

* finalize integrationtest

* fail if group is not found

* fix tests

* nox -Re formatters

* fix docstring

* add integration tests for required_actions

* fix diff logic and fail early

* nox -Re formatters

* fix boolean logic error

* Apply suggestions from code review

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>

* Apply suggestions from code review

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>

---------

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
Co-authored-by: Felix Fontein <felix@fontein.de>
2026-05-30 13:44:08 +02:00
munchtoast
d4031f36e4
kopia: Add kopia_repository module (#11752)
* Add kopia module util

* fix pipeline suggestions

* add kopia repository module

* apply code review changes

* remove kopia_runner instance unit test

* update botmeta with kopia

* refactor docs and redundant state

* add kopia_info module and fix kopia_repository check mode support

- Add kopia_info module for read-only repository information gathering
  (kopia repository status, kopia repository throttle get) following
  the pacemaker_info pattern with ModuleHelper and info_module fragment
- Add _fmt_throttle to _kopia.py and register throttle format in
  kopia_runner; remove throttle_operation get option from
  kopia_repository per Ansible best practices (info ops belong in
  _info modules)
- Add throttle suboption dict to kopia_repository with all seven
  kopia repository throttle set flags
- Fix check_mode: support from full to actually full by implementing
  _predict_value() in kopia_repository; previously check_mode_skip
  caused changed to always be false in check mode
- Add check mode test cases to test_kopia_repository.yaml covering
  created and disconnected states for both connected and disconnected
  initial conditions
- Add BOTMETA.yml entry and full test fixture for kopia_info

* apply code review suggestions
2026-05-30 13:38:30 +02:00
Maxim Bakurevych
580e8ad3f9
slack: support file upload (#12032)
* slack: add support for file uploads and threading

* slack: add support for file uploads and threading

* docs: rename fragment to match PR #12032

* Fix validate-modules issues and update documentation for files support

* Fix tests

* Fix tests

* Fix tests

* Fix tests

* chore: fix nox sanity issues

* style: add author copyright

* style: fix examples

* build: trigger CI due to infrastructure timeout

* Update plugins/modules/slack.py

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>

* doc: address reviewer feedback on changelog and token placeholder

* doc: address reviewer feedback on changelog and token placeholder

* fix: address maintainer feedback

* fix: pipeline status, rm continue

* fix: fix unit tests

* fix: linter fix

* fix: fix comments

* Update plugins/modules/slack.py

Co-authored-by: Felix Fontein <felix@fontein.de>

* Update plugins/modules/slack.py

Co-authored-by: Felix Fontein <felix@fontein.de>

* docs: remove outdated comment about failing logic

* Update plugins/modules/slack.py

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>

* Update plugins/modules/slack.py

Co-authored-by: Felix Fontein <felix@fontein.de>

* fix: handle missing files via fail_on_file_error

* Apply suggestions from code review

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>

* Apply suggestions from code review

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>

* fix: adjust options syntax and formatting

---------

Co-authored-by: Максим Бакуревич <maksimbakurevic@MacBook-Air-Maksim.local>
Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
Co-authored-by: Felix Fontein <felix@fontein.de>
2026-05-30 13:37:04 +02:00
Asif Draxi
fdace38501
nmcli: fix check/diff for bond arp_interval and arp_ip_target (#11588) (#12085)
* nmcli: bond ARP options stop lying in check/diff (#11588)

Align arp_interval/arp_ip_target keys with bond.options parsing, route
ARP settings via +bond.options, and fix bond MTU false positives.

* Changelog: nmcli fragment gets PR links and clearer diff wording

Address reviewer feedback on #12085 — both entries now cite the PR URL
and the MTU entry says "incorrectly reports diff" instead of "false positives".

---------

Co-authored-by: Asif Draxi <asif.draxi@blackline.com>
2026-05-23 13:35:40 +02:00
Felix Fontein
ea02e6a5a9
onepassword* lookups: drop support for op v1 (#12061)
Drop support for op v1.
2026-05-18 05:12:14 +02:00
Alexander Freiherr von Buddenbrock
23bd56990c
Start opentelemetry spans on host start instead of task start (#11434)
* Start opentelemetry spans on host start instead of task start

v2_playbook_on_task_start does not have the host information, so spans
would always start at the same time for every host in that task, even if
they started at different times, like when hosts > forks with strategy
host_pinned. This also hides the duration of the task for that host.

This change uses the newer v2_runner_on_start callback and adds the acutal
host start time to the span. The change is backwards compatible with ansible
versions that do not have v2_runner_on_start and makes no assumptions around
the ordering of v2_runner_on_start and v2_playbook_on_task_start.

* Add changelog fragment

* Remove redundant callback hooks

v2_runner_on_starts gets called by ansible right after the strategy has called on_task_start or on_handler_start. So there is no need to keep this code as the minimum ansible-core version is guaranteed to have this function. on_cleanup (removed around ansible-core 2.0) and on_no_hosts (removed around ansible-core 2.5) never get called.

* Fix unreachable hosts causing exceptions

If finish_task is never called for a host the result object stays None, which caused an exception in update_span_data. This was the case for unreachable hosts, as the callback plugin did not implement v2_runner_on_unreachable.

* Fix import order in test_opentelemetry
2026-05-17 11:28:15 +02:00
Felix Fontein
bb93811ea6
Improve --docker arguments to ansible-test (#12070)
Improve --docker arguments to ansible-test.
2026-05-17 10:47:56 +02:00
Alexei Znamensky
862d7d7aaf
snap: support system as a configuration target (#12025)
* feat(snap): support snap system configuration via name=system

Treat `system` as a virtual snap that is always considered installed,
bypassing snap info lookup and install/refresh logic, while still
allowing snap set/get operations via the options parameter.

Fixes #11266

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs(snap): note version_added for system support; add changelog fragment

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 22:02:28 +12:00
Fulvius
2cb4a5d4e7
gitlab_user: update SSH keys when key material changes (#11996)
* gitlab_user: update SSH keys when key material changes

Compare SSH keys by key type and key material so comment-only differences remain idempotent while changed keys are replaced. Add unit and integration coverage for SSH key updates.

Fixes #6516

* gitlab_user: add SSH key update modes

Restore backward-compatible same-name SSH key handling by default and
add explicit update and deduplicate modes for controlled replacement
behavior.

Refs: #6516

* Apply suggestions from code review

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>

---------

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
2026-05-12 21:19:15 +12:00
Alexei Znamensky
1047f45bec
multiple module utils: flatten directories (#11974)
* multiple module utils: flatten directories

* adjust pritunl tests

* adjust lxca and keycloak tests

* adjust botmeta

* rename test files correctly

* and an import fix

* rename pritunl api mod utils test

* fix typo in test filename

* rename references to pritunl api test

* rename keycloak mod utils test
2026-05-06 07:07:51 +02:00
Mike Aldred
aeb8d3f656
pfexec become plugin: fix broken defaults for illumos/SmartOS (#11623)
* pfexec become plugin: fix broken defaults for illumos/SmartOS

The pfexec become plugin has had incorrect defaults since it was
migrated from Ansible core, making it unusable on illumos without
manual workarounds:

1. become_flags defaulted to '-H -S -n' which are sudo flags.
   pfexec does not accept any of these options, causing:
   'exec: illegal option -- H'

2. wrap_exe defaulted to false. Unlike sudo, pfexec does not
   interpret shell constructs internally. Since Ansible generates
   compound commands (echo BECOME-SUCCESS-xxx ; python3), these
   must be wrapped in /bin/sh -c for pfexec to execute them.

These issues were originally reported in 2016 (ansible/ansible#15642),
migrated to community.general as #3671, and partially fixed by PR #3889
in 2022 (which corrected quoting but not the defaults). Users have had
to work around this with explicit inventory settings ever since.

Changes:
- become_flags default: '-H -S -n' -> '' (empty)
- wrap_exe default: false -> true
- build_become_command: handle empty flags cleanly
- Updated tests to match corrected defaults
- Added test for custom flags
- Improved wrap_exe description to explain why it should be enabled

* Update changelog fragment with PR number

* Fix ruff formatting in test_pfexec.py

* Address review feedback from russoz

Remove redundant 'should generally be left enabled' description line
and simplify become command return by removing unnecessary flags
conditional.

* Fix unit test regexes for empty default flags

Match double space in test assertions when become_flags defaults to
empty string, consistent with doas, dzdo, and pbrun test patterns.

* pfexec become plugin: deprecate wrap_exe default rather than flipping

Changing the wrap_exe default from false to true is a breaking change
for the narrow case (e.g. ansible.builtin.raw) where the current default
does work, so deprecate instead: remove the default, emit a deprecation
warning when the option is unset, and treat that as false for now.

Build the become command with " ".join() so an empty become_flags no
longer produces a stray double space.

Tests set wrap_exe explicitly so the deprecation warning does not fire
during unit runs.

* pfexec become plugin: target 14.0.0 for wrap_exe deprecation

Per felixfontein's review, switch the deprecation target for the wrap_exe
default from community.general 15.0.0 to 14.0.0, and reword the option
description to mark the current default as deprecated rather than just
"changing in a future release".
2026-04-25 21:12:36 +02:00
Alexei Znamensky
53397c081a
Replace % string formatting with f-strings across multiple plugins (#11908)
* Replace % string formatting with f-strings across multiple plugins

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>

* Add changelog fragment for PR 11908

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-04-22 07:06:27 +12:00
Felix Fontein
4fa82b9617
Make all doc fragments, module utils, and plugin utils private (#11896)
* Make all doc fragments private.

* Make all plugin utils private.

* Make all module utils private.

* Reformat.

* Changelog fragment.

* Update configs and ignores.

* Adjust unit test names.
2026-04-20 20:16:26 +02:00
Felix Fontein
72c13c85ad
Prepare main for 13.0.0 (#11834)
* Bump version to 13.0.0.

* Remove deprecated modules and plugins.

* Remove deprecated module utils.

* Remove leftovers.

* Remove mode=compatibility.

* Change default of is_pre740 from true to false.

* Change default of force_defaults from true to false.

* Remove support for ubuntu_legacy mechanism.

* Remove cpanm compatibility tests.
2026-04-20 12:35:43 +02:00
Alexei Znamensky
77509be2aa
Replace .format() calls with f-strings across multiple plugins (#11879)
* Replace .format() calls with f-strings across multiple plugins

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>

* Add changelog fragment for PR 11879

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-04-19 22:37:32 +12:00
munchtoast
6c809dd9db
pacemaker: fix race condition on resource creation (#11750)
* remove pacemaker wait arg and fix race condition

* fix up pacemaker resource and stonith polling

* add changelog for pacemaker timeout bug

* remove env from test case and fix changelog file name

* Update changelogs/fragments/11750-pacemaker-wait-race-condition.yml

Co-authored-by: Felix Fontein <felix@fontein.de>

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
2026-04-18 22:45:58 +02:00
Alexei Znamensky
edf8f24959
parted: add unit_preserve_case option to fix unit case in return value (#11813)
* parted: add unit_preserve_case option to fix unit case in return value

Adds O(unit_preserve_case) feature flag (bool, default None) to control
the case of the ``unit`` field in the module return value.

Previously the unit was always lowercased (e.g. ``kib``), making it
impossible to feed ``disk.unit`` back as the ``unit`` parameter without
a validation error. With O(unit_preserve_case=true) the unit is returned
in its original mixed case (e.g. ``KiB``), matching the accepted input
values.

The default (None) emits a deprecation notice; the default will become
V(true) in community.general 14.0.0.

Fixes #1860

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* parted: add changelog fragment for PR #11813

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* adjustments from review

* Comment 15.0.0 deprecation in option decription.

* parted: fix unit test calls to parse_partition_info after signature change

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* parted: fix unit_preserve_case - parted outputs lowercase units in machine mode

Parted's machine-parseable output always uses lowercase unit suffixes
(e.g. ``kib``, ``mib``) regardless of what was passed to the ``unit``
parameter. Removing the explicit ``.lower()`` call was therefore not
enough to preserve case.

Add a ``canonical_unit()`` helper that maps a unit string to its canonical
mixed-case form using ``parted_units`` as the reference, and use it
instead of a bare identity when ``unit_preserve_case=true``.

Also fix a yamllint violation in the DOCUMENTATION block (missing space
after ``#`` in inline comments).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Update plugins/modules/parted.py

Co-authored-by: Felix Fontein <felix@fontein.de>

* Update plugins/modules/parted.py

Co-authored-by: Felix Fontein <felix@fontein.de>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Felix Fontein <felix@fontein.de>
2026-04-18 22:38:09 +02:00
tigattack
e911081102
logrotate: fix parameter and config file validation and more (#11764)
* fix(logrotate): add missing defaults and parameter validation declarations

- Add default="present" to state parameter
- Add default="/etc/logrotate.d" to config_dir parameter
- Add required_by declarations for shred and compression parameters

* fix(logrotate): fix runtime validation bugs, remove duplicate checks

- Fix shred_cycles TypeError when value is None
- Fix enabled=None handling in get_config_path
- Remove duplicate runtime mutually_exclusive checks
- Add runtime boolean truthiness checks
- Add 'create' parameter format validation
- Remove stale test method

* fix(logrotate): restructure file operations, validate before write

- Write content to tmpdir temp file, validate, then atomic move to destination.
- Wrap all os.remove() calls in try/except with fail_json on error
- Wrap all module.atomic_move() calls in try/except with fail_json on error
- Also add self.mock_module.tmpdir = self.test_dir to test setUp for new code path

* docs(logrotate): update DOCUMENTATION block

- Add 'default: present' to state option
- Add 'default: /etc/logrotate.d' to config_dir option

* feat(logrotate): add optional backup parameter

* chore: add logrotate fixes changelog fragment

* chore(changelog/logrotate): use present tense singular

* fix(logrotate): handle trailing spaces in create param

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>

* refactor(logrotate): remove redundant checks

These are already handled by `required_if` statements in the module spec

* refactor(logrotate): use tempfile to create temporary file

* refactor(logrotate): remove redundant `bool()` casts on `target_enabled`

`target_enabled` is guaranteed to be bool by this point. It's either the module param (typed bool) or falls back to `current_enabled` (also bool). The `bool()` wraps are no-ops.

* refactor(logrotate): remove unused `self.config_file` attribute

* refactor(logrotate): remove dead `any_state` parameter from `read_existing_config`

* fix(logrotate): raise error instead of falling through on enabled-state rename failures

* refactor(logrotate): tighten `get_config_path` sig to bool

`None` callers are removed now so this is safe

* test(logrotate): remove stale open mock assertion after tempfile refactor

* style(logrotate): format file

* chore(logrotate): add missing `version_added` attribute

Co-authored-by: Felix Fontein <felix@fontein.de>

* fix(logrotate): clean up temp file

Co-authored-by: Felix Fontein <felix@fontein.de>

* fix(logrotate): remove redundant temp file cleanup

Co-authored-by: Felix Fontein <felix@fontein.de>

* refactor(logrotate): Use dict subscript to access required backup param

Co-authored-by: Felix Fontein <felix@fontein.de>

* fix(logrotate): fix: only remove old config file when path differs from target

Co-authored-by: Felix Fontein <felix@fontein.de>

* fix(logrotate): update logrotate_bin type hint to str

* feat(logrotate): add backup file handling when removing old config

* style(logrotate): format file

* test(logrotate): add missing backup default to `_setup_module_params`

* test(logrotate): fix incorrect `os.remove` assertion in update test

* refactor(logrotate): remove unnecessary `to_native()` call

Co-authored-by: Felix Fontein <felix@fontein.de>

* refactor(logrotate): replace str quotes with !r

Co-authored-by: Felix Fontein <felix@fontein.de>

* fix(logrotate): change backup default back to true

* fix(logrotate): raise error when `shred_cycle`s is set with `shred=false`

* docs(logrotate): clarify `shred_cycles` behaviour

* fix(logrotate): remove to_native calls for exception messages

* docs(logrotate): improve `config_dir` param description

* refactor(logrotate): simplify backup file assignment logic

* style(logrotate): format file

* docs(logrotate): improve config_map description

---------

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
Co-authored-by: Felix Fontein <felix@fontein.de>
2026-04-17 08:44:29 +02:00
Felix Fontein
7884a3f2a2
CI: Temporarily skip failing callback unit tests for ansible-core 2.21+ (#11842)
Temporarily skip failing unit tests.
2026-04-16 21:34:28 +02:00
Martin Schürrer
df252e5fab
incus, machinectl, run0 - fix become over pty connections (#11771)
* incus, machinectl, run0 - fix become over pty connections

Four small fixes across three plugins, all discovered while trying to
use community.general.machinectl (and later community.general.run0)
as become methods over the community.general.incus connection.

Core bug: machinectl and run0 both set require_tty = True, but the
incus connection plugin was ignoring that hint and invoking
'incus exec' without -t. Honor require_tty by passing -t, mirroring
what the OpenSSH plugin does with -tt.

Once the pty is in place, both become plugins emit terminal control
sequences (window-title OSC, ANSI reset) around the child command
that land in captured stdout alongside the module JSON and trip the
result parser with "Module invocation had junk after the JSON data".
Suppress that decoration at the source by prefixing the constructed
shell command with SYSTEMD_COLORS=0. TERM=dumb would work too but
has a wider blast radius (it also affects interactive tools inside
the become-user session); SYSTEMD_COLORS is the documented
systemd-scoped knob.

run0 was also missing pipelining = False. When run0 is used over a
connection that honors require_tty, ansible's pipelining sends the
module source on stdin to remote python3, which cannot be forwarded
cleanly through the pty chain and hangs indefinitely. Disable
pipelining the same way community.general.machinectl already does.

Also add tests/unit/plugins/become/test_machinectl.py mirroring the
existing test_run0.py. machinectl had no unit test coverage before,
which is why CI did not catch the SYSTEMD_COLORS=0 prefix change
when the equivalent run0 change broke test_run0_basic/test_run0_flags.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Update changelogs/fragments/11771-incus-machinectl-run0-become-pty.yml

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
2026-04-15 17:47:09 +02:00
Alexei Znamensky
b40608a39d
Ensure standard locale in run_command (group5-batch1) (#11768)
* ensure standard locale in run_command (group5-batch1)

Adds ``LANGUAGE=C`` and ``LC_ALL=C`` to ``run_command()`` calls in modules
that parse command output, to prevent locale-dependent parsing failures on
non-C-locale systems.

Modules updated: apache2_module, composer, facter_facts, known_hosts module
utils, lvg_rename, macports, modprobe, monit, open_iscsi, pacman_key,
rhsm_release, rpm_ostree_pkg, sysupgrade.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* add changelog fragment for group5-batch1

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Remove lvg_rename from locale fix — superseded by PR #11746

PR #11746 (feat: use CmdRunner for LVM commands) takes priority and
will handle lvg_rename.py via CmdRunner refactor. Removing our
run_command_environ_update change to avoid conflict.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 07:50:25 +12:00
Alexei Znamensky
6f12d93057
gem: use CmdRunner (#11733)
* gem: use `CmdRunner`

* add changelog frag

* gem: restore get_rubygems_path() helper to preserve executable splitting

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 13:12:26 +02:00
Alexei Znamensky
bdd3174563
nmcli: use get_best_parsable_locale() to support UTF-8 connection names (#11742)
* nmcli: start locale fix - normalize run_command environ to LANGUAGE=C, LC_ALL=C

Work in progress - issue #10384 (UTF-8 conn_name support) requires deeper
investigation beyond simple locale variable normalization.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* nmcli: use get_best_parsable_locale() to support UTF-8 connection names

Fixes issue where UTF-8 connection names (e.g. Chinese characters) were
corrupted to '????' when LC_ALL=C forced ASCII encoding, causing
connection_exists() to always return False for non-ASCII names.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* add changelog fragment for PR #11742

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-08 15:32:39 +02:00
Alexei Znamensky
e59888dd7e
Ensure standard locale in run_command (group3-batch3) (#11741)
* run_command locale group3 batch3: normalise to LANGUAGE=C, LC_ALL=C

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix changelog fragment: bugfixes, American English, separate code spans

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix changelog fragment: correct PR number (11741)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-08 15:21:58 +02:00
Alexei Znamensky
a4bba99203
composer - make create-project idempotent, add force parameter (#11689)
* composer - make create-project idempotent, add force parameter

Adds a check for an existing composer.json in working_dir before running
create-project, so the task is skipped rather than failing on second run.
A new force parameter allows bypassing this check when needed.

Fixes #725.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* changelog fragment: rename to PR number, add PR URL

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-28 08:17:23 +13:00
Alexei Znamensky
ef700b116a
nsupdate: add unit tests (#11677)
* nsupdate: add unit tests

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix var name to regain sanity

* remove unneeded typing from test file

* formatting

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 21:37:16 +01:00
Alexei Znamensky
e2c06f2d12
pacman: add root, cachedir, and config options (#11681)
* pacman: add root, cachedir, and config options

Add three dedicated options -- O(root), O(cachedir), and O(config) --
so that all pacman commands get the corresponding global flags
(--root, --cachedir, --config) prepended, enabling use cases such as
installing packages into a chroot or alternative root directory
(similar to pacstrap).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* add changelog frag

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 11:53:11 +13:00
Alexei Znamensky
d06c83eb68
etcd3: re-enable and fix tests, add unit tests (#11678)
* etcd3: re-enable and fix tests, add unit tests

- Add unit tests for community.general.etcd3 module (12 tests covering
  state=present/absent, idempotency, check mode, and error paths)
- Fix integration test setup: update etcd binary to v3.6.9 (from v3.2.14),
  download from GitHub releases, add health-check retry loop after start
- Work around etcd3 Python library incompatibility with protobuf >= 4.x
  by setting PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python
- Update to FQCNs throughout integration tests
- Re-enable both etcd3 and lookup_etcd3 integration targets

Fixes https://github.com/ansible-collections/community.general/issues/322

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* improve use of multiple context managers

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 15:55:16 +13:00
Ted W.
3c21ac961b
nmcli: fix setting_types() to properly handle routing_rules as a list type (#11635)
* Fix setting_types() to properly handle routing_rules as a list type

* Add changelog fragment for ipv6.routing-rules bugfix

* Update changelogs/fragments/11630-nmcli-ipv6-routing-rules.yml

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>

* Add PR URL to changelog fragment

---------

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
2026-03-23 19:58:47 +01:00
Alexei Znamensky
25a4f568f9
puppet: deprecate param timeout (#11658)
* puppet: deprecate param timeout

* add changelog frag

* Update changelogs/fragments/11658-puppet-timeout-deprecation.yml

Co-authored-by: Felix Fontein <felix@fontein.de>

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
2026-03-23 19:57:01 +01:00
Alexei Znamensky
d48e767e1e
open_iscsi: support IPv6 portals (#11657)
* fix(modules/open_iscsi): support IPv6 portals

* add changelog frag
2026-03-23 06:47:40 +01:00
Alexei Znamensky
a09e879ff2
xfconf: fix boolean return values (#11645)
* xfconf: fix boolean return values

* add changelog frag
2026-03-23 08:18:03 +13:00
Alexei Znamensky
758a445d97
npm: use uthelper for tests (#11639) 2026-03-22 18:32:59 +13:00
Alexei Znamensky
3aa4a29842
test(cmd_runner_fmt): assert that unpack_* functions can handle _ArgFormat objects (#11637)
test(cmd_runner_fmt): assert that unpack functions can handle _ArgFormat objects
2026-03-22 15:19:09 +13:00
Alexei Znamensky
1dfc4fed40
test: uthelper now generates one test function per test case (#11636) 2026-03-22 14:42:10 +13:00
Christoph Fiehe
dae2157bb7
merge_variables: extended merge capabilities added (#11536)
* merge_variables: extended merge capabilities added

This extension gives you more control over the variable merging process of the lookup plugin `merge_variables`. It closes the gap between Puppet's Hiera merging capabilities and the limitations of Ansible's default variable plugin `host_group_vars` regarding fragment-based value definition. You can now decide which merge strategy should be applied to dicts, lists, and other types. Furthermore, you can specify a merge strategy that should be applied in case of type conflicts.

The default behavior of the plugin has been preserved so that it is fully backward-compatible with the already implemented state.

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* Update changelogs/fragments/11536-merge-variables-extended-merging-capabilities.yml

Co-authored-by: Felix Fontein <felix@fontein.de>

* Update plugins/lookup/merge_variables.py

Co-authored-by: Felix Fontein <felix@fontein.de>

* Periods added at the end of each choice description

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* Update plugins/lookup/merge_variables.py

Co-authored-by: Mark <40321020+m-a-r-k-e@users.noreply.github.com>

* ref: follow project standard for choice descriptions

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* ref: more examples added and refactoring

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* Update plugins/lookup/merge_variables.py

Co-authored-by: Felix Fontein <felix@fontein.de>

* ref: some more comments to examples added

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* fix: unused import removed

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* ref: re-add "merge" to strategy map

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* Update comments

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* Specification of transformations solely as string

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* Comments updated

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* ref: `append_rp` and `prepend_rp` removed
feat: options dict for list transformations re-added
feat: allow setting `keep` for dedup transformation with possible values: `first` (default) and `last`

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* ref: improve options documentation

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* ref: documentation improved, avoiding words like newer or older in merge description

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* Update plugins/lookup/merge_variables.py

Co-authored-by: Felix Fontein <felix@fontein.de>

* ref: "prio" replaced by "dict"

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

* feat: two integration tests added

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>

---------

Signed-off-by: Fiehe Christoph  <c.fiehe@eurodata.de>
Co-authored-by: Fiehe Christoph <c.fiehe@eurodata.de>
Co-authored-by: Felix Fontein <felix@fontein.de>
Co-authored-by: Mark <40321020+m-a-r-k-e@users.noreply.github.com>
2026-03-19 22:45:44 +01:00
Thomas Sjögren
df9b30448a
github_secrets_info: new module (#11586)
* github_secrets_info: new module

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* clean tests

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* remove pynacl dep

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* fqcn

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* remove excess output

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* just return result as sample

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* only print secrets, adapt tests

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* Update plugins/modules/github_secrets_info.py

Co-authored-by: Felix Fontein <felix@fontein.de>

* Update plugins/modules/github_secrets_info.py

Co-authored-by: Felix Fontein <felix@fontein.de>

* Update plugins/modules/github_secrets_info.py

Co-authored-by: Felix Fontein <felix@fontein.de>

* t is for typing, and typing is what we did

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* add info_module attributes

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

---------

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>
Co-authored-by: Felix Fontein <felix@fontein.de>
2026-03-16 20:14:08 +01:00
Alexei Znamensky
cc24e57307
monit: deprecate support for monit <= 5.18 (#11254)
* monit: deprecate support for monit <= 5.18

* add additional runs for checking version

* add changelog frag

* bump deprecation for 14.0.0
2026-03-16 20:04:05 +01:00
Thomas Sjögren
46ffec6f0e
github_secrets: new module (#11514)
* add support for managing GitHub secrets

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* fix tab

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* update for sanity

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* more sanity fixes

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* update botmeta

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* formating

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* remove list function

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* remove docstring, format text strings and return codes

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* switch to deps

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* black and ruff doesnt get along

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* initial unit tests

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* update non-existing secret test

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* update description and details

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* handle when a secret cant be deleted

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* fail if not acceptable error codes

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* add test for non-acceptable status codes

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* remove local ruff config

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* allow empty strings

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* set required_

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* extend tests

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* cleanup

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* cover all, got a git urlopen error

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* cover all, got a git urlopen error

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* ensure value cant be None

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* check_mode

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* bump to 12.5.0

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* Update plugins/modules/github_secrets.py

Co-authored-by: Felix Fontein <felix@fontein.de>

* extend check_mode and related tests

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* split constants and return dict when checking secret

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* switch to HTTPStatus

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* replace DELETE and UPDATE with NO_CONTENT

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* Update plugins/modules/github_secrets.py

Co-authored-by: Felix Fontein <felix@fontein.de>

* Update plugins/modules/github_secrets.py

Co-authored-by: Felix Fontein <felix@fontein.de>

* update tests

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>

* Update plugins/modules/github_secrets.py

Co-authored-by: Felix Fontein <felix@fontein.de>

* Update plugins/modules/github_secrets.py

Co-authored-by: Felix Fontein <felix@fontein.de>

* Update plugins/modules/github_secrets.py

Co-authored-by: Felix Fontein <felix@fontein.de>

* Update plugins/modules/github_secrets.py

Co-authored-by: Felix Fontein <felix@fontein.de>

* Update plugins/modules/github_secrets.py

Co-authored-by: Felix Fontein <felix@fontein.de>

---------

Signed-off-by: Thomas Sjögren <konstruktoid@users.noreply.github.com>
Co-authored-by: Felix Fontein <felix@fontein.de>
2026-03-15 16:29:33 +01:00
Alexei Znamensky
2d685e7a85
test(monit): use uthelper (#11592) 2026-03-14 22:14:41 +01:00
Alexei Znamensky
ce5d5622b9
replace list(map(...)) with comprehension (#11590)
* replace `list(map(...))` with comprehension

* add changelog frag
2026-03-14 08:43:23 +01:00
Aleksandr Gabidullin
f0e3edc892
New module: logrotate (#11424)
* add module logrotate

* add values for start

* fix docs

* version 12.5.0 and fix test

---------

Co-authored-by: Александр Габидуллин <agabidullin@astralinux.ru>
2026-03-13 07:44:21 +01:00
Felix Fontein
9b72d95452
Add missing __future__ imports (#11567)
Add missing __future__ imports.
2026-03-11 06:42:08 +01:00
Roland Sommer
71f8c15d2e
Allow setting of independent custom domain for incus inventory (#11555)
Allowing the domain suffix to be appended independent of the `host_fqdn`
setting enables the inventory plugin to construct proper FQDNs if a
network has the `dns.domain` property set. Otherwise you would always
end up with something like `host01.project.local.example.net` despite
`host01.example.net` being the expected result.
2026-03-07 14:15:07 +01:00