diff --git a/.azure-pipelines/azure-pipelines.yml b/.azure-pipelines/azure-pipelines.yml index 610bce0533..df768879d1 100644 --- a/.azure-pipelines/azure-pipelines.yml +++ b/.azure-pipelines/azure-pipelines.yml @@ -70,7 +70,6 @@ stages: - test: 2 - test: 3 - test: 4 - - test: extra - stage: Sanity_2_18 displayName: Sanity 2.18 dependsOn: [] @@ -230,8 +229,6 @@ stages: test: freebsd/13.3 - name: RHEL 9.3 test: rhel/9.3 - - name: FreeBSD 14.0 - test: freebsd/14.0 groups: - 1 - 2 diff --git a/.github/BOTMETA.yml b/.github/BOTMETA.yml index c92ce76034..501c1370d4 100644 --- a/.github/BOTMETA.yml +++ b/.github/BOTMETA.yml @@ -119,6 +119,8 @@ files: $connections/saltstack.py: labels: saltstack maintainers: mscherer + $connections/wsl.py: + maintainers: rgl $connections/zone.py: maintainers: $team_ansible_core $doc_fragments/: diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 2f4ff900d8..f71b322d2a 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -9,3 +9,7 @@ updates: directory: "/" schedule: interval: "weekly" + groups: + ci: + patterns: + - "*" diff --git a/.github/workflows/ansible-test.yml b/.github/workflows/ansible-test.yml index c5b26dba9a..c8d2cb6184 100644 --- a/.github/workflows/ansible-test.yml +++ b/.github/workflows/ansible-test.yml @@ -30,11 +30,6 @@ jobs: matrix: ansible: - '2.15' - # Ansible-test on various stable branches does not yet work well with cgroups v2. - # Since ubuntu-latest now uses Ubuntu 22.04, we need to fall back to the ubuntu-20.04 - # image for these stable branches. The list of branches where this is necessary will - # shrink over time, check out https://github.com/ansible-collections/news-for-maintainers/issues/28 - # for the latest list. runs-on: ubuntu-latest steps: - name: Perform sanity testing @@ -49,11 +44,6 @@ jobs: git clone --depth=1 --single-branch https://github.com/ansible-collections/community.internal_test_tools.git ../../community/internal_test_tools units: - # Ansible-test on various stable branches does not yet work well with cgroups v2. - # Since ubuntu-latest now uses Ubuntu 22.04, we need to fall back to the ubuntu-20.04 - # image for these stable branches. The list of branches where this is necessary will - # shrink over time, check out https://github.com/ansible-collections/news-for-maintainers/issues/28 - # for the latest list. runs-on: ubuntu-latest name: EOL Units (Ⓐ${{ matrix.ansible }}+py${{ matrix.python }}) strategy: @@ -92,11 +82,6 @@ jobs: testing-type: units integration: - # Ansible-test on various stable branches does not yet work well with cgroups v2. - # Since ubuntu-latest now uses Ubuntu 22.04, we need to fall back to the ubuntu-20.04 - # image for these stable branches. The list of branches where this is necessary will - # shrink over time, check out https://github.com/ansible-collections/news-for-maintainers/issues/28 - # for the latest list. runs-on: ubuntu-latest name: EOL I (Ⓐ${{ matrix.ansible }}+${{ matrix.docker }}+py${{ matrix.python }}:${{ matrix.target }}) strategy: diff --git a/.github/workflows/import-galaxy.yml b/.github/workflows/import-galaxy.yml deleted file mode 100644 index 0c0ee402a8..0000000000 --- a/.github/workflows/import-galaxy.yml +++ /dev/null @@ -1,20 +0,0 @@ ---- -# Copyright (c) Ansible Project -# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) -# SPDX-License-Identifier: GPL-3.0-or-later - -name: import-galaxy -'on': - # Run CI against all pushes (direct commits, also merged PRs) to main, and all Pull Requests - push: - branches: - - main - - stable-* - pull_request: - -jobs: - import-galaxy: - permissions: - contents: read - name: Test to import built collection artifact with Galaxy importer - uses: ansible-community/github-action-test-galaxy-import/.github/workflows/test-galaxy-import.yml@main diff --git a/.github/workflows/nox.yml b/.github/workflows/nox.yml new file mode 100644 index 0000000000..bed8dff985 --- /dev/null +++ b/.github/workflows/nox.yml @@ -0,0 +1,28 @@ +--- +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +name: nox +'on': + push: + branches: + - main + - stable-* + pull_request: + # Run CI once per day (at 08:00 UTC) + schedule: + - cron: '0 8 * * *' + workflow_dispatch: + +jobs: + nox: + runs-on: ubuntu-latest + name: "Run extra sanity tests" + steps: + - name: Check out collection + uses: actions/checkout@v4 + with: + persist-credentials: false + - name: Run nox + uses: ansible-community/antsibull-nox@main diff --git a/.github/workflows/reuse.yml b/.github/workflows/reuse.yml deleted file mode 100644 index 3c5e986e57..0000000000 --- a/.github/workflows/reuse.yml +++ /dev/null @@ -1,35 +0,0 @@ ---- -# Copyright (c) Ansible Project -# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) -# SPDX-License-Identifier: GPL-3.0-or-later - -name: Verify REUSE - -on: - push: - branches: - - main - - stable-* - pull_request: - types: [opened, synchronize, reopened] - branches: - - main - - stable-* - # Run CI once per day (at 07:30 UTC) - schedule: - - cron: '30 7 * * *' - -jobs: - check: - permissions: - contents: read - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - ref: ${{ github.event.pull_request.head.sha || '' }} - - - name: REUSE Compliance Check - uses: fsfe/reuse-action@v5 diff --git a/.reuse/dep5 b/.reuse/dep5 deleted file mode 100644 index 0c3745ebf8..0000000000 --- a/.reuse/dep5 +++ /dev/null @@ -1,5 +0,0 @@ -Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ - -Files: changelogs/fragments/* -Copyright: Ansible Project -License: GPL-3.0-or-later diff --git a/CHANGELOG.md b/CHANGELOG.md index 3608353706..b35c52441b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,993 +1,5 @@ -# Community General Release Notes +# Placeholder changelog -**Topics** - -- v10\.5\.0 - - Release Summary - - Minor Changes - - Bugfixes - - New Modules -- v10\.4\.0 - - Release Summary - - Minor Changes - - Deprecated Features - - Bugfixes - - New Modules -- v10\.3\.1 - - Release Summary - - Minor Changes - - Bugfixes -- v10\.3\.0 - - Release Summary - - Minor Changes - - Deprecated Features - - Security Fixes - - Bugfixes - - New Plugins - - Connection - - Filter - - Lookup - - New Modules -- v10\.2\.0 - - Release Summary - - Minor Changes - - Deprecated Features - - Security Fixes - - Bugfixes - - New Plugins - - Inventory - - New Modules -- v10\.1\.0 - - Release Summary - - Minor Changes - - Deprecated Features - - Bugfixes - - New Plugins - - Filter - - New Modules -- v10\.0\.1 - - Release Summary - - Bugfixes -- v10\.0\.0 - - Release Summary - - Minor Changes - - Breaking Changes / Porting Guide - - Deprecated Features - - Removed Features \(previously deprecated\) - - Bugfixes - - Known Issues - - New Plugins - - Filter - - Test - - New Modules -This changelog describes changes after version 9\.0\.0\. - - -## v10\.5\.0 - - -### Release Summary - -Regular bugfix and feature release\. - - -### Minor Changes - -* CmdRunner module utils \- the convenience method cmd\_runner\_fmt\.as\_fixed\(\) now accepts multiple arguments as a list \([https\://github\.com/ansible\-collections/community\.general/pull/9893](https\://github\.com/ansible\-collections/community\.general/pull/9893)\)\. -* apache2\_mod\_proxy \- code simplification\, no change in functionality \([https\://github\.com/ansible\-collections/community\.general/pull/9457](https\://github\.com/ansible\-collections/community\.general/pull/9457)\)\. -* consul\_token \- fix idempotency when policies or roles are supplied by name \([https\://github\.com/ansible\-collections/community\.general/issues/9841](https\://github\.com/ansible\-collections/community\.general/issues/9841)\, [https\://github\.com/ansible\-collections/community\.general/pull/9845](https\://github\.com/ansible\-collections/community\.general/pull/9845)\)\. -* keycloak\_realm \- remove ID requirement when creating a realm to allow Keycloak generating its own realm ID \([https\://github\.com/ansible\-collections/community\.general/pull/9768](https\://github\.com/ansible\-collections/community\.general/pull/9768)\)\. -* nmap inventory plugin \- adds dns\_servers option for specifying DNS servers for name resolution\. Accepts hostnames or IP addresses in the same format as the exclude option \([https\://github\.com/ansible\-collections/community\.general/pull/9849](https\://github\.com/ansible\-collections/community\.general/pull/9849)\)\. -* proxmox\_kvm \- add missing audio hardware device handling \([https\://github\.com/ansible\-collections/community\.general/issues/5192](https\://github\.com/ansible\-collections/community\.general/issues/5192)\, [https\://github\.com/ansible\-collections/community\.general/pull/9847](https\://github\.com/ansible\-collections/community\.general/pull/9847)\)\. -* redfish\_config \- add command SetPowerRestorePolicy to set the desired power state of the system when power is restored \([https\://github\.com/ansible\-collections/community\.general/pull/9837](https\://github\.com/ansible\-collections/community\.general/pull/9837)\)\. -* redfish\_info \- add command GetPowerRestorePolicy to get the desired power state of the system when power is restored \([https\://github\.com/ansible\-collections/community\.general/pull/9824](https\://github\.com/ansible\-collections/community\.general/pull/9824)\)\. -* rocketchat \- option is\_pre740 has been added to control the format of the payload\. For Rocket\.Chat 7\.4\.0 or newer\, it must be set to false \([https\://github\.com/ansible\-collections/community\.general/pull/9882](https\://github\.com/ansible\-collections/community\.general/pull/9882)\)\. -* slack callback plugin \- add http\_agent option to enable the user to set a custom user agent for slack callback plugin \([https\://github\.com/ansible\-collections/community\.general/issues/9813](https\://github\.com/ansible\-collections/community\.general/issues/9813)\, [https\://github\.com/ansible\-collections/community\.general/pull/9836](https\://github\.com/ansible\-collections/community\.general/pull/9836)\)\. -* systemd\_info \- add wildcard expression support in unitname option \([https\://github\.com/ansible\-collections/community\.general/pull/9821](https\://github\.com/ansible\-collections/community\.general/pull/9821)\)\. -* systemd\_info \- extend support to timer units \([https\://github\.com/ansible\-collections/community\.general/pull/9891](https\://github\.com/ansible\-collections/community\.general/pull/9891)\)\. -* vmadm \- add new options flexible\_disk\_size and owner\_uuid \([https\://github\.com/ansible\-collections/community\.general/pull/9892](https\://github\.com/ansible\-collections/community\.general/pull/9892)\)\. - - -### Bugfixes - -* cloudlare\_dns \- handle exhausted response stream in case of HTTP errors to show nice error message to the user \([https\://github\.com/ansible\-collections/community\.general/issues/9782](https\://github\.com/ansible\-collections/community\.general/issues/9782)\, [https\://github\.com/ansible\-collections/community\.general/pull/9818](https\://github\.com/ansible\-collections/community\.general/pull/9818)\)\. -* dnf\_versionlock \- add support for dnf5 \([https\://github\.com/ansible\-collections/community\.general/issues/9556](https\://github\.com/ansible\-collections/community\.general/issues/9556)\)\. -* homebrew \- fix crash when package names include tap \([https\://github\.com/ansible\-collections/community\.general/issues/9777](https\://github\.com/ansible\-collections/community\.general/issues/9777)\, [https\://github\.com/ansible\-collections/community\.general/pull/9803](https\://github\.com/ansible\-collections/community\.general/pull/9803)\)\. -* homebrew\_cask \- handle unusual brew version strings \([https\://github\.com/ansible\-collections/community\.general/issues/8432](https\://github\.com/ansible\-collections/community\.general/issues/8432)\, [https\://github\.com/ansible\-collections/community\.general/pull/9881](https\://github\.com/ansible\-collections/community\.general/pull/9881)\)\. -* nmcli \- enable changing only the order of DNS servers or search suffixes \([https\://github\.com/ansible\-collections/community\.general/issues/8724](https\://github\.com/ansible\-collections/community\.general/issues/8724)\, [https\://github\.com/ansible\-collections/community\.general/pull/9880](https\://github\.com/ansible\-collections/community\.general/pull/9880)\)\. -* proxmox \- add missing key selection of \'status\' key to get\_lxc\_status \([https\://github\.com/ansible\-collections/community\.general/issues/9696](https\://github\.com/ansible\-collections/community\.general/issues/9696)\, [https\://github\.com/ansible\-collections/community\.general/pull/9809](https\://github\.com/ansible\-collections/community\.general/pull/9809)\)\. -* proxmox\_vm\_info \- the module no longer expects that the key template exists in a dictionary returned by Proxmox \([https\://github\.com/ansible\-collections/community\.general/issues/9875](https\://github\.com/ansible\-collections/community\.general/issues/9875)\, [https\://github\.com/ansible\-collections/community\.general/pull/9910](https\://github\.com/ansible\-collections/community\.general/pull/9910)\)\. -* sudoers \- display stdout and stderr raised while failed validation \([https\://github\.com/ansible\-collections/community\.general/issues/9674](https\://github\.com/ansible\-collections/community\.general/issues/9674)\, [https\://github\.com/ansible\-collections/community\.general/pull/9871](https\://github\.com/ansible\-collections/community\.general/pull/9871)\)\. - - -### New Modules - -* community\.general\.pacemaker\_resource \- Manage pacemaker resources\. - - -## v10\.4\.0 - - -### Release Summary - -Regular bugfix and feature release\. - - -### Minor Changes - -* bitwarden lookup plugin \- add new option collection\_name to filter results by collection name\, and new option result\_count to validate number of results \([https\://github\.com/ansible\-collections/community\.general/pull/9728](https\://github\.com/ansible\-collections/community\.general/pull/9728)\)\. -* incus connection plugin \- adds remote\_user and incus\_become\_method parameters for allowing a non\-root user to connect to an Incus instance \([https\://github\.com/ansible\-collections/community\.general/pull/9743](https\://github\.com/ansible\-collections/community\.general/pull/9743)\)\. -* iocage inventory plugin \- the new parameter hooks\_results of the plugin is a list of files inside a jail that provide configuration parameters for the inventory\. The inventory plugin reads the files from the jails and put the contents into the items of created variable iocage\_hooks \([https\://github\.com/ansible\-collections/community\.general/issues/9650](https\://github\.com/ansible\-collections/community\.general/issues/9650)\, [https\://github\.com/ansible\-collections/community\.general/pull/9651](https\://github\.com/ansible\-collections/community\.general/pull/9651)\)\. -* jira \- adds client\_cert and client\_key parameters for supporting client certificate authentification when connecting to Jira \([https\://github\.com/ansible\-collections/community\.general/pull/9753](https\://github\.com/ansible\-collections/community\.general/pull/9753)\)\. -* lldp \- adds multivalues parameter to control behavior when lldpctl outputs an attribute multiple times \([https\://github\.com/ansible\-collections/community\.general/pull/9657](https\://github\.com/ansible\-collections/community\.general/pull/9657)\)\. -* lvg \- add remove\_extra\_pvs parameter to control if ansible should remove physical volumes which are not in the pvs parameter \([https\://github\.com/ansible\-collections/community\.general/pull/9698](https\://github\.com/ansible\-collections/community\.general/pull/9698)\)\. -* lxd connection plugin \- adds remote\_user and lxd\_become\_method parameters for allowing a non\-root user to connect to an LXD instance \([https\://github\.com/ansible\-collections/community\.general/pull/9659](https\://github\.com/ansible\-collections/community\.general/pull/9659)\)\. -* nmcli \- adds VRF support with new type value vrf and new slave\_type value vrf as well as new table parameter \([https\://github\.com/ansible\-collections/community\.general/pull/9658](https\://github\.com/ansible\-collections/community\.general/pull/9658)\, [https\://github\.com/ansible\-collections/community\.general/issues/8014](https\://github\.com/ansible\-collections/community\.general/issues/8014)\)\. -* proxmox\_kvm \- allow hibernation and suspending of VMs \([https\://github\.com/ansible\-collections/community\.general/issues/9620](https\://github\.com/ansible\-collections/community\.general/issues/9620)\, [https\://github\.com/ansible\-collections/community\.general/pull/9653](https\://github\.com/ansible\-collections/community\.general/pull/9653)\)\. -* redfish\_command \- add PowerFullPowerCycle to power command options \([https\://github\.com/ansible\-collections/community\.general/pull/9729](https\://github\.com/ansible\-collections/community\.general/pull/9729)\)\. -* ssh\_config \- add other\_options option \([https\://github\.com/ansible\-collections/community\.general/issues/8053](https\://github\.com/ansible\-collections/community\.general/issues/8053)\, [https\://github\.com/ansible\-collections/community\.general/pull/9684](https\://github\.com/ansible\-collections/community\.general/pull/9684)\)\. -* xen\_orchestra inventory plugin \- add use\_vm\_uuid and use\_host\_uuid boolean options to allow switching over to using VM/Xen name labels instead of UUIDs as item names \([https\://github\.com/ansible\-collections/community\.general/pull/9787](https\://github\.com/ansible\-collections/community\.general/pull/9787)\)\. - - -### Deprecated Features - -* profitbricks \- module is deprecated and will be removed in community\.general 11\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/9733](https\://github\.com/ansible\-collections/community\.general/pull/9733)\)\. -* profitbricks\_datacenter \- module is deprecated and will be removed in community\.general 11\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/9733](https\://github\.com/ansible\-collections/community\.general/pull/9733)\)\. -* profitbricks\_nic \- module is deprecated and will be removed in community\.general 11\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/9733](https\://github\.com/ansible\-collections/community\.general/pull/9733)\)\. -* profitbricks\_volume \- module is deprecated and will be removed in community\.general 11\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/9733](https\://github\.com/ansible\-collections/community\.general/pull/9733)\)\. -* profitbricks\_volume\_attachments \- module is deprecated and will be removed in community\.general 11\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/9733](https\://github\.com/ansible\-collections/community\.general/pull/9733)\)\. - - -### Bugfixes - -* apache2\_mod\_proxy \- make compatible with Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9762](https\://github\.com/ansible\-collections/community\.general/pull/9762)\)\. -* apache2\_mod\_proxy \- passing the cluster\'s page as referer for the member\'s pages\. This makes the module actually work again for halfway modern Apache versions\. According to some comments founds on the net the referer was required since at least 2019 for some versions of Apache 2 \([https\://github\.com/ansible\-collections/community\.general/pull/9762](https\://github\.com/ansible\-collections/community\.general/pull/9762)\)\. -* elasticsearch\_plugin \- fix ERROR\: D is not a recognized option issue when configuring proxy settings \([https\://github\.com/ansible\-collections/community\.general/pull/9774](https\://github\.com/ansible\-collections/community\.general/pull/9774)\, [https\://github\.com/ansible\-collections/community\.general/issues/9773](https\://github\.com/ansible\-collections/community\.general/issues/9773)\)\. -* ipa\_host \- module revoked existing host certificates even if user\_certificate was not given \([https\://github\.com/ansible\-collections/community\.general/pull/9694](https\://github\.com/ansible\-collections/community\.general/pull/9694)\)\. -* keycloak\_client \- in check mode\, detect whether the lists in before client \(for example redirect URI list\) contain items that the lists in the desired client do not contain \([https\://github\.com/ansible\-collections/community\.general/pull/9739](https\://github\.com/ansible\-collections/community\.general/pull/9739)\)\. -* lldp \- fix crash caused by certain lldpctl output where an attribute is defined as branch and leaf \([https\://github\.com/ansible\-collections/community\.general/pull/9657](https\://github\.com/ansible\-collections/community\.general/pull/9657)\)\. -* onepassword\_doc lookup plugin \- ensure that 1Password Connect support also works for this plugin \([https\://github\.com/ansible\-collections/community\.general/pull/9625](https\://github\.com/ansible\-collections/community\.general/pull/9625)\)\. -* passwordstore lookup plugin \- fix subkey creation even when create\=false \([https\://github\.com/ansible\-collections/community\.general/issues/9105](https\://github\.com/ansible\-collections/community\.general/issues/9105)\, [https\://github\.com/ansible\-collections/community\.general/pull/9106](https\://github\.com/ansible\-collections/community\.general/pull/9106)\)\. -* proxmox inventory plugin \- plugin did not update cache correctly after meta\: refresh\_inventory \([https\://github\.com/ansible\-collections/community\.general/issues/9710](https\://github\.com/ansible\-collections/community\.general/issues/9710)\, [https\://github\.com/ansible\-collections/community\.general/pull/9760](https\://github\.com/ansible\-collections/community\.general/pull/9760)\)\. -* redhat\_subscription \- use the \"enable\_content\" option \(when available\) when - registering using D\-Bus\, to ensure that subscription\-manager enables the - content on registration\; this is particular important on EL 10\+ and Fedora - 41\+ - \([https\://github\.com/ansible\-collections/community\.general/pull/9778](https\://github\.com/ansible\-collections/community\.general/pull/9778)\)\. -* zfs \- fix handling of multi\-line values of user\-defined ZFS properties \([https\://github\.com/ansible\-collections/community\.general/pull/6264](https\://github\.com/ansible\-collections/community\.general/pull/6264)\)\. -* zfs\_facts \- parameter type now accepts multple values as documented \([https\://github\.com/ansible\-collections/community\.general/issues/5909](https\://github\.com/ansible\-collections/community\.general/issues/5909)\, [https\://github\.com/ansible\-collections/community\.general/pull/9697](https\://github\.com/ansible\-collections/community\.general/pull/9697)\)\. - - -### New Modules - -* community\.general\.systemd\_info \- Gather C\(systemd\) unit info\. - - -## v10\.3\.1 - - -### Release Summary - -Bugfix release\. - - -### Minor Changes - -* onepassword\_ssh\_key \- refactor to move code to lookup class \([https\://github\.com/ansible\-collections/community\.general/pull/9633](https\://github\.com/ansible\-collections/community\.general/pull/9633)\)\. - - -### Bugfixes - -* cloudflare\_dns \- fix crash when deleting a DNS record or when updating a record with solo\=true \([https\://github\.com/ansible\-collections/community\.general/issues/9652](https\://github\.com/ansible\-collections/community\.general/issues/9652)\, [https\://github\.com/ansible\-collections/community\.general/pull/9649](https\://github\.com/ansible\-collections/community\.general/pull/9649)\)\. -* homebrew \- make package name parsing more resilient \([https\://github\.com/ansible\-collections/community\.general/pull/9665](https\://github\.com/ansible\-collections/community\.general/pull/9665)\, [https\://github\.com/ansible\-collections/community\.general/issues/9641](https\://github\.com/ansible\-collections/community\.general/issues/9641)\)\. -* keycloak module utils \- replaces missing return in get\_role\_composites method which caused it to return None instead of composite roles \([https\://github\.com/ansible\-collections/community\.general/issues/9678](https\://github\.com/ansible\-collections/community\.general/issues/9678)\, [https\://github\.com/ansible\-collections/community\.general/pull/9691](https\://github\.com/ansible\-collections/community\.general/pull/9691)\)\. -* keycloak\_client \- fix and improve existing tests\. The module showed a diff without actual changes\, solved by improving the normalise\_cr\(\) function \([https\://github\.com/ansible\-collections/community\.general/pull/9644](https\://github\.com/ansible\-collections/community\.general/pull/9644)\)\. -* proxmox \- adds the pubkey parameter \(back to\) the update state \([https\://github\.com/ansible\-collections/community\.general/issues/9642](https\://github\.com/ansible\-collections/community\.general/issues/9642)\, [https\://github\.com/ansible\-collections/community\.general/pull/9645](https\://github\.com/ansible\-collections/community\.general/pull/9645)\)\. -* proxmox \- fixes a typo in the translation of the pubkey parameter to proxmox\' ssh\-public\-keys \([https\://github\.com/ansible\-collections/community\.general/issues/9642](https\://github\.com/ansible\-collections/community\.general/issues/9642)\, [https\://github\.com/ansible\-collections/community\.general/pull/9645](https\://github\.com/ansible\-collections/community\.general/pull/9645)\)\. -* xml \- ensure file descriptor is closed \([https\://github\.com/ansible\-collections/community\.general/pull/9695](https\://github\.com/ansible\-collections/community\.general/pull/9695)\)\. - - -## v10\.3\.0 - - -### Release Summary - -Regular bugfix and feature release\. - - -### Minor Changes - -* MH module utils \- delegate debug to the underlying AnsibleModule instance or issues a warning if an attribute already exists with that name \([https\://github\.com/ansible\-collections/community\.general/pull/9577](https\://github\.com/ansible\-collections/community\.general/pull/9577)\)\. -* apache2\_mod\_proxy \- better handling regexp extraction \([https\://github\.com/ansible\-collections/community\.general/pull/9609](https\://github\.com/ansible\-collections/community\.general/pull/9609)\)\. -* apache2\_mod\_proxy \- change type of state to a list of strings\. No change for the users \([https\://github\.com/ansible\-collections/community\.general/pull/9600](https\://github\.com/ansible\-collections/community\.general/pull/9600)\)\. -* apache2\_mod\_proxy \- improve readability when using results from fecth\_url\(\) \([https\://github\.com/ansible\-collections/community\.general/pull/9608](https\://github\.com/ansible\-collections/community\.general/pull/9608)\)\. -* apache2\_mod\_proxy \- refactor repeated code into method \([https\://github\.com/ansible\-collections/community\.general/pull/9599](https\://github\.com/ansible\-collections/community\.general/pull/9599)\)\. -* apache2\_mod\_proxy \- remove unused parameter and code from Balancer constructor \([https\://github\.com/ansible\-collections/community\.general/pull/9614](https\://github\.com/ansible\-collections/community\.general/pull/9614)\)\. -* apache2\_mod\_proxy \- simplified and improved string manipulation \([https\://github\.com/ansible\-collections/community\.general/pull/9614](https\://github\.com/ansible\-collections/community\.general/pull/9614)\)\. -* apache2\_mod\_proxy \- use deps to handle dependencies \([https\://github\.com/ansible\-collections/community\.general/pull/9612](https\://github\.com/ansible\-collections/community\.general/pull/9612)\)\. -* cgroup\_memory\_recap callback plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* chroot connection plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9584](https\://github\.com/ansible\-collections/community\.general/pull/9584)\)\. -* cloud\_init\_data\_facts \- open file using open\(\) as a context manager \([https\://github\.com/ansible\-collections/community\.general/pull/9579](https\://github\.com/ansible\-collections/community\.general/pull/9579)\)\. -* cobbler inventory plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9584](https\://github\.com/ansible\-collections/community\.general/pull/9584)\)\. -* context\_demo callback plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* counter filter plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9585](https\://github\.com/ansible\-collections/community\.general/pull/9585)\)\. -* counter\_enabled callback plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* cpanm \- enable usage of option \-\-with\-recommends \([https\://github\.com/ansible\-collections/community\.general/issues/9554](https\://github\.com/ansible\-collections/community\.general/issues/9554)\, [https\://github\.com/ansible\-collections/community\.general/pull/9555](https\://github\.com/ansible\-collections/community\.general/pull/9555)\)\. -* cpanm \- enable usage of option \-\-with\-suggests \([https\://github\.com/ansible\-collections/community\.general/pull/9555](https\://github\.com/ansible\-collections/community\.general/pull/9555)\)\. -* crc32 filter plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9585](https\://github\.com/ansible\-collections/community\.general/pull/9585)\)\. -* cronvar \- open file using open\(\) as a context manager \([https\://github\.com/ansible\-collections/community\.general/pull/9579](https\://github\.com/ansible\-collections/community\.general/pull/9579)\)\. -* crypttab \- open file using open\(\) as a context manager \([https\://github\.com/ansible\-collections/community\.general/pull/9579](https\://github\.com/ansible\-collections/community\.general/pull/9579)\)\. -* default\_without\_diff callback plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* dense callback plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* dict filter plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9585](https\://github\.com/ansible\-collections/community\.general/pull/9585)\)\. -* dict\_kv filter plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9585](https\://github\.com/ansible\-collections/community\.general/pull/9585)\)\. -* diy callback plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* doas become plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* dzdo become plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* elastic callback plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* from\_csv filter plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9585](https\://github\.com/ansible\-collections/community\.general/pull/9585)\)\. -* from\_ini filter plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9585](https\://github\.com/ansible\-collections/community\.general/pull/9585)\)\. -* funcd connection plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9584](https\://github\.com/ansible\-collections/community\.general/pull/9584)\)\. -* gitlab\_runners inventory plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9584](https\://github\.com/ansible\-collections/community\.general/pull/9584)\)\. -* groupby\_as\_dict filter plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9585](https\://github\.com/ansible\-collections/community\.general/pull/9585)\)\. -* hashids filter plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9585](https\://github\.com/ansible\-collections/community\.general/pull/9585)\)\. -* icinga2 inventory plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9584](https\://github\.com/ansible\-collections/community\.general/pull/9584)\)\. -* incus connection plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9584](https\://github\.com/ansible\-collections/community\.general/pull/9584)\)\. -* iocage connection plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9584](https\://github\.com/ansible\-collections/community\.general/pull/9584)\)\. -* iocage inventory plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9584](https\://github\.com/ansible\-collections/community\.general/pull/9584)\)\. -* iocage inventory plugin \- the new parameter sudo of the plugin lets the command iocage list \-l to run as root on the iocage host\. This is needed to get the IPv4 of a running DHCP jail \([https\://github\.com/ansible\-collections/community\.general/issues/9572](https\://github\.com/ansible\-collections/community\.general/issues/9572)\, [https\://github\.com/ansible\-collections/community\.general/pull/9573](https\://github\.com/ansible\-collections/community\.general/pull/9573)\)\. -* iptables\_state action plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* jabber callback plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* jail connection plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9584](https\://github\.com/ansible\-collections/community\.general/pull/9584)\)\. -* jc filter plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9585](https\://github\.com/ansible\-collections/community\.general/pull/9585)\)\. -* jira \- transition operation now has status\_id to directly reference wanted transition \([https\://github\.com/ansible\-collections/community\.general/pull/9602](https\://github\.com/ansible\-collections/community\.general/pull/9602)\)\. -* json\_query filter plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9585](https\://github\.com/ansible\-collections/community\.general/pull/9585)\)\. -* keep\_keys filter plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9585](https\://github\.com/ansible\-collections/community\.general/pull/9585)\)\. -* keycloak\_\* modules \- refresh\_token parameter added\. When multiple authentication parameters are provided \(token\, refresh\_token\, and auth\_username/auth\_password\)\, modules will now automatically retry requests upon authentication errors \(401\)\, using in order the token\, refresh token\, and username/password \([https\://github\.com/ansible\-collections/community\.general/pull/9494](https\://github\.com/ansible\-collections/community\.general/pull/9494)\)\. -* known\_hosts \- open file using open\(\) as a context manager \([https\://github\.com/ansible\-collections/community\.general/pull/9579](https\://github\.com/ansible\-collections/community\.general/pull/9579)\)\. -* ksu become plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* linode inventory plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9584](https\://github\.com/ansible\-collections/community\.general/pull/9584)\)\. -* lists filter plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9585](https\://github\.com/ansible\-collections/community\.general/pull/9585)\)\. -* lists\_mergeby filter plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9585](https\://github\.com/ansible\-collections/community\.general/pull/9585)\)\. -* log\_plays callback plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* loganalytics callback plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* logdna callback plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* logentries callback plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* logstash callback plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* lxc connection plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9584](https\://github\.com/ansible\-collections/community\.general/pull/9584)\)\. -* lxd connection plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9584](https\://github\.com/ansible\-collections/community\.general/pull/9584)\)\. -* lxd inventory plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9584](https\://github\.com/ansible\-collections/community\.general/pull/9584)\)\. -* machinectl become plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* mail callback plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* memcached cache plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* nmap inventory plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9584](https\://github\.com/ansible\-collections/community\.general/pull/9584)\)\. -* nmcli \- add a option fail\_over\_mac \([https\://github\.com/ansible\-collections/community\.general/issues/9570](https\://github\.com/ansible\-collections/community\.general/issues/9570)\, [https\://github\.com/ansible\-collections/community\.general/pull/9571](https\://github\.com/ansible\-collections/community\.general/pull/9571)\)\. -* nrdp callback plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* null callback plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* one\_template \- adds filter option for retrieving templates which are not owned by the user \([https\://github\.com/ansible\-collections/community\.general/pull/9547](https\://github\.com/ansible\-collections/community\.general/pull/9547)\, [https\://github\.com/ansible\-collections/community\.general/issues/9278](https\://github\.com/ansible\-collections/community\.general/issues/9278)\)\. -* online inventory plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9584](https\://github\.com/ansible\-collections/community\.general/pull/9584)\)\. -* opennebula inventory plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9584](https\://github\.com/ansible\-collections/community\.general/pull/9584)\)\. -* opentelemetry callback plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* parted \- open file using open\(\) as a context manager \([https\://github\.com/ansible\-collections/community\.general/pull/9579](https\://github\.com/ansible\-collections/community\.general/pull/9579)\)\. -* pbrun become plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* pfexec become plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* pickle cache plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* pmrun become plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* proxmox \- refactors the proxmox module \([https\://github\.com/ansible\-collections/community\.general/pull/9225](https\://github\.com/ansible\-collections/community\.general/pull/9225)\)\. -* proxmox inventory plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9584](https\://github\.com/ansible\-collections/community\.general/pull/9584)\)\. -* proxmox\_pct\_remote connection plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9584](https\://github\.com/ansible\-collections/community\.general/pull/9584)\)\. -* proxmox\_template \- add support for checksum validation with new options checksum\_algorithm and checksum \([https\://github\.com/ansible\-collections/community\.general/issues/9553](https\://github\.com/ansible\-collections/community\.general/issues/9553)\, [https\://github\.com/ansible\-collections/community\.general/pull/9601](https\://github\.com/ansible\-collections/community\.general/pull/9601)\)\. -* pulp\_repo \- open file using open\(\) as a context manager \([https\://github\.com/ansible\-collections/community\.general/pull/9579](https\://github\.com/ansible\-collections/community\.general/pull/9579)\)\. -* qubes connection plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9584](https\://github\.com/ansible\-collections/community\.general/pull/9584)\)\. -* random\_mac filter plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9585](https\://github\.com/ansible\-collections/community\.general/pull/9585)\)\. -* redfish\_info \- add command GetAccountServiceConfig to get full information about AccountService configuration \([https\://github\.com/ansible\-collections/community\.general/pull/9403](https\://github\.com/ansible\-collections/community\.general/pull/9403)\)\. -* redhat\_subscription \- open file using open\(\) as a context manager \([https\://github\.com/ansible\-collections/community\.general/pull/9579](https\://github\.com/ansible\-collections/community\.general/pull/9579)\)\. -* redis cache plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* remove\_keys filter plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9585](https\://github\.com/ansible\-collections/community\.general/pull/9585)\)\. -* replace\_keys filter plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9585](https\://github\.com/ansible\-collections/community\.general/pull/9585)\)\. -* reveal\_ansible\_type filter plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9585](https\://github\.com/ansible\-collections/community\.general/pull/9585)\)\. -* run0 become plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* saltstack connection plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9584](https\://github\.com/ansible\-collections/community\.general/pull/9584)\)\. -* say callback plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* scaleway inventory plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9584](https\://github\.com/ansible\-collections/community\.general/pull/9584)\)\. -* selective callback plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* sesu become plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* shutdown action plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* slack callback plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* snap \- add return value version \([https\://github\.com/ansible\-collections/community\.general/pull/9598](https\://github\.com/ansible\-collections/community\.general/pull/9598)\)\. -* snap\_alias \- add return value version \([https\://github\.com/ansible\-collections/community\.general/pull/9598](https\://github\.com/ansible\-collections/community\.general/pull/9598)\)\. -* solaris\_zone \- open file using open\(\) as a context manager \([https\://github\.com/ansible\-collections/community\.general/pull/9579](https\://github\.com/ansible\-collections/community\.general/pull/9579)\)\. -* sorcery \- open file using open\(\) as a context manager \([https\://github\.com/ansible\-collections/community\.general/pull/9579](https\://github\.com/ansible\-collections/community\.general/pull/9579)\)\. -* splunk callback plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* stackpath\_compute inventory plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9584](https\://github\.com/ansible\-collections/community\.general/pull/9584)\)\. -* sudosu become plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* sumologic callback plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* syslog\_json callback plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* time filter plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9585](https\://github\.com/ansible\-collections/community\.general/pull/9585)\)\. -* timestamp callback plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* timezone \- open file using open\(\) as a context manager \([https\://github\.com/ansible\-collections/community\.general/pull/9579](https\://github\.com/ansible\-collections/community\.general/pull/9579)\)\. -* to\_ini filter plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9585](https\://github\.com/ansible\-collections/community\.general/pull/9585)\)\. -* ufw \- add support for vrrp protocol \([https\://github\.com/ansible\-collections/community\.general/issues/9562](https\://github\.com/ansible\-collections/community\.general/issues/9562)\, [https\://github\.com/ansible\-collections/community\.general/pull/9582](https\://github\.com/ansible\-collections/community\.general/pull/9582)\)\. -* unicode\_normalize filter plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9585](https\://github\.com/ansible\-collections/community\.general/pull/9585)\)\. -* unixy callback plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* version\_sort filter plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9585](https\://github\.com/ansible\-collections/community\.general/pull/9585)\)\. -* virtualbox inventory plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9584](https\://github\.com/ansible\-collections/community\.general/pull/9584)\)\. -* xen\_orchestra inventory plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9584](https\://github\.com/ansible\-collections/community\.general/pull/9584)\)\. -* yaml cache plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* yaml callback plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9583](https\://github\.com/ansible\-collections/community\.general/pull/9583)\)\. -* zone connection plugin \- adjust standard preamble for Python 3 \([https\://github\.com/ansible\-collections/community\.general/pull/9584](https\://github\.com/ansible\-collections/community\.general/pull/9584)\)\. - - -### Deprecated Features - -* MH module utils \- attribute debug definition in subclasses of MH is now deprecated\, as that name will become a delegation to AnsibleModule in community\.general 12\.0\.0\, and any such attribute will be overridden by that delegation in that version \([https\://github\.com/ansible\-collections/community\.general/pull/9577](https\://github\.com/ansible\-collections/community\.general/pull/9577)\)\. -* proxmox \- removes default value false of update parameter\. This will be changed to a default of true in community\.general 11\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/9225](https\://github\.com/ansible\-collections/community\.general/pull/9225)\)\. - - -### Security Fixes - -* keycloak\_client \- Sanitize saml\.encryption\.private\.key so it does not show in the logs \([https\://github\.com/ansible\-collections/community\.general/pull/9621](https\://github\.com/ansible\-collections/community\.general/pull/9621)\)\. - - -### Bugfixes - -* homebrew \- fix incorrect handling of homebrew modules when a tap is requested \([https\://github\.com/ansible\-collections/community\.general/pull/9546](https\://github\.com/ansible\-collections/community\.general/pull/9546)\, [https\://github\.com/ansible\-collections/community\.general/issues/9533](https\://github\.com/ansible\-collections/community\.general/issues/9533)\)\. -* iocage inventory plugin \- the plugin parses the IP4 tab of the jails list and put the elements into the new variable iocage\_ip4\_dict\. In multiple interface format the variable iocage\_ip4 keeps the comma\-separated list of IP4 \([https\://github\.com/ansible\-collections/community\.general/issues/9538](https\://github\.com/ansible\-collections/community\.general/issues/9538)\)\. -* pipx \- honor option global when state\=latest \([https\://github\.com/ansible\-collections/community\.general/pull/9623](https\://github\.com/ansible\-collections/community\.general/pull/9623)\)\. -* proxmox \- fixes idempotency of template conversions \([https\://github\.com/ansible\-collections/community\.general/pull/9225](https\://github\.com/ansible\-collections/community\.general/pull/9225)\, [https\://github\.com/ansible\-collections/community\.general/issues/8811](https\://github\.com/ansible\-collections/community\.general/issues/8811)\)\. -* proxmox \- fixes incorrect parsing for bind\-only mounts \([https\://github\.com/ansible\-collections/community\.general/pull/9225](https\://github\.com/ansible\-collections/community\.general/pull/9225)\, [https\://github\.com/ansible\-collections/community\.general/issues/8982](https\://github\.com/ansible\-collections/community\.general/issues/8982)\)\. -* proxmox \- fixes issues with disk\_volume variable \([https\://github\.com/ansible\-collections/community\.general/pull/9225](https\://github\.com/ansible\-collections/community\.general/pull/9225)\, [https\://github\.com/ansible\-collections/community\.general/issues/9065](https\://github\.com/ansible\-collections/community\.general/issues/9065)\)\. -* proxmox module utils \- fixes ignoring of choose\_first\_if\_multiple argument in get\_vmid \([https\://github\.com/ansible\-collections/community\.general/pull/9225](https\://github\.com/ansible\-collections/community\.general/pull/9225)\)\. -* redhat\_subscription \- do not try to unsubscribe \(i\.e\. remove subscriptions\) - when unregistering a system\: newer versions of subscription\-manager\, as - available in EL 10 and Fedora 41\+\, do not support entitlements anymore\, and - thus unsubscribing will fail - \([https\://github\.com/ansible\-collections/community\.general/pull/9578](https\://github\.com/ansible\-collections/community\.general/pull/9578)\)\. - - -### New Plugins - - -#### Connection - -* community\.general\.proxmox\_pct\_remote \- Run tasks in Proxmox LXC container instances using pct CLI via SSH\. - - -#### Filter - -* community\.general\.json\_diff \- Create a JSON patch by comparing two JSON files\. -* community\.general\.json\_patch \- Apply a JSON\-Patch \(RFC 6902\) operation to an object\. -* community\.general\.json\_patch\_recipe \- Apply JSON\-Patch \(RFC 6902\) operations to an object\. - - -#### Lookup - -* community\.general\.onepassword\_ssh\_key \- Fetch SSH keys stored in 1Password\. - - -### New Modules - -* community\.general\.proxmox\_backup\_info \- Retrieve information on Proxmox scheduled backups\. - - -## v10\.2\.0 - - -### Release Summary - -Regular bugfix and feature release\. - - -### Minor Changes - -* bitwarden lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* cgroup\_memory\_recap callback plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9321](https\://github\.com/ansible\-collections/community\.general/pull/9321)\)\. -* chef\_databag lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* chroot connection plugin \- clean up string conversions \([https\://github\.com/ansible\-collections/community\.general/pull/9379](https\://github\.com/ansible\-collections/community\.general/pull/9379)\)\. -* chroot connection plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9322](https\://github\.com/ansible\-collections/community\.general/pull/9322)\)\. -* cobbler inventory plugin \- clean up string conversions \([https\://github\.com/ansible\-collections/community\.general/pull/9379](https\://github\.com/ansible\-collections/community\.general/pull/9379)\)\. -* cobbler inventory plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9323](https\://github\.com/ansible\-collections/community\.general/pull/9323)\)\. -* collection\_version lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* consul\_kv lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* context\_demo callback plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9321](https\://github\.com/ansible\-collections/community\.general/pull/9321)\)\. -* counter\_enabled callback plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9321](https\://github\.com/ansible\-collections/community\.general/pull/9321)\)\. -* credstash lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* cyberarkpassword lookup plugin \- clean up string conversions \([https\://github\.com/ansible\-collections/community\.general/pull/9379](https\://github\.com/ansible\-collections/community\.general/pull/9379)\)\. -* cyberarkpassword lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* dense callback plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9321](https\://github\.com/ansible\-collections/community\.general/pull/9321)\)\. -* dependent lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* dig lookup plugin \- clean up string conversions \([https\://github\.com/ansible\-collections/community\.general/pull/9379](https\://github\.com/ansible\-collections/community\.general/pull/9379)\)\. -* dig lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* diy callback plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9321](https\://github\.com/ansible\-collections/community\.general/pull/9321)\)\. -* dnstxt lookup plugin \- clean up string conversions \([https\://github\.com/ansible\-collections/community\.general/pull/9379](https\://github\.com/ansible\-collections/community\.general/pull/9379)\)\. -* dnstxt lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* doas become plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9319](https\://github\.com/ansible\-collections/community\.general/pull/9319)\)\. -* dsv lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* dzdo become plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9319](https\://github\.com/ansible\-collections/community\.general/pull/9319)\)\. -* elastic callback plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9321](https\://github\.com/ansible\-collections/community\.general/pull/9321)\)\. -* etcd lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* etcd3 lookup plugin \- clean up string conversions \([https\://github\.com/ansible\-collections/community\.general/pull/9379](https\://github\.com/ansible\-collections/community\.general/pull/9379)\)\. -* etcd3 lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* filetree lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* from\_csv filter plugin \- clean up string conversions \([https\://github\.com/ansible\-collections/community\.general/pull/9379](https\://github\.com/ansible\-collections/community\.general/pull/9379)\)\. -* from\_ini filter plugin \- clean up string conversions \([https\://github\.com/ansible\-collections/community\.general/pull/9379](https\://github\.com/ansible\-collections/community\.general/pull/9379)\)\. -* funcd connection plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9322](https\://github\.com/ansible\-collections/community\.general/pull/9322)\)\. -* github\_app\_access\_token lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* gitlab\_instance\_variable \- add support for raw variables suboption \([https\://github\.com/ansible\-collections/community\.general/pull/9425](https\://github\.com/ansible\-collections/community\.general/pull/9425)\)\. -* gitlab\_runners inventory plugin \- clean up string conversions \([https\://github\.com/ansible\-collections/community\.general/pull/9379](https\://github\.com/ansible\-collections/community\.general/pull/9379)\)\. -* gitlab\_runners inventory plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9323](https\://github\.com/ansible\-collections/community\.general/pull/9323)\)\. -* hiera lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* icinga2 inventory plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9323](https\://github\.com/ansible\-collections/community\.general/pull/9323)\)\. -* incus connection plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9322](https\://github\.com/ansible\-collections/community\.general/pull/9322)\)\. -* iocage connection plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9322](https\://github\.com/ansible\-collections/community\.general/pull/9322)\)\. -* iocage inventory plugin \- clean up string conversions \([https\://github\.com/ansible\-collections/community\.general/pull/9379](https\://github\.com/ansible\-collections/community\.general/pull/9379)\)\. -* iptables\_state action plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9318](https\://github\.com/ansible\-collections/community\.general/pull/9318)\)\. -* jabber callback plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9321](https\://github\.com/ansible\-collections/community\.general/pull/9321)\)\. -* jail connection plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9322](https\://github\.com/ansible\-collections/community\.general/pull/9322)\)\. -* keycloak \- add an action group for Keycloak modules to allow module\_defaults to be set for Keycloak tasks \([https\://github\.com/ansible\-collections/community\.general/pull/9284](https\://github\.com/ansible\-collections/community\.general/pull/9284)\)\. -* keyring lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* ksu become plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9319](https\://github\.com/ansible\-collections/community\.general/pull/9319)\)\. -* lastpass lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* linode inventory plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9323](https\://github\.com/ansible\-collections/community\.general/pull/9323)\)\. -* lmdb\_kv lookup plugin \- clean up string conversions \([https\://github\.com/ansible\-collections/community\.general/pull/9379](https\://github\.com/ansible\-collections/community\.general/pull/9379)\)\. -* lmdb\_kv lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* locale\_gen \- invert the logic to determine ubuntu\_mode\, making it look first for /etc/locale\.gen \(set ubuntu\_mode to False\) and only then looking for /var/lib/locales/supported\.d/ \(set ubuntu\_mode to True\) \([https\://github\.com/ansible\-collections/community\.general/pull/9238](https\://github\.com/ansible\-collections/community\.general/pull/9238)\, [https\://github\.com/ansible\-collections/community\.general/issues/9131](https\://github\.com/ansible\-collections/community\.general/issues/9131)\, [https\://github\.com/ansible\-collections/community\.general/issues/8487](https\://github\.com/ansible\-collections/community\.general/issues/8487)\)\. -* locale\_gen \- new return value mechanism to better express the semantics of the ubuntu\_mode\, with the possible values being either glibc \(ubuntu\_mode\=False\) or ubuntu\_legacy \(ubuntu\_mode\=True\) \([https\://github\.com/ansible\-collections/community\.general/pull/9238](https\://github\.com/ansible\-collections/community\.general/pull/9238)\)\. -* log\_plays callback plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9321](https\://github\.com/ansible\-collections/community\.general/pull/9321)\)\. -* loganalytics callback plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9321](https\://github\.com/ansible\-collections/community\.general/pull/9321)\)\. -* logdna callback plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9321](https\://github\.com/ansible\-collections/community\.general/pull/9321)\)\. -* logentries callback plugin \- clean up string conversions \([https\://github\.com/ansible\-collections/community\.general/pull/9379](https\://github\.com/ansible\-collections/community\.general/pull/9379)\)\. -* logentries callback plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9321](https\://github\.com/ansible\-collections/community\.general/pull/9321)\)\. -* lxc connection plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9322](https\://github\.com/ansible\-collections/community\.general/pull/9322)\)\. -* lxd connection plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9322](https\://github\.com/ansible\-collections/community\.general/pull/9322)\)\. -* lxd inventory plugin \- clean up string conversions \([https\://github\.com/ansible\-collections/community\.general/pull/9379](https\://github\.com/ansible\-collections/community\.general/pull/9379)\)\. -* lxd inventory plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9323](https\://github\.com/ansible\-collections/community\.general/pull/9323)\)\. -* machinectl become plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9319](https\://github\.com/ansible\-collections/community\.general/pull/9319)\)\. -* mail callback plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9321](https\://github\.com/ansible\-collections/community\.general/pull/9321)\)\. -* manageiq\_alert\_profiles \- improve handling of parameter requirements \([https\://github\.com/ansible\-collections/community\.general/pull/9449](https\://github\.com/ansible\-collections/community\.general/pull/9449)\)\. -* manifold lookup plugin \- clean up string conversions \([https\://github\.com/ansible\-collections/community\.general/pull/9379](https\://github\.com/ansible\-collections/community\.general/pull/9379)\)\. -* manifold lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* memcached cache plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9320](https\://github\.com/ansible\-collections/community\.general/pull/9320)\)\. -* merge\_variables lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* nmap inventory plugin \- clean up string conversions \([https\://github\.com/ansible\-collections/community\.general/pull/9379](https\://github\.com/ansible\-collections/community\.general/pull/9379)\)\. -* nmap inventory plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9323](https\://github\.com/ansible\-collections/community\.general/pull/9323)\)\. -* nrdp callback plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9321](https\://github\.com/ansible\-collections/community\.general/pull/9321)\)\. -* onepassword lookup plugin \- clean up string conversions \([https\://github\.com/ansible\-collections/community\.general/pull/9379](https\://github\.com/ansible\-collections/community\.general/pull/9379)\)\. -* onepassword lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* onepassword\_doc lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* online inventory plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9323](https\://github\.com/ansible\-collections/community\.general/pull/9323)\)\. -* opennebula inventory plugin \- clean up string conversions \([https\://github\.com/ansible\-collections/community\.general/pull/9379](https\://github\.com/ansible\-collections/community\.general/pull/9379)\)\. -* opennebula inventory plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9323](https\://github\.com/ansible\-collections/community\.general/pull/9323)\)\. -* opentelemetry callback plugin \- remove code handling Python versions prior to 3\.7 \([https\://github\.com/ansible\-collections/community\.general/pull/9482](https\://github\.com/ansible\-collections/community\.general/pull/9482)\)\. -* opentelemetry callback plugin \- remove code handling Python versions prior to 3\.7 \([https\://github\.com/ansible\-collections/community\.general/pull/9503](https\://github\.com/ansible\-collections/community\.general/pull/9503)\)\. -* opentelemetry callback plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9321](https\://github\.com/ansible\-collections/community\.general/pull/9321)\)\. -* pacemaker\_cluster \- remove unused code \([https\://github\.com/ansible\-collections/community\.general/pull/9471](https\://github\.com/ansible\-collections/community\.general/pull/9471)\)\. -* pacemaker\_cluster \- using safer mechanism to run external command \([https\://github\.com/ansible\-collections/community\.general/pull/9471](https\://github\.com/ansible\-collections/community\.general/pull/9471)\)\. -* passwordstore lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* pbrun become plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9319](https\://github\.com/ansible\-collections/community\.general/pull/9319)\)\. -* pfexec become plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9319](https\://github\.com/ansible\-collections/community\.general/pull/9319)\)\. -* pmrun become plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9319](https\://github\.com/ansible\-collections/community\.general/pull/9319)\)\. -* proxmox inventory plugin \- clean up string conversions \([https\://github\.com/ansible\-collections/community\.general/pull/9379](https\://github\.com/ansible\-collections/community\.general/pull/9379)\)\. -* proxmox inventory plugin \- strip whitespace from user\, token\_id\, and token\_secret \([https\://github\.com/ansible\-collections/community\.general/issues/9227](https\://github\.com/ansible\-collections/community\.general/issues/9227)\, [https\://github\.com/ansible\-collections/community\.general/pull/9228/](https\://github\.com/ansible\-collections/community\.general/pull/9228/)\)\. -* proxmox inventory plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9323](https\://github\.com/ansible\-collections/community\.general/pull/9323)\)\. -* proxmox module utils \- add method api\_task\_complete that can wait for task completion and return error message \([https\://github\.com/ansible\-collections/community\.general/pull/9256](https\://github\.com/ansible\-collections/community\.general/pull/9256)\)\. -* proxmox\_backup \- refactor permission checking to improve code readability and maintainability \([https\://github\.com/ansible\-collections/community\.general/pull/9239](https\://github\.com/ansible\-collections/community\.general/pull/9239)\)\. -* qubes connection plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9322](https\://github\.com/ansible\-collections/community\.general/pull/9322)\)\. -* random\_pet lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* redis cache plugin \- clean up string conversions \([https\://github\.com/ansible\-collections/community\.general/pull/9379](https\://github\.com/ansible\-collections/community\.general/pull/9379)\)\. -* redis cache plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9320](https\://github\.com/ansible\-collections/community\.general/pull/9320)\)\. -* redis lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* revbitspss lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* saltstack connection plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9322](https\://github\.com/ansible\-collections/community\.general/pull/9322)\)\. -* say callback plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9321](https\://github\.com/ansible\-collections/community\.general/pull/9321)\)\. -* scaleway inventory plugin \- clean up string conversions \([https\://github\.com/ansible\-collections/community\.general/pull/9379](https\://github\.com/ansible\-collections/community\.general/pull/9379)\)\. -* scaleway inventory plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9323](https\://github\.com/ansible\-collections/community\.general/pull/9323)\)\. -* selective callback plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9321](https\://github\.com/ansible\-collections/community\.general/pull/9321)\)\. -* sesu become plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9319](https\://github\.com/ansible\-collections/community\.general/pull/9319)\)\. -* shelvefile lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* shutdown action plugin \- clean up string conversions \([https\://github\.com/ansible\-collections/community\.general/pull/9379](https\://github\.com/ansible\-collections/community\.general/pull/9379)\)\. -* shutdown action plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9318](https\://github\.com/ansible\-collections/community\.general/pull/9318)\)\. -* slack callback plugin \- clean up string conversions \([https\://github\.com/ansible\-collections/community\.general/pull/9379](https\://github\.com/ansible\-collections/community\.general/pull/9379)\)\. -* slack callback plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9321](https\://github\.com/ansible\-collections/community\.general/pull/9321)\)\. -* splunk callback plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9321](https\://github\.com/ansible\-collections/community\.general/pull/9321)\)\. -* stackpath\_compute inventory plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9323](https\://github\.com/ansible\-collections/community\.general/pull/9323)\)\. -* sudosu become plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9319](https\://github\.com/ansible\-collections/community\.general/pull/9319)\)\. -* timestamp callback plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9321](https\://github\.com/ansible\-collections/community\.general/pull/9321)\)\. -* to\_ini filter plugin \- clean up string conversions \([https\://github\.com/ansible\-collections/community\.general/pull/9379](https\://github\.com/ansible\-collections/community\.general/pull/9379)\)\. -* tss lookup plugin \- clean up string conversions \([https\://github\.com/ansible\-collections/community\.general/pull/9379](https\://github\.com/ansible\-collections/community\.general/pull/9379)\)\. -* tss lookup plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9324](https\://github\.com/ansible\-collections/community\.general/pull/9324)\)\. -* unixy callback plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9321](https\://github\.com/ansible\-collections/community\.general/pull/9321)\)\. -* virtualbox inventory plugin \- clean up string conversions \([https\://github\.com/ansible\-collections/community\.general/pull/9379](https\://github\.com/ansible\-collections/community\.general/pull/9379)\)\. -* virtualbox inventory plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9323](https\://github\.com/ansible\-collections/community\.general/pull/9323)\)\. -* xbps \- add root and repository options to enable bootstrapping new void installations \([https\://github\.com/ansible\-collections/community\.general/pull/9174](https\://github\.com/ansible\-collections/community\.general/pull/9174)\)\. -* xen\_orchestra inventory plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9323](https\://github\.com/ansible\-collections/community\.general/pull/9323)\)\. -* xfconf \- add return value version \([https\://github\.com/ansible\-collections/community\.general/pull/9226](https\://github\.com/ansible\-collections/community\.general/pull/9226)\)\. -* xfconf\_info \- add return value version \([https\://github\.com/ansible\-collections/community\.general/pull/9226](https\://github\.com/ansible\-collections/community\.general/pull/9226)\)\. -* yaml callback plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9321](https\://github\.com/ansible\-collections/community\.general/pull/9321)\)\. -* zone connection plugin \- use f\-strings instead of interpolations or format \([https\://github\.com/ansible\-collections/community\.general/pull/9322](https\://github\.com/ansible\-collections/community\.general/pull/9322)\)\. -* zypper \- add quiet option \([https\://github\.com/ansible\-collections/community\.general/pull/9270](https\://github\.com/ansible\-collections/community\.general/pull/9270)\)\. -* zypper \- add simple\_errors option \([https\://github\.com/ansible\-collections/community\.general/pull/9270](https\://github\.com/ansible\-collections/community\.general/pull/9270)\)\. - - -### Deprecated Features - -* atomic\_container \- module is deprecated and will be removed in community\.general 13\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/9487](https\://github\.com/ansible\-collections/community\.general/pull/9487)\)\. -* atomic\_host \- module is deprecated and will be removed in community\.general 13\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/9487](https\://github\.com/ansible\-collections/community\.general/pull/9487)\)\. -* atomic\_image \- module is deprecated and will be removed in community\.general 13\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/9487](https\://github\.com/ansible\-collections/community\.general/pull/9487)\)\. -* facter \- module is deprecated and will be removed in community\.general 12\.0\.0\, use community\.general\.facter\_facts instead \([https\://github\.com/ansible\-collections/community\.general/pull/9451](https\://github\.com/ansible\-collections/community\.general/pull/9451)\)\. -* locale\_gen \- ubuntu\_mode\=True\, or mechanism\=ubuntu\_legacy is deprecated and will be removed in community\.general 13\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/9238](https\://github\.com/ansible\-collections/community\.general/pull/9238)\)\. -* pure module utils \- the module utils is deprecated and will be removed from community\.general 12\.0\.0\. The modules using this were removed in community\.general 3\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/9432](https\://github\.com/ansible\-collections/community\.general/pull/9432)\)\. -* purestorage doc fragments \- the doc fragment is deprecated and will be removed from community\.general 12\.0\.0\. The modules using this were removed in community\.general 3\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/9432](https\://github\.com/ansible\-collections/community\.general/pull/9432)\)\. -* sensu\_check \- module is deprecated and will be removed in community\.general 13\.0\.0\, use collection sensu\.sensu\_go instead \([https\://github\.com/ansible\-collections/community\.general/pull/9483](https\://github\.com/ansible\-collections/community\.general/pull/9483)\)\. -* sensu\_client \- module is deprecated and will be removed in community\.general 13\.0\.0\, use collection sensu\.sensu\_go instead \([https\://github\.com/ansible\-collections/community\.general/pull/9483](https\://github\.com/ansible\-collections/community\.general/pull/9483)\)\. -* sensu\_handler \- module is deprecated and will be removed in community\.general 13\.0\.0\, use collection sensu\.sensu\_go instead \([https\://github\.com/ansible\-collections/community\.general/pull/9483](https\://github\.com/ansible\-collections/community\.general/pull/9483)\)\. -* sensu\_silence \- module is deprecated and will be removed in community\.general 13\.0\.0\, use collection sensu\.sensu\_go instead \([https\://github\.com/ansible\-collections/community\.general/pull/9483](https\://github\.com/ansible\-collections/community\.general/pull/9483)\)\. -* sensu\_subscription \- module is deprecated and will be removed in community\.general 13\.0\.0\, use collection sensu\.sensu\_go instead \([https\://github\.com/ansible\-collections/community\.general/pull/9483](https\://github\.com/ansible\-collections/community\.general/pull/9483)\)\. -* slack \- the default value auto of the prepend\_hash option is deprecated and will change to never in community\.general 12\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/9443](https\://github\.com/ansible\-collections/community\.general/pull/9443)\)\. -* yaml callback plugin \- deprecate plugin in favor of result\_format\=yaml in plugin ansible\.bulitin\.default \([https\://github\.com/ansible\-collections/community\.general/pull/9456](https\://github\.com/ansible\-collections/community\.general/pull/9456)\)\. - - -### Security Fixes - -* keycloak\_authentication \- API calls did not properly set the priority during update resulting in incorrectly sorted authentication flows\. This apparently only affects Keycloak 25 or newer \([https\://github\.com/ansible\-collections/community\.general/pull/9263](https\://github\.com/ansible\-collections/community\.general/pull/9263)\)\. - - -### Bugfixes - -* dig lookup plugin \- correctly handle NoNameserver exception \([https\://github\.com/ansible\-collections/community\.general/pull/9363](https\://github\.com/ansible\-collections/community\.general/pull/9363)\, [https\://github\.com/ansible\-collections/community\.general/issues/9362](https\://github\.com/ansible\-collections/community\.general/issues/9362)\)\. -* homebrew \- fix incorrect handling of aliased homebrew modules when the alias is requested \([https\://github\.com/ansible\-collections/community\.general/pull/9255](https\://github\.com/ansible\-collections/community\.general/pull/9255)\, [https\://github\.com/ansible\-collections/community\.general/issues/9240](https\://github\.com/ansible\-collections/community\.general/issues/9240)\)\. -* htpasswd \- report changes when file permissions are adjusted \([https\://github\.com/ansible\-collections/community\.general/issues/9485](https\://github\.com/ansible\-collections/community\.general/issues/9485)\, [https\://github\.com/ansible\-collections/community\.general/pull/9490](https\://github\.com/ansible\-collections/community\.general/pull/9490)\)\. -* proxmox\_backup \- fix incorrect key lookup in vmid permission check \([https\://github\.com/ansible\-collections/community\.general/pull/9223](https\://github\.com/ansible\-collections/community\.general/pull/9223)\)\. -* proxmox\_disk \- fix async method and make resize\_disk method handle errors correctly \([https\://github\.com/ansible\-collections/community\.general/pull/9256](https\://github\.com/ansible\-collections/community\.general/pull/9256)\)\. -* proxmox\_template \- fix the wrong path called on proxmox\_template\.task\_status \([https\://github\.com/ansible\-collections/community\.general/issues/9276](https\://github\.com/ansible\-collections/community\.general/issues/9276)\, [https\://github\.com/ansible\-collections/community\.general/pull/9277](https\://github\.com/ansible\-collections/community\.general/pull/9277)\)\. -* qubes connection plugin \- fix the printing of debug information \([https\://github\.com/ansible\-collections/community\.general/pull/9334](https\://github\.com/ansible\-collections/community\.general/pull/9334)\)\. -* redfish\_utils module utils \- Fix VerifyBiosAttributes command on multi system resource nodes \([https\://github\.com/ansible\-collections/community\.general/pull/9234](https\://github\.com/ansible\-collections/community\.general/pull/9234)\)\. - - -### New Plugins - - -#### Inventory - -* community\.general\.iocage \- iocage inventory source\. - - -### New Modules - -* community\.general\.android\_sdk \- Manages Android SDK packages\. -* community\.general\.ldap\_inc \- Use the Modify\-Increment LDAP V3 feature to increment an attribute value\. -* community\.general\.systemd\_creds\_decrypt \- C\(systemd\)\'s C\(systemd\-creds decrypt\) plugin\. -* community\.general\.systemd\_creds\_encrypt \- C\(systemd\)\'s C\(systemd\-creds encrypt\) plugin\. - - -## v10\.1\.0 - - -### Release Summary - -Regular bugfix and feature release\. - - -### Minor Changes - -* alternatives \- add family parameter that allows to utilize the \-\-family option available in RedHat version of update\-alternatives \([https\://github\.com/ansible\-collections/community\.general/issues/5060](https\://github\.com/ansible\-collections/community\.general/issues/5060)\, [https\://github\.com/ansible\-collections/community\.general/pull/9096](https\://github\.com/ansible\-collections/community\.general/pull/9096)\)\. -* cloudflare\_dns \- add support for comment and tags \([https\://github\.com/ansible\-collections/community\.general/pull/9132](https\://github\.com/ansible\-collections/community\.general/pull/9132)\)\. -* deps module utils \- add deps\.clear\(\) to clear out previously declared dependencies \([https\://github\.com/ansible\-collections/community\.general/pull/9179](https\://github\.com/ansible\-collections/community\.general/pull/9179)\)\. -* homebrew \- greatly speed up module when multiple packages are passed in the name option \([https\://github\.com/ansible\-collections/community\.general/pull/9181](https\://github\.com/ansible\-collections/community\.general/pull/9181)\)\. -* homebrew \- remove duplicated package name validation \([https\://github\.com/ansible\-collections/community\.general/pull/9076](https\://github\.com/ansible\-collections/community\.general/pull/9076)\)\. -* iso\_extract \- adds password parameter that is passed to 7z \([https\://github\.com/ansible\-collections/community\.general/pull/9159](https\://github\.com/ansible\-collections/community\.general/pull/9159)\)\. -* launchd \- add plist option for services such as sshd\, where the plist filename doesn\'t match the service name \([https\://github\.com/ansible\-collections/community\.general/pull/9102](https\://github\.com/ansible\-collections/community\.general/pull/9102)\)\. -* nmcli \- add sriov parameter that enables support for SR\-IOV settings \([https\://github\.com/ansible\-collections/community\.general/pull/9168](https\://github\.com/ansible\-collections/community\.general/pull/9168)\)\. -* pipx \- add return value version \([https\://github\.com/ansible\-collections/community\.general/pull/9180](https\://github\.com/ansible\-collections/community\.general/pull/9180)\)\. -* pipx\_info \- add return value version \([https\://github\.com/ansible\-collections/community\.general/pull/9180](https\://github\.com/ansible\-collections/community\.general/pull/9180)\)\. -* proxmox\_template \- add server side artifact fetching support \([https\://github\.com/ansible\-collections/community\.general/pull/9113](https\://github\.com/ansible\-collections/community\.general/pull/9113)\)\. -* redfish\_command \- add update\_custom\_oem\_header\, update\_custom\_oem\_params\, and update\_custom\_oem\_mime\_type options \([https\://github\.com/ansible\-collections/community\.general/pull/9123](https\://github\.com/ansible\-collections/community\.general/pull/9123)\)\. -* redfish\_utils module utils \- remove redundant code \([https\://github\.com/ansible\-collections/community\.general/pull/9190](https\://github\.com/ansible\-collections/community\.general/pull/9190)\)\. -* rpm\_ostree\_pkg \- added the options apply\_live \([https\://github\.com/ansible\-collections/community\.general/pull/9167](https\://github\.com/ansible\-collections/community\.general/pull/9167)\)\. -* rpm\_ostree\_pkg \- added the return value needs\_reboot \([https\://github\.com/ansible\-collections/community\.general/pull/9167](https\://github\.com/ansible\-collections/community\.general/pull/9167)\)\. -* scaleway\_lb \- minor simplification in the code \([https\://github\.com/ansible\-collections/community\.general/pull/9189](https\://github\.com/ansible\-collections/community\.general/pull/9189)\)\. -* ssh\_config \- add dynamicforward option \([https\://github\.com/ansible\-collections/community\.general/pull/9192](https\://github\.com/ansible\-collections/community\.general/pull/9192)\)\. - - -### Deprecated Features - -* opkg \- deprecate value \"\" for parameter force \([https\://github\.com/ansible\-collections/community\.general/pull/9172](https\://github\.com/ansible\-collections/community\.general/pull/9172)\)\. -* redfish\_utils module utils \- deprecate method RedfishUtils\.\_init\_session\(\) \([https\://github\.com/ansible\-collections/community\.general/pull/9190](https\://github\.com/ansible\-collections/community\.general/pull/9190)\)\. - - -### Bugfixes - -* dnf\_config\_manager \- fix hanging when prompting to import GPG keys \([https\://github\.com/ansible\-collections/community\.general/pull/9124](https\://github\.com/ansible\-collections/community\.general/pull/9124)\, [https\://github\.com/ansible\-collections/community\.general/issues/8830](https\://github\.com/ansible\-collections/community\.general/issues/8830)\)\. -* dnf\_config\_manager \- forces locale to C before module starts\. If the locale was set to non\-English\, the output of the dnf config\-manager could not be parsed \([https\://github\.com/ansible\-collections/community\.general/pull/9157](https\://github\.com/ansible\-collections/community\.general/pull/9157)\, [https\://github\.com/ansible\-collections/community\.general/issues/9046](https\://github\.com/ansible\-collections/community\.general/issues/9046)\)\. -* flatpak \- force the locale language to C when running the flatpak command \([https\://github\.com/ansible\-collections/community\.general/pull/9187](https\://github\.com/ansible\-collections/community\.general/pull/9187)\, [https\://github\.com/ansible\-collections/community\.general/issues/8883](https\://github\.com/ansible\-collections/community\.general/issues/8883)\)\. -* gio\_mime \- fix command line when determining version of gio \([https\://github\.com/ansible\-collections/community\.general/pull/9171](https\://github\.com/ansible\-collections/community\.general/pull/9171)\, [https\://github\.com/ansible\-collections/community\.general/issues/9158](https\://github\.com/ansible\-collections/community\.general/issues/9158)\)\. -* github\_key \- in check mode\, a faulty call to \`datetime\.strftime\(\.\.\.\)\` was being made which generated an exception \([https\://github\.com/ansible\-collections/community\.general/issues/9185](https\://github\.com/ansible\-collections/community\.general/issues/9185)\)\. -* homebrew\_cask \- allow \+ symbol in Homebrew cask name validation regex \([https\://github\.com/ansible\-collections/community\.general/pull/9128](https\://github\.com/ansible\-collections/community\.general/pull/9128)\)\. -* keycloak\_clientscope\_type \- sort the default and optional clientscope lists to improve the diff \([https\://github\.com/ansible\-collections/community\.general/pull/9202](https\://github\.com/ansible\-collections/community\.general/pull/9202)\)\. -* slack \- fail if Slack API response is not OK with error message \([https\://github\.com/ansible\-collections/community\.general/pull/9198](https\://github\.com/ansible\-collections/community\.general/pull/9198)\)\. - - -### New Plugins - - -#### Filter - -* community\.general\.accumulate \- Produce a list of accumulated sums of the input list contents\. - - -### New Modules - -* community\.general\.decompress \- Decompresses compressed files\. -* community\.general\.proxmox\_backup \- Start a VM backup in Proxmox VE cluster\. - - -## v10\.0\.1 - - -### Release Summary - -Bugfix release for inclusion in Ansible 11\.0\.0rc1\. - - -### Bugfixes - -* keycloak\_client \- fix diff by removing code that turns the attributes dict which contains additional settings into a list \([https\://github\.com/ansible\-collections/community\.general/pull/9077](https\://github\.com/ansible\-collections/community\.general/pull/9077)\)\. -* keycloak\_clientscope \- fix diff and end\_state by removing the code that turns the attributes dict\, which contains additional config items\, into a list \([https\://github\.com/ansible\-collections/community\.general/pull/9082](https\://github\.com/ansible\-collections/community\.general/pull/9082)\)\. -* redfish\_utils module utils \- remove undocumented default applytime \([https\://github\.com/ansible\-collections/community\.general/pull/9114](https\://github\.com/ansible\-collections/community\.general/pull/9114)\)\. - - -## v10\.0\.0 - - -### Release Summary - -This is release 10\.0\.0 of community\.general\, released on 2024\-11\-04\. - - -### Minor Changes - -* CmdRunner module util \- argument formats can be specified as plain functions without calling cmd\_runner\_fmt\.as\_func\(\) \([https\://github\.com/ansible\-collections/community\.general/pull/8479](https\://github\.com/ansible\-collections/community\.general/pull/8479)\)\. -* CmdRunner module utils \- the parameter force\_lang now supports the special value auto which will automatically try and determine the best parsable locale in the system \([https\://github\.com/ansible\-collections/community\.general/pull/8517](https\://github\.com/ansible\-collections/community\.general/pull/8517)\)\. -* MH module utils \- add parameter when to cause\_changes decorator \([https\://github\.com/ansible\-collections/community\.general/pull/8766](https\://github\.com/ansible\-collections/community\.general/pull/8766)\)\. -* MH module utils \- minor refactor in decorators \([https\://github\.com/ansible\-collections/community\.general/pull/8766](https\://github\.com/ansible\-collections/community\.general/pull/8766)\)\. -* alternatives \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\. -* ansible\_galaxy\_install \- add return value version \([https\://github\.com/ansible\-collections/community\.general/pull/9060](https\://github\.com/ansible\-collections/community\.general/pull/9060)\)\. -* ansible\_galaxy\_install \- add upgrade feature \([https\://github\.com/ansible\-collections/community\.general/pull/8431](https\://github\.com/ansible\-collections/community\.general/pull/8431)\, [https\://github\.com/ansible\-collections/community\.general/issues/8351](https\://github\.com/ansible\-collections/community\.general/issues/8351)\)\. -* ansible\_galaxy\_install \- minor refactor in the module \([https\://github\.com/ansible\-collections/community\.general/pull/8413](https\://github\.com/ansible\-collections/community\.general/pull/8413)\)\. -* apache2\_mod\_proxy \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\. -* apache2\_mod\_proxy \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\. -* cargo \- add option directory\, which allows source directory to be specified \([https\://github\.com/ansible\-collections/community\.general/pull/8480](https\://github\.com/ansible\-collections/community\.general/pull/8480)\)\. -* cgroup\_memory\_recap\, hipchat\, jabber\, log\_plays\, loganalytics\, logentries\, logstash\, slack\, splunk\, sumologic\, syslog\_json callback plugins \- make sure that all options are typed \([https\://github\.com/ansible\-collections/community\.general/pull/8628](https\://github\.com/ansible\-collections/community\.general/pull/8628)\)\. -* chef\_databag\, consul\_kv\, cyberarkpassword\, dsv\, etcd\, filetree\, hiera\, onepassword\, onepassword\_doc\, onepassword\_raw\, passwordstore\, redis\, shelvefile\, tss lookup plugins \- make sure that all options are typed \([https\://github\.com/ansible\-collections/community\.general/pull/8626](https\://github\.com/ansible\-collections/community\.general/pull/8626)\)\. -* chroot\, funcd\, incus\, iocage\, jail\, lxc\, lxd\, qubes\, zone connection plugins \- make sure that all options are typed \([https\://github\.com/ansible\-collections/community\.general/pull/8627](https\://github\.com/ansible\-collections/community\.general/pull/8627)\)\. -* cmd\_runner module utils \- add decorator cmd\_runner\_fmt\.stack \([https\://github\.com/ansible\-collections/community\.general/pull/8415](https\://github\.com/ansible\-collections/community\.general/pull/8415)\)\. -* cmd\_runner module utils \- refactor argument formatting code to its own Python module \([https\://github\.com/ansible\-collections/community\.general/pull/8964](https\://github\.com/ansible\-collections/community\.general/pull/8964)\)\. -* cmd\_runner\_fmt module utils \- simplify implementation of cmd\_runner\_fmt\.as\_bool\_not\(\) \([https\://github\.com/ansible\-collections/community\.general/pull/8512](https\://github\.com/ansible\-collections/community\.general/pull/8512)\)\. -* cobbler\, linode\, lxd\, nmap\, online\, scaleway\, stackpath\_compute\, virtualbox inventory plugins \- make sure that all options are typed \([https\://github\.com/ansible\-collections/community\.general/pull/8625](https\://github\.com/ansible\-collections/community\.general/pull/8625)\)\. -* consul\_acl \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\. -* consul\_kv \- add argument for the datacenter option on Consul API \([https\://github\.com/ansible\-collections/community\.general/pull/9026](https\://github\.com/ansible\-collections/community\.general/pull/9026)\)\. -* copr \- Added includepkgs and excludepkgs parameters to limit the list of packages fetched or excluded from the repository\([https\://github\.com/ansible\-collections/community\.general/pull/8779](https\://github\.com/ansible\-collections/community\.general/pull/8779)\)\. -* cpanm \- add return value cpanm\_version \([https\://github\.com/ansible\-collections/community\.general/pull/9061](https\://github\.com/ansible\-collections/community\.general/pull/9061)\)\. -* credstash lookup plugin \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\. -* csv module utils \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\. -* deco MH module utils \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\. -* dig lookup plugin \- add port option to specify DNS server port \([https\://github\.com/ansible\-collections/community\.general/pull/8966](https\://github\.com/ansible\-collections/community\.general/pull/8966)\)\. -* django module utils \- always retrieve version \([https\://github\.com/ansible\-collections/community\.general/pull/9063](https\://github\.com/ansible\-collections/community\.general/pull/9063)\)\. -* django\_check \- add return value version \([https\://github\.com/ansible\-collections/community\.general/pull/9063](https\://github\.com/ansible\-collections/community\.general/pull/9063)\)\. -* django\_command \- add return value version \([https\://github\.com/ansible\-collections/community\.general/pull/9063](https\://github\.com/ansible\-collections/community\.general/pull/9063)\)\. -* django\_createcachetable \- add return value version \([https\://github\.com/ansible\-collections/community\.general/pull/9063](https\://github\.com/ansible\-collections/community\.general/pull/9063)\)\. -* doas\, dzdo\, ksu\, machinectl\, pbrun\, pfexec\, pmrun\, sesu\, sudosu become plugins \- make sure that all options are typed \([https\://github\.com/ansible\-collections/community\.general/pull/8623](https\://github\.com/ansible\-collections/community\.general/pull/8623)\)\. -* etcd3 \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\. -* flatpak \- improve the parsing of Flatpak application IDs based on official guidelines \([https\://github\.com/ansible\-collections/community\.general/pull/8909](https\://github\.com/ansible\-collections/community\.general/pull/8909)\)\. -* gconftool2 \- make use of ModuleHelper features to simplify code \([https\://github\.com/ansible\-collections/community\.general/pull/8711](https\://github\.com/ansible\-collections/community\.general/pull/8711)\)\. -* gcontool2 \- add return value version \([https\://github\.com/ansible\-collections/community\.general/pull/9064](https\://github\.com/ansible\-collections/community\.general/pull/9064)\)\. -* gcontool2 module utils \- add argument formatter version \([https\://github\.com/ansible\-collections/community\.general/pull/9064](https\://github\.com/ansible\-collections/community\.general/pull/9064)\)\. -* gcontool2\_info \- add return value version \([https\://github\.com/ansible\-collections/community\.general/pull/9064](https\://github\.com/ansible\-collections/community\.general/pull/9064)\)\. -* gio\_mime \- add return value version \([https\://github\.com/ansible\-collections/community\.general/pull/9067](https\://github\.com/ansible\-collections/community\.general/pull/9067)\)\. -* gio\_mime \- adjust code ahead of the old VardDict deprecation \([https\://github\.com/ansible\-collections/community\.general/pull/8855](https\://github\.com/ansible\-collections/community\.general/pull/8855)\)\. -* gio\_mime \- mute the old VarDict deprecation \([https\://github\.com/ansible\-collections/community\.general/pull/8776](https\://github\.com/ansible\-collections/community\.general/pull/8776)\)\. -* gio\_mime module utils \- add argument formatter version \([https\://github\.com/ansible\-collections/community\.general/pull/9067](https\://github\.com/ansible\-collections/community\.general/pull/9067)\)\. -* github\_app\_access\_token lookup plugin \- adds new private\_key parameter \([https\://github\.com/ansible\-collections/community\.general/pull/8989](https\://github\.com/ansible\-collections/community\.general/pull/8989)\)\. -* gitlab\_deploy\_key \- better construct when using dict\.items\(\) \([https\://github\.com/ansible\-collections/community\.general/pull/8876](https\://github\.com/ansible\-collections/community\.general/pull/8876)\)\. -* gitlab\_group \- add many new parameters \([https\://github\.com/ansible\-collections/community\.general/pull/8908](https\://github\.com/ansible\-collections/community\.general/pull/8908)\)\. -* gitlab\_group \- better construct when using dict\.items\(\) \([https\://github\.com/ansible\-collections/community\.general/pull/8876](https\://github\.com/ansible\-collections/community\.general/pull/8876)\)\. -* gitlab\_group \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\. -* gitlab\_issue \- better construct when using dict\.items\(\) \([https\://github\.com/ansible\-collections/community\.general/pull/8876](https\://github\.com/ansible\-collections/community\.general/pull/8876)\)\. -* gitlab\_merge\_request \- better construct when using dict\.items\(\) \([https\://github\.com/ansible\-collections/community\.general/pull/8876](https\://github\.com/ansible\-collections/community\.general/pull/8876)\)\. -* gitlab\_project \- add option container\_expiration\_policy to schedule container registry cleanup \([https\://github\.com/ansible\-collections/community\.general/pull/8674](https\://github\.com/ansible\-collections/community\.general/pull/8674)\)\. -* gitlab\_project \- add option issues\_access\_level to enable/disable project issues \([https\://github\.com/ansible\-collections/community\.general/pull/8760](https\://github\.com/ansible\-collections/community\.general/pull/8760)\)\. -* gitlab\_project \- add option model\_registry\_access\_level to disable model registry \([https\://github\.com/ansible\-collections/community\.general/pull/8688](https\://github\.com/ansible\-collections/community\.general/pull/8688)\)\. -* gitlab\_project \- add option pages\_access\_level to disable project pages \([https\://github\.com/ansible\-collections/community\.general/pull/8688](https\://github\.com/ansible\-collections/community\.general/pull/8688)\)\. -* gitlab\_project \- add option repository\_access\_level to disable project repository \([https\://github\.com/ansible\-collections/community\.general/pull/8674](https\://github\.com/ansible\-collections/community\.general/pull/8674)\)\. -* gitlab\_project \- add option service\_desk\_enabled to disable service desk \([https\://github\.com/ansible\-collections/community\.general/pull/8688](https\://github\.com/ansible\-collections/community\.general/pull/8688)\)\. -* gitlab\_project \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\. -* gitlab\_project \- sorted parameters in order to avoid future merge conflicts \([https\://github\.com/ansible\-collections/community\.general/pull/8759](https\://github\.com/ansible\-collections/community\.general/pull/8759)\)\. -* gitlab\_runner \- better construct when using dict\.items\(\) \([https\://github\.com/ansible\-collections/community\.general/pull/8876](https\://github\.com/ansible\-collections/community\.general/pull/8876)\)\. -* hashids filter plugin \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\. -* homebrew \- speed up brew install and upgrade \([https\://github\.com/ansible\-collections/community\.general/pull/9022](https\://github\.com/ansible\-collections/community\.general/pull/9022)\)\. -* hwc\_ecs\_instance \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\. -* hwc\_evs\_disk \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\. -* hwc\_vpc\_eip \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\. -* hwc\_vpc\_peering\_connect \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\. -* hwc\_vpc\_port \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\. -* hwc\_vpc\_subnet \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\. -* icinga2\_host \- replace loop with dict comprehension \([https\://github\.com/ansible\-collections/community\.general/pull/8876](https\://github\.com/ansible\-collections/community\.general/pull/8876)\)\. -* imc\_rest \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\. -* ipa\_dnsrecord \- adds SSHFP record type for managing SSH fingerprints in FreeIPA DNS \([https\://github\.com/ansible\-collections/community\.general/pull/8404](https\://github\.com/ansible\-collections/community\.general/pull/8404)\)\. -* ipa\_otptoken \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\. -* jenkins\_node \- add offline\_message parameter for updating a Jenkins node offline cause reason when the state is \"disabled\" \(offline\) \([https\://github\.com/ansible\-collections/community\.general/pull/9084](https\://github\.com/ansible\-collections/community\.general/pull/9084)\)\.\" -* jira \- adjust code ahead of the old VardDict deprecation \([https\://github\.com/ansible\-collections/community\.general/pull/8856](https\://github\.com/ansible\-collections/community\.general/pull/8856)\)\. -* jira \- mute the old VarDict deprecation \([https\://github\.com/ansible\-collections/community\.general/pull/8776](https\://github\.com/ansible\-collections/community\.general/pull/8776)\)\. -* jira \- replace deprecated params when using decorator cause\_changes \([https\://github\.com/ansible\-collections/community\.general/pull/8791](https\://github\.com/ansible\-collections/community\.general/pull/8791)\)\. -* keep\_keys filter plugin \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\. -* keycloak module utils \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\. -* keycloak\_client \- add client\-x509 choice to client\_authenticator\_type \([https\://github\.com/ansible\-collections/community\.general/pull/8973](https\://github\.com/ansible\-collections/community\.general/pull/8973)\)\. -* keycloak\_client \- assign auth flow by name \([https\://github\.com/ansible\-collections/community\.general/pull/8428](https\://github\.com/ansible\-collections/community\.general/pull/8428)\)\. -* keycloak\_client \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\. -* keycloak\_clientscope \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\. -* keycloak\_identity\_provider \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\. -* keycloak\_realm \- add boolean toggle to configure organization support for a given keycloak realm \([https\://github\.com/ansible\-collections/community\.general/issues/9027](https\://github\.com/ansible\-collections/community\.general/issues/9027)\, [https\://github\.com/ansible\-collections/community\.general/pull/8927/](https\://github\.com/ansible\-collections/community\.general/pull/8927/)\)\. -* keycloak\_user\_federation \- add module argument allowing users to optout of the removal of unspecified mappers\, for example to keep the keycloak default mappers \([https\://github\.com/ansible\-collections/community\.general/pull/8764](https\://github\.com/ansible\-collections/community\.general/pull/8764)\)\. -* keycloak\_user\_federation \- add the user federation config parameter referral to the module arguments \([https\://github\.com/ansible\-collections/community\.general/pull/8954](https\://github\.com/ansible\-collections/community\.general/pull/8954)\)\. -* keycloak\_user\_federation \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\. -* keycloak\_user\_federation \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\. -* keycloak\_user\_federation \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\. -* linode \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\. -* locale\_gen \- add support for multiple locales \([https\://github\.com/ansible\-collections/community\.general/issues/8677](https\://github\.com/ansible\-collections/community\.general/issues/8677)\, [https\://github\.com/ansible\-collections/community\.general/pull/8682](https\://github\.com/ansible\-collections/community\.general/pull/8682)\)\. -* lxc\_container \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\. -* lxd\_container \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\. -* manageiq\_provider \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\. -* mattermost \- adds support for message priority \([https\://github\.com/ansible\-collections/community\.general/issues/9068](https\://github\.com/ansible\-collections/community\.general/issues/9068)\, [https\://github\.com/ansible\-collections/community\.general/pull/9087](https\://github\.com/ansible\-collections/community\.general/pull/9087)\)\. -* memcached\, pickle\, redis\, yaml cache plugins \- make sure that all options are typed \([https\://github\.com/ansible\-collections/community\.general/pull/8624](https\://github\.com/ansible\-collections/community\.general/pull/8624)\)\. -* memset\_dns\_reload \- replace loop with dict\(\) \([https\://github\.com/ansible\-collections/community\.general/pull/8876](https\://github\.com/ansible\-collections/community\.general/pull/8876)\)\. -* memset\_memstore\_info \- replace loop with dict\(\) \([https\://github\.com/ansible\-collections/community\.general/pull/8876](https\://github\.com/ansible\-collections/community\.general/pull/8876)\)\. -* memset\_server\_info \- replace loop with dict\(\) \([https\://github\.com/ansible\-collections/community\.general/pull/8876](https\://github\.com/ansible\-collections/community\.general/pull/8876)\)\. -* memset\_zone \- replace loop with dict\(\) \([https\://github\.com/ansible\-collections/community\.general/pull/8876](https\://github\.com/ansible\-collections/community\.general/pull/8876)\)\. -* memset\_zone\_domain \- replace loop with dict\(\) \([https\://github\.com/ansible\-collections/community\.general/pull/8876](https\://github\.com/ansible\-collections/community\.general/pull/8876)\)\. -* memset\_zone\_record \- replace loop with dict\(\) \([https\://github\.com/ansible\-collections/community\.general/pull/8876](https\://github\.com/ansible\-collections/community\.general/pull/8876)\)\. -* nmcli \- add conn\_enable param to reload connection \([https\://github\.com/ansible\-collections/community\.general/issues/3752](https\://github\.com/ansible\-collections/community\.general/issues/3752)\, [https\://github\.com/ansible\-collections/community\.general/issues/8704](https\://github\.com/ansible\-collections/community\.general/issues/8704)\, [https\://github\.com/ansible\-collections/community\.general/pull/8897](https\://github\.com/ansible\-collections/community\.general/pull/8897)\)\. -* nmcli \- add state\=up and state\=down to enable/disable connections \([https\://github\.com/ansible\-collections/community\.general/issues/3752](https\://github\.com/ansible\-collections/community\.general/issues/3752)\, [https\://github\.com/ansible\-collections/community\.general/issues/8704](https\://github\.com/ansible\-collections/community\.general/issues/8704)\, [https\://github\.com/ansible\-collections/community\.general/issues/7152](https\://github\.com/ansible\-collections/community\.general/issues/7152)\, [https\://github\.com/ansible\-collections/community\.general/pull/8897](https\://github\.com/ansible\-collections/community\.general/pull/8897)\)\. -* nmcli \- better construct when using dict\.items\(\) \([https\://github\.com/ansible\-collections/community\.general/pull/8876](https\://github\.com/ansible\-collections/community\.general/pull/8876)\)\. -* npm \- add force parameter to allow \-\-force \([https\://github\.com/ansible\-collections/community\.general/pull/8885](https\://github\.com/ansible\-collections/community\.general/pull/8885)\)\. -* ocapi\_utils \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\. -* one\_image \- add create\, template and datastore\_id arguments for image creation \([https\://github\.com/ansible\-collections/community\.general/pull/9075](https\://github\.com/ansible\-collections/community\.general/pull/9075)\)\. -* one\_image \- add wait\_timeout argument for adjustable timeouts \([https\://github\.com/ansible\-collections/community\.general/pull/9075](https\://github\.com/ansible\-collections/community\.general/pull/9075)\)\. -* one\_image \- add option persistent to manage image persistence \([https\://github\.com/ansible\-collections/community\.general/issues/3578](https\://github\.com/ansible\-collections/community\.general/issues/3578)\, [https\://github\.com/ansible\-collections/community\.general/pull/8889](https\://github\.com/ansible\-collections/community\.general/pull/8889)\)\. -* one\_image \- extend xsd scheme to make it return a lot more info about image \([https\://github\.com/ansible\-collections/community\.general/pull/8889](https\://github\.com/ansible\-collections/community\.general/pull/8889)\)\. -* one\_image \- refactor code to make it more similar to one\_template and one\_vnet \([https\://github\.com/ansible\-collections/community\.general/pull/8889](https\://github\.com/ansible\-collections/community\.general/pull/8889)\)\. -* one\_image\_info \- extend xsd scheme to make it return a lot more info about image \([https\://github\.com/ansible\-collections/community\.general/pull/8889](https\://github\.com/ansible\-collections/community\.general/pull/8889)\)\. -* one\_image\_info \- refactor code to make it more similar to one\_template and one\_vnet \([https\://github\.com/ansible\-collections/community\.general/pull/8889](https\://github\.com/ansible\-collections/community\.general/pull/8889)\)\. -* one\_service \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\. -* one\_vm \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\. -* onepassword lookup plugin \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\. -* open\_iscsi \- allow login to a portal with multiple targets without specifying any of them \([https\://github\.com/ansible\-collections/community\.general/pull/8719](https\://github\.com/ansible\-collections/community\.general/pull/8719)\)\. -* openbsd\_pkg \- adds diff support to show changes in installed package list\. This does not yet work for check mode \([https\://github\.com/ansible\-collections/community\.general/pull/8402](https\://github\.com/ansible\-collections/community\.general/pull/8402)\)\. -* opennebula\.py \- add VM id and VM host to inventory host data \([https\://github\.com/ansible\-collections/community\.general/pull/8532](https\://github\.com/ansible\-collections/community\.general/pull/8532)\)\. -* opentelemetry callback plugin \- fix default value for store\_spans\_in\_file causing traces to be produced to a file named None \([https\://github\.com/ansible\-collections/community\.general/issues/8566](https\://github\.com/ansible\-collections/community\.general/issues/8566)\, [https\://github\.com/ansible\-collections/community\.general/pull/8741](https\://github\.com/ansible\-collections/community\.general/pull/8741)\)\. -* opkg \- add return value version \([https\://github\.com/ansible\-collections/community\.general/pull/9086](https\://github\.com/ansible\-collections/community\.general/pull/9086)\)\. -* passwordstore lookup plugin \- add subkey creation/update support \([https\://github\.com/ansible\-collections/community\.general/pull/8952](https\://github\.com/ansible\-collections/community\.general/pull/8952)\)\. -* passwordstore lookup plugin \- add the current user to the lockfile file name to address issues on multi\-user systems \([https\://github\.com/ansible\-collections/community\.general/pull/8689](https\://github\.com/ansible\-collections/community\.general/pull/8689)\)\. -* pids \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\. -* pipx \- add parameter suffix to module \([https\://github\.com/ansible\-collections/community\.general/pull/8675](https\://github\.com/ansible\-collections/community\.general/pull/8675)\, [https\://github\.com/ansible\-collections/community\.general/issues/8656](https\://github\.com/ansible\-collections/community\.general/issues/8656)\)\. -* pipx \- added new states install\_all\, uninject\, upgrade\_shared\, pin\, and unpin \([https\://github\.com/ansible\-collections/community\.general/pull/8809](https\://github\.com/ansible\-collections/community\.general/pull/8809)\)\. -* pipx \- added parameter global to module \([https\://github\.com/ansible\-collections/community\.general/pull/8793](https\://github\.com/ansible\-collections/community\.general/pull/8793)\)\. -* pipx \- refactor out parsing of pipx list output to module utils \([https\://github\.com/ansible\-collections/community\.general/pull/9044](https\://github\.com/ansible\-collections/community\.general/pull/9044)\)\. -* pipx \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\. -* pipx\_info \- add new return value pinned \([https\://github\.com/ansible\-collections/community\.general/pull/9044](https\://github\.com/ansible\-collections/community\.general/pull/9044)\)\. -* pipx\_info \- added parameter global to module \([https\://github\.com/ansible\-collections/community\.general/pull/8793](https\://github\.com/ansible\-collections/community\.general/pull/8793)\)\. -* pipx\_info \- refactor out parsing of pipx list output to module utils \([https\://github\.com/ansible\-collections/community\.general/pull/9044](https\://github\.com/ansible\-collections/community\.general/pull/9044)\)\. -* pipx\_info \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\. -* pkg5\_publisher \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\. -* pkgng \- add option use\_globs \(default true\) to optionally disable glob patterns \([https\://github\.com/ansible\-collections/community\.general/issues/8632](https\://github\.com/ansible\-collections/community\.general/issues/8632)\, [https\://github\.com/ansible\-collections/community\.general/pull/8633](https\://github\.com/ansible\-collections/community\.general/pull/8633)\)\. -* proxmox \- add disk\_volume and mount\_volumes keys for better readability \([https\://github\.com/ansible\-collections/community\.general/pull/8542](https\://github\.com/ansible\-collections/community\.general/pull/8542)\)\. -* proxmox \- allow specification of the API port when using proxmox\_\* \([https\://github\.com/ansible\-collections/community\.general/issues/8440](https\://github\.com/ansible\-collections/community\.general/issues/8440)\, [https\://github\.com/ansible\-collections/community\.general/pull/8441](https\://github\.com/ansible\-collections/community\.general/pull/8441)\)\. -* proxmox \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\. -* proxmox \- translate the old disk and mounts keys to the new handling internally \([https\://github\.com/ansible\-collections/community\.general/pull/8542](https\://github\.com/ansible\-collections/community\.general/pull/8542)\)\. -* proxmox inventory plugin \- add new fact for LXC interface details \([https\://github\.com/ansible\-collections/community\.general/pull/8713](https\://github\.com/ansible\-collections/community\.general/pull/8713)\)\. -* proxmox inventory plugin \- clean up authentication code \([https\://github\.com/ansible\-collections/community\.general/pull/8917](https\://github\.com/ansible\-collections/community\.general/pull/8917)\)\. -* proxmox inventory plugin \- fix urllib3 InsecureRequestWarnings not being suppressed when a token is used \([https\://github\.com/ansible\-collections/community\.general/pull/9099](https\://github\.com/ansible\-collections/community\.general/pull/9099)\)\. -* proxmox\_disk \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\. -* proxmox\_kvm \- adds the ciupgrade parameter to specify whether cloud\-init should upgrade system packages at first boot \([https\://github\.com/ansible\-collections/community\.general/pull/9066](https\://github\.com/ansible\-collections/community\.general/pull/9066)\)\. -* proxmox\_kvm \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\. -* proxmox\_kvm \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\. -* proxmox\_template \- small refactor in logic for determining whether a template exists or not \([https\://github\.com/ansible\-collections/community\.general/pull/8516](https\://github\.com/ansible\-collections/community\.general/pull/8516)\)\. -* proxmox\_vm\_info \- add network option to retrieve current network information \([https\://github\.com/ansible\-collections/community\.general/pull/8471](https\://github\.com/ansible\-collections/community\.general/pull/8471)\)\. -* redfish\_\* modules \- adds ciphers option for custom cipher selection \([https\://github\.com/ansible\-collections/community\.general/pull/8533](https\://github\.com/ansible\-collections/community\.general/pull/8533)\)\. -* redfish\_command \- add UpdateUserAccountTypes command \([https\://github\.com/ansible\-collections/community\.general/issues/9058](https\://github\.com/ansible\-collections/community\.general/issues/9058)\, [https\://github\.com/ansible\-collections/community\.general/pull/9059](https\://github\.com/ansible\-collections/community\.general/pull/9059)\)\. -* redfish\_command \- add wait and wait\_timeout options to allow a user to block a command until a service is accessible after performing the requested command \([https\://github\.com/ansible\-collections/community\.general/issues/8051](https\://github\.com/ansible\-collections/community\.general/issues/8051)\, [https\://github\.com/ansible\-collections/community\.general/pull/8434](https\://github\.com/ansible\-collections/community\.general/pull/8434)\)\. -* redfish\_command \- add handling of the PasswordChangeRequired message from services in the UpdateUserPassword command to directly modify the user\'s password if the requested user is the one invoking the operation \([https\://github\.com/ansible\-collections/community\.general/issues/8652](https\://github\.com/ansible\-collections/community\.general/issues/8652)\, [https\://github\.com/ansible\-collections/community\.general/pull/8653](https\://github\.com/ansible\-collections/community\.general/pull/8653)\)\. -* redfish\_confg \- remove CapacityBytes from required paramaters of the CreateVolume command \([https\://github\.com/ansible\-collections/community\.general/pull/8956](https\://github\.com/ansible\-collections/community\.general/pull/8956)\)\. -* redfish\_config \- add parameter storage\_none\_volume\_deletion to CreateVolume command in order to control the automatic deletion of non\-RAID volumes \([https\://github\.com/ansible\-collections/community\.general/pull/8990](https\://github\.com/ansible\-collections/community\.general/pull/8990)\)\. -* redfish\_info \- add command CheckAvailability to check if a service is accessible \([https\://github\.com/ansible\-collections/community\.general/issues/8051](https\://github\.com/ansible\-collections/community\.general/issues/8051)\, [https\://github\.com/ansible\-collections/community\.general/pull/8434](https\://github\.com/ansible\-collections/community\.general/pull/8434)\)\. -* redfish\_info \- adds RedfishURI and StorageId to Disk inventory \([https\://github\.com/ansible\-collections/community\.general/pull/8937](https\://github\.com/ansible\-collections/community\.general/pull/8937)\)\. -* redfish\_utils \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\. -* redfish\_utils module utils \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\. -* redfish\_utils module utils \- schedule a BIOS configuration job at next reboot when the BIOS config is changed \([https\://github\.com/ansible\-collections/community\.general/pull/9012](https\://github\.com/ansible\-collections/community\.general/pull/9012)\)\. -* redis cache plugin \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\. -* redis\, redis\_info \- add client\_cert and client\_key options to specify path to certificate for Redis authentication \([https\://github\.com/ansible\-collections/community\.general/pull/8654](https\://github\.com/ansible\-collections/community\.general/pull/8654)\)\. -* redis\_info \- adds support for getting cluster info \([https\://github\.com/ansible\-collections/community\.general/pull/8464](https\://github\.com/ansible\-collections/community\.general/pull/8464)\)\. -* remove\_keys filter plugin \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\. -* replace\_keys filter plugin \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\. -* scaleway \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\. -* scaleway module utils \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\. -* scaleway\_compute \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\. -* scaleway\_container \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8858](https\://github\.com/ansible\-collections/community\.general/pull/8858)\)\. -* scaleway\_container\_info \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8858](https\://github\.com/ansible\-collections/community\.general/pull/8858)\)\. -* scaleway\_container\_namespace \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8858](https\://github\.com/ansible\-collections/community\.general/pull/8858)\)\. -* scaleway\_container\_namespace\_info \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8858](https\://github\.com/ansible\-collections/community\.general/pull/8858)\)\. -* scaleway\_container\_registry \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8858](https\://github\.com/ansible\-collections/community\.general/pull/8858)\)\. -* scaleway\_container\_registry\_info \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8858](https\://github\.com/ansible\-collections/community\.general/pull/8858)\)\. -* scaleway\_function \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8858](https\://github\.com/ansible\-collections/community\.general/pull/8858)\)\. -* scaleway\_function\_info \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8858](https\://github\.com/ansible\-collections/community\.general/pull/8858)\)\. -* scaleway\_function\_namespace \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8858](https\://github\.com/ansible\-collections/community\.general/pull/8858)\)\. -* scaleway\_function\_namespace\_info \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8858](https\://github\.com/ansible\-collections/community\.general/pull/8858)\)\. -* scaleway\_ip \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\. -* scaleway\_lb \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\. -* scaleway\_security\_group \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\. -* scaleway\_security\_group \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\. -* scaleway\_user\_data \- better construct when using dict\.items\(\) \([https\://github\.com/ansible\-collections/community\.general/pull/8876](https\://github\.com/ansible\-collections/community\.general/pull/8876)\)\. -* scaleway\_user\_data \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\. -* sensu\_silence \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\. -* snmp\_facts \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\. -* sorcery \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\. -* sudosu become plugin \- added an option \(alt\_method\) to enhance compatibility with more versions of su \([https\://github\.com/ansible\-collections/community\.general/pull/8214](https\://github\.com/ansible\-collections/community\.general/pull/8214)\)\. -* udm\_dns\_record \- replace loop with dict\.update\(\) \([https\://github\.com/ansible\-collections/community\.general/pull/8876](https\://github\.com/ansible\-collections/community\.general/pull/8876)\)\. -* ufw \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\. -* unsafe plugin utils \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\. -* vardict module utils \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\. -* vars MH module utils \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\. -* virtualbox inventory plugin \- expose a new parameter enable\_advanced\_group\_parsing to change how the VirtualBox dynamic inventory parses VM groups \([https\://github\.com/ansible\-collections/community\.general/issues/8508](https\://github\.com/ansible\-collections/community\.general/issues/8508)\, [https\://github\.com/ansible\-collections/community\.general/pull/8510](https\://github\.com/ansible\-collections/community\.general/pull/8510)\)\. -* vmadm \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\. -* wdc\_redfish\_command \- minor change to handle upgrade file for Redfish WD platforms \([https\://github\.com/ansible\-collections/community\.general/pull/8444](https\://github\.com/ansible\-collections/community\.general/pull/8444)\)\. - - -### Breaking Changes / Porting Guide - -* The collection no longer supports ansible\-core 2\.13 and ansible\-core 2\.14\. While most \(or even all\) modules and plugins might still work with these versions\, they are no longer tested in CI and breakages regarding them will not be fixed \([https\://github\.com/ansible\-collections/community\.general/pull/8921](https\://github\.com/ansible\-collections/community\.general/pull/8921)\)\. -* cmd\_runner module utils \- CLI arguments created directly from module parameters are no longer assigned a default formatter \([https\://github\.com/ansible\-collections/community\.general/pull/8928](https\://github\.com/ansible\-collections/community\.general/pull/8928)\)\. -* irc \- the defaults of use\_tls and validate\_certs changed from false to true \([https\://github\.com/ansible\-collections/community\.general/pull/8918](https\://github\.com/ansible\-collections/community\.general/pull/8918)\)\. -* rhsm\_repository \- the states present and absent have been removed\. Use enabled and disabled instead \([https\://github\.com/ansible\-collections/community\.general/pull/8918](https\://github\.com/ansible\-collections/community\.general/pull/8918)\)\. - - -### Deprecated Features - -* CmdRunner module util \- setting the value of the ignore\_none parameter within a CmdRunner context is deprecated and that feature should be removed in community\.general 12\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/8479](https\://github\.com/ansible\-collections/community\.general/pull/8479)\)\. -* MH decorator cause\_changes module utils \- deprecate parameters on\_success and on\_failure \([https\://github\.com/ansible\-collections/community\.general/pull/8791](https\://github\.com/ansible\-collections/community\.general/pull/8791)\)\. -* git\_config \- the list\_all option has been deprecated and will be removed in community\.general 11\.0\.0\. Use the community\.general\.git\_config\_info module instead \([https\://github\.com/ansible\-collections/community\.general/pull/8453](https\://github\.com/ansible\-collections/community\.general/pull/8453)\)\. -* git\_config \- using state\=present without providing value is deprecated and will be disallowed in community\.general 11\.0\.0\. Use the community\.general\.git\_config\_info module instead to read a value \([https\://github\.com/ansible\-collections/community\.general/pull/8453](https\://github\.com/ansible\-collections/community\.general/pull/8453)\)\. -* hipchat \- the hipchat service has been discontinued and the self\-hosted variant has been End of Life since 2020\. The module is therefore deprecated and will be removed from community\.general 11\.0\.0 if nobody provides compelling reasons to still keep it \([https\://github\.com/ansible\-collections/community\.general/pull/8919](https\://github\.com/ansible\-collections/community\.general/pull/8919)\)\. -* pipx \- support for versions of the command line tool pipx older than 1\.7\.0 is deprecated and will be removed in community\.general 11\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/8793](https\://github\.com/ansible\-collections/community\.general/pull/8793)\)\. -* pipx\_info \- support for versions of the command line tool pipx older than 1\.7\.0 is deprecated and will be removed in community\.general 11\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/8793](https\://github\.com/ansible\-collections/community\.general/pull/8793)\)\. - - -### Removed Features \(previously deprecated\) - -* The consul\_acl module has been removed\. Use community\.general\.consul\_token and/or community\.general\.consul\_policy instead \([https\://github\.com/ansible\-collections/community\.general/pull/8921](https\://github\.com/ansible\-collections/community\.general/pull/8921)\)\. -* The hipchat callback plugin has been removed\. The hipchat service has been discontinued and the self\-hosted variant has been End of Life since 2020 \([https\://github\.com/ansible\-collections/community\.general/pull/8921](https\://github\.com/ansible\-collections/community\.general/pull/8921)\)\. -* The redhat module utils has been removed \([https\://github\.com/ansible\-collections/community\.general/pull/8921](https\://github\.com/ansible\-collections/community\.general/pull/8921)\)\. -* The rhn\_channel module has been removed \([https\://github\.com/ansible\-collections/community\.general/pull/8921](https\://github\.com/ansible\-collections/community\.general/pull/8921)\)\. -* The rhn\_register module has been removed \([https\://github\.com/ansible\-collections/community\.general/pull/8921](https\://github\.com/ansible\-collections/community\.general/pull/8921)\)\. -* consul \- removed the ack\_params\_state\_absent option\. It had no effect anymore \([https\://github\.com/ansible\-collections/community\.general/pull/8918](https\://github\.com/ansible\-collections/community\.general/pull/8918)\)\. -* ejabberd\_user \- removed the logging option \([https\://github\.com/ansible\-collections/community\.general/pull/8918](https\://github\.com/ansible\-collections/community\.general/pull/8918)\)\. -* gitlab modules \- remove basic auth feature \([https\://github\.com/ansible\-collections/community\.general/pull/8405](https\://github\.com/ansible\-collections/community\.general/pull/8405)\)\. -* proxmox\_kvm \- removed the proxmox\_default\_behavior option\. Explicitly specify the old default values if you were using proxmox\_default\_behavior\=compatibility\, otherwise simply remove it \([https\://github\.com/ansible\-collections/community\.general/pull/8918](https\://github\.com/ansible\-collections/community\.general/pull/8918)\)\. -* redhat\_subscriptions \- removed the pool option\. Use pool\_ids instead \([https\://github\.com/ansible\-collections/community\.general/pull/8918](https\://github\.com/ansible\-collections/community\.general/pull/8918)\)\. - - -### Bugfixes - -* bitwarden lookup plugin \- fix KeyError in search\_field \([https\://github\.com/ansible\-collections/community\.general/issues/8549](https\://github\.com/ansible\-collections/community\.general/issues/8549)\, [https\://github\.com/ansible\-collections/community\.general/pull/8557](https\://github\.com/ansible\-collections/community\.general/pull/8557)\)\. -* bitwarden lookup plugin \- support BWS v0\.3\.0 syntax breaking change \([https\://github\.com/ansible\-collections/community\.general/pull/9028](https\://github\.com/ansible\-collections/community\.general/pull/9028)\)\. -* cloudflare\_dns \- fix changing Cloudflare SRV records \([https\://github\.com/ansible\-collections/community\.general/issues/8679](https\://github\.com/ansible\-collections/community\.general/issues/8679)\, [https\://github\.com/ansible\-collections/community\.general/pull/8948](https\://github\.com/ansible\-collections/community\.general/pull/8948)\)\. -* cmd\_runner module utils \- call to get\_best\_parsable\_locales\(\) was missing parameter \([https\://github\.com/ansible\-collections/community\.general/pull/8929](https\://github\.com/ansible\-collections/community\.general/pull/8929)\)\. -* collection\_version lookup plugin \- use importlib directly instead of the deprecated and in ansible\-core 2\.19 removed ansible\.module\_utils\.compat\.importlib \([https\://github\.com/ansible\-collections/community\.general/pull/9084](https\://github\.com/ansible\-collections/community\.general/pull/9084)\)\. -* cpanm \- use new VarDict to prevent deprecation warning \([https\://github\.com/ansible\-collections/community\.general/issues/8410](https\://github\.com/ansible\-collections/community\.general/issues/8410)\, [https\://github\.com/ansible\-collections/community\.general/pull/8411](https\://github\.com/ansible\-collections/community\.general/pull/8411)\)\. -* dig lookup plugin \- fix using only the last nameserver specified \([https\://github\.com/ansible\-collections/community\.general/pull/8970](https\://github\.com/ansible\-collections/community\.general/pull/8970)\)\. -* django module utils \- use new VarDict to prevent deprecation warning \([https\://github\.com/ansible\-collections/community\.general/issues/8410](https\://github\.com/ansible\-collections/community\.general/issues/8410)\, [https\://github\.com/ansible\-collections/community\.general/pull/8411](https\://github\.com/ansible\-collections/community\.general/pull/8411)\)\. -* django\_command \- option command is now split lexically before passed to underlying PythonRunner \([https\://github\.com/ansible\-collections/community\.general/pull/8944](https\://github\.com/ansible\-collections/community\.general/pull/8944)\)\. -* gconftool2\_info \- use new VarDict to prevent deprecation warning \([https\://github\.com/ansible\-collections/community\.general/issues/8410](https\://github\.com/ansible\-collections/community\.general/issues/8410)\, [https\://github\.com/ansible\-collections/community\.general/pull/8411](https\://github\.com/ansible\-collections/community\.general/pull/8411)\)\. -* git\_config \- fix behavior of state\=absent if value is present \([https\://github\.com/ansible\-collections/community\.general/issues/8436](https\://github\.com/ansible\-collections/community\.general/issues/8436)\, [https\://github\.com/ansible\-collections/community\.general/pull/8452](https\://github\.com/ansible\-collections/community\.general/pull/8452)\)\. -* gitlab\_group\_access\_token \- fix crash in check mode caused by attempted access to a newly created access token \([https\://github\.com/ansible\-collections/community\.general/pull/8796](https\://github\.com/ansible\-collections/community\.general/pull/8796)\)\. -* gitlab\_label \- update label\'s color \([https\://github\.com/ansible\-collections/community\.general/pull/9010](https\://github\.com/ansible\-collections/community\.general/pull/9010)\)\. -* gitlab\_project \- fix container\_expiration\_policy not being applied when creating a new project \([https\://github\.com/ansible\-collections/community\.general/pull/8790](https\://github\.com/ansible\-collections/community\.general/pull/8790)\)\. -* gitlab\_project \- fix crash caused by old Gitlab projects not having a container\_expiration\_policy attribute \([https\://github\.com/ansible\-collections/community\.general/pull/8790](https\://github\.com/ansible\-collections/community\.general/pull/8790)\)\. -* gitlab\_project\_access\_token \- fix crash in check mode caused by attempted access to a newly created access token \([https\://github\.com/ansible\-collections/community\.general/pull/8796](https\://github\.com/ansible\-collections/community\.general/pull/8796)\)\. -* gitlab\_runner \- fix paused parameter being ignored \([https\://github\.com/ansible\-collections/community\.general/pull/8648](https\://github\.com/ansible\-collections/community\.general/pull/8648)\)\. -* homebrew \- do not fail when brew prints warnings \([https\://github\.com/ansible\-collections/community\.general/pull/8406](https\://github\.com/ansible\-collections/community\.general/pull/8406)\, [https\://github\.com/ansible\-collections/community\.general/issues/7044](https\://github\.com/ansible\-collections/community\.general/issues/7044)\)\. -* homebrew\_cask \- fix upgrade\_all returns changed when nothing upgraded \([https\://github\.com/ansible\-collections/community\.general/issues/8707](https\://github\.com/ansible\-collections/community\.general/issues/8707)\, [https\://github\.com/ansible\-collections/community\.general/pull/8708](https\://github\.com/ansible\-collections/community\.general/pull/8708)\)\. -* homectl \- the module now tries to use legacycrypt on Python 3\.13\+ \([https\://github\.com/ansible\-collections/community\.general/issues/4691](https\://github\.com/ansible\-collections/community\.general/issues/4691)\, [https\://github\.com/ansible\-collections/community\.general/pull/8987](https\://github\.com/ansible\-collections/community\.general/pull/8987)\)\. -* hponcfg \- use new VarDict to prevent deprecation warning \([https\://github\.com/ansible\-collections/community\.general/issues/8410](https\://github\.com/ansible\-collections/community\.general/issues/8410)\, [https\://github\.com/ansible\-collections/community\.general/pull/8411](https\://github\.com/ansible\-collections/community\.general/pull/8411)\)\. -* ini\_file \- pass absolute paths to module\.atomic\_move\(\) \([https\://github\.com/ansible/ansible/issues/83950](https\://github\.com/ansible/ansible/issues/83950)\, [https\://github\.com/ansible\-collections/community\.general/pull/8925](https\://github\.com/ansible\-collections/community\.general/pull/8925)\)\. -* ipa\_host \- add force\_create\, fix enabled and disabled states \([https\://github\.com/ansible\-collections/community\.general/issues/1094](https\://github\.com/ansible\-collections/community\.general/issues/1094)\, [https\://github\.com/ansible\-collections/community\.general/pull/8920](https\://github\.com/ansible\-collections/community\.general/pull/8920)\)\. -* ipa\_hostgroup \- fix enabled \`\` and \`\`disabled states \([https\://github\.com/ansible\-collections/community\.general/issues/8408](https\://github\.com/ansible\-collections/community\.general/issues/8408)\, [https\://github\.com/ansible\-collections/community\.general/pull/8900](https\://github\.com/ansible\-collections/community\.general/pull/8900)\)\. -* java\_keystore \- pass absolute paths to module\.atomic\_move\(\) \([https\://github\.com/ansible/ansible/issues/83950](https\://github\.com/ansible/ansible/issues/83950)\, [https\://github\.com/ansible\-collections/community\.general/pull/8925](https\://github\.com/ansible\-collections/community\.general/pull/8925)\)\. -* jenkins\_node \- fixed enabled\, disable and absent node state redirect authorization issues\, same as was present for present \([https\://github\.com/ansible\-collections/community\.general/pull/9084](https\://github\.com/ansible\-collections/community\.general/pull/9084)\)\. -* jenkins\_plugin \- pass absolute paths to module\.atomic\_move\(\) \([https\://github\.com/ansible/ansible/issues/83950](https\://github\.com/ansible/ansible/issues/83950)\, [https\://github\.com/ansible\-collections/community\.general/pull/8925](https\://github\.com/ansible\-collections/community\.general/pull/8925)\)\. -* kdeconfig \- pass absolute paths to module\.atomic\_move\(\) \([https\://github\.com/ansible/ansible/issues/83950](https\://github\.com/ansible/ansible/issues/83950)\, [https\://github\.com/ansible\-collections/community\.general/pull/8925](https\://github\.com/ansible\-collections/community\.general/pull/8925)\)\. -* kernel\_blacklist \- use new VarDict to prevent deprecation warning \([https\://github\.com/ansible\-collections/community\.general/issues/8410](https\://github\.com/ansible\-collections/community\.general/issues/8410)\, [https\://github\.com/ansible\-collections/community\.general/pull/8411](https\://github\.com/ansible\-collections/community\.general/pull/8411)\)\. -* keycloak\_client \- fix TypeError when sanitizing the saml\.signing\.private\.key attribute in the module\'s diff or state output\. The sanitize\_cr function expected a dict where in some cases a list might occur \([https\://github\.com/ansible\-collections/community\.general/pull/8403](https\://github\.com/ansible\-collections/community\.general/pull/8403)\)\. -* keycloak\_clientscope \- remove IDs from clientscope and its protocol mappers on comparison for changed check \([https\://github\.com/ansible\-collections/community\.general/pull/8545](https\://github\.com/ansible\-collections/community\.general/pull/8545)\)\. -* keycloak\_clientscope\_type \- fix detect changes in check mode \([https\://github\.com/ansible\-collections/community\.general/issues/9092](https\://github\.com/ansible\-collections/community\.general/issues/9092)\, [https\://github\.com/ansible\-collections/community\.general/pull/9093](https\://github\.com/ansible\-collections/community\.general/pull/9093)\)\. -* keycloak\_group \- fix crash caused in subgroup creation\. The crash was caused by a missing or empty subGroups property in Keycloak ≥23 \([https\://github\.com/ansible\-collections/community\.general/issues/8788](https\://github\.com/ansible\-collections/community\.general/issues/8788)\, [https\://github\.com/ansible\-collections/community\.general/pull/8979](https\://github\.com/ansible\-collections/community\.general/pull/8979)\)\. -* keycloak\_realm \- add normalizations for attributes and protocol\_mappers \([https\://github\.com/ansible\-collections/community\.general/pull/8496](https\://github\.com/ansible\-collections/community\.general/pull/8496)\)\. -* keycloak\_realm \- fix change detection in check mode by sorting the lists in the realms beforehand \([https\://github\.com/ansible\-collections/community\.general/pull/8877](https\://github\.com/ansible\-collections/community\.general/pull/8877)\)\. -* keycloak\_realm\_key \- fix invalid usage of parent\_id \([https\://github\.com/ansible\-collections/community\.general/issues/7850](https\://github\.com/ansible\-collections/community\.general/issues/7850)\, [https\://github\.com/ansible\-collections/community\.general/pull/8823](https\://github\.com/ansible\-collections/community\.general/pull/8823)\)\. -* keycloak\_user\_federation \- add module argument allowing users to configure the update mode for the parameter bindCredential \([https\://github\.com/ansible\-collections/community\.general/pull/8898](https\://github\.com/ansible\-collections/community\.general/pull/8898)\)\. -* keycloak\_user\_federation \- fix key error when removing mappers during an update and new mappers are specified in the module args \([https\://github\.com/ansible\-collections/community\.general/pull/8762](https\://github\.com/ansible\-collections/community\.general/pull/8762)\)\. -* keycloak\_user\_federation \- fix the UnboundLocalError that occurs when an ID is provided for a user federation mapper \([https\://github\.com/ansible\-collections/community\.general/pull/8831](https\://github\.com/ansible\-collections/community\.general/pull/8831)\)\. -* keycloak\_user\_federation \- get cleartext IDP clientSecret from full realm info to detect changes to it \([https\://github\.com/ansible\-collections/community\.general/issues/8294](https\://github\.com/ansible\-collections/community\.general/issues/8294)\, [https\://github\.com/ansible\-collections/community\.general/pull/8735](https\://github\.com/ansible\-collections/community\.general/pull/8735)\)\. -* keycloak\_user\_federation \- minimize change detection by setting krbPrincipalAttribute to \'\' in Keycloak responses if missing \([https\://github\.com/ansible\-collections/community\.general/pull/8785](https\://github\.com/ansible\-collections/community\.general/pull/8785)\)\. -* keycloak\_user\_federation \- remove lastSync parameter from Keycloak responses to minimize diff/changes \([https\://github\.com/ansible\-collections/community\.general/pull/8812](https\://github\.com/ansible\-collections/community\.general/pull/8812)\)\. -* keycloak\_user\_federation \- remove existing user federation mappers if they are not present in the federation configuration and will not be updated \([https\://github\.com/ansible\-collections/community\.general/issues/7169](https\://github\.com/ansible\-collections/community\.general/issues/7169)\, [https\://github\.com/ansible\-collections/community\.general/pull/8695](https\://github\.com/ansible\-collections/community\.general/pull/8695)\)\. -* keycloak\_user\_federation \- sort desired and after mapper list by name \(analog to before mapper list\) to minimize diff and make change detection more accurate \([https\://github\.com/ansible\-collections/community\.general/pull/8761](https\://github\.com/ansible\-collections/community\.general/pull/8761)\)\. -* keycloak\_userprofile \- fix empty response when fetching userprofile component by removing parent\=parent\_id filter \([https\://github\.com/ansible\-collections/community\.general/pull/8923](https\://github\.com/ansible\-collections/community\.general/pull/8923)\)\. -* keycloak\_userprofile \- improve diff by deserializing the fetched kc\.user\.profile\.config and serialize it only when sending back \([https\://github\.com/ansible\-collections/community\.general/pull/8940](https\://github\.com/ansible\-collections/community\.general/pull/8940)\)\. -* launched \- correctly report changed status in check mode \([https\://github\.com/ansible\-collections/community\.general/pull/8406](https\://github\.com/ansible\-collections/community\.general/pull/8406)\)\. -* locale\_gen \- use new VarDict to prevent deprecation warning \([https\://github\.com/ansible\-collections/community\.general/issues/8410](https\://github\.com/ansible\-collections/community\.general/issues/8410)\, [https\://github\.com/ansible\-collections/community\.general/pull/8411](https\://github\.com/ansible\-collections/community\.general/pull/8411)\)\. -* lxd\_container \- fix bug introduced in previous commit \([https\://github\.com/ansible\-collections/community\.general/pull/8895](https\://github\.com/ansible\-collections/community\.general/pull/8895)\, [https\://github\.com/ansible\-collections/community\.general/issues/8888](https\://github\.com/ansible\-collections/community\.general/issues/8888)\)\. -* mksysb \- use new VarDict to prevent deprecation warning \([https\://github\.com/ansible\-collections/community\.general/issues/8410](https\://github\.com/ansible\-collections/community\.general/issues/8410)\, [https\://github\.com/ansible\-collections/community\.general/pull/8411](https\://github\.com/ansible\-collections/community\.general/pull/8411)\)\. -* modprobe \- fix check mode not being honored for persistent option \([https\://github\.com/ansible\-collections/community\.general/issues/9051](https\://github\.com/ansible\-collections/community\.general/issues/9051)\, [https\://github\.com/ansible\-collections/community\.general/pull/9052](https\://github\.com/ansible\-collections/community\.general/pull/9052)\)\. -* nsupdate \- fix \'index out of range\' error when changing NS records by falling back to authority section of the response \([https\://github\.com/ansible\-collections/community\.general/issues/8612](https\://github\.com/ansible\-collections/community\.general/issues/8612)\, [https\://github\.com/ansible\-collections/community\.general/pull/8614](https\://github\.com/ansible\-collections/community\.general/pull/8614)\)\. -* one\_host \- fix if statements for cases when ID\=0 \([https\://github\.com/ansible\-collections/community\.general/issues/1199](https\://github\.com/ansible\-collections/community\.general/issues/1199)\, [https\://github\.com/ansible\-collections/community\.general/pull/8907](https\://github\.com/ansible\-collections/community\.general/pull/8907)\)\. -* one\_image \- fix module failing due to a class method typo \([https\://github\.com/ansible\-collections/community\.general/pull/9056](https\://github\.com/ansible\-collections/community\.general/pull/9056)\)\. -* one\_image\_info \- fix module failing due to a class method typo \([https\://github\.com/ansible\-collections/community\.general/pull/9056](https\://github\.com/ansible\-collections/community\.general/pull/9056)\)\. -* one\_service \- fix service creation after it was deleted with unique parameter \([https\://github\.com/ansible\-collections/community\.general/issues/3137](https\://github\.com/ansible\-collections/community\.general/issues/3137)\, [https\://github\.com/ansible\-collections/community\.general/pull/8887](https\://github\.com/ansible\-collections/community\.general/pull/8887)\)\. -* one\_vnet \- fix module failing due to a variable typo \([https\://github\.com/ansible\-collections/community\.general/pull/9019](https\://github\.com/ansible\-collections/community\.general/pull/9019)\)\. -* opennebula inventory plugin \- fix invalid reference to IP when inventory runs against NICs with no IPv4 address \([https\://github\.com/ansible\-collections/community\.general/pull/8489](https\://github\.com/ansible\-collections/community\.general/pull/8489)\)\. -* opentelemetry callback \- do not save the JSON response when using the ansible\.builtin\.uri module \([https\://github\.com/ansible\-collections/community\.general/pull/8430](https\://github\.com/ansible\-collections/community\.general/pull/8430)\)\. -* opentelemetry callback \- do not save the content response when using the ansible\.builtin\.slurp module \([https\://github\.com/ansible\-collections/community\.general/pull/8430](https\://github\.com/ansible\-collections/community\.general/pull/8430)\)\. -* pam\_limits \- pass absolute paths to module\.atomic\_move\(\) \([https\://github\.com/ansible/ansible/issues/83950](https\://github\.com/ansible/ansible/issues/83950)\, [https\://github\.com/ansible\-collections/community\.general/pull/8925](https\://github\.com/ansible\-collections/community\.general/pull/8925)\)\. -* paman \- do not fail if an empty list of packages has been provided and there is nothing to do \([https\://github\.com/ansible\-collections/community\.general/pull/8514](https\://github\.com/ansible\-collections/community\.general/pull/8514)\)\. -* pipx \- it was ignoring global when listing existing applications \([https\://github\.com/ansible\-collections/community\.general/pull/9044](https\://github\.com/ansible\-collections/community\.general/pull/9044)\)\. -* pipx module utils \- add missing command line formatter for argument spec\_metadata \([https\://github\.com/ansible\-collections/community\.general/pull/9044](https\://github\.com/ansible\-collections/community\.general/pull/9044)\)\. -* pipx\_info \- use new VarDict to prevent deprecation warning \([https\://github\.com/ansible\-collections/community\.general/issues/8410](https\://github\.com/ansible\-collections/community\.general/issues/8410)\, [https\://github\.com/ansible\-collections/community\.general/pull/8411](https\://github\.com/ansible\-collections/community\.general/pull/8411)\)\. -* proxmox \- fix idempotency on creation of mount volumes using Proxmox\' special \\:\ syntax \([https\://github\.com/ansible\-collections/community\.general/issues/8407](https\://github\.com/ansible\-collections/community\.general/issues/8407)\, [https\://github\.com/ansible\-collections/community\.general/pull/8542](https\://github\.com/ansible\-collections/community\.general/pull/8542)\)\. -* proxmox \- fixed an issue where the new volume handling incorrectly converted null values into \"None\" strings \([https\://github\.com/ansible\-collections/community\.general/pull/8646](https\://github\.com/ansible\-collections/community\.general/pull/8646)\)\. -* proxmox \- fixed an issue where volume strings where overwritten instead of appended to in the new build\_volume\(\) method \([https\://github\.com/ansible\-collections/community\.general/pull/8646](https\://github\.com/ansible\-collections/community\.general/pull/8646)\)\. -* proxmox \- removed the forced conversion of non\-string values to strings to be consistent with the module documentation \([https\://github\.com/ansible\-collections/community\.general/pull/8646](https\://github\.com/ansible\-collections/community\.general/pull/8646)\)\. -* proxmox inventory plugin \- fixed a possible error on concatenating responses from proxmox\. In case an API call unexpectedly returned an empty result\, the inventory failed with a fatal error\. Added check for empty response \([https\://github\.com/ansible\-collections/community\.general/issues/8798](https\://github\.com/ansible\-collections/community\.general/issues/8798)\, [https\://github\.com/ansible\-collections/community\.general/pull/8794](https\://github\.com/ansible\-collections/community\.general/pull/8794)\)\. -* python\_runner module utils \- parameter path\_prefix was being handled as string when it should be a list \([https\://github\.com/ansible\-collections/community\.general/pull/8944](https\://github\.com/ansible\-collections/community\.general/pull/8944)\)\. -* redfish\_utils module utils \- do not fail when language is not exactly \"en\" \([https\://github\.com/ansible\-collections/community\.general/pull/8613](https\://github\.com/ansible\-collections/community\.general/pull/8613)\)\. -* redfish\_utils module utils \- fix issue with URI parsing to gracefully handling trailing slashes when extracting member identifiers \([https\://github\.com/ansible\-collections/community\.general/issues/9047](https\://github\.com/ansible\-collections/community\.general/issues/9047)\, [https\://github\.com/ansible\-collections/community\.general/pull/9057](https\://github\.com/ansible\-collections/community\.general/pull/9057)\)\. -* snap \- use new VarDict to prevent deprecation warning \([https\://github\.com/ansible\-collections/community\.general/issues/8410](https\://github\.com/ansible\-collections/community\.general/issues/8410)\, [https\://github\.com/ansible\-collections/community\.general/pull/8411](https\://github\.com/ansible\-collections/community\.general/pull/8411)\)\. -* snap\_alias \- use new VarDict to prevent deprecation warning \([https\://github\.com/ansible\-collections/community\.general/issues/8410](https\://github\.com/ansible\-collections/community\.general/issues/8410)\, [https\://github\.com/ansible\-collections/community\.general/pull/8411](https\://github\.com/ansible\-collections/community\.general/pull/8411)\)\. -* udm\_user \- the module now tries to use legacycrypt on Python 3\.13\+ \([https\://github\.com/ansible\-collections/community\.general/issues/4690](https\://github\.com/ansible\-collections/community\.general/issues/4690)\, [https\://github\.com/ansible\-collections/community\.general/pull/8987](https\://github\.com/ansible\-collections/community\.general/pull/8987)\)\. - - -### Known Issues - -* jenkins\_node \- the module is not able to update offline message when node is already offline due to internally using toggleOffline API \([https\://github\.com/ansible\-collections/community\.general/pull/9084](https\://github\.com/ansible\-collections/community\.general/pull/9084)\)\. - - -### New Plugins - - -#### Filter - -* community\.general\.keep\_keys \- Keep specific keys from dictionaries in a list\. -* community\.general\.remove\_keys \- Remove specific keys from dictionaries in a list\. -* community\.general\.replace\_keys \- Replace specific keys in a list of dictionaries\. -* community\.general\.reveal\_ansible\_type \- Return input type\. - - -#### Test - -* community\.general\.ansible\_type \- Validate input type\. - - -### New Modules - -* community\.general\.bootc\_manage \- Bootc Switch and Upgrade\. -* community\.general\.consul\_agent\_check \- Add\, modify\, and delete checks within a consul cluster\. -* community\.general\.consul\_agent\_service \- Add\, modify and delete services within a consul cluster\. -* community\.general\.django\_check \- Wrapper for C\(django\-admin check\)\. -* community\.general\.django\_createcachetable \- Wrapper for C\(django\-admin createcachetable\)\. -* community\.general\.homebrew\_services \- Services manager for Homebrew\. -* community\.general\.ipa\_getkeytab \- Manage keytab file in FreeIPA\. -* community\.general\.jenkins\_node \- Manage Jenkins nodes\. -* community\.general\.keycloak\_component \- Allows administration of Keycloak components via Keycloak API\. -* community\.general\.keycloak\_realm\_keys\_metadata\_info \- Allows obtaining Keycloak realm keys metadata via Keycloak API\. -* community\.general\.keycloak\_userprofile \- Allows managing Keycloak User Profiles\. -* community\.general\.krb\_ticket \- Kerberos utils for managing tickets\. -* community\.general\.one\_vnet \- Manages OpenNebula virtual networks\. -* community\.general\.zypper\_repository\_info \- List Zypper repositories\. +This file is a placeholder; a version-specific `CHANGELOG-vX.md` will be generated during releases from fragments +under `changelogs/fragments`. On release branches once a release has been created, consult the branch's version-specific +file for changes that have occurred in that branch. diff --git a/CHANGELOG.rst b/CHANGELOG.rst index be5218f651..119e04e170 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,937 +1,6 @@ -=============================== -Community General Release Notes -=============================== +Placeholder changelog +===================== -.. contents:: Topics - -This changelog describes changes after version 9.0.0. - -v10.5.0 -======= - -Release Summary ---------------- - -Regular bugfix and feature release. - -Minor Changes -------------- - -- CmdRunner module utils - the convenience method ``cmd_runner_fmt.as_fixed()`` now accepts multiple arguments as a list (https://github.com/ansible-collections/community.general/pull/9893). -- apache2_mod_proxy - code simplification, no change in functionality (https://github.com/ansible-collections/community.general/pull/9457). -- consul_token - fix idempotency when ``policies`` or ``roles`` are supplied by name (https://github.com/ansible-collections/community.general/issues/9841, https://github.com/ansible-collections/community.general/pull/9845). -- keycloak_realm - remove ID requirement when creating a realm to allow Keycloak generating its own realm ID (https://github.com/ansible-collections/community.general/pull/9768). -- nmap inventory plugin - adds ``dns_servers`` option for specifying DNS servers for name resolution. Accepts hostnames or IP addresses in the same format as the ``exclude`` option (https://github.com/ansible-collections/community.general/pull/9849). -- proxmox_kvm - add missing audio hardware device handling (https://github.com/ansible-collections/community.general/issues/5192, https://github.com/ansible-collections/community.general/pull/9847). -- redfish_config - add command ``SetPowerRestorePolicy`` to set the desired power state of the system when power is restored (https://github.com/ansible-collections/community.general/pull/9837). -- redfish_info - add command ``GetPowerRestorePolicy`` to get the desired power state of the system when power is restored (https://github.com/ansible-collections/community.general/pull/9824). -- rocketchat - option ``is_pre740`` has been added to control the format of the payload. For Rocket.Chat 7.4.0 or newer, it must be set to ``false`` (https://github.com/ansible-collections/community.general/pull/9882). -- slack callback plugin - add ``http_agent`` option to enable the user to set a custom user agent for slack callback plugin (https://github.com/ansible-collections/community.general/issues/9813, https://github.com/ansible-collections/community.general/pull/9836). -- systemd_info - add wildcard expression support in ``unitname`` option (https://github.com/ansible-collections/community.general/pull/9821). -- systemd_info - extend support to timer units (https://github.com/ansible-collections/community.general/pull/9891). -- vmadm - add new options ``flexible_disk_size`` and ``owner_uuid`` (https://github.com/ansible-collections/community.general/pull/9892). - -Bugfixes --------- - -- cloudlare_dns - handle exhausted response stream in case of HTTP errors to show nice error message to the user (https://github.com/ansible-collections/community.general/issues/9782, https://github.com/ansible-collections/community.general/pull/9818). -- dnf_versionlock - add support for dnf5 (https://github.com/ansible-collections/community.general/issues/9556). -- homebrew - fix crash when package names include tap (https://github.com/ansible-collections/community.general/issues/9777, https://github.com/ansible-collections/community.general/pull/9803). -- homebrew_cask - handle unusual brew version strings (https://github.com/ansible-collections/community.general/issues/8432, https://github.com/ansible-collections/community.general/pull/9881). -- nmcli - enable changing only the order of DNS servers or search suffixes (https://github.com/ansible-collections/community.general/issues/8724, https://github.com/ansible-collections/community.general/pull/9880). -- proxmox - add missing key selection of ``'status'`` key to ``get_lxc_status`` (https://github.com/ansible-collections/community.general/issues/9696, https://github.com/ansible-collections/community.general/pull/9809). -- proxmox_vm_info - the module no longer expects that the key ``template`` exists in a dictionary returned by Proxmox (https://github.com/ansible-collections/community.general/issues/9875, https://github.com/ansible-collections/community.general/pull/9910). -- sudoers - display stdout and stderr raised while failed validation (https://github.com/ansible-collections/community.general/issues/9674, https://github.com/ansible-collections/community.general/pull/9871). - -New Modules ------------ - -- community.general.pacemaker_resource - Manage pacemaker resources. - -v10.4.0 -======= - -Release Summary ---------------- - -Regular bugfix and feature release. - -Minor Changes -------------- - -- bitwarden lookup plugin - add new option ``collection_name`` to filter results by collection name, and new option ``result_count`` to validate number of results (https://github.com/ansible-collections/community.general/pull/9728). -- incus connection plugin - adds ``remote_user`` and ``incus_become_method`` parameters for allowing a non-root user to connect to an Incus instance (https://github.com/ansible-collections/community.general/pull/9743). -- iocage inventory plugin - the new parameter ``hooks_results`` of the plugin is a list of files inside a jail that provide configuration parameters for the inventory. The inventory plugin reads the files from the jails and put the contents into the items of created variable ``iocage_hooks`` (https://github.com/ansible-collections/community.general/issues/9650, https://github.com/ansible-collections/community.general/pull/9651). -- jira - adds ``client_cert`` and ``client_key`` parameters for supporting client certificate authentification when connecting to Jira (https://github.com/ansible-collections/community.general/pull/9753). -- lldp - adds ``multivalues`` parameter to control behavior when lldpctl outputs an attribute multiple times (https://github.com/ansible-collections/community.general/pull/9657). -- lvg - add ``remove_extra_pvs`` parameter to control if ansible should remove physical volumes which are not in the ``pvs`` parameter (https://github.com/ansible-collections/community.general/pull/9698). -- lxd connection plugin - adds ``remote_user`` and ``lxd_become_method`` parameters for allowing a non-root user to connect to an LXD instance (https://github.com/ansible-collections/community.general/pull/9659). -- nmcli - adds VRF support with new ``type`` value ``vrf`` and new ``slave_type`` value ``vrf`` as well as new ``table`` parameter (https://github.com/ansible-collections/community.general/pull/9658, https://github.com/ansible-collections/community.general/issues/8014). -- proxmox_kvm - allow hibernation and suspending of VMs (https://github.com/ansible-collections/community.general/issues/9620, https://github.com/ansible-collections/community.general/pull/9653). -- redfish_command - add ``PowerFullPowerCycle`` to power command options (https://github.com/ansible-collections/community.general/pull/9729). -- ssh_config - add ``other_options`` option (https://github.com/ansible-collections/community.general/issues/8053, https://github.com/ansible-collections/community.general/pull/9684). -- xen_orchestra inventory plugin - add ``use_vm_uuid`` and ``use_host_uuid`` boolean options to allow switching over to using VM/Xen name labels instead of UUIDs as item names (https://github.com/ansible-collections/community.general/pull/9787). - -Deprecated Features -------------------- - -- profitbricks - module is deprecated and will be removed in community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/9733). -- profitbricks_datacenter - module is deprecated and will be removed in community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/9733). -- profitbricks_nic - module is deprecated and will be removed in community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/9733). -- profitbricks_volume - module is deprecated and will be removed in community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/9733). -- profitbricks_volume_attachments - module is deprecated and will be removed in community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/9733). - -Bugfixes --------- - -- apache2_mod_proxy - make compatible with Python 3 (https://github.com/ansible-collections/community.general/pull/9762). -- apache2_mod_proxy - passing the cluster's page as referer for the member's pages. This makes the module actually work again for halfway modern Apache versions. According to some comments founds on the net the referer was required since at least 2019 for some versions of Apache 2 (https://github.com/ansible-collections/community.general/pull/9762). -- elasticsearch_plugin - fix ``ERROR: D is not a recognized option`` issue when configuring proxy settings (https://github.com/ansible-collections/community.general/pull/9774, https://github.com/ansible-collections/community.general/issues/9773). -- ipa_host - module revoked existing host certificates even if ``user_certificate`` was not given (https://github.com/ansible-collections/community.general/pull/9694). -- keycloak_client - in check mode, detect whether the lists in before client (for example redirect URI list) contain items that the lists in the desired client do not contain (https://github.com/ansible-collections/community.general/pull/9739). -- lldp - fix crash caused by certain lldpctl output where an attribute is defined as branch and leaf (https://github.com/ansible-collections/community.general/pull/9657). -- onepassword_doc lookup plugin - ensure that 1Password Connect support also works for this plugin (https://github.com/ansible-collections/community.general/pull/9625). -- passwordstore lookup plugin - fix subkey creation even when ``create=false`` (https://github.com/ansible-collections/community.general/issues/9105, https://github.com/ansible-collections/community.general/pull/9106). -- proxmox inventory plugin - plugin did not update cache correctly after ``meta: refresh_inventory`` (https://github.com/ansible-collections/community.general/issues/9710, https://github.com/ansible-collections/community.general/pull/9760). -- redhat_subscription - use the "enable_content" option (when available) when - registering using D-Bus, to ensure that subscription-manager enables the - content on registration; this is particular important on EL 10+ and Fedora - 41+ - (https://github.com/ansible-collections/community.general/pull/9778). -- zfs - fix handling of multi-line values of user-defined ZFS properties (https://github.com/ansible-collections/community.general/pull/6264). -- zfs_facts - parameter ``type`` now accepts multple values as documented (https://github.com/ansible-collections/community.general/issues/5909, https://github.com/ansible-collections/community.general/pull/9697). - -New Modules ------------ - -- community.general.systemd_info - Gather C(systemd) unit info. - -v10.3.1 -======= - -Release Summary ---------------- - -Bugfix release. - -Minor Changes -------------- - -- onepassword_ssh_key - refactor to move code to lookup class (https://github.com/ansible-collections/community.general/pull/9633). - -Bugfixes --------- - -- cloudflare_dns - fix crash when deleting a DNS record or when updating a record with ``solo=true`` (https://github.com/ansible-collections/community.general/issues/9652, https://github.com/ansible-collections/community.general/pull/9649). -- homebrew - make package name parsing more resilient (https://github.com/ansible-collections/community.general/pull/9665, https://github.com/ansible-collections/community.general/issues/9641). -- keycloak module utils - replaces missing return in get_role_composites method which caused it to return None instead of composite roles (https://github.com/ansible-collections/community.general/issues/9678, https://github.com/ansible-collections/community.general/pull/9691). -- keycloak_client - fix and improve existing tests. The module showed a diff without actual changes, solved by improving the ``normalise_cr()`` function (https://github.com/ansible-collections/community.general/pull/9644). -- proxmox - adds the ``pubkey`` parameter (back to) the ``update`` state (https://github.com/ansible-collections/community.general/issues/9642, https://github.com/ansible-collections/community.general/pull/9645). -- proxmox - fixes a typo in the translation of the ``pubkey`` parameter to proxmox' ``ssh-public-keys`` (https://github.com/ansible-collections/community.general/issues/9642, https://github.com/ansible-collections/community.general/pull/9645). -- xml - ensure file descriptor is closed (https://github.com/ansible-collections/community.general/pull/9695). - -v10.3.0 -======= - -Release Summary ---------------- - -Regular bugfix and feature release. - -Minor Changes -------------- - -- MH module utils - delegate ``debug`` to the underlying ``AnsibleModule`` instance or issues a warning if an attribute already exists with that name (https://github.com/ansible-collections/community.general/pull/9577). -- apache2_mod_proxy - better handling regexp extraction (https://github.com/ansible-collections/community.general/pull/9609). -- apache2_mod_proxy - change type of ``state`` to a list of strings. No change for the users (https://github.com/ansible-collections/community.general/pull/9600). -- apache2_mod_proxy - improve readability when using results from ``fecth_url()`` (https://github.com/ansible-collections/community.general/pull/9608). -- apache2_mod_proxy - refactor repeated code into method (https://github.com/ansible-collections/community.general/pull/9599). -- apache2_mod_proxy - remove unused parameter and code from ``Balancer`` constructor (https://github.com/ansible-collections/community.general/pull/9614). -- apache2_mod_proxy - simplified and improved string manipulation (https://github.com/ansible-collections/community.general/pull/9614). -- apache2_mod_proxy - use ``deps`` to handle dependencies (https://github.com/ansible-collections/community.general/pull/9612). -- cgroup_memory_recap callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- chroot connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). -- cloud_init_data_facts - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). -- cobbler inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). -- context_demo callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- counter filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). -- counter_enabled callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- cpanm - enable usage of option ``--with-recommends`` (https://github.com/ansible-collections/community.general/issues/9554, https://github.com/ansible-collections/community.general/pull/9555). -- cpanm - enable usage of option ``--with-suggests`` (https://github.com/ansible-collections/community.general/pull/9555). -- crc32 filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). -- cronvar - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). -- crypttab - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). -- default_without_diff callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- dense callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- dict filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). -- dict_kv filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). -- diy callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- doas become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- dzdo become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- elastic callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- from_csv filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). -- from_ini filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). -- funcd connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). -- gitlab_runners inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). -- groupby_as_dict filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). -- hashids filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). -- icinga2 inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). -- incus connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). -- iocage connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). -- iocage inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). -- iocage inventory plugin - the new parameter ``sudo`` of the plugin lets the command ``iocage list -l`` to run as root on the iocage host. This is needed to get the IPv4 of a running DHCP jail (https://github.com/ansible-collections/community.general/issues/9572, https://github.com/ansible-collections/community.general/pull/9573). -- iptables_state action plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- jabber callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- jail connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). -- jc filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). -- jira - transition operation now has ``status_id`` to directly reference wanted transition (https://github.com/ansible-collections/community.general/pull/9602). -- json_query filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). -- keep_keys filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). -- keycloak_* modules - ``refresh_token`` parameter added. When multiple authentication parameters are provided (``token``, ``refresh_token``, and ``auth_username``/``auth_password``), modules will now automatically retry requests upon authentication errors (401), using in order the token, refresh token, and username/password (https://github.com/ansible-collections/community.general/pull/9494). -- known_hosts - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). -- ksu become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- linode inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). -- lists filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). -- lists_mergeby filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). -- log_plays callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- loganalytics callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- logdna callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- logentries callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- logstash callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- lxc connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). -- lxd connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). -- lxd inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). -- machinectl become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- mail callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- memcached cache plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- nmap inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). -- nmcli - add a option ``fail_over_mac`` (https://github.com/ansible-collections/community.general/issues/9570, https://github.com/ansible-collections/community.general/pull/9571). -- nrdp callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- null callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- one_template - adds ``filter`` option for retrieving templates which are not owned by the user (https://github.com/ansible-collections/community.general/pull/9547, https://github.com/ansible-collections/community.general/issues/9278). -- online inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). -- opennebula inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). -- opentelemetry callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- parted - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). -- pbrun become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- pfexec become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- pickle cache plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- pmrun become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- proxmox - refactors the proxmox module (https://github.com/ansible-collections/community.general/pull/9225). -- proxmox inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). -- proxmox_pct_remote connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). -- proxmox_template - add support for checksum validation with new options ``checksum_algorithm`` and ``checksum`` (https://github.com/ansible-collections/community.general/issues/9553, https://github.com/ansible-collections/community.general/pull/9601). -- pulp_repo - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). -- qubes connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). -- random_mac filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). -- redfish_info - add command ``GetAccountServiceConfig`` to get full information about AccountService configuration (https://github.com/ansible-collections/community.general/pull/9403). -- redhat_subscription - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). -- redis cache plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- remove_keys filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). -- replace_keys filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). -- reveal_ansible_type filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). -- run0 become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- saltstack connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). -- say callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- scaleway inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). -- selective callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- sesu become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- shutdown action plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- slack callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- snap - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9598). -- snap_alias - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9598). -- solaris_zone - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). -- sorcery - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). -- splunk callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- stackpath_compute inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). -- sudosu become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- sumologic callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- syslog_json callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- time filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). -- timestamp callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- timezone - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). -- to_ini filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). -- ufw - add support for ``vrrp`` protocol (https://github.com/ansible-collections/community.general/issues/9562, https://github.com/ansible-collections/community.general/pull/9582). -- unicode_normalize filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). -- unixy callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- version_sort filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). -- virtualbox inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). -- xen_orchestra inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). -- yaml cache plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- yaml callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). -- zone connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - -Deprecated Features -------------------- - -- MH module utils - attribute ``debug`` definition in subclasses of MH is now deprecated, as that name will become a delegation to ``AnsibleModule`` in community.general 12.0.0, and any such attribute will be overridden by that delegation in that version (https://github.com/ansible-collections/community.general/pull/9577). -- proxmox - removes default value ``false`` of ``update`` parameter. This will be changed to a default of ``true`` in community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/9225). - -Security Fixes --------------- - -- keycloak_client - Sanitize ``saml.encryption.private.key`` so it does not show in the logs (https://github.com/ansible-collections/community.general/pull/9621). - -Bugfixes --------- - -- homebrew - fix incorrect handling of homebrew modules when a tap is requested (https://github.com/ansible-collections/community.general/pull/9546, https://github.com/ansible-collections/community.general/issues/9533). -- iocage inventory plugin - the plugin parses the IP4 tab of the jails list and put the elements into the new variable ``iocage_ip4_dict``. In multiple interface format the variable ``iocage_ip4`` keeps the comma-separated list of IP4 (https://github.com/ansible-collections/community.general/issues/9538). -- pipx - honor option ``global`` when ``state=latest`` (https://github.com/ansible-collections/community.general/pull/9623). -- proxmox - fixes idempotency of template conversions (https://github.com/ansible-collections/community.general/pull/9225, https://github.com/ansible-collections/community.general/issues/8811). -- proxmox - fixes incorrect parsing for bind-only mounts (https://github.com/ansible-collections/community.general/pull/9225, https://github.com/ansible-collections/community.general/issues/8982). -- proxmox - fixes issues with disk_volume variable (https://github.com/ansible-collections/community.general/pull/9225, https://github.com/ansible-collections/community.general/issues/9065). -- proxmox module utils - fixes ignoring of ``choose_first_if_multiple`` argument in ``get_vmid`` (https://github.com/ansible-collections/community.general/pull/9225). -- redhat_subscription - do not try to unsubscribe (i.e. remove subscriptions) - when unregistering a system: newer versions of subscription-manager, as - available in EL 10 and Fedora 41+, do not support entitlements anymore, and - thus unsubscribing will fail - (https://github.com/ansible-collections/community.general/pull/9578). - -New Plugins ------------ - -Connection -~~~~~~~~~~ - -- community.general.proxmox_pct_remote - Run tasks in Proxmox LXC container instances using pct CLI via SSH. - -Filter -~~~~~~ - -- community.general.json_diff - Create a JSON patch by comparing two JSON files. -- community.general.json_patch - Apply a JSON-Patch (RFC 6902) operation to an object. -- community.general.json_patch_recipe - Apply JSON-Patch (RFC 6902) operations to an object. - -Lookup -~~~~~~ - -- community.general.onepassword_ssh_key - Fetch SSH keys stored in 1Password. - -New Modules ------------ - -- community.general.proxmox_backup_info - Retrieve information on Proxmox scheduled backups. - -v10.2.0 -======= - -Release Summary ---------------- - -Regular bugfix and feature release. - -Minor Changes -------------- - -- bitwarden lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- cgroup_memory_recap callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). -- chef_databag lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- chroot connection plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). -- chroot connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). -- cobbler inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). -- cobbler inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). -- collection_version lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- consul_kv lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- context_demo callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). -- counter_enabled callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). -- credstash lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- cyberarkpassword lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). -- cyberarkpassword lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- dense callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). -- dependent lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- dig lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). -- dig lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- diy callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). -- dnstxt lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). -- dnstxt lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- doas become plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9319). -- dsv lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- dzdo become plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9319). -- elastic callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). -- etcd lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- etcd3 lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). -- etcd3 lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- filetree lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- from_csv filter plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). -- from_ini filter plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). -- funcd connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). -- github_app_access_token lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- gitlab_instance_variable - add support for ``raw`` variables suboption (https://github.com/ansible-collections/community.general/pull/9425). -- gitlab_runners inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). -- gitlab_runners inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). -- hiera lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- icinga2 inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). -- incus connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). -- iocage connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). -- iocage inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). -- iptables_state action plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9318). -- jabber callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). -- jail connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). -- keycloak - add an action group for Keycloak modules to allow ``module_defaults`` to be set for Keycloak tasks (https://github.com/ansible-collections/community.general/pull/9284). -- keyring lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- ksu become plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9319). -- lastpass lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- linode inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). -- lmdb_kv lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). -- lmdb_kv lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- locale_gen - invert the logic to determine ``ubuntu_mode``, making it look first for ``/etc/locale.gen`` (set ``ubuntu_mode`` to ``False``) and only then looking for ``/var/lib/locales/supported.d/`` (set ``ubuntu_mode`` to ``True``) (https://github.com/ansible-collections/community.general/pull/9238, https://github.com/ansible-collections/community.general/issues/9131, https://github.com/ansible-collections/community.general/issues/8487). -- locale_gen - new return value ``mechanism`` to better express the semantics of the ``ubuntu_mode``, with the possible values being either ``glibc`` (``ubuntu_mode=False``) or ``ubuntu_legacy`` (``ubuntu_mode=True``) (https://github.com/ansible-collections/community.general/pull/9238). -- log_plays callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). -- loganalytics callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). -- logdna callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). -- logentries callback plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). -- logentries callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). -- lxc connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). -- lxd connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). -- lxd inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). -- lxd inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). -- machinectl become plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9319). -- mail callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). -- manageiq_alert_profiles - improve handling of parameter requirements (https://github.com/ansible-collections/community.general/pull/9449). -- manifold lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). -- manifold lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- memcached cache plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9320). -- merge_variables lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- nmap inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). -- nmap inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). -- nrdp callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). -- onepassword lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). -- onepassword lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- onepassword_doc lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- online inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). -- opennebula inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). -- opennebula inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). -- opentelemetry callback plugin - remove code handling Python versions prior to 3.7 (https://github.com/ansible-collections/community.general/pull/9482). -- opentelemetry callback plugin - remove code handling Python versions prior to 3.7 (https://github.com/ansible-collections/community.general/pull/9503). -- opentelemetry callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). -- pacemaker_cluster - remove unused code (https://github.com/ansible-collections/community.general/pull/9471). -- pacemaker_cluster - using safer mechanism to run external command (https://github.com/ansible-collections/community.general/pull/9471). -- passwordstore lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- pbrun become plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9319). -- pfexec become plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9319). -- pmrun become plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9319). -- proxmox inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). -- proxmox inventory plugin - strip whitespace from ``user``, ``token_id``, and ``token_secret`` (https://github.com/ansible-collections/community.general/issues/9227, https://github.com/ansible-collections/community.general/pull/9228/). -- proxmox inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). -- proxmox module utils - add method ``api_task_complete`` that can wait for task completion and return error message (https://github.com/ansible-collections/community.general/pull/9256). -- proxmox_backup - refactor permission checking to improve code readability and maintainability (https://github.com/ansible-collections/community.general/pull/9239). -- qubes connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). -- random_pet lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- redis cache plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). -- redis cache plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9320). -- redis lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- revbitspss lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- saltstack connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). -- say callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). -- scaleway inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). -- scaleway inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). -- selective callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). -- sesu become plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9319). -- shelvefile lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- shutdown action plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). -- shutdown action plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9318). -- slack callback plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). -- slack callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). -- splunk callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). -- stackpath_compute inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). -- sudosu become plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9319). -- timestamp callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). -- to_ini filter plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). -- tss lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). -- tss lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). -- unixy callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). -- virtualbox inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). -- virtualbox inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). -- xbps - add ``root`` and ``repository`` options to enable bootstrapping new void installations (https://github.com/ansible-collections/community.general/pull/9174). -- xen_orchestra inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). -- xfconf - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9226). -- xfconf_info - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9226). -- yaml callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). -- zone connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). -- zypper - add ``quiet`` option (https://github.com/ansible-collections/community.general/pull/9270). -- zypper - add ``simple_errors`` option (https://github.com/ansible-collections/community.general/pull/9270). - -Deprecated Features -------------------- - -- atomic_container - module is deprecated and will be removed in community.general 13.0.0 (https://github.com/ansible-collections/community.general/pull/9487). -- atomic_host - module is deprecated and will be removed in community.general 13.0.0 (https://github.com/ansible-collections/community.general/pull/9487). -- atomic_image - module is deprecated and will be removed in community.general 13.0.0 (https://github.com/ansible-collections/community.general/pull/9487). -- facter - module is deprecated and will be removed in community.general 12.0.0, use ``community.general.facter_facts`` instead (https://github.com/ansible-collections/community.general/pull/9451). -- locale_gen - ``ubuntu_mode=True``, or ``mechanism=ubuntu_legacy`` is deprecated and will be removed in community.general 13.0.0 (https://github.com/ansible-collections/community.general/pull/9238). -- pure module utils - the module utils is deprecated and will be removed from community.general 12.0.0. The modules using this were removed in community.general 3.0.0 (https://github.com/ansible-collections/community.general/pull/9432). -- purestorage doc fragments - the doc fragment is deprecated and will be removed from community.general 12.0.0. The modules using this were removed in community.general 3.0.0 (https://github.com/ansible-collections/community.general/pull/9432). -- sensu_check - module is deprecated and will be removed in community.general 13.0.0, use collection ``sensu.sensu_go`` instead (https://github.com/ansible-collections/community.general/pull/9483). -- sensu_client - module is deprecated and will be removed in community.general 13.0.0, use collection ``sensu.sensu_go`` instead (https://github.com/ansible-collections/community.general/pull/9483). -- sensu_handler - module is deprecated and will be removed in community.general 13.0.0, use collection ``sensu.sensu_go`` instead (https://github.com/ansible-collections/community.general/pull/9483). -- sensu_silence - module is deprecated and will be removed in community.general 13.0.0, use collection ``sensu.sensu_go`` instead (https://github.com/ansible-collections/community.general/pull/9483). -- sensu_subscription - module is deprecated and will be removed in community.general 13.0.0, use collection ``sensu.sensu_go`` instead (https://github.com/ansible-collections/community.general/pull/9483). -- slack - the default value ``auto`` of the ``prepend_hash`` option is deprecated and will change to ``never`` in community.general 12.0.0 (https://github.com/ansible-collections/community.general/pull/9443). -- yaml callback plugin - deprecate plugin in favor of ``result_format=yaml`` in plugin ``ansible.bulitin.default`` (https://github.com/ansible-collections/community.general/pull/9456). - -Security Fixes --------------- - -- keycloak_authentication - API calls did not properly set the ``priority`` during update resulting in incorrectly sorted authentication flows. This apparently only affects Keycloak 25 or newer (https://github.com/ansible-collections/community.general/pull/9263). - -Bugfixes --------- - -- dig lookup plugin - correctly handle ``NoNameserver`` exception (https://github.com/ansible-collections/community.general/pull/9363, https://github.com/ansible-collections/community.general/issues/9362). -- homebrew - fix incorrect handling of aliased homebrew modules when the alias is requested (https://github.com/ansible-collections/community.general/pull/9255, https://github.com/ansible-collections/community.general/issues/9240). -- htpasswd - report changes when file permissions are adjusted (https://github.com/ansible-collections/community.general/issues/9485, https://github.com/ansible-collections/community.general/pull/9490). -- proxmox_backup - fix incorrect key lookup in vmid permission check (https://github.com/ansible-collections/community.general/pull/9223). -- proxmox_disk - fix async method and make ``resize_disk`` method handle errors correctly (https://github.com/ansible-collections/community.general/pull/9256). -- proxmox_template - fix the wrong path called on ``proxmox_template.task_status`` (https://github.com/ansible-collections/community.general/issues/9276, https://github.com/ansible-collections/community.general/pull/9277). -- qubes connection plugin - fix the printing of debug information (https://github.com/ansible-collections/community.general/pull/9334). -- redfish_utils module utils - Fix ``VerifyBiosAttributes`` command on multi system resource nodes (https://github.com/ansible-collections/community.general/pull/9234). - -New Plugins ------------ - -Inventory -~~~~~~~~~ - -- community.general.iocage - iocage inventory source. - -New Modules ------------ - -- community.general.android_sdk - Manages Android SDK packages. -- community.general.ldap_inc - Use the Modify-Increment LDAP V3 feature to increment an attribute value. -- community.general.systemd_creds_decrypt - C(systemd)'s C(systemd-creds decrypt) plugin. -- community.general.systemd_creds_encrypt - C(systemd)'s C(systemd-creds encrypt) plugin. - -v10.1.0 -======= - -Release Summary ---------------- - -Regular bugfix and feature release. - -Minor Changes -------------- - -- alternatives - add ``family`` parameter that allows to utilize the ``--family`` option available in RedHat version of update-alternatives (https://github.com/ansible-collections/community.general/issues/5060, https://github.com/ansible-collections/community.general/pull/9096). -- cloudflare_dns - add support for ``comment`` and ``tags`` (https://github.com/ansible-collections/community.general/pull/9132). -- deps module utils - add ``deps.clear()`` to clear out previously declared dependencies (https://github.com/ansible-collections/community.general/pull/9179). -- homebrew - greatly speed up module when multiple packages are passed in the ``name`` option (https://github.com/ansible-collections/community.general/pull/9181). -- homebrew - remove duplicated package name validation (https://github.com/ansible-collections/community.general/pull/9076). -- iso_extract - adds ``password`` parameter that is passed to 7z (https://github.com/ansible-collections/community.general/pull/9159). -- launchd - add ``plist`` option for services such as sshd, where the plist filename doesn't match the service name (https://github.com/ansible-collections/community.general/pull/9102). -- nmcli - add ``sriov`` parameter that enables support for SR-IOV settings (https://github.com/ansible-collections/community.general/pull/9168). -- pipx - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9180). -- pipx_info - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9180). -- proxmox_template - add server side artifact fetching support (https://github.com/ansible-collections/community.general/pull/9113). -- redfish_command - add ``update_custom_oem_header``, ``update_custom_oem_params``, and ``update_custom_oem_mime_type`` options (https://github.com/ansible-collections/community.general/pull/9123). -- redfish_utils module utils - remove redundant code (https://github.com/ansible-collections/community.general/pull/9190). -- rpm_ostree_pkg - added the options ``apply_live`` (https://github.com/ansible-collections/community.general/pull/9167). -- rpm_ostree_pkg - added the return value ``needs_reboot`` (https://github.com/ansible-collections/community.general/pull/9167). -- scaleway_lb - minor simplification in the code (https://github.com/ansible-collections/community.general/pull/9189). -- ssh_config - add ``dynamicforward`` option (https://github.com/ansible-collections/community.general/pull/9192). - -Deprecated Features -------------------- - -- opkg - deprecate value ``""`` for parameter ``force`` (https://github.com/ansible-collections/community.general/pull/9172). -- redfish_utils module utils - deprecate method ``RedfishUtils._init_session()`` (https://github.com/ansible-collections/community.general/pull/9190). - -Bugfixes --------- - -- dnf_config_manager - fix hanging when prompting to import GPG keys (https://github.com/ansible-collections/community.general/pull/9124, https://github.com/ansible-collections/community.general/issues/8830). -- dnf_config_manager - forces locale to ``C`` before module starts. If the locale was set to non-English, the output of the ``dnf config-manager`` could not be parsed (https://github.com/ansible-collections/community.general/pull/9157, https://github.com/ansible-collections/community.general/issues/9046). -- flatpak - force the locale language to ``C`` when running the flatpak command (https://github.com/ansible-collections/community.general/pull/9187, https://github.com/ansible-collections/community.general/issues/8883). -- gio_mime - fix command line when determining version of ``gio`` (https://github.com/ansible-collections/community.general/pull/9171, https://github.com/ansible-collections/community.general/issues/9158). -- github_key - in check mode, a faulty call to ```datetime.strftime(...)``` was being made which generated an exception (https://github.com/ansible-collections/community.general/issues/9185). -- homebrew_cask - allow ``+`` symbol in Homebrew cask name validation regex (https://github.com/ansible-collections/community.general/pull/9128). -- keycloak_clientscope_type - sort the default and optional clientscope lists to improve the diff (https://github.com/ansible-collections/community.general/pull/9202). -- slack - fail if Slack API response is not OK with error message (https://github.com/ansible-collections/community.general/pull/9198). - -New Plugins ------------ - -Filter -~~~~~~ - -- community.general.accumulate - Produce a list of accumulated sums of the input list contents. - -New Modules ------------ - -- community.general.decompress - Decompresses compressed files. -- community.general.proxmox_backup - Start a VM backup in Proxmox VE cluster. - -v10.0.1 -======= - -Release Summary ---------------- - -Bugfix release for inclusion in Ansible 11.0.0rc1. - -Bugfixes --------- - -- keycloak_client - fix diff by removing code that turns the attributes dict which contains additional settings into a list (https://github.com/ansible-collections/community.general/pull/9077). -- keycloak_clientscope - fix diff and ``end_state`` by removing the code that turns the attributes dict, which contains additional config items, into a list (https://github.com/ansible-collections/community.general/pull/9082). -- redfish_utils module utils - remove undocumented default applytime (https://github.com/ansible-collections/community.general/pull/9114). - -v10.0.0 -======= - -Release Summary ---------------- - -This is release 10.0.0 of ``community.general``, released on 2024-11-04. - -Minor Changes -------------- - -- CmdRunner module util - argument formats can be specified as plain functions without calling ``cmd_runner_fmt.as_func()`` (https://github.com/ansible-collections/community.general/pull/8479). -- CmdRunner module utils - the parameter ``force_lang`` now supports the special value ``auto`` which will automatically try and determine the best parsable locale in the system (https://github.com/ansible-collections/community.general/pull/8517). -- MH module utils - add parameter ``when`` to ``cause_changes`` decorator (https://github.com/ansible-collections/community.general/pull/8766). -- MH module utils - minor refactor in decorators (https://github.com/ansible-collections/community.general/pull/8766). -- alternatives - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). -- ansible_galaxy_install - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9060). -- ansible_galaxy_install - add upgrade feature (https://github.com/ansible-collections/community.general/pull/8431, https://github.com/ansible-collections/community.general/issues/8351). -- ansible_galaxy_install - minor refactor in the module (https://github.com/ansible-collections/community.general/pull/8413). -- apache2_mod_proxy - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). -- apache2_mod_proxy - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). -- cargo - add option ``directory``, which allows source directory to be specified (https://github.com/ansible-collections/community.general/pull/8480). -- cgroup_memory_recap, hipchat, jabber, log_plays, loganalytics, logentries, logstash, slack, splunk, sumologic, syslog_json callback plugins - make sure that all options are typed (https://github.com/ansible-collections/community.general/pull/8628). -- chef_databag, consul_kv, cyberarkpassword, dsv, etcd, filetree, hiera, onepassword, onepassword_doc, onepassword_raw, passwordstore, redis, shelvefile, tss lookup plugins - make sure that all options are typed (https://github.com/ansible-collections/community.general/pull/8626). -- chroot, funcd, incus, iocage, jail, lxc, lxd, qubes, zone connection plugins - make sure that all options are typed (https://github.com/ansible-collections/community.general/pull/8627). -- cmd_runner module utils - add decorator ``cmd_runner_fmt.stack`` (https://github.com/ansible-collections/community.general/pull/8415). -- cmd_runner module utils - refactor argument formatting code to its own Python module (https://github.com/ansible-collections/community.general/pull/8964). -- cmd_runner_fmt module utils - simplify implementation of ``cmd_runner_fmt.as_bool_not()`` (https://github.com/ansible-collections/community.general/pull/8512). -- cobbler, linode, lxd, nmap, online, scaleway, stackpath_compute, virtualbox inventory plugins - make sure that all options are typed (https://github.com/ansible-collections/community.general/pull/8625). -- consul_acl - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). -- consul_kv - add argument for the datacenter option on Consul API (https://github.com/ansible-collections/community.general/pull/9026). -- copr - Added ``includepkgs`` and ``excludepkgs`` parameters to limit the list of packages fetched or excluded from the repository(https://github.com/ansible-collections/community.general/pull/8779). -- cpanm - add return value ``cpanm_version`` (https://github.com/ansible-collections/community.general/pull/9061). -- credstash lookup plugin - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). -- csv module utils - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). -- deco MH module utils - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). -- dig lookup plugin - add ``port`` option to specify DNS server port (https://github.com/ansible-collections/community.general/pull/8966). -- django module utils - always retrieve version (https://github.com/ansible-collections/community.general/pull/9063). -- django_check - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9063). -- django_command - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9063). -- django_createcachetable - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9063). -- doas, dzdo, ksu, machinectl, pbrun, pfexec, pmrun, sesu, sudosu become plugins - make sure that all options are typed (https://github.com/ansible-collections/community.general/pull/8623). -- etcd3 - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). -- flatpak - improve the parsing of Flatpak application IDs based on official guidelines (https://github.com/ansible-collections/community.general/pull/8909). -- gconftool2 - make use of ``ModuleHelper`` features to simplify code (https://github.com/ansible-collections/community.general/pull/8711). -- gcontool2 - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9064). -- gcontool2 module utils - add argument formatter ``version`` (https://github.com/ansible-collections/community.general/pull/9064). -- gcontool2_info - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9064). -- gio_mime - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9067). -- gio_mime - adjust code ahead of the old ``VardDict`` deprecation (https://github.com/ansible-collections/community.general/pull/8855). -- gio_mime - mute the old ``VarDict`` deprecation (https://github.com/ansible-collections/community.general/pull/8776). -- gio_mime module utils - add argument formatter ``version`` (https://github.com/ansible-collections/community.general/pull/9067). -- github_app_access_token lookup plugin - adds new ``private_key`` parameter (https://github.com/ansible-collections/community.general/pull/8989). -- gitlab_deploy_key - better construct when using ``dict.items()`` (https://github.com/ansible-collections/community.general/pull/8876). -- gitlab_group - add many new parameters (https://github.com/ansible-collections/community.general/pull/8908). -- gitlab_group - better construct when using ``dict.items()`` (https://github.com/ansible-collections/community.general/pull/8876). -- gitlab_group - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). -- gitlab_issue - better construct when using ``dict.items()`` (https://github.com/ansible-collections/community.general/pull/8876). -- gitlab_merge_request - better construct when using ``dict.items()`` (https://github.com/ansible-collections/community.general/pull/8876). -- gitlab_project - add option ``container_expiration_policy`` to schedule container registry cleanup (https://github.com/ansible-collections/community.general/pull/8674). -- gitlab_project - add option ``issues_access_level`` to enable/disable project issues (https://github.com/ansible-collections/community.general/pull/8760). -- gitlab_project - add option ``model_registry_access_level`` to disable model registry (https://github.com/ansible-collections/community.general/pull/8688). -- gitlab_project - add option ``pages_access_level`` to disable project pages (https://github.com/ansible-collections/community.general/pull/8688). -- gitlab_project - add option ``repository_access_level`` to disable project repository (https://github.com/ansible-collections/community.general/pull/8674). -- gitlab_project - add option ``service_desk_enabled`` to disable service desk (https://github.com/ansible-collections/community.general/pull/8688). -- gitlab_project - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). -- gitlab_project - sorted parameters in order to avoid future merge conflicts (https://github.com/ansible-collections/community.general/pull/8759). -- gitlab_runner - better construct when using ``dict.items()`` (https://github.com/ansible-collections/community.general/pull/8876). -- hashids filter plugin - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). -- homebrew - speed up brew install and upgrade (https://github.com/ansible-collections/community.general/pull/9022). -- hwc_ecs_instance - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). -- hwc_evs_disk - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). -- hwc_vpc_eip - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). -- hwc_vpc_peering_connect - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). -- hwc_vpc_port - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). -- hwc_vpc_subnet - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). -- icinga2_host - replace loop with dict comprehension (https://github.com/ansible-collections/community.general/pull/8876). -- imc_rest - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). -- ipa_dnsrecord - adds ``SSHFP`` record type for managing SSH fingerprints in FreeIPA DNS (https://github.com/ansible-collections/community.general/pull/8404). -- ipa_otptoken - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). -- jenkins_node - add ``offline_message`` parameter for updating a Jenkins node offline cause reason when the state is "disabled" (offline) (https://github.com/ansible-collections/community.general/pull/9084)." -- jira - adjust code ahead of the old ``VardDict`` deprecation (https://github.com/ansible-collections/community.general/pull/8856). -- jira - mute the old ``VarDict`` deprecation (https://github.com/ansible-collections/community.general/pull/8776). -- jira - replace deprecated params when using decorator ``cause_changes`` (https://github.com/ansible-collections/community.general/pull/8791). -- keep_keys filter plugin - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). -- keycloak module utils - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). -- keycloak_client - add ``client-x509`` choice to ``client_authenticator_type`` (https://github.com/ansible-collections/community.general/pull/8973). -- keycloak_client - assign auth flow by name (https://github.com/ansible-collections/community.general/pull/8428). -- keycloak_client - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). -- keycloak_clientscope - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). -- keycloak_identity_provider - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). -- keycloak_realm - add boolean toggle to configure organization support for a given keycloak realm (https://github.com/ansible-collections/community.general/issues/9027, https://github.com/ansible-collections/community.general/pull/8927/). -- keycloak_user_federation - add module argument allowing users to optout of the removal of unspecified mappers, for example to keep the keycloak default mappers (https://github.com/ansible-collections/community.general/pull/8764). -- keycloak_user_federation - add the user federation config parameter ``referral`` to the module arguments (https://github.com/ansible-collections/community.general/pull/8954). -- keycloak_user_federation - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). -- keycloak_user_federation - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). -- keycloak_user_federation - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). -- linode - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). -- locale_gen - add support for multiple locales (https://github.com/ansible-collections/community.general/issues/8677, https://github.com/ansible-collections/community.general/pull/8682). -- lxc_container - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). -- lxd_container - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). -- manageiq_provider - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). -- mattermost - adds support for message priority (https://github.com/ansible-collections/community.general/issues/9068, https://github.com/ansible-collections/community.general/pull/9087). -- memcached, pickle, redis, yaml cache plugins - make sure that all options are typed (https://github.com/ansible-collections/community.general/pull/8624). -- memset_dns_reload - replace loop with ``dict()`` (https://github.com/ansible-collections/community.general/pull/8876). -- memset_memstore_info - replace loop with ``dict()`` (https://github.com/ansible-collections/community.general/pull/8876). -- memset_server_info - replace loop with ``dict()`` (https://github.com/ansible-collections/community.general/pull/8876). -- memset_zone - replace loop with ``dict()`` (https://github.com/ansible-collections/community.general/pull/8876). -- memset_zone_domain - replace loop with ``dict()`` (https://github.com/ansible-collections/community.general/pull/8876). -- memset_zone_record - replace loop with ``dict()`` (https://github.com/ansible-collections/community.general/pull/8876). -- nmcli - add ``conn_enable`` param to reload connection (https://github.com/ansible-collections/community.general/issues/3752, https://github.com/ansible-collections/community.general/issues/8704, https://github.com/ansible-collections/community.general/pull/8897). -- nmcli - add ``state=up`` and ``state=down`` to enable/disable connections (https://github.com/ansible-collections/community.general/issues/3752, https://github.com/ansible-collections/community.general/issues/8704, https://github.com/ansible-collections/community.general/issues/7152, https://github.com/ansible-collections/community.general/pull/8897). -- nmcli - better construct when using ``dict.items()`` (https://github.com/ansible-collections/community.general/pull/8876). -- npm - add ``force`` parameter to allow ``--force`` (https://github.com/ansible-collections/community.general/pull/8885). -- ocapi_utils - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). -- one_image - add ``create``, ``template`` and ``datastore_id`` arguments for image creation (https://github.com/ansible-collections/community.general/pull/9075). -- one_image - add ``wait_timeout`` argument for adjustable timeouts (https://github.com/ansible-collections/community.general/pull/9075). -- one_image - add option ``persistent`` to manage image persistence (https://github.com/ansible-collections/community.general/issues/3578, https://github.com/ansible-collections/community.general/pull/8889). -- one_image - extend xsd scheme to make it return a lot more info about image (https://github.com/ansible-collections/community.general/pull/8889). -- one_image - refactor code to make it more similar to ``one_template`` and ``one_vnet`` (https://github.com/ansible-collections/community.general/pull/8889). -- one_image_info - extend xsd scheme to make it return a lot more info about image (https://github.com/ansible-collections/community.general/pull/8889). -- one_image_info - refactor code to make it more similar to ``one_template`` and ``one_vnet`` (https://github.com/ansible-collections/community.general/pull/8889). -- one_service - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). -- one_vm - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). -- onepassword lookup plugin - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). -- open_iscsi - allow login to a portal with multiple targets without specifying any of them (https://github.com/ansible-collections/community.general/pull/8719). -- openbsd_pkg - adds diff support to show changes in installed package list. This does not yet work for check mode (https://github.com/ansible-collections/community.general/pull/8402). -- opennebula.py - add VM ``id`` and VM ``host`` to inventory host data (https://github.com/ansible-collections/community.general/pull/8532). -- opentelemetry callback plugin - fix default value for ``store_spans_in_file`` causing traces to be produced to a file named ``None`` (https://github.com/ansible-collections/community.general/issues/8566, https://github.com/ansible-collections/community.general/pull/8741). -- opkg - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9086). -- passwordstore lookup plugin - add subkey creation/update support (https://github.com/ansible-collections/community.general/pull/8952). -- passwordstore lookup plugin - add the current user to the lockfile file name to address issues on multi-user systems (https://github.com/ansible-collections/community.general/pull/8689). -- pids - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). -- pipx - add parameter ``suffix`` to module (https://github.com/ansible-collections/community.general/pull/8675, https://github.com/ansible-collections/community.general/issues/8656). -- pipx - added new states ``install_all``, ``uninject``, ``upgrade_shared``, ``pin``, and ``unpin`` (https://github.com/ansible-collections/community.general/pull/8809). -- pipx - added parameter ``global`` to module (https://github.com/ansible-collections/community.general/pull/8793). -- pipx - refactor out parsing of ``pipx list`` output to module utils (https://github.com/ansible-collections/community.general/pull/9044). -- pipx - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). -- pipx_info - add new return value ``pinned`` (https://github.com/ansible-collections/community.general/pull/9044). -- pipx_info - added parameter ``global`` to module (https://github.com/ansible-collections/community.general/pull/8793). -- pipx_info - refactor out parsing of ``pipx list`` output to module utils (https://github.com/ansible-collections/community.general/pull/9044). -- pipx_info - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). -- pkg5_publisher - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). -- pkgng - add option ``use_globs`` (default ``true``) to optionally disable glob patterns (https://github.com/ansible-collections/community.general/issues/8632, https://github.com/ansible-collections/community.general/pull/8633). -- proxmox - add ``disk_volume`` and ``mount_volumes`` keys for better readability (https://github.com/ansible-collections/community.general/pull/8542). -- proxmox - allow specification of the API port when using proxmox_* (https://github.com/ansible-collections/community.general/issues/8440, https://github.com/ansible-collections/community.general/pull/8441). -- proxmox - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). -- proxmox - translate the old ``disk`` and ``mounts`` keys to the new handling internally (https://github.com/ansible-collections/community.general/pull/8542). -- proxmox inventory plugin - add new fact for LXC interface details (https://github.com/ansible-collections/community.general/pull/8713). -- proxmox inventory plugin - clean up authentication code (https://github.com/ansible-collections/community.general/pull/8917). -- proxmox inventory plugin - fix urllib3 ``InsecureRequestWarnings`` not being suppressed when a token is used (https://github.com/ansible-collections/community.general/pull/9099). -- proxmox_disk - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). -- proxmox_kvm - adds the ``ciupgrade`` parameter to specify whether cloud-init should upgrade system packages at first boot (https://github.com/ansible-collections/community.general/pull/9066). -- proxmox_kvm - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). -- proxmox_kvm - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). -- proxmox_template - small refactor in logic for determining whether a template exists or not (https://github.com/ansible-collections/community.general/pull/8516). -- proxmox_vm_info - add ``network`` option to retrieve current network information (https://github.com/ansible-collections/community.general/pull/8471). -- redfish_* modules - adds ``ciphers`` option for custom cipher selection (https://github.com/ansible-collections/community.general/pull/8533). -- redfish_command - add ``UpdateUserAccountTypes`` command (https://github.com/ansible-collections/community.general/issues/9058, https://github.com/ansible-collections/community.general/pull/9059). -- redfish_command - add ``wait`` and ``wait_timeout`` options to allow a user to block a command until a service is accessible after performing the requested command (https://github.com/ansible-collections/community.general/issues/8051, https://github.com/ansible-collections/community.general/pull/8434). -- redfish_command - add handling of the ``PasswordChangeRequired`` message from services in the ``UpdateUserPassword`` command to directly modify the user's password if the requested user is the one invoking the operation (https://github.com/ansible-collections/community.general/issues/8652, https://github.com/ansible-collections/community.general/pull/8653). -- redfish_confg - remove ``CapacityBytes`` from required paramaters of the ``CreateVolume`` command (https://github.com/ansible-collections/community.general/pull/8956). -- redfish_config - add parameter ``storage_none_volume_deletion`` to ``CreateVolume`` command in order to control the automatic deletion of non-RAID volumes (https://github.com/ansible-collections/community.general/pull/8990). -- redfish_info - add command ``CheckAvailability`` to check if a service is accessible (https://github.com/ansible-collections/community.general/issues/8051, https://github.com/ansible-collections/community.general/pull/8434). -- redfish_info - adds ``RedfishURI`` and ``StorageId`` to Disk inventory (https://github.com/ansible-collections/community.general/pull/8937). -- redfish_utils - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). -- redfish_utils module utils - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). -- redfish_utils module utils - schedule a BIOS configuration job at next reboot when the BIOS config is changed (https://github.com/ansible-collections/community.general/pull/9012). -- redis cache plugin - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). -- redis, redis_info - add ``client_cert`` and ``client_key`` options to specify path to certificate for Redis authentication (https://github.com/ansible-collections/community.general/pull/8654). -- redis_info - adds support for getting cluster info (https://github.com/ansible-collections/community.general/pull/8464). -- remove_keys filter plugin - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). -- replace_keys filter plugin - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). -- scaleway - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). -- scaleway module utils - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). -- scaleway_compute - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). -- scaleway_container - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8858). -- scaleway_container_info - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8858). -- scaleway_container_namespace - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8858). -- scaleway_container_namespace_info - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8858). -- scaleway_container_registry - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8858). -- scaleway_container_registry_info - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8858). -- scaleway_function - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8858). -- scaleway_function_info - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8858). -- scaleway_function_namespace - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8858). -- scaleway_function_namespace_info - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8858). -- scaleway_ip - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). -- scaleway_lb - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). -- scaleway_security_group - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). -- scaleway_security_group - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). -- scaleway_user_data - better construct when using ``dict.items()`` (https://github.com/ansible-collections/community.general/pull/8876). -- scaleway_user_data - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). -- sensu_silence - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). -- snmp_facts - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). -- sorcery - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). -- sudosu become plugin - added an option (``alt_method``) to enhance compatibility with more versions of ``su`` (https://github.com/ansible-collections/community.general/pull/8214). -- udm_dns_record - replace loop with ``dict.update()`` (https://github.com/ansible-collections/community.general/pull/8876). -- ufw - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). -- unsafe plugin utils - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). -- vardict module utils - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). -- vars MH module utils - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). -- virtualbox inventory plugin - expose a new parameter ``enable_advanced_group_parsing`` to change how the VirtualBox dynamic inventory parses VM groups (https://github.com/ansible-collections/community.general/issues/8508, https://github.com/ansible-collections/community.general/pull/8510). -- vmadm - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). -- wdc_redfish_command - minor change to handle upgrade file for Redfish WD platforms (https://github.com/ansible-collections/community.general/pull/8444). - -Breaking Changes / Porting Guide --------------------------------- - -- The collection no longer supports ansible-core 2.13 and ansible-core 2.14. While most (or even all) modules and plugins might still work with these versions, they are no longer tested in CI and breakages regarding them will not be fixed (https://github.com/ansible-collections/community.general/pull/8921). -- cmd_runner module utils - CLI arguments created directly from module parameters are no longer assigned a default formatter (https://github.com/ansible-collections/community.general/pull/8928). -- irc - the defaults of ``use_tls`` and ``validate_certs`` changed from ``false`` to ``true`` (https://github.com/ansible-collections/community.general/pull/8918). -- rhsm_repository - the states ``present`` and ``absent`` have been removed. Use ``enabled`` and ``disabled`` instead (https://github.com/ansible-collections/community.general/pull/8918). - -Deprecated Features -------------------- - -- CmdRunner module util - setting the value of the ``ignore_none`` parameter within a ``CmdRunner`` context is deprecated and that feature should be removed in community.general 12.0.0 (https://github.com/ansible-collections/community.general/pull/8479). -- MH decorator cause_changes module utils - deprecate parameters ``on_success`` and ``on_failure`` (https://github.com/ansible-collections/community.general/pull/8791). -- git_config - the ``list_all`` option has been deprecated and will be removed in community.general 11.0.0. Use the ``community.general.git_config_info`` module instead (https://github.com/ansible-collections/community.general/pull/8453). -- git_config - using ``state=present`` without providing ``value`` is deprecated and will be disallowed in community.general 11.0.0. Use the ``community.general.git_config_info`` module instead to read a value (https://github.com/ansible-collections/community.general/pull/8453). -- hipchat - the hipchat service has been discontinued and the self-hosted variant has been End of Life since 2020. The module is therefore deprecated and will be removed from community.general 11.0.0 if nobody provides compelling reasons to still keep it (https://github.com/ansible-collections/community.general/pull/8919). -- pipx - support for versions of the command line tool ``pipx`` older than ``1.7.0`` is deprecated and will be removed in community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/8793). -- pipx_info - support for versions of the command line tool ``pipx`` older than ``1.7.0`` is deprecated and will be removed in community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/8793). - -Removed Features (previously deprecated) ----------------------------------------- - -- The consul_acl module has been removed. Use community.general.consul_token and/or community.general.consul_policy instead (https://github.com/ansible-collections/community.general/pull/8921). -- The hipchat callback plugin has been removed. The hipchat service has been discontinued and the self-hosted variant has been End of Life since 2020 (https://github.com/ansible-collections/community.general/pull/8921). -- The redhat module utils has been removed (https://github.com/ansible-collections/community.general/pull/8921). -- The rhn_channel module has been removed (https://github.com/ansible-collections/community.general/pull/8921). -- The rhn_register module has been removed (https://github.com/ansible-collections/community.general/pull/8921). -- consul - removed the ``ack_params_state_absent`` option. It had no effect anymore (https://github.com/ansible-collections/community.general/pull/8918). -- ejabberd_user - removed the ``logging`` option (https://github.com/ansible-collections/community.general/pull/8918). -- gitlab modules - remove basic auth feature (https://github.com/ansible-collections/community.general/pull/8405). -- proxmox_kvm - removed the ``proxmox_default_behavior`` option. Explicitly specify the old default values if you were using ``proxmox_default_behavior=compatibility``, otherwise simply remove it (https://github.com/ansible-collections/community.general/pull/8918). -- redhat_subscriptions - removed the ``pool`` option. Use ``pool_ids`` instead (https://github.com/ansible-collections/community.general/pull/8918). - -Bugfixes --------- - -- bitwarden lookup plugin - fix ``KeyError`` in ``search_field`` (https://github.com/ansible-collections/community.general/issues/8549, https://github.com/ansible-collections/community.general/pull/8557). -- bitwarden lookup plugin - support BWS v0.3.0 syntax breaking change (https://github.com/ansible-collections/community.general/pull/9028). -- cloudflare_dns - fix changing Cloudflare SRV records (https://github.com/ansible-collections/community.general/issues/8679, https://github.com/ansible-collections/community.general/pull/8948). -- cmd_runner module utils - call to ``get_best_parsable_locales()`` was missing parameter (https://github.com/ansible-collections/community.general/pull/8929). -- collection_version lookup plugin - use ``importlib`` directly instead of the deprecated and in ansible-core 2.19 removed ``ansible.module_utils.compat.importlib`` (https://github.com/ansible-collections/community.general/pull/9084). -- cpanm - use new ``VarDict`` to prevent deprecation warning (https://github.com/ansible-collections/community.general/issues/8410, https://github.com/ansible-collections/community.general/pull/8411). -- dig lookup plugin - fix using only the last nameserver specified (https://github.com/ansible-collections/community.general/pull/8970). -- django module utils - use new ``VarDict`` to prevent deprecation warning (https://github.com/ansible-collections/community.general/issues/8410, https://github.com/ansible-collections/community.general/pull/8411). -- django_command - option ``command`` is now split lexically before passed to underlying PythonRunner (https://github.com/ansible-collections/community.general/pull/8944). -- gconftool2_info - use new ``VarDict`` to prevent deprecation warning (https://github.com/ansible-collections/community.general/issues/8410, https://github.com/ansible-collections/community.general/pull/8411). -- git_config - fix behavior of ``state=absent`` if ``value`` is present (https://github.com/ansible-collections/community.general/issues/8436, https://github.com/ansible-collections/community.general/pull/8452). -- gitlab_group_access_token - fix crash in check mode caused by attempted access to a newly created access token (https://github.com/ansible-collections/community.general/pull/8796). -- gitlab_label - update label's color (https://github.com/ansible-collections/community.general/pull/9010). -- gitlab_project - fix ``container_expiration_policy`` not being applied when creating a new project (https://github.com/ansible-collections/community.general/pull/8790). -- gitlab_project - fix crash caused by old Gitlab projects not having a ``container_expiration_policy`` attribute (https://github.com/ansible-collections/community.general/pull/8790). -- gitlab_project_access_token - fix crash in check mode caused by attempted access to a newly created access token (https://github.com/ansible-collections/community.general/pull/8796). -- gitlab_runner - fix ``paused`` parameter being ignored (https://github.com/ansible-collections/community.general/pull/8648). -- homebrew - do not fail when brew prints warnings (https://github.com/ansible-collections/community.general/pull/8406, https://github.com/ansible-collections/community.general/issues/7044). -- homebrew_cask - fix ``upgrade_all`` returns ``changed`` when nothing upgraded (https://github.com/ansible-collections/community.general/issues/8707, https://github.com/ansible-collections/community.general/pull/8708). -- homectl - the module now tries to use ``legacycrypt`` on Python 3.13+ (https://github.com/ansible-collections/community.general/issues/4691, https://github.com/ansible-collections/community.general/pull/8987). -- hponcfg - use new ``VarDict`` to prevent deprecation warning (https://github.com/ansible-collections/community.general/issues/8410, https://github.com/ansible-collections/community.general/pull/8411). -- ini_file - pass absolute paths to ``module.atomic_move()`` (https://github.com/ansible/ansible/issues/83950, https://github.com/ansible-collections/community.general/pull/8925). -- ipa_host - add ``force_create``, fix ``enabled`` and ``disabled`` states (https://github.com/ansible-collections/community.general/issues/1094, https://github.com/ansible-collections/community.general/pull/8920). -- ipa_hostgroup - fix ``enabled `` and ``disabled`` states (https://github.com/ansible-collections/community.general/issues/8408, https://github.com/ansible-collections/community.general/pull/8900). -- java_keystore - pass absolute paths to ``module.atomic_move()`` (https://github.com/ansible/ansible/issues/83950, https://github.com/ansible-collections/community.general/pull/8925). -- jenkins_node - fixed ``enabled``, ``disable`` and ``absent`` node state redirect authorization issues, same as was present for ``present`` (https://github.com/ansible-collections/community.general/pull/9084). -- jenkins_plugin - pass absolute paths to ``module.atomic_move()`` (https://github.com/ansible/ansible/issues/83950, https://github.com/ansible-collections/community.general/pull/8925). -- kdeconfig - pass absolute paths to ``module.atomic_move()`` (https://github.com/ansible/ansible/issues/83950, https://github.com/ansible-collections/community.general/pull/8925). -- kernel_blacklist - use new ``VarDict`` to prevent deprecation warning (https://github.com/ansible-collections/community.general/issues/8410, https://github.com/ansible-collections/community.general/pull/8411). -- keycloak_client - fix TypeError when sanitizing the ``saml.signing.private.key`` attribute in the module's diff or state output. The ``sanitize_cr`` function expected a dict where in some cases a list might occur (https://github.com/ansible-collections/community.general/pull/8403). -- keycloak_clientscope - remove IDs from clientscope and its protocol mappers on comparison for changed check (https://github.com/ansible-collections/community.general/pull/8545). -- keycloak_clientscope_type - fix detect changes in check mode (https://github.com/ansible-collections/community.general/issues/9092, https://github.com/ansible-collections/community.general/pull/9093). -- keycloak_group - fix crash caused in subgroup creation. The crash was caused by a missing or empty ``subGroups`` property in Keycloak ≥23 (https://github.com/ansible-collections/community.general/issues/8788, https://github.com/ansible-collections/community.general/pull/8979). -- keycloak_realm - add normalizations for ``attributes`` and ``protocol_mappers`` (https://github.com/ansible-collections/community.general/pull/8496). -- keycloak_realm - fix change detection in check mode by sorting the lists in the realms beforehand (https://github.com/ansible-collections/community.general/pull/8877). -- keycloak_realm_key - fix invalid usage of ``parent_id`` (https://github.com/ansible-collections/community.general/issues/7850, https://github.com/ansible-collections/community.general/pull/8823). -- keycloak_user_federation - add module argument allowing users to configure the update mode for the parameter ``bindCredential`` (https://github.com/ansible-collections/community.general/pull/8898). -- keycloak_user_federation - fix key error when removing mappers during an update and new mappers are specified in the module args (https://github.com/ansible-collections/community.general/pull/8762). -- keycloak_user_federation - fix the ``UnboundLocalError`` that occurs when an ID is provided for a user federation mapper (https://github.com/ansible-collections/community.general/pull/8831). -- keycloak_user_federation - get cleartext IDP ``clientSecret`` from full realm info to detect changes to it (https://github.com/ansible-collections/community.general/issues/8294, https://github.com/ansible-collections/community.general/pull/8735). -- keycloak_user_federation - minimize change detection by setting ``krbPrincipalAttribute`` to ``''`` in Keycloak responses if missing (https://github.com/ansible-collections/community.general/pull/8785). -- keycloak_user_federation - remove ``lastSync`` parameter from Keycloak responses to minimize diff/changes (https://github.com/ansible-collections/community.general/pull/8812). -- keycloak_user_federation - remove existing user federation mappers if they are not present in the federation configuration and will not be updated (https://github.com/ansible-collections/community.general/issues/7169, https://github.com/ansible-collections/community.general/pull/8695). -- keycloak_user_federation - sort desired and after mapper list by name (analog to before mapper list) to minimize diff and make change detection more accurate (https://github.com/ansible-collections/community.general/pull/8761). -- keycloak_userprofile - fix empty response when fetching userprofile component by removing ``parent=parent_id`` filter (https://github.com/ansible-collections/community.general/pull/8923). -- keycloak_userprofile - improve diff by deserializing the fetched ``kc.user.profile.config`` and serialize it only when sending back (https://github.com/ansible-collections/community.general/pull/8940). -- launched - correctly report changed status in check mode (https://github.com/ansible-collections/community.general/pull/8406). -- locale_gen - use new ``VarDict`` to prevent deprecation warning (https://github.com/ansible-collections/community.general/issues/8410, https://github.com/ansible-collections/community.general/pull/8411). -- lxd_container - fix bug introduced in previous commit (https://github.com/ansible-collections/community.general/pull/8895, https://github.com/ansible-collections/community.general/issues/8888). -- mksysb - use new ``VarDict`` to prevent deprecation warning (https://github.com/ansible-collections/community.general/issues/8410, https://github.com/ansible-collections/community.general/pull/8411). -- modprobe - fix check mode not being honored for ``persistent`` option (https://github.com/ansible-collections/community.general/issues/9051, https://github.com/ansible-collections/community.general/pull/9052). -- nsupdate - fix 'index out of range' error when changing NS records by falling back to authority section of the response (https://github.com/ansible-collections/community.general/issues/8612, https://github.com/ansible-collections/community.general/pull/8614). -- one_host - fix if statements for cases when ``ID=0`` (https://github.com/ansible-collections/community.general/issues/1199, https://github.com/ansible-collections/community.general/pull/8907). -- one_image - fix module failing due to a class method typo (https://github.com/ansible-collections/community.general/pull/9056). -- one_image_info - fix module failing due to a class method typo (https://github.com/ansible-collections/community.general/pull/9056). -- one_service - fix service creation after it was deleted with ``unique`` parameter (https://github.com/ansible-collections/community.general/issues/3137, https://github.com/ansible-collections/community.general/pull/8887). -- one_vnet - fix module failing due to a variable typo (https://github.com/ansible-collections/community.general/pull/9019). -- opennebula inventory plugin - fix invalid reference to IP when inventory runs against NICs with no IPv4 address (https://github.com/ansible-collections/community.general/pull/8489). -- opentelemetry callback - do not save the JSON response when using the ``ansible.builtin.uri`` module (https://github.com/ansible-collections/community.general/pull/8430). -- opentelemetry callback - do not save the content response when using the ``ansible.builtin.slurp`` module (https://github.com/ansible-collections/community.general/pull/8430). -- pam_limits - pass absolute paths to ``module.atomic_move()`` (https://github.com/ansible/ansible/issues/83950, https://github.com/ansible-collections/community.general/pull/8925). -- paman - do not fail if an empty list of packages has been provided and there is nothing to do (https://github.com/ansible-collections/community.general/pull/8514). -- pipx - it was ignoring ``global`` when listing existing applications (https://github.com/ansible-collections/community.general/pull/9044). -- pipx module utils - add missing command line formatter for argument ``spec_metadata`` (https://github.com/ansible-collections/community.general/pull/9044). -- pipx_info - use new ``VarDict`` to prevent deprecation warning (https://github.com/ansible-collections/community.general/issues/8410, https://github.com/ansible-collections/community.general/pull/8411). -- proxmox - fix idempotency on creation of mount volumes using Proxmox' special ``:`` syntax (https://github.com/ansible-collections/community.general/issues/8407, https://github.com/ansible-collections/community.general/pull/8542). -- proxmox - fixed an issue where the new volume handling incorrectly converted ``null`` values into ``"None"`` strings (https://github.com/ansible-collections/community.general/pull/8646). -- proxmox - fixed an issue where volume strings where overwritten instead of appended to in the new ``build_volume()`` method (https://github.com/ansible-collections/community.general/pull/8646). -- proxmox - removed the forced conversion of non-string values to strings to be consistent with the module documentation (https://github.com/ansible-collections/community.general/pull/8646). -- proxmox inventory plugin - fixed a possible error on concatenating responses from proxmox. In case an API call unexpectedly returned an empty result, the inventory failed with a fatal error. Added check for empty response (https://github.com/ansible-collections/community.general/issues/8798, https://github.com/ansible-collections/community.general/pull/8794). -- python_runner module utils - parameter ``path_prefix`` was being handled as string when it should be a list (https://github.com/ansible-collections/community.general/pull/8944). -- redfish_utils module utils - do not fail when language is not exactly "en" (https://github.com/ansible-collections/community.general/pull/8613). -- redfish_utils module utils - fix issue with URI parsing to gracefully handling trailing slashes when extracting member identifiers (https://github.com/ansible-collections/community.general/issues/9047, https://github.com/ansible-collections/community.general/pull/9057). -- snap - use new ``VarDict`` to prevent deprecation warning (https://github.com/ansible-collections/community.general/issues/8410, https://github.com/ansible-collections/community.general/pull/8411). -- snap_alias - use new ``VarDict`` to prevent deprecation warning (https://github.com/ansible-collections/community.general/issues/8410, https://github.com/ansible-collections/community.general/pull/8411). -- udm_user - the module now tries to use ``legacycrypt`` on Python 3.13+ (https://github.com/ansible-collections/community.general/issues/4690, https://github.com/ansible-collections/community.general/pull/8987). - -Known Issues ------------- - -- jenkins_node - the module is not able to update offline message when node is already offline due to internally using toggleOffline API (https://github.com/ansible-collections/community.general/pull/9084). - -New Plugins ------------ - -Filter -~~~~~~ - -- community.general.keep_keys - Keep specific keys from dictionaries in a list. -- community.general.remove_keys - Remove specific keys from dictionaries in a list. -- community.general.replace_keys - Replace specific keys in a list of dictionaries. -- community.general.reveal_ansible_type - Return input type. - -Test -~~~~ - -- community.general.ansible_type - Validate input type. - -New Modules ------------ - -- community.general.bootc_manage - Bootc Switch and Upgrade. -- community.general.consul_agent_check - Add, modify, and delete checks within a consul cluster. -- community.general.consul_agent_service - Add, modify and delete services within a consul cluster. -- community.general.django_check - Wrapper for C(django-admin check). -- community.general.django_createcachetable - Wrapper for C(django-admin createcachetable). -- community.general.homebrew_services - Services manager for Homebrew. -- community.general.ipa_getkeytab - Manage keytab file in FreeIPA. -- community.general.jenkins_node - Manage Jenkins nodes. -- community.general.keycloak_component - Allows administration of Keycloak components via Keycloak API. -- community.general.keycloak_realm_keys_metadata_info - Allows obtaining Keycloak realm keys metadata via Keycloak API. -- community.general.keycloak_userprofile - Allows managing Keycloak User Profiles. -- community.general.krb_ticket - Kerberos utils for managing tickets. -- community.general.one_vnet - Manages OpenNebula virtual networks. -- community.general.zypper_repository_info - List Zypper repositories. +This file is a placeholder; a version-specific ``CHANGELOG-vX.rst`` will be generated during releases from fragments +under ``changelogs/fragments``. On release branches once a release has been created, consult the branch's version-specific +file for changes that have occurred in that branch. diff --git a/README.md b/README.md index beeca12078..7a81456861 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,10 @@ SPDX-License-Identifier: GPL-3.0-or-later # Community General Collection -[![Documentation](https://img.shields.io/badge/docs-brightgreen.svg)](https://docs.ansible.com/ansible/latest/collections/community/general/) -[![Build Status](https://dev.azure.com/ansible/community.general/_apis/build/status/CI?branchName=stable-10)](https://dev.azure.com/ansible/community.general/_build?definitionId=31) -[![EOL CI](https://github.com/ansible-collections/community.general/actions/workflows/ansible-test.yml/badge.svg?branch=stable-10)](https://github.com/ansible-collections/community.general/actions) +[![Documentation](https://img.shields.io/badge/docs-brightgreen.svg)](https://docs.ansible.com/ansible/devel/collections/community/general/) +[![Build Status](https://dev.azure.com/ansible/community.general/_apis/build/status/CI?branchName=main)](https://dev.azure.com/ansible/community.general/_build?definitionId=31) +[![EOL CI](https://github.com/ansible-collections/community.general/actions/workflows/ansible-test.yml/badge.svg?branch=main)](https://github.com/ansible-collections/community.general/actions) +[![Nox CI](https://github.com/ansible-collections/community.general/actions/workflows/nox.yml/badge.svg?branch=main)](https://github.com/ansible-collections/community.general/actions) [![Codecov](https://img.shields.io/codecov/c/github/ansible-collections/community.general)](https://codecov.io/gh/ansible-collections/community.general) [![REUSE status](https://api.reuse.software/badge/github.com/ansible-collections/community.general)](https://api.reuse.software/info/github.com/ansible-collections/community.general) @@ -117,7 +118,7 @@ See the [Releasing guidelines](https://github.com/ansible/community-docs/blob/ma ## Release notes -See the [changelog](https://github.com/ansible-collections/community.general/blob/stable-10/CHANGELOG.md). +See the [changelog](https://github.com/ansible-collections/community.general/blob/main/CHANGELOG.md). ## Roadmap @@ -136,8 +137,8 @@ See [this issue](https://github.com/ansible-collections/community.general/issues This collection is primarily licensed and distributed as a whole under the GNU General Public License v3.0 or later. -See [LICENSES/GPL-3.0-or-later.txt](https://github.com/ansible-collections/community.general/blob/stable-10/COPYING) for the full text. +See [LICENSES/GPL-3.0-or-later.txt](https://github.com/ansible-collections/community.general/blob/main/COPYING) for the full text. -Parts of the collection are licensed under the [BSD 2-Clause license](https://github.com/ansible-collections/community.general/blob/stable-10/LICENSES/BSD-2-Clause.txt), the [MIT license](https://github.com/ansible-collections/community.general/blob/stable-10/LICENSES/MIT.txt), and the [PSF 2.0 license](https://github.com/ansible-collections/community.general/blob/stable-10/LICENSES/PSF-2.0.txt). +Parts of the collection are licensed under the [BSD 2-Clause license](https://github.com/ansible-collections/community.general/blob/main/LICENSES/BSD-2-Clause.txt), the [MIT license](https://github.com/ansible-collections/community.general/blob/main/LICENSES/MIT.txt), and the [PSF 2.0 license](https://github.com/ansible-collections/community.general/blob/main/LICENSES/PSF-2.0.txt). All files have a machine readable `SDPX-License-Identifier:` comment denoting its respective license(s) or an equivalent entry in an accompanying `.license` file. Only changelog fragments (which will not be part of a release) are covered by a blanket statement in `.reuse/dep5`. This conforms to the [REUSE specification](https://reuse.software/spec/). diff --git a/REUSE.toml b/REUSE.toml new file mode 100644 index 0000000000..ff95bb8217 --- /dev/null +++ b/REUSE.toml @@ -0,0 +1,11 @@ +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +version = 1 + +[[annotations]] +path = "changelogs/fragments/**" +precedence = "aggregate" +SPDX-FileCopyrightText = "Ansible Project" +SPDX-License-Identifier = "GPL-3.0-or-later" diff --git a/antsibull-nox.toml b/antsibull-nox.toml new file mode 100644 index 0000000000..8c1c501896 --- /dev/null +++ b/antsibull-nox.toml @@ -0,0 +1,48 @@ +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later +# SPDX-FileCopyrightText: 2025 Felix Fontein + +[collection_sources] +"ansible.posix" = "git+https://github.com/ansible-collections/ansible.posix.git,main" +"community.crypto" = "git+https://github.com/ansible-collections/community.crypto.git,main" +"community.docker" = "git+https://github.com/ansible-collections/community.docker.git,main" +"community.internal_test_tools" = "git+https://github.com/ansible-collections/community.internal_test_tools.git,main" + +[sessions] + +[sessions.docs_check] +validate_collection_refs="all" + +[sessions.license_check] + +[sessions.extra_checks] +run_no_unwanted_files = true +no_unwanted_files_module_extensions = [".py"] +no_unwanted_files_yaml_extensions = [".yml"] +run_action_groups = true + +[[sessions.extra_checks.action_groups_config]] +name = "consul" +pattern = "^consul_.*$" +exclusions = [ + "consul_acl_bootstrap", + "consul_kv", +] +doc_fragment = "community.general.consul.actiongroup_consul" + +[[sessions.extra_checks.action_groups_config]] +name = "keycloak" +pattern = "^keycloak_.*$" +exclusions = [ + "keycloak_realm_info", +] +doc_fragment = "community.general.keycloak.actiongroup_keycloak" + +[[sessions.extra_checks.action_groups_config]] +name = "proxmox" +pattern = "^proxmox(_.*)?$" +exclusions = [] +doc_fragment = "community.general.proxmox.actiongroup_proxmox" + +[sessions.build_import_check] +run_galaxy_importer = true diff --git a/changelogs/changelog.yaml b/changelogs/changelog.yaml index 10a94fd5b9..ab0a7be6fd 100644 --- a/changelogs/changelog.yaml +++ b/changelogs/changelog.yaml @@ -1,1659 +1,3 @@ --- -ancestor: 9.0.0 -releases: - 10.0.0: - changes: - breaking_changes: - - The collection no longer supports ansible-core 2.13 and ansible-core 2.14. - While most (or even all) modules and plugins might still work with these - versions, they are no longer tested in CI and breakages regarding them will - not be fixed (https://github.com/ansible-collections/community.general/pull/8921). - - cmd_runner module utils - CLI arguments created directly from module parameters - are no longer assigned a default formatter (https://github.com/ansible-collections/community.general/pull/8928). - - irc - the defaults of ``use_tls`` and ``validate_certs`` changed from ``false`` - to ``true`` (https://github.com/ansible-collections/community.general/pull/8918). - - rhsm_repository - the states ``present`` and ``absent`` have been removed. - Use ``enabled`` and ``disabled`` instead (https://github.com/ansible-collections/community.general/pull/8918). - bugfixes: - - bitwarden lookup plugin - fix ``KeyError`` in ``search_field`` (https://github.com/ansible-collections/community.general/issues/8549, - https://github.com/ansible-collections/community.general/pull/8557). - - bitwarden lookup plugin - support BWS v0.3.0 syntax breaking change (https://github.com/ansible-collections/community.general/pull/9028). - - cloudflare_dns - fix changing Cloudflare SRV records (https://github.com/ansible-collections/community.general/issues/8679, - https://github.com/ansible-collections/community.general/pull/8948). - - cmd_runner module utils - call to ``get_best_parsable_locales()`` was missing - parameter (https://github.com/ansible-collections/community.general/pull/8929). - - collection_version lookup plugin - use ``importlib`` directly instead of - the deprecated and in ansible-core 2.19 removed ``ansible.module_utils.compat.importlib`` - (https://github.com/ansible-collections/community.general/pull/9084). - - cpanm - use new ``VarDict`` to prevent deprecation warning (https://github.com/ansible-collections/community.general/issues/8410, - https://github.com/ansible-collections/community.general/pull/8411). - - dig lookup plugin - fix using only the last nameserver specified (https://github.com/ansible-collections/community.general/pull/8970). - - django module utils - use new ``VarDict`` to prevent deprecation warning - (https://github.com/ansible-collections/community.general/issues/8410, https://github.com/ansible-collections/community.general/pull/8411). - - django_command - option ``command`` is now split lexically before passed - to underlying PythonRunner (https://github.com/ansible-collections/community.general/pull/8944). - - gconftool2_info - use new ``VarDict`` to prevent deprecation warning (https://github.com/ansible-collections/community.general/issues/8410, - https://github.com/ansible-collections/community.general/pull/8411). - - git_config - fix behavior of ``state=absent`` if ``value`` is present (https://github.com/ansible-collections/community.general/issues/8436, - https://github.com/ansible-collections/community.general/pull/8452). - - gitlab_group_access_token - fix crash in check mode caused by attempted - access to a newly created access token (https://github.com/ansible-collections/community.general/pull/8796). - - gitlab_label - update label's color (https://github.com/ansible-collections/community.general/pull/9010). - - gitlab_project - fix ``container_expiration_policy`` not being applied when - creating a new project (https://github.com/ansible-collections/community.general/pull/8790). - - gitlab_project - fix crash caused by old Gitlab projects not having a ``container_expiration_policy`` - attribute (https://github.com/ansible-collections/community.general/pull/8790). - - gitlab_project_access_token - fix crash in check mode caused by attempted - access to a newly created access token (https://github.com/ansible-collections/community.general/pull/8796). - - gitlab_runner - fix ``paused`` parameter being ignored (https://github.com/ansible-collections/community.general/pull/8648). - - homebrew - do not fail when brew prints warnings (https://github.com/ansible-collections/community.general/pull/8406, - https://github.com/ansible-collections/community.general/issues/7044). - - homebrew_cask - fix ``upgrade_all`` returns ``changed`` when nothing upgraded - (https://github.com/ansible-collections/community.general/issues/8707, https://github.com/ansible-collections/community.general/pull/8708). - - homectl - the module now tries to use ``legacycrypt`` on Python 3.13+ (https://github.com/ansible-collections/community.general/issues/4691, - https://github.com/ansible-collections/community.general/pull/8987). - - hponcfg - use new ``VarDict`` to prevent deprecation warning (https://github.com/ansible-collections/community.general/issues/8410, - https://github.com/ansible-collections/community.general/pull/8411). - - ini_file - pass absolute paths to ``module.atomic_move()`` (https://github.com/ansible/ansible/issues/83950, - https://github.com/ansible-collections/community.general/pull/8925). - - ipa_host - add ``force_create``, fix ``enabled`` and ``disabled`` states - (https://github.com/ansible-collections/community.general/issues/1094, https://github.com/ansible-collections/community.general/pull/8920). - - ipa_hostgroup - fix ``enabled `` and ``disabled`` states (https://github.com/ansible-collections/community.general/issues/8408, - https://github.com/ansible-collections/community.general/pull/8900). - - java_keystore - pass absolute paths to ``module.atomic_move()`` (https://github.com/ansible/ansible/issues/83950, - https://github.com/ansible-collections/community.general/pull/8925). - - jenkins_node - fixed ``enabled``, ``disable`` and ``absent`` node state - redirect authorization issues, same as was present for ``present`` (https://github.com/ansible-collections/community.general/pull/9084). - - jenkins_plugin - pass absolute paths to ``module.atomic_move()`` (https://github.com/ansible/ansible/issues/83950, - https://github.com/ansible-collections/community.general/pull/8925). - - kdeconfig - pass absolute paths to ``module.atomic_move()`` (https://github.com/ansible/ansible/issues/83950, - https://github.com/ansible-collections/community.general/pull/8925). - - kernel_blacklist - use new ``VarDict`` to prevent deprecation warning (https://github.com/ansible-collections/community.general/issues/8410, - https://github.com/ansible-collections/community.general/pull/8411). - - keycloak_client - fix TypeError when sanitizing the ``saml.signing.private.key`` - attribute in the module's diff or state output. The ``sanitize_cr`` function - expected a dict where in some cases a list might occur (https://github.com/ansible-collections/community.general/pull/8403). - - keycloak_clientscope - remove IDs from clientscope and its protocol mappers - on comparison for changed check (https://github.com/ansible-collections/community.general/pull/8545). - - keycloak_clientscope_type - fix detect changes in check mode (https://github.com/ansible-collections/community.general/issues/9092, - https://github.com/ansible-collections/community.general/pull/9093). - - "keycloak_group - fix crash caused in subgroup creation. The crash was caused\ - \ by a missing or empty ``subGroups`` property in Keycloak \u226523 (https://github.com/ansible-collections/community.general/issues/8788,\ - \ https://github.com/ansible-collections/community.general/pull/8979)." - - keycloak_realm - add normalizations for ``attributes`` and ``protocol_mappers`` - (https://github.com/ansible-collections/community.general/pull/8496). - - keycloak_realm - fix change detection in check mode by sorting the lists - in the realms beforehand (https://github.com/ansible-collections/community.general/pull/8877). - - keycloak_realm_key - fix invalid usage of ``parent_id`` (https://github.com/ansible-collections/community.general/issues/7850, - https://github.com/ansible-collections/community.general/pull/8823). - - keycloak_user_federation - add module argument allowing users to configure - the update mode for the parameter ``bindCredential`` (https://github.com/ansible-collections/community.general/pull/8898). - - keycloak_user_federation - fix key error when removing mappers during an - update and new mappers are specified in the module args (https://github.com/ansible-collections/community.general/pull/8762). - - keycloak_user_federation - fix the ``UnboundLocalError`` that occurs when - an ID is provided for a user federation mapper (https://github.com/ansible-collections/community.general/pull/8831). - - keycloak_user_federation - get cleartext IDP ``clientSecret`` from full - realm info to detect changes to it (https://github.com/ansible-collections/community.general/issues/8294, - https://github.com/ansible-collections/community.general/pull/8735). - - keycloak_user_federation - minimize change detection by setting ``krbPrincipalAttribute`` - to ``''`` in Keycloak responses if missing (https://github.com/ansible-collections/community.general/pull/8785). - - keycloak_user_federation - remove ``lastSync`` parameter from Keycloak responses - to minimize diff/changes (https://github.com/ansible-collections/community.general/pull/8812). - - keycloak_user_federation - remove existing user federation mappers if they - are not present in the federation configuration and will not be updated - (https://github.com/ansible-collections/community.general/issues/7169, https://github.com/ansible-collections/community.general/pull/8695). - - keycloak_user_federation - sort desired and after mapper list by name (analog - to before mapper list) to minimize diff and make change detection more accurate - (https://github.com/ansible-collections/community.general/pull/8761). - - keycloak_userprofile - fix empty response when fetching userprofile component - by removing ``parent=parent_id`` filter (https://github.com/ansible-collections/community.general/pull/8923). - - keycloak_userprofile - improve diff by deserializing the fetched ``kc.user.profile.config`` - and serialize it only when sending back (https://github.com/ansible-collections/community.general/pull/8940). - - launched - correctly report changed status in check mode (https://github.com/ansible-collections/community.general/pull/8406). - - locale_gen - use new ``VarDict`` to prevent deprecation warning (https://github.com/ansible-collections/community.general/issues/8410, - https://github.com/ansible-collections/community.general/pull/8411). - - lxd_container - fix bug introduced in previous commit (https://github.com/ansible-collections/community.general/pull/8895, - https://github.com/ansible-collections/community.general/issues/8888). - - mksysb - use new ``VarDict`` to prevent deprecation warning (https://github.com/ansible-collections/community.general/issues/8410, - https://github.com/ansible-collections/community.general/pull/8411). - - modprobe - fix check mode not being honored for ``persistent`` option (https://github.com/ansible-collections/community.general/issues/9051, - https://github.com/ansible-collections/community.general/pull/9052). - - nsupdate - fix 'index out of range' error when changing NS records by falling - back to authority section of the response (https://github.com/ansible-collections/community.general/issues/8612, - https://github.com/ansible-collections/community.general/pull/8614). - - one_host - fix if statements for cases when ``ID=0`` (https://github.com/ansible-collections/community.general/issues/1199, - https://github.com/ansible-collections/community.general/pull/8907). - - one_image - fix module failing due to a class method typo (https://github.com/ansible-collections/community.general/pull/9056). - - one_image_info - fix module failing due to a class method typo (https://github.com/ansible-collections/community.general/pull/9056). - - one_service - fix service creation after it was deleted with ``unique`` - parameter (https://github.com/ansible-collections/community.general/issues/3137, - https://github.com/ansible-collections/community.general/pull/8887). - - one_vnet - fix module failing due to a variable typo (https://github.com/ansible-collections/community.general/pull/9019). - - opennebula inventory plugin - fix invalid reference to IP when inventory - runs against NICs with no IPv4 address (https://github.com/ansible-collections/community.general/pull/8489). - - opentelemetry callback - do not save the JSON response when using the ``ansible.builtin.uri`` - module (https://github.com/ansible-collections/community.general/pull/8430). - - opentelemetry callback - do not save the content response when using the - ``ansible.builtin.slurp`` module (https://github.com/ansible-collections/community.general/pull/8430). - - pam_limits - pass absolute paths to ``module.atomic_move()`` (https://github.com/ansible/ansible/issues/83950, - https://github.com/ansible-collections/community.general/pull/8925). - - paman - do not fail if an empty list of packages has been provided and there - is nothing to do (https://github.com/ansible-collections/community.general/pull/8514). - - pipx - it was ignoring ``global`` when listing existing applications (https://github.com/ansible-collections/community.general/pull/9044). - - pipx module utils - add missing command line formatter for argument ``spec_metadata`` - (https://github.com/ansible-collections/community.general/pull/9044). - - pipx_info - use new ``VarDict`` to prevent deprecation warning (https://github.com/ansible-collections/community.general/issues/8410, - https://github.com/ansible-collections/community.general/pull/8411). - - proxmox - fix idempotency on creation of mount volumes using Proxmox' special - ``:`` syntax (https://github.com/ansible-collections/community.general/issues/8407, - https://github.com/ansible-collections/community.general/pull/8542). - - proxmox - fixed an issue where the new volume handling incorrectly converted - ``null`` values into ``"None"`` strings (https://github.com/ansible-collections/community.general/pull/8646). - - proxmox - fixed an issue where volume strings where overwritten instead - of appended to in the new ``build_volume()`` method (https://github.com/ansible-collections/community.general/pull/8646). - - proxmox - removed the forced conversion of non-string values to strings - to be consistent with the module documentation (https://github.com/ansible-collections/community.general/pull/8646). - - proxmox inventory plugin - fixed a possible error on concatenating responses - from proxmox. In case an API call unexpectedly returned an empty result, - the inventory failed with a fatal error. Added check for empty response - (https://github.com/ansible-collections/community.general/issues/8798, https://github.com/ansible-collections/community.general/pull/8794). - - python_runner module utils - parameter ``path_prefix`` was being handled - as string when it should be a list (https://github.com/ansible-collections/community.general/pull/8944). - - redfish_utils module utils - do not fail when language is not exactly "en" - (https://github.com/ansible-collections/community.general/pull/8613). - - redfish_utils module utils - fix issue with URI parsing to gracefully handling - trailing slashes when extracting member identifiers (https://github.com/ansible-collections/community.general/issues/9047, - https://github.com/ansible-collections/community.general/pull/9057). - - snap - use new ``VarDict`` to prevent deprecation warning (https://github.com/ansible-collections/community.general/issues/8410, - https://github.com/ansible-collections/community.general/pull/8411). - - snap_alias - use new ``VarDict`` to prevent deprecation warning (https://github.com/ansible-collections/community.general/issues/8410, - https://github.com/ansible-collections/community.general/pull/8411). - - udm_user - the module now tries to use ``legacycrypt`` on Python 3.13+ (https://github.com/ansible-collections/community.general/issues/4690, - https://github.com/ansible-collections/community.general/pull/8987). - deprecated_features: - - CmdRunner module util - setting the value of the ``ignore_none`` parameter - within a ``CmdRunner`` context is deprecated and that feature should be - removed in community.general 12.0.0 (https://github.com/ansible-collections/community.general/pull/8479). - - MH decorator cause_changes module utils - deprecate parameters ``on_success`` - and ``on_failure`` (https://github.com/ansible-collections/community.general/pull/8791). - - git_config - the ``list_all`` option has been deprecated and will be removed - in community.general 11.0.0. Use the ``community.general.git_config_info`` - module instead (https://github.com/ansible-collections/community.general/pull/8453). - - git_config - using ``state=present`` without providing ``value`` is deprecated - and will be disallowed in community.general 11.0.0. Use the ``community.general.git_config_info`` - module instead to read a value (https://github.com/ansible-collections/community.general/pull/8453). - - hipchat - the hipchat service has been discontinued and the self-hosted - variant has been End of Life since 2020. The module is therefore deprecated - and will be removed from community.general 11.0.0 if nobody provides compelling - reasons to still keep it (https://github.com/ansible-collections/community.general/pull/8919). - - 'pipx - support for versions of the command line tool ``pipx`` older than - ``1.7.0`` is deprecated and will be removed in community.general 11.0.0 - (https://github.com/ansible-collections/community.general/pull/8793). - - ' - - 'pipx_info - support for versions of the command line tool ``pipx`` older - than ``1.7.0`` is deprecated and will be removed in community.general 11.0.0 - (https://github.com/ansible-collections/community.general/pull/8793). - - ' - known_issues: - - jenkins_node - the module is not able to update offline message when node - is already offline due to internally using toggleOffline API (https://github.com/ansible-collections/community.general/pull/9084). - minor_changes: - - CmdRunner module util - argument formats can be specified as plain functions - without calling ``cmd_runner_fmt.as_func()`` (https://github.com/ansible-collections/community.general/pull/8479). - - CmdRunner module utils - the parameter ``force_lang`` now supports the special - value ``auto`` which will automatically try and determine the best parsable - locale in the system (https://github.com/ansible-collections/community.general/pull/8517). - - MH module utils - add parameter ``when`` to ``cause_changes`` decorator - (https://github.com/ansible-collections/community.general/pull/8766). - - MH module utils - minor refactor in decorators (https://github.com/ansible-collections/community.general/pull/8766). - - alternatives - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). - - ansible_galaxy_install - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9060). - - ansible_galaxy_install - add upgrade feature (https://github.com/ansible-collections/community.general/pull/8431, - https://github.com/ansible-collections/community.general/issues/8351). - - ansible_galaxy_install - minor refactor in the module (https://github.com/ansible-collections/community.general/pull/8413). - - apache2_mod_proxy - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8814). - - apache2_mod_proxy - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8833). - - cargo - add option ``directory``, which allows source directory to be specified - (https://github.com/ansible-collections/community.general/pull/8480). - - cgroup_memory_recap, hipchat, jabber, log_plays, loganalytics, logentries, - logstash, slack, splunk, sumologic, syslog_json callback plugins - make - sure that all options are typed (https://github.com/ansible-collections/community.general/pull/8628). - - chef_databag, consul_kv, cyberarkpassword, dsv, etcd, filetree, hiera, onepassword, - onepassword_doc, onepassword_raw, passwordstore, redis, shelvefile, tss - lookup plugins - make sure that all options are typed (https://github.com/ansible-collections/community.general/pull/8626). - - chroot, funcd, incus, iocage, jail, lxc, lxd, qubes, zone connection plugins - - make sure that all options are typed (https://github.com/ansible-collections/community.general/pull/8627). - - cmd_runner module utils - add decorator ``cmd_runner_fmt.stack`` (https://github.com/ansible-collections/community.general/pull/8415). - - cmd_runner module utils - refactor argument formatting code to its own Python - module (https://github.com/ansible-collections/community.general/pull/8964). - - cmd_runner_fmt module utils - simplify implementation of ``cmd_runner_fmt.as_bool_not()`` - (https://github.com/ansible-collections/community.general/pull/8512). - - cobbler, linode, lxd, nmap, online, scaleway, stackpath_compute, virtualbox - inventory plugins - make sure that all options are typed (https://github.com/ansible-collections/community.general/pull/8625). - - consul_acl - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). - - consul_kv - add argument for the datacenter option on Consul API (https://github.com/ansible-collections/community.general/pull/9026). - - copr - Added ``includepkgs`` and ``excludepkgs`` parameters to limit the - list of packages fetched or excluded from the repository(https://github.com/ansible-collections/community.general/pull/8779). - - cpanm - add return value ``cpanm_version`` (https://github.com/ansible-collections/community.general/pull/9061). - - credstash lookup plugin - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8822). - - csv module utils - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8814). - - deco MH module utils - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8822). - - dig lookup plugin - add ``port`` option to specify DNS server port (https://github.com/ansible-collections/community.general/pull/8966). - - django module utils - always retrieve version (https://github.com/ansible-collections/community.general/pull/9063). - - django_check - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9063). - - django_command - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9063). - - django_createcachetable - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9063). - - doas, dzdo, ksu, machinectl, pbrun, pfexec, pmrun, sesu, sudosu become plugins - - make sure that all options are typed (https://github.com/ansible-collections/community.general/pull/8623). - - etcd3 - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). - - flatpak - improve the parsing of Flatpak application IDs based on official - guidelines (https://github.com/ansible-collections/community.general/pull/8909). - - gconftool2 - make use of ``ModuleHelper`` features to simplify code (https://github.com/ansible-collections/community.general/pull/8711). - - gcontool2 - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9064). - - gcontool2 module utils - add argument formatter ``version`` (https://github.com/ansible-collections/community.general/pull/9064). - - gcontool2_info - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9064). - - gio_mime - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9067). - - gio_mime - adjust code ahead of the old ``VardDict`` deprecation (https://github.com/ansible-collections/community.general/pull/8855). - - gio_mime - mute the old ``VarDict`` deprecation (https://github.com/ansible-collections/community.general/pull/8776). - - gio_mime module utils - add argument formatter ``version`` (https://github.com/ansible-collections/community.general/pull/9067). - - github_app_access_token lookup plugin - adds new ``private_key`` parameter - (https://github.com/ansible-collections/community.general/pull/8989). - - gitlab_deploy_key - better construct when using ``dict.items()`` (https://github.com/ansible-collections/community.general/pull/8876). - - gitlab_group - add many new parameters (https://github.com/ansible-collections/community.general/pull/8908). - - gitlab_group - better construct when using ``dict.items()`` (https://github.com/ansible-collections/community.general/pull/8876). - - gitlab_group - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). - - gitlab_issue - better construct when using ``dict.items()`` (https://github.com/ansible-collections/community.general/pull/8876). - - gitlab_merge_request - better construct when using ``dict.items()`` (https://github.com/ansible-collections/community.general/pull/8876). - - gitlab_project - add option ``container_expiration_policy`` to schedule - container registry cleanup (https://github.com/ansible-collections/community.general/pull/8674). - - gitlab_project - add option ``issues_access_level`` to enable/disable project - issues (https://github.com/ansible-collections/community.general/pull/8760). - - gitlab_project - add option ``model_registry_access_level`` to disable model - registry (https://github.com/ansible-collections/community.general/pull/8688). - - gitlab_project - add option ``pages_access_level`` to disable project pages - (https://github.com/ansible-collections/community.general/pull/8688). - - gitlab_project - add option ``repository_access_level`` to disable project - repository (https://github.com/ansible-collections/community.general/pull/8674). - - gitlab_project - add option ``service_desk_enabled`` to disable service - desk (https://github.com/ansible-collections/community.general/pull/8688). - - gitlab_project - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). - - gitlab_project - sorted parameters in order to avoid future merge conflicts - (https://github.com/ansible-collections/community.general/pull/8759). - - gitlab_runner - better construct when using ``dict.items()`` (https://github.com/ansible-collections/community.general/pull/8876). - - hashids filter plugin - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8814). - - homebrew - speed up brew install and upgrade (https://github.com/ansible-collections/community.general/pull/9022). - - hwc_ecs_instance - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8822). - - hwc_evs_disk - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). - - hwc_vpc_eip - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). - - hwc_vpc_peering_connect - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8822). - - hwc_vpc_port - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). - - hwc_vpc_subnet - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). - - icinga2_host - replace loop with dict comprehension (https://github.com/ansible-collections/community.general/pull/8876). - - imc_rest - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). - - ipa_dnsrecord - adds ``SSHFP`` record type for managing SSH fingerprints - in FreeIPA DNS (https://github.com/ansible-collections/community.general/pull/8404). - - ipa_otptoken - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). - - jenkins_node - add ``offline_message`` parameter for updating a Jenkins - node offline cause reason when the state is "disabled" (offline) (https://github.com/ansible-collections/community.general/pull/9084)." - - jira - adjust code ahead of the old ``VardDict`` deprecation (https://github.com/ansible-collections/community.general/pull/8856). - - jira - mute the old ``VarDict`` deprecation (https://github.com/ansible-collections/community.general/pull/8776). - - jira - replace deprecated params when using decorator ``cause_changes`` - (https://github.com/ansible-collections/community.general/pull/8791). - - keep_keys filter plugin - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8814). - - keycloak module utils - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8822). - - keycloak_client - add ``client-x509`` choice to ``client_authenticator_type`` - (https://github.com/ansible-collections/community.general/pull/8973). - - keycloak_client - assign auth flow by name (https://github.com/ansible-collections/community.general/pull/8428). - - keycloak_client - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8814). - - keycloak_clientscope - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8814). - - keycloak_identity_provider - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8814). - - keycloak_realm - add boolean toggle to configure organization support for - a given keycloak realm (https://github.com/ansible-collections/community.general/issues/9027, - https://github.com/ansible-collections/community.general/pull/8927/). - - keycloak_user_federation - add module argument allowing users to optout - of the removal of unspecified mappers, for example to keep the keycloak - default mappers (https://github.com/ansible-collections/community.general/pull/8764). - - keycloak_user_federation - add the user federation config parameter ``referral`` - to the module arguments (https://github.com/ansible-collections/community.general/pull/8954). - - keycloak_user_federation - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8814). - - keycloak_user_federation - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8822). - - keycloak_user_federation - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8833). - - linode - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). - - locale_gen - add support for multiple locales (https://github.com/ansible-collections/community.general/issues/8677, - https://github.com/ansible-collections/community.general/pull/8682). - - lxc_container - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). - - lxd_container - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). - - manageiq_provider - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8814). - - mattermost - adds support for message priority (https://github.com/ansible-collections/community.general/issues/9068, - https://github.com/ansible-collections/community.general/pull/9087). - - memcached, pickle, redis, yaml cache plugins - make sure that all options - are typed (https://github.com/ansible-collections/community.general/pull/8624). - - memset_dns_reload - replace loop with ``dict()`` (https://github.com/ansible-collections/community.general/pull/8876). - - memset_memstore_info - replace loop with ``dict()`` (https://github.com/ansible-collections/community.general/pull/8876). - - memset_server_info - replace loop with ``dict()`` (https://github.com/ansible-collections/community.general/pull/8876). - - memset_zone - replace loop with ``dict()`` (https://github.com/ansible-collections/community.general/pull/8876). - - memset_zone_domain - replace loop with ``dict()`` (https://github.com/ansible-collections/community.general/pull/8876). - - memset_zone_record - replace loop with ``dict()`` (https://github.com/ansible-collections/community.general/pull/8876). - - nmcli - add ``conn_enable`` param to reload connection (https://github.com/ansible-collections/community.general/issues/3752, - https://github.com/ansible-collections/community.general/issues/8704, https://github.com/ansible-collections/community.general/pull/8897). - - nmcli - add ``state=up`` and ``state=down`` to enable/disable connections - (https://github.com/ansible-collections/community.general/issues/3752, https://github.com/ansible-collections/community.general/issues/8704, - https://github.com/ansible-collections/community.general/issues/7152, https://github.com/ansible-collections/community.general/pull/8897). - - nmcli - better construct when using ``dict.items()`` (https://github.com/ansible-collections/community.general/pull/8876). - - npm - add ``force`` parameter to allow ``--force`` (https://github.com/ansible-collections/community.general/pull/8885). - - ocapi_utils - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). - - one_image - add ``create``, ``template`` and ``datastore_id`` arguments - for image creation (https://github.com/ansible-collections/community.general/pull/9075). - - one_image - add ``wait_timeout`` argument for adjustable timeouts (https://github.com/ansible-collections/community.general/pull/9075). - - one_image - add option ``persistent`` to manage image persistence (https://github.com/ansible-collections/community.general/issues/3578, - https://github.com/ansible-collections/community.general/pull/8889). - - one_image - extend xsd scheme to make it return a lot more info about image - (https://github.com/ansible-collections/community.general/pull/8889). - - one_image - refactor code to make it more similar to ``one_template`` and - ``one_vnet`` (https://github.com/ansible-collections/community.general/pull/8889). - - one_image_info - extend xsd scheme to make it return a lot more info about - image (https://github.com/ansible-collections/community.general/pull/8889). - - one_image_info - refactor code to make it more similar to ``one_template`` - and ``one_vnet`` (https://github.com/ansible-collections/community.general/pull/8889). - - one_service - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). - - one_vm - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). - - onepassword lookup plugin - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8833). - - open_iscsi - allow login to a portal with multiple targets without specifying - any of them (https://github.com/ansible-collections/community.general/pull/8719). - - openbsd_pkg - adds diff support to show changes in installed package list. - This does not yet work for check mode (https://github.com/ansible-collections/community.general/pull/8402). - - opennebula.py - add VM ``id`` and VM ``host`` to inventory host data (https://github.com/ansible-collections/community.general/pull/8532). - - opentelemetry callback plugin - fix default value for ``store_spans_in_file`` - causing traces to be produced to a file named ``None`` (https://github.com/ansible-collections/community.general/issues/8566, - https://github.com/ansible-collections/community.general/pull/8741). - - opkg - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9086). - - passwordstore lookup plugin - add subkey creation/update support (https://github.com/ansible-collections/community.general/pull/8952). - - passwordstore lookup plugin - add the current user to the lockfile file - name to address issues on multi-user systems (https://github.com/ansible-collections/community.general/pull/8689). - - pids - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). - - pipx - add parameter ``suffix`` to module (https://github.com/ansible-collections/community.general/pull/8675, - https://github.com/ansible-collections/community.general/issues/8656). - - pipx - added new states ``install_all``, ``uninject``, ``upgrade_shared``, - ``pin``, and ``unpin`` (https://github.com/ansible-collections/community.general/pull/8809). - - pipx - added parameter ``global`` to module (https://github.com/ansible-collections/community.general/pull/8793). - - pipx - refactor out parsing of ``pipx list`` output to module utils (https://github.com/ansible-collections/community.general/pull/9044). - - pipx - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). - - pipx_info - add new return value ``pinned`` (https://github.com/ansible-collections/community.general/pull/9044). - - pipx_info - added parameter ``global`` to module (https://github.com/ansible-collections/community.general/pull/8793). - - pipx_info - refactor out parsing of ``pipx list`` output to module utils - (https://github.com/ansible-collections/community.general/pull/9044). - - pipx_info - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). - - pkg5_publisher - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). - - pkgng - add option ``use_globs`` (default ``true``) to optionally disable - glob patterns (https://github.com/ansible-collections/community.general/issues/8632, - https://github.com/ansible-collections/community.general/pull/8633). - - proxmox - add ``disk_volume`` and ``mount_volumes`` keys for better readability - (https://github.com/ansible-collections/community.general/pull/8542). - - proxmox - allow specification of the API port when using proxmox_* (https://github.com/ansible-collections/community.general/issues/8440, - https://github.com/ansible-collections/community.general/pull/8441). - - proxmox - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). - - proxmox - translate the old ``disk`` and ``mounts`` keys to the new handling - internally (https://github.com/ansible-collections/community.general/pull/8542). - - proxmox inventory plugin - add new fact for LXC interface details (https://github.com/ansible-collections/community.general/pull/8713). - - proxmox inventory plugin - clean up authentication code (https://github.com/ansible-collections/community.general/pull/8917). - - proxmox inventory plugin - fix urllib3 ``InsecureRequestWarnings`` not being - suppressed when a token is used (https://github.com/ansible-collections/community.general/pull/9099). - - proxmox_disk - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). - - proxmox_kvm - adds the ``ciupgrade`` parameter to specify whether cloud-init - should upgrade system packages at first boot (https://github.com/ansible-collections/community.general/pull/9066). - - proxmox_kvm - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814). - - proxmox_kvm - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). - - proxmox_template - small refactor in logic for determining whether a template - exists or not (https://github.com/ansible-collections/community.general/pull/8516). - - proxmox_vm_info - add ``network`` option to retrieve current network information - (https://github.com/ansible-collections/community.general/pull/8471). - - redfish_* modules - adds ``ciphers`` option for custom cipher selection - (https://github.com/ansible-collections/community.general/pull/8533). - - redfish_command - add ``UpdateUserAccountTypes`` command (https://github.com/ansible-collections/community.general/issues/9058, - https://github.com/ansible-collections/community.general/pull/9059). - - redfish_command - add ``wait`` and ``wait_timeout`` options to allow a user - to block a command until a service is accessible after performing the requested - command (https://github.com/ansible-collections/community.general/issues/8051, - https://github.com/ansible-collections/community.general/pull/8434). - - redfish_command - add handling of the ``PasswordChangeRequired`` message - from services in the ``UpdateUserPassword`` command to directly modify the - user's password if the requested user is the one invoking the operation - (https://github.com/ansible-collections/community.general/issues/8652, https://github.com/ansible-collections/community.general/pull/8653). - - redfish_confg - remove ``CapacityBytes`` from required paramaters of the - ``CreateVolume`` command (https://github.com/ansible-collections/community.general/pull/8956). - - redfish_config - add parameter ``storage_none_volume_deletion`` to ``CreateVolume`` - command in order to control the automatic deletion of non-RAID volumes (https://github.com/ansible-collections/community.general/pull/8990). - - redfish_info - add command ``CheckAvailability`` to check if a service is - accessible (https://github.com/ansible-collections/community.general/issues/8051, - https://github.com/ansible-collections/community.general/pull/8434). - - redfish_info - adds ``RedfishURI`` and ``StorageId`` to Disk inventory (https://github.com/ansible-collections/community.general/pull/8937). - - redfish_utils - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). - - redfish_utils module utils - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8822). - - redfish_utils module utils - schedule a BIOS configuration job at next reboot - when the BIOS config is changed (https://github.com/ansible-collections/community.general/pull/9012). - - redis cache plugin - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8833). - - redis, redis_info - add ``client_cert`` and ``client_key`` options to specify - path to certificate for Redis authentication (https://github.com/ansible-collections/community.general/pull/8654). - - redis_info - adds support for getting cluster info (https://github.com/ansible-collections/community.general/pull/8464). - - remove_keys filter plugin - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8814). - - replace_keys filter plugin - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8814). - - scaleway - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). - - scaleway module utils - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8822). - - scaleway_compute - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8833). - - scaleway_container - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8858). - - scaleway_container_info - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8858). - - scaleway_container_namespace - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8858). - - scaleway_container_namespace_info - replace Python 2.6 construct with dict - comprehensions (https://github.com/ansible-collections/community.general/pull/8858). - - scaleway_container_registry - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8858). - - scaleway_container_registry_info - replace Python 2.6 construct with dict - comprehensions (https://github.com/ansible-collections/community.general/pull/8858). - - scaleway_function - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8858). - - scaleway_function_info - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8858). - - scaleway_function_namespace - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8858). - - scaleway_function_namespace_info - replace Python 2.6 construct with dict - comprehensions (https://github.com/ansible-collections/community.general/pull/8858). - - scaleway_ip - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). - - scaleway_lb - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). - - scaleway_security_group - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8822). - - scaleway_security_group - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8833). - - scaleway_user_data - better construct when using ``dict.items()`` (https://github.com/ansible-collections/community.general/pull/8876). - - scaleway_user_data - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8833). - - sensu_silence - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). - - snmp_facts - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). - - sorcery - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833). - - sudosu become plugin - added an option (``alt_method``) to enhance compatibility - with more versions of ``su`` (https://github.com/ansible-collections/community.general/pull/8214). - - udm_dns_record - replace loop with ``dict.update()`` (https://github.com/ansible-collections/community.general/pull/8876). - - ufw - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). - - unsafe plugin utils - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8814). - - vardict module utils - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8814). - - vars MH module utils - replace Python 2.6 construct with dict comprehensions - (https://github.com/ansible-collections/community.general/pull/8814). - - virtualbox inventory plugin - expose a new parameter ``enable_advanced_group_parsing`` - to change how the VirtualBox dynamic inventory parses VM groups (https://github.com/ansible-collections/community.general/issues/8508, - https://github.com/ansible-collections/community.general/pull/8510). - - vmadm - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822). - - wdc_redfish_command - minor change to handle upgrade file for Redfish WD - platforms (https://github.com/ansible-collections/community.general/pull/8444). - release_summary: This is release 10.0.0 of ``community.general``, released on - 2024-11-04. - removed_features: - - The consul_acl module has been removed. Use community.general.consul_token - and/or community.general.consul_policy instead (https://github.com/ansible-collections/community.general/pull/8921). - - The hipchat callback plugin has been removed. The hipchat service has been - discontinued and the self-hosted variant has been End of Life since 2020 - (https://github.com/ansible-collections/community.general/pull/8921). - - The redhat module utils has been removed (https://github.com/ansible-collections/community.general/pull/8921). - - The rhn_channel module has been removed (https://github.com/ansible-collections/community.general/pull/8921). - - The rhn_register module has been removed (https://github.com/ansible-collections/community.general/pull/8921). - - consul - removed the ``ack_params_state_absent`` option. It had no effect - anymore (https://github.com/ansible-collections/community.general/pull/8918). - - ejabberd_user - removed the ``logging`` option (https://github.com/ansible-collections/community.general/pull/8918). - - gitlab modules - remove basic auth feature (https://github.com/ansible-collections/community.general/pull/8405). - - proxmox_kvm - removed the ``proxmox_default_behavior`` option. Explicitly - specify the old default values if you were using ``proxmox_default_behavior=compatibility``, - otherwise simply remove it (https://github.com/ansible-collections/community.general/pull/8918). - - redhat_subscriptions - removed the ``pool`` option. Use ``pool_ids`` instead - (https://github.com/ansible-collections/community.general/pull/8918). - fragments: - - 10.0.0.yml - - 8051-Redfish-Wait-For-Service.yml - - 8214-sudosu-not-working-on-some-BSD-machines.yml - - 8402-add-diif-mode-openbsd-pkg.yml - - 8403-fix-typeerror-in-keycloak-client.yaml - - 8404-ipa_dnsrecord_sshfp.yml - - 8405-gitlab-remove-basic-auth.yml - - 8406-fix-homebrew-cask-warning.yaml - - 8411-locale-gen-vardict.yml - - 8413-galaxy-refactor.yml - - 8415-cmd-runner-stack.yml - - 8428-assign-auth-flow-by-name-keycloak-client.yaml - - 8430-fix-opentelemetry-when-using-logs-with-uri-or-slurp-tasks.yaml - - 8431-galaxy-upgrade.yml - - 8440-allow-api-port-specification.yaml - - 8444-fix-redfish-gen2-upgrade.yaml - - 8452-git_config-absent.yml - - 8453-git_config-deprecate-read.yml - - 8464-redis-add-cluster-info.yml - - 8471-proxmox-vm-info-network.yml - - 8476-launchd-check-mode-changed.yaml - - 8479-cmdrunner-improvements.yml - - 8480-directory-feature-cargo.yml - - 8489-fix-opennebula-inventory-crash-when-nic-has-no-ip.yml - - 8496-keycloak_clientscope-add-normalizations.yaml - - 8508-virtualbox-inventory.yml - - 8512-as-bool-not.yml - - 8514-pacman-empty.yml - - 8516-proxmox-template-refactor.yml - - 8517-cmd-runner-lang-auto.yml - - 8532-expand-opennuebula-inventory-data.yml - - 8533-add-ciphers-option.yml - - 8542-fix-proxmox-volume-handling.yml - - 8545-keycloak-clientscope-remove-id-on-compare.yml - - 8557-fix-bug-with-bitwarden.yml - - 8613-redfish_utils-language.yaml - - 8614-nsupdate-index-out-of-range.yml - - 8623-become-types.yml - - 8624-cache-types.yml - - 8625-inventory-types.yml - - 8626-lookup-types.yml - - 8627-connection-types.yml - - 8628-callback-types.yml - - 8632-pkgng-add-option-use_globs.yml - - 8646-fix-bug-in-proxmox-volumes.yml - - 8648-fix-gitlab-runner-paused.yaml - - 8652-Redfish-Password-Change-Required.yml - - 8654-add-redis-tls-params.yml - - 8674-add-gitlab-project-cleanup-policy.yml - - 8675-pipx-install-suffix.yml - - 8679-fix-cloudflare-srv.yml - - 8682-locale-gen-multiple.yaml - - 8688-gitlab_project-add-new-params.yml - - 8689-passwordstore-lock-naming.yml - - 8695-keycloak_user_federation-mapper-removal.yml - - 8708-homebrew_cask-fix-upgrade-all.yml - - 8711-gconftool2-refactor.yml - - 8713-proxmox_lxc_interfaces.yml - - 8719-openiscsi-add-multiple-targets.yaml - - 8735-keycloak_identity_provider-get-cleartext-secret-from-realm-info.yml - - 8738-limit-packages-for-copr.yml - - 8741-fix-opentelemetry-callback.yml - - 8759-gitlab_project-sort-params.yml - - 8760-gitlab_project-add-issues-access-level.yml - - 8761-keycloak_user_federation-sort-desired-and-after-mappers-by-name.yml - - 8762-keycloac_user_federation-fix-key-error-when-updating.yml - - 8764-keycloak_user_federation-make-mapper-removal-optout.yml - - 8766-mh-deco-improve.yml - - 8776-mute-vardict-deprecation.yml - - 8785-keycloak_user_federation-set-krbPrincipalAttribute-to-empty-string-if-missing.yaml - - 8790-gitlab_project-fix-cleanup-policy-on-project-create.yml - - 8791-mh-cause-changes-param-depr.yml - - 8793-pipx-global.yml - - 8794-Fixing-possible-concatination-error.yaml - - 8796-gitlab-access-token-check-mode.yml - - 8809-pipx-new-params.yml - - 8812-keycloak-user-federation-remove-lastSync-param-from-kc-responses.yml - - 8814-dict-comprehension.yml - - 8822-dict-comprehension.yml - - 8823-keycloak-realm-key.yml - - 8831-fix-error-when-mapper-id-is-provided.yml - - 8833-dict-comprehension.yml - - 8855-gio_mime_vardict.yml - - 8856-jira_vardict.yml - - 8858-dict-comprehension.yml - - 8876-dict-items-loop.yml - - 8877-keycloak_realm-sort-lists-before-change-detection.yaml - - 8885-add-force-flag-for-nmp.yml - - 8887-fix-one_service-unique.yml - - 8889-refactor-one-image-modules.yml - - 8895-fix-comprehension.yaml - - 8897-nmcli-add-reload-and-up-down.yml - - 8898-add-arg-to-exclude-bind-credential-from-change-check.yaml - - 8900-ipa-hostgroup-fix-states.yml - - 8907-fix-one-host-id.yml - - 8908-add-gitlab-group-params.yml - - 8909-flatpak-improve-name-parsing.yaml - - 8917-proxmox-clean-auth.yml - - 8920-ipa-host-fix-state.yml - - 8923-keycloak_userprofile-fix-empty-response-when-fetching-userprofile.yml - - 8925-atomic.yml - - 8928-cmd-runner-10.0.0.yml - - 8929-cmd_runner-bugfix.yml - - 8937-add-StorageId-RedfishURI-to-disk-facts.yml - - 8940-keycloak_userprofile-improve-diff.yml - - 8944-django-command-fix.yml - - 8952-password-store-lookup-create-subkey-support.yml - - 8954-keycloak-user-federation-add-referral-parameter.yml - - 8956-remove-capacitybytes-from-the-required-parameters_list.yml - - 8964-cmd-runner-argformat-refactor.yml - - 8966-dig-add-port-option.yml - - 8970-fix-dig-multi-nameservers.yml - - 8973-keycloak_client-add-x509-auth.yml - - 8979-keycloak_group-fix-subgroups.yml - - 8987-legacycrypt.yml - - 8989-github-app-token-from-fact.yml - - 8990.yml - - 9010-edit-gitlab-label-color.yaml - - 9012-dell-pwrbutton-requires-a-job-initiated-at-reboot.yml - - 9019-onevnet-bugfix.yml - - 9022-improve-homebrew-perf.yml - - 9026-consul_kv-datacenter.yml - - 9027-support-organizations-in-keycloak-realm.yml - - 9028-bitwarden-secrets-manager-syntax-fix.yml - - 9044-pipx-fixes.yml - - 9047-redfish-uri-parsing.yml - - 9052-modprobe-bugfix.yml - - 9056-fix-one_image-modules.yml - - 9059-redfish_command-updateuseraccounttypes.yml - - 9060-ansible-galaxy-install-version.yml - - 9061-cpanm-version.yml - - 9063-django-version.yml - - 9064-gconftool2-version.yml - - 9066-proxmox-kvm-ciupgrade.yml - - 9067-gio-mime-version.yml - - 9075-add-creation-oneimage.yml - - 9084-collection_version-importlib.yml - - 9084-jenkins_node-add-offline-message.yml - - 9086-gio-mime-version.yml - - 9087-mattermost-priority.yaml - - 9092-keycloak-clientscope-type-fix-check-mode.yml - - 9099-proxmox-fix-insecure.yml - - deprecate-hipchat.yml - - deprecations.yml - - removals.yml - modules: - - description: Bootc Switch and Upgrade. - name: bootc_manage - namespace: '' - - description: Add, modify, and delete checks within a consul cluster. - name: consul_agent_check - namespace: '' - - description: Add, modify and delete services within a consul cluster. - name: consul_agent_service - namespace: '' - - description: Wrapper for C(django-admin check). - name: django_check - namespace: '' - - description: Wrapper for C(django-admin createcachetable). - name: django_createcachetable - namespace: '' - - description: Services manager for Homebrew. - name: homebrew_services - namespace: '' - - description: Manage keytab file in FreeIPA. - name: ipa_getkeytab - namespace: '' - - description: Manage Jenkins nodes. - name: jenkins_node - namespace: '' - - description: Allows administration of Keycloak components via Keycloak API. - name: keycloak_component - namespace: '' - - description: Allows obtaining Keycloak realm keys metadata via Keycloak API. - name: keycloak_realm_keys_metadata_info - namespace: '' - - description: Allows managing Keycloak User Profiles. - name: keycloak_userprofile - namespace: '' - - description: Kerberos utils for managing tickets. - name: krb_ticket - namespace: '' - - description: Manages OpenNebula virtual networks. - name: one_vnet - namespace: '' - - description: List Zypper repositories. - name: zypper_repository_info - namespace: '' - plugins: - filter: - - description: Keep specific keys from dictionaries in a list. - name: keep_keys - namespace: null - - description: Remove specific keys from dictionaries in a list. - name: remove_keys - namespace: null - - description: Replace specific keys in a list of dictionaries. - name: replace_keys - namespace: null - - description: Return input type. - name: reveal_ansible_type - namespace: null - test: - - description: Validate input type. - name: ansible_type - namespace: null - release_date: '2024-11-04' - 10.0.1: - changes: - bugfixes: - - keycloak_client - fix diff by removing code that turns the attributes dict - which contains additional settings into a list (https://github.com/ansible-collections/community.general/pull/9077). - - keycloak_clientscope - fix diff and ``end_state`` by removing the code that - turns the attributes dict, which contains additional config items, into - a list (https://github.com/ansible-collections/community.general/pull/9082). - - redfish_utils module utils - remove undocumented default applytime (https://github.com/ansible-collections/community.general/pull/9114). - release_summary: Bugfix release for inclusion in Ansible 11.0.0rc1. - fragments: - - 10.0.1.yml - - 9077-keycloak_client-fix-attributes-dict-turned-into-list.yml - - 9082-keycloak_clientscope-fix-attributes-dict-turned-into-list.yml - - 9114-redfish-utils-update-remove-default-applytime.yml - release_date: '2024-11-11' - 10.1.0: - changes: - bugfixes: - - dnf_config_manager - fix hanging when prompting to import GPG keys (https://github.com/ansible-collections/community.general/pull/9124, - https://github.com/ansible-collections/community.general/issues/8830). - - dnf_config_manager - forces locale to ``C`` before module starts. If the - locale was set to non-English, the output of the ``dnf config-manager`` - could not be parsed (https://github.com/ansible-collections/community.general/pull/9157, - https://github.com/ansible-collections/community.general/issues/9046). - - flatpak - force the locale language to ``C`` when running the flatpak command - (https://github.com/ansible-collections/community.general/pull/9187, https://github.com/ansible-collections/community.general/issues/8883). - - gio_mime - fix command line when determining version of ``gio`` (https://github.com/ansible-collections/community.general/pull/9171, - https://github.com/ansible-collections/community.general/issues/9158). - - github_key - in check mode, a faulty call to ```datetime.strftime(...)``` - was being made which generated an exception (https://github.com/ansible-collections/community.general/issues/9185). - - homebrew_cask - allow ``+`` symbol in Homebrew cask name validation regex - (https://github.com/ansible-collections/community.general/pull/9128). - - keycloak_clientscope_type - sort the default and optional clientscope lists - to improve the diff (https://github.com/ansible-collections/community.general/pull/9202). - - slack - fail if Slack API response is not OK with error message (https://github.com/ansible-collections/community.general/pull/9198). - deprecated_features: - - opkg - deprecate value ``""`` for parameter ``force`` (https://github.com/ansible-collections/community.general/pull/9172). - - redfish_utils module utils - deprecate method ``RedfishUtils._init_session()`` - (https://github.com/ansible-collections/community.general/pull/9190). - minor_changes: - - alternatives - add ``family`` parameter that allows to utilize the ``--family`` - option available in RedHat version of update-alternatives (https://github.com/ansible-collections/community.general/issues/5060, - https://github.com/ansible-collections/community.general/pull/9096). - - cloudflare_dns - add support for ``comment`` and ``tags`` (https://github.com/ansible-collections/community.general/pull/9132). - - deps module utils - add ``deps.clear()`` to clear out previously declared - dependencies (https://github.com/ansible-collections/community.general/pull/9179). - - homebrew - greatly speed up module when multiple packages are passed in - the ``name`` option (https://github.com/ansible-collections/community.general/pull/9181). - - homebrew - remove duplicated package name validation (https://github.com/ansible-collections/community.general/pull/9076). - - iso_extract - adds ``password`` parameter that is passed to 7z (https://github.com/ansible-collections/community.general/pull/9159). - - launchd - add ``plist`` option for services such as sshd, where the plist - filename doesn't match the service name (https://github.com/ansible-collections/community.general/pull/9102). - - nmcli - add ``sriov`` parameter that enables support for SR-IOV settings - (https://github.com/ansible-collections/community.general/pull/9168). - - pipx - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9180). - - pipx_info - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9180). - - proxmox_template - add server side artifact fetching support (https://github.com/ansible-collections/community.general/pull/9113). - - redfish_command - add ``update_custom_oem_header``, ``update_custom_oem_params``, - and ``update_custom_oem_mime_type`` options (https://github.com/ansible-collections/community.general/pull/9123). - - redfish_utils module utils - remove redundant code (https://github.com/ansible-collections/community.general/pull/9190). - - rpm_ostree_pkg - added the options ``apply_live`` (https://github.com/ansible-collections/community.general/pull/9167). - - rpm_ostree_pkg - added the return value ``needs_reboot`` (https://github.com/ansible-collections/community.general/pull/9167). - - scaleway_lb - minor simplification in the code (https://github.com/ansible-collections/community.general/pull/9189). - - ssh_config - add ``dynamicforward`` option (https://github.com/ansible-collections/community.general/pull/9192). - release_summary: Regular bugfix and feature release. - fragments: - - 10.1.0.yml - - 5932-launchd-plist.yml - - 7402-proxmox-template-support-server-side-artifact-fetching.yaml - - 9076-remove-duplicated-homebrew-package-name-validation.yml - - 9096-alternatives-add-family-parameter.yml - - 9123-redfish-command-custom-oem-params.yml - - 9124-dnf_config_manager.yml - - 9128-homebrew_cask-name-regex-fix.yml - - 9132-cloudflare_dns-comment-and-tags.yml - - 9157-fix-dnf_config_manager-locale.yml - - 9159-iso-extract_add_password.yml - - 9167-rpm_ostree_pkg-apply_live.yml - - 9168-nmcli-add-sriov-parameter.yml - - 9171-gio-mime-fix-version.yml - - 9172-opkg-deprecate-force-none.yml - - 9179-deps-tests.yml - - 9180-pipx-version.yml - - 9181-improve-homebrew-module-performance.yml - - 9186-fix-broken-check-mode-in-github-key.yml - - 9187-flatpak-lang.yml - - 9189-scalway-lb-simplify-return.yml - - 9190-redfish-utils-unused-code.yml - - 9198-fail-if-slack-api-response-is-not-ok-with-error-message.yml - - 9202-keycloak_clientscope_type-sort-lists.yml - - ssh_config_add_dynamicforward_option.yml - modules: - - description: Decompresses compressed files. - name: decompress - namespace: '' - - description: Start a VM backup in Proxmox VE cluster. - name: proxmox_backup - namespace: '' - plugins: - filter: - - description: Produce a list of accumulated sums of the input list contents. - name: accumulate - namespace: null - release_date: '2024-12-02' - 10.2.0: - changes: - bugfixes: - - dig lookup plugin - correctly handle ``NoNameserver`` exception (https://github.com/ansible-collections/community.general/pull/9363, - https://github.com/ansible-collections/community.general/issues/9362). - - homebrew - fix incorrect handling of aliased homebrew modules when the alias - is requested (https://github.com/ansible-collections/community.general/pull/9255, - https://github.com/ansible-collections/community.general/issues/9240). - - htpasswd - report changes when file permissions are adjusted (https://github.com/ansible-collections/community.general/issues/9485, - https://github.com/ansible-collections/community.general/pull/9490). - - proxmox_backup - fix incorrect key lookup in vmid permission check (https://github.com/ansible-collections/community.general/pull/9223). - - proxmox_disk - fix async method and make ``resize_disk`` method handle errors - correctly (https://github.com/ansible-collections/community.general/pull/9256). - - proxmox_template - fix the wrong path called on ``proxmox_template.task_status`` - (https://github.com/ansible-collections/community.general/issues/9276, https://github.com/ansible-collections/community.general/pull/9277). - - qubes connection plugin - fix the printing of debug information (https://github.com/ansible-collections/community.general/pull/9334). - - redfish_utils module utils - Fix ``VerifyBiosAttributes`` command on multi - system resource nodes (https://github.com/ansible-collections/community.general/pull/9234). - deprecated_features: - - atomic_container - module is deprecated and will be removed in community.general - 13.0.0 (https://github.com/ansible-collections/community.general/pull/9487). - - atomic_host - module is deprecated and will be removed in community.general - 13.0.0 (https://github.com/ansible-collections/community.general/pull/9487). - - atomic_image - module is deprecated and will be removed in community.general - 13.0.0 (https://github.com/ansible-collections/community.general/pull/9487). - - facter - module is deprecated and will be removed in community.general 12.0.0, - use ``community.general.facter_facts`` instead (https://github.com/ansible-collections/community.general/pull/9451). - - 'locale_gen - ``ubuntu_mode=True``, or ``mechanism=ubuntu_legacy`` is deprecated - and will be removed in community.general 13.0.0 (https://github.com/ansible-collections/community.general/pull/9238). - - ' - - pure module utils - the module utils is deprecated and will be removed from - community.general 12.0.0. The modules using this were removed in community.general - 3.0.0 (https://github.com/ansible-collections/community.general/pull/9432). - - purestorage doc fragments - the doc fragment is deprecated and will be removed - from community.general 12.0.0. The modules using this were removed in community.general - 3.0.0 (https://github.com/ansible-collections/community.general/pull/9432). - - sensu_check - module is deprecated and will be removed in community.general - 13.0.0, use collection ``sensu.sensu_go`` instead (https://github.com/ansible-collections/community.general/pull/9483). - - sensu_client - module is deprecated and will be removed in community.general - 13.0.0, use collection ``sensu.sensu_go`` instead (https://github.com/ansible-collections/community.general/pull/9483). - - sensu_handler - module is deprecated and will be removed in community.general - 13.0.0, use collection ``sensu.sensu_go`` instead (https://github.com/ansible-collections/community.general/pull/9483). - - sensu_silence - module is deprecated and will be removed in community.general - 13.0.0, use collection ``sensu.sensu_go`` instead (https://github.com/ansible-collections/community.general/pull/9483). - - sensu_subscription - module is deprecated and will be removed in community.general - 13.0.0, use collection ``sensu.sensu_go`` instead (https://github.com/ansible-collections/community.general/pull/9483). - - slack - the default value ``auto`` of the ``prepend_hash`` option is deprecated - and will change to ``never`` in community.general 12.0.0 (https://github.com/ansible-collections/community.general/pull/9443). - - yaml callback plugin - deprecate plugin in favor of ``result_format=yaml`` - in plugin ``ansible.bulitin.default`` (https://github.com/ansible-collections/community.general/pull/9456). - minor_changes: - - bitwarden lookup plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9324). - - cgroup_memory_recap callback plugin - use f-strings instead of interpolations - or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). - - chef_databag lookup plugin - use f-strings instead of interpolations or - ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - chroot connection plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). - - chroot connection plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9322). - - cobbler inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). - - cobbler inventory plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9323). - - collection_version lookup plugin - use f-strings instead of interpolations - or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - consul_kv lookup plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9324). - - context_demo callback plugin - use f-strings instead of interpolations or - ``format`` (https://github.com/ansible-collections/community.general/pull/9321). - - counter_enabled callback plugin - use f-strings instead of interpolations - or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). - - credstash lookup plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9324). - - cyberarkpassword lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). - - cyberarkpassword lookup plugin - use f-strings instead of interpolations - or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - dense callback plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9321). - - dependent lookup plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9324). - - dig lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). - - dig lookup plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9324). - - diy callback plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9321). - - dnstxt lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). - - dnstxt lookup plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9324). - - doas become plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9319). - - dsv lookup plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9324). - - dzdo become plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9319). - - elastic callback plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9321). - - etcd lookup plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9324). - - etcd3 lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). - - etcd3 lookup plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9324). - - filetree lookup plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9324). - - from_csv filter plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). - - from_ini filter plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). - - funcd connection plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9322). - - github_app_access_token lookup plugin - use f-strings instead of interpolations - or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - gitlab_instance_variable - add support for ``raw`` variables suboption (https://github.com/ansible-collections/community.general/pull/9425). - - gitlab_runners inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). - - gitlab_runners inventory plugin - use f-strings instead of interpolations - or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). - - hiera lookup plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9324). - - icinga2 inventory plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9323). - - incus connection plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9322). - - iocage connection plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9322). - - iocage inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). - - iptables_state action plugin - use f-strings instead of interpolations or - ``format`` (https://github.com/ansible-collections/community.general/pull/9318). - - jabber callback plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9321). - - jail connection plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9322). - - keycloak - add an action group for Keycloak modules to allow ``module_defaults`` - to be set for Keycloak tasks (https://github.com/ansible-collections/community.general/pull/9284). - - keyring lookup plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9324). - - ksu become plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9319). - - lastpass lookup plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9324). - - linode inventory plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9323). - - lmdb_kv lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). - - lmdb_kv lookup plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9324). - - locale_gen - invert the logic to determine ``ubuntu_mode``, making it look - first for ``/etc/locale.gen`` (set ``ubuntu_mode`` to ``False``) and only - then looking for ``/var/lib/locales/supported.d/`` (set ``ubuntu_mode`` - to ``True``) (https://github.com/ansible-collections/community.general/pull/9238, - https://github.com/ansible-collections/community.general/issues/9131, https://github.com/ansible-collections/community.general/issues/8487). - - 'locale_gen - new return value ``mechanism`` to better express the semantics - of the ``ubuntu_mode``, with the possible values being either ``glibc`` - (``ubuntu_mode=False``) or ``ubuntu_legacy`` (``ubuntu_mode=True``) (https://github.com/ansible-collections/community.general/pull/9238). - - ' - - log_plays callback plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9321). - - loganalytics callback plugin - use f-strings instead of interpolations or - ``format`` (https://github.com/ansible-collections/community.general/pull/9321). - - logdna callback plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9321). - - logentries callback plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). - - logentries callback plugin - use f-strings instead of interpolations or - ``format`` (https://github.com/ansible-collections/community.general/pull/9321). - - lxc connection plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9322). - - lxd connection plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9322). - - lxd inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). - - lxd inventory plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9323). - - machinectl become plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9319). - - mail callback plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9321). - - manageiq_alert_profiles - improve handling of parameter requirements (https://github.com/ansible-collections/community.general/pull/9449). - - manifold lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). - - manifold lookup plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9324). - - memcached cache plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9320). - - merge_variables lookup plugin - use f-strings instead of interpolations - or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - nmap inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). - - nmap inventory plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9323). - - nrdp callback plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9321). - - onepassword lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). - - onepassword lookup plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9324). - - onepassword_doc lookup plugin - use f-strings instead of interpolations - or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - online inventory plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9323). - - opennebula inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). - - opennebula inventory plugin - use f-strings instead of interpolations or - ``format`` (https://github.com/ansible-collections/community.general/pull/9323). - - opentelemetry callback plugin - remove code handling Python versions prior - to 3.7 (https://github.com/ansible-collections/community.general/pull/9482). - - opentelemetry callback plugin - remove code handling Python versions prior - to 3.7 (https://github.com/ansible-collections/community.general/pull/9503). - - opentelemetry callback plugin - use f-strings instead of interpolations - or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). - - pacemaker_cluster - remove unused code (https://github.com/ansible-collections/community.general/pull/9471). - - pacemaker_cluster - using safer mechanism to run external command (https://github.com/ansible-collections/community.general/pull/9471). - - passwordstore lookup plugin - use f-strings instead of interpolations or - ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - pbrun become plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9319). - - pfexec become plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9319). - - pmrun become plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9319). - - proxmox inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). - - proxmox inventory plugin - strip whitespace from ``user``, ``token_id``, - and ``token_secret`` (https://github.com/ansible-collections/community.general/issues/9227, - https://github.com/ansible-collections/community.general/pull/9228/). - - proxmox inventory plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9323). - - proxmox module utils - add method ``api_task_complete`` that can wait for - task completion and return error message (https://github.com/ansible-collections/community.general/pull/9256). - - proxmox_backup - refactor permission checking to improve code readability - and maintainability (https://github.com/ansible-collections/community.general/pull/9239). - - qubes connection plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9322). - - random_pet lookup plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9324). - - redis cache plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). - - redis cache plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9320). - - redis lookup plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9324). - - revbitspss lookup plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9324). - - saltstack connection plugin - use f-strings instead of interpolations or - ``format`` (https://github.com/ansible-collections/community.general/pull/9322). - - say callback plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9321). - - scaleway inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). - - scaleway inventory plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9323). - - selective callback plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9321). - - sesu become plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9319). - - shelvefile lookup plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9324). - - shutdown action plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). - - shutdown action plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9318). - - slack callback plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). - - slack callback plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9321). - - splunk callback plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9321). - - stackpath_compute inventory plugin - use f-strings instead of interpolations - or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). - - sudosu become plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9319). - - timestamp callback plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9321). - - to_ini filter plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). - - tss lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). - - tss lookup plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9324). - - unixy callback plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9321). - - virtualbox inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379). - - virtualbox inventory plugin - use f-strings instead of interpolations or - ``format`` (https://github.com/ansible-collections/community.general/pull/9323). - - xbps - add ``root`` and ``repository`` options to enable bootstrapping new - void installations (https://github.com/ansible-collections/community.general/pull/9174). - - xen_orchestra inventory plugin - use f-strings instead of interpolations - or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). - - xfconf - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9226). - - xfconf_info - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9226). - - yaml callback plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9321). - - zone connection plugin - use f-strings instead of interpolations or ``format`` - (https://github.com/ansible-collections/community.general/pull/9322). - - zypper - add ``quiet`` option (https://github.com/ansible-collections/community.general/pull/9270). - - zypper - add ``simple_errors`` option (https://github.com/ansible-collections/community.general/pull/9270). - release_summary: Regular bugfix and feature release. - security_fixes: - - keycloak_authentication - API calls did not properly set the ``priority`` - during update resulting in incorrectly sorted authentication flows. This - apparently only affects Keycloak 25 or newer (https://github.com/ansible-collections/community.general/pull/9263). - fragments: - - 10.2.0.yml - - 9174-xbps-support-rootdir-and-repository.yml - - 9223-proxmox-backup-bugfixes.yml - - 9226-xfconf-version.yml - - 9228-fix-issue-header.yml - - 9234-fix-verify-bios-attributes-multi-system.yml - - 9238-locale-gen-rewrite.yml - - 9239-proxmox-backup-refactor.yml - - 9255-fix-handling-of-aliased-homebrew-packages.yml - - 9256-proxmox_disk-fix-async-method-of-resize_disk.yml - - 9263-kc_authentication-api-priority.yaml - - 9270-zypper-add-simple_errors.yaml - - 9277-proxmox_template-fix-the-wrong-path-called-on-proxmox_template.task_status.yaml - - 9284-add-keycloak-action-group.yml - - 9318-fstr-actionplugins.yml - - 9319-fstr-become-plugins.yml - - 9320-fstr-cache-plugins.yml - - 9321-fstr-callback-plugins.yml - - 9322-fstr-connection-plugins.yml - - 9323-fstr-inventory-plugins.yml - - 9324-fstr-lookup-plugins.yml - - 9334-qubes-conn.yml - - 9363-dig-nonameservers.yml - - 9379-refactor.yml - - 9387-pacemaker-cluster-cmd.yml - - 9425-gitlab-instance-raw-variable.yml - - 9432-deprecate-pure.yml - - 9443-slack-prepend_hash.yml - - 9449-manageiq-alert-profiles-reqs.yml - - 9451-facter-deprecation.yml - - 9456-yaml-callback-deprecation.yml - - 9482-opentelemetry-python-37.yml - - 9483-sensu-deprecation.yml - - 9487-atomic-deprecation.yml - - 9490-htpasswd-permissions.yml - - 9503-opentelemetry-remove-unused-code.yml - modules: - - description: Manages Android SDK packages. - name: android_sdk - namespace: '' - - description: Use the Modify-Increment LDAP V3 feature to increment an attribute - value. - name: ldap_inc - namespace: '' - - description: C(systemd)'s C(systemd-creds decrypt) plugin. - name: systemd_creds_decrypt - namespace: '' - - description: C(systemd)'s C(systemd-creds encrypt) plugin. - name: systemd_creds_encrypt - namespace: '' - plugins: - inventory: - - description: iocage inventory source. - name: iocage - namespace: null - release_date: '2024-12-31' - 10.3.0: - changes: - bugfixes: - - homebrew - fix incorrect handling of homebrew modules when a tap is requested - (https://github.com/ansible-collections/community.general/pull/9546, https://github.com/ansible-collections/community.general/issues/9533). - - iocage inventory plugin - the plugin parses the IP4 tab of the jails list - and put the elements into the new variable ``iocage_ip4_dict``. In multiple - interface format the variable ``iocage_ip4`` keeps the comma-separated list - of IP4 (https://github.com/ansible-collections/community.general/issues/9538). - - pipx - honor option ``global`` when ``state=latest`` (https://github.com/ansible-collections/community.general/pull/9623). - - proxmox - fixes idempotency of template conversions (https://github.com/ansible-collections/community.general/pull/9225, - https://github.com/ansible-collections/community.general/issues/8811). - - proxmox - fixes incorrect parsing for bind-only mounts (https://github.com/ansible-collections/community.general/pull/9225, - https://github.com/ansible-collections/community.general/issues/8982). - - proxmox - fixes issues with disk_volume variable (https://github.com/ansible-collections/community.general/pull/9225, - https://github.com/ansible-collections/community.general/issues/9065). - - proxmox module utils - fixes ignoring of ``choose_first_if_multiple`` argument - in ``get_vmid`` (https://github.com/ansible-collections/community.general/pull/9225). - - 'redhat_subscription - do not try to unsubscribe (i.e. remove subscriptions) - - when unregistering a system: newer versions of subscription-manager, as - - available in EL 10 and Fedora 41+, do not support entitlements anymore, - and - - thus unsubscribing will fail - - (https://github.com/ansible-collections/community.general/pull/9578). - - ' - deprecated_features: - - 'MH module utils - attribute ``debug`` definition in subclasses of MH is - now deprecated, as that name will become a delegation to ``AnsibleModule`` - in community.general 12.0.0, and any such attribute will be overridden by - that delegation in that version (https://github.com/ansible-collections/community.general/pull/9577). - - ' - - proxmox - removes default value ``false`` of ``update`` parameter. This - will be changed to a default of ``true`` in community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/9225). - minor_changes: - - MH module utils - delegate ``debug`` to the underlying ``AnsibleModule`` - instance or issues a warning if an attribute already exists with that name - (https://github.com/ansible-collections/community.general/pull/9577). - - apache2_mod_proxy - better handling regexp extraction (https://github.com/ansible-collections/community.general/pull/9609). - - apache2_mod_proxy - change type of ``state`` to a list of strings. No change - for the users (https://github.com/ansible-collections/community.general/pull/9600). - - apache2_mod_proxy - improve readability when using results from ``fecth_url()`` - (https://github.com/ansible-collections/community.general/pull/9608). - - apache2_mod_proxy - refactor repeated code into method (https://github.com/ansible-collections/community.general/pull/9599). - - apache2_mod_proxy - remove unused parameter and code from ``Balancer`` constructor - (https://github.com/ansible-collections/community.general/pull/9614). - - apache2_mod_proxy - simplified and improved string manipulation (https://github.com/ansible-collections/community.general/pull/9614). - - apache2_mod_proxy - use ``deps`` to handle dependencies (https://github.com/ansible-collections/community.general/pull/9612). - - cgroup_memory_recap callback plugin - adjust standard preamble for Python - 3 (https://github.com/ansible-collections/community.general/pull/9583). - - chroot connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - cloud_init_data_facts - open file using ``open()`` as a context manager - (https://github.com/ansible-collections/community.general/pull/9579). - - cobbler inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - context_demo callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - counter filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - counter_enabled callback plugin - adjust standard preamble for Python 3 - (https://github.com/ansible-collections/community.general/pull/9583). - - cpanm - enable usage of option ``--with-recommends`` (https://github.com/ansible-collections/community.general/issues/9554, - https://github.com/ansible-collections/community.general/pull/9555). - - cpanm - enable usage of option ``--with-suggests`` (https://github.com/ansible-collections/community.general/pull/9555). - - crc32 filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - cronvar - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). - - crypttab - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). - - default_without_diff callback plugin - adjust standard preamble for Python - 3 (https://github.com/ansible-collections/community.general/pull/9583). - - dense callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - dict filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - dict_kv filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - diy callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - doas become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - dzdo become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - elastic callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - from_csv filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - from_ini filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - funcd connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - gitlab_runners inventory plugin - adjust standard preamble for Python 3 - (https://github.com/ansible-collections/community.general/pull/9584). - - groupby_as_dict filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - hashids filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - icinga2 inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - incus connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - iocage connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - iocage inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - iocage inventory plugin - the new parameter ``sudo`` of the plugin lets - the command ``iocage list -l`` to run as root on the iocage host. This is - needed to get the IPv4 of a running DHCP jail (https://github.com/ansible-collections/community.general/issues/9572, - https://github.com/ansible-collections/community.general/pull/9573). - - iptables_state action plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - jabber callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - jail connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - jc filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - jira - transition operation now has ``status_id`` to directly reference - wanted transition (https://github.com/ansible-collections/community.general/pull/9602). - - json_query filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - keep_keys filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - keycloak_* modules - ``refresh_token`` parameter added. When multiple authentication - parameters are provided (``token``, ``refresh_token``, and ``auth_username``/``auth_password``), - modules will now automatically retry requests upon authentication errors - (401), using in order the token, refresh token, and username/password (https://github.com/ansible-collections/community.general/pull/9494). - - known_hosts - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). - - ksu become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - linode inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - lists filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - lists_mergeby filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - log_plays callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - loganalytics callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - logdna callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - logentries callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - logstash callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - lxc connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - lxd connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - lxd inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - machinectl become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - mail callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - memcached cache plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - nmap inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - nmcli - add a option ``fail_over_mac`` (https://github.com/ansible-collections/community.general/issues/9570, - https://github.com/ansible-collections/community.general/pull/9571). - - nrdp callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - null callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - one_template - adds ``filter`` option for retrieving templates which are - not owned by the user (https://github.com/ansible-collections/community.general/pull/9547, - https://github.com/ansible-collections/community.general/issues/9278). - - online inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - opennebula inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - opentelemetry callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - parted - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). - - pbrun become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - pfexec become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - pickle cache plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - pmrun become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - proxmox - refactors the proxmox module (https://github.com/ansible-collections/community.general/pull/9225). - - proxmox inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - proxmox_pct_remote connection plugin - adjust standard preamble for Python - 3 (https://github.com/ansible-collections/community.general/pull/9584). - - proxmox_template - add support for checksum validation with new options - ``checksum_algorithm`` and ``checksum`` (https://github.com/ansible-collections/community.general/issues/9553, - https://github.com/ansible-collections/community.general/pull/9601). - - pulp_repo - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). - - qubes connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - random_mac filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - redfish_info - add command ``GetAccountServiceConfig`` to get full information - about AccountService configuration (https://github.com/ansible-collections/community.general/pull/9403). - - redhat_subscription - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). - - redis cache plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - remove_keys filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - replace_keys filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - reveal_ansible_type filter plugin - adjust standard preamble for Python - 3 (https://github.com/ansible-collections/community.general/pull/9585). - - run0 become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - saltstack connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - say callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - scaleway inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - selective callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - sesu become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - shutdown action plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - slack callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - snap - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9598). - - snap_alias - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9598). - - solaris_zone - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). - - sorcery - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). - - splunk callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - stackpath_compute inventory plugin - adjust standard preamble for Python - 3 (https://github.com/ansible-collections/community.general/pull/9584). - - sudosu become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - sumologic callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - syslog_json callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - time filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - timestamp callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - timezone - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). - - to_ini filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - ufw - add support for ``vrrp`` protocol (https://github.com/ansible-collections/community.general/issues/9562, - https://github.com/ansible-collections/community.general/pull/9582). - - unicode_normalize filter plugin - adjust standard preamble for Python 3 - (https://github.com/ansible-collections/community.general/pull/9585). - - unixy callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - version_sort filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - virtualbox inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - xen_orchestra inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - yaml cache plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - yaml callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - zone connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - release_summary: Regular bugfix and feature release. - security_fixes: - - keycloak_client - Sanitize ``saml.encryption.private.key`` so it does not - show in the logs (https://github.com/ansible-collections/community.general/pull/9621). - fragments: - - 10.3.0.yml - - 9225-proxmox-module-refactoring.yml - - 9403-redfish-add-get-accountservice.yml - - 9494-keycloak-modules-retry-request-on-authentication-error.yaml - - 9539-iocage-inventory-dhcp.yml - - 9546-fix-handling-of-tap-homebrew-packages.yml - - 9547-one_template-filter.yml - - 9554-add-cpanm-option_with-recommends-and-suggests.yml - - 9570-feat-nmcli-add-fail-over-mac-parameter.yml - - 9573-iocage-inventory-sudo.yml - - 9577-mh-delegate-debug.yml - - 9578-redhat_subscription-no-remove-on-unregister.yml - - 9579-with-open.yml - - 9582-add-support-for-vrrp.yml - - 9583-py3-imports-actionbecomecachecallback.yml - - 9584-py3-imports-connectioninventory.yml - - 9585-py3-imports-filter.yml - - 9586-allow-transition-id-jira.yml - - 9598-snap-version.yml - - 9599-apache2-mod-proxy-revamp1.yml - - 9600-apache2-mod-proxy-revamp2.yml - - 9601-proxmox-template-support-for-checksums.yml - - 9608-apache2-mod-proxy-revamp3.yml - - 9609-apache2-mod-proxy-revamp4.yml - - 9612-apache2-mod-proxy-revamp5.yml - - 9614-apache2-mod-proxy-revamp7.yml - - 9621-keycloak_client-sanitize-saml-encryption-key.yml - - 9623-pipx-global-latest.yml - modules: - - description: Retrieve information on Proxmox scheduled backups. - name: proxmox_backup_info - namespace: '' - plugins: - connection: - - description: Run tasks in Proxmox LXC container instances using pct CLI - via SSH. - name: proxmox_pct_remote - namespace: null - filter: - - description: Create a JSON patch by comparing two JSON files. - name: json_diff - namespace: null - - description: Apply a JSON-Patch (RFC 6902) operation to an object. - name: json_patch - namespace: null - - description: Apply JSON-Patch (RFC 6902) operations to an object. - name: json_patch_recipe - namespace: null - lookup: - - description: Fetch SSH keys stored in 1Password. - name: onepassword_ssh_key - namespace: null - release_date: '2025-01-27' - 10.3.1: - changes: - bugfixes: - - cloudflare_dns - fix crash when deleting a DNS record or when updating a - record with ``solo=true`` (https://github.com/ansible-collections/community.general/issues/9652, - https://github.com/ansible-collections/community.general/pull/9649). - - homebrew - make package name parsing more resilient (https://github.com/ansible-collections/community.general/pull/9665, - https://github.com/ansible-collections/community.general/issues/9641). - - keycloak module utils - replaces missing return in get_role_composites method - which caused it to return None instead of composite roles (https://github.com/ansible-collections/community.general/issues/9678, - https://github.com/ansible-collections/community.general/pull/9691). - - keycloak_client - fix and improve existing tests. The module showed a diff - without actual changes, solved by improving the ``normalise_cr()`` function - (https://github.com/ansible-collections/community.general/pull/9644). - - proxmox - adds the ``pubkey`` parameter (back to) the ``update`` state (https://github.com/ansible-collections/community.general/issues/9642, - https://github.com/ansible-collections/community.general/pull/9645). - - proxmox - fixes a typo in the translation of the ``pubkey`` parameter to - proxmox' ``ssh-public-keys`` (https://github.com/ansible-collections/community.general/issues/9642, - https://github.com/ansible-collections/community.general/pull/9645). - - xml - ensure file descriptor is closed (https://github.com/ansible-collections/community.general/pull/9695). - minor_changes: - - onepassword_ssh_key - refactor to move code to lookup class (https://github.com/ansible-collections/community.general/pull/9633). - release_summary: Bugfix release. - fragments: - - 10.3.1.yml - - 9633-onepassword_ssh_key.yml - - 9644-kc_client-test-improvement-and-fix.yaml - - 9645-proxmox-fix-pubkey.yml - - 9649-cloudflare_dns-fix-crash-when-deleting-record.yml - - 9665-more-resilient-handling-of-homebrew-packages-names.yml - - 9691-keycloak-module-utils-replace-missing-return-in-get_role_composites.yml - - 9695-xml-close-file.yml - release_date: '2025-02-10' - 10.4.0: - changes: - bugfixes: - - apache2_mod_proxy - make compatible with Python 3 (https://github.com/ansible-collections/community.general/pull/9762). - - apache2_mod_proxy - passing the cluster's page as referer for the member's - pages. This makes the module actually work again for halfway modern Apache - versions. According to some comments founds on the net the referer was required - since at least 2019 for some versions of Apache 2 (https://github.com/ansible-collections/community.general/pull/9762). - - 'elasticsearch_plugin - fix ``ERROR: D is not a recognized option`` issue - when configuring proxy settings (https://github.com/ansible-collections/community.general/pull/9774, - https://github.com/ansible-collections/community.general/issues/9773).' - - ipa_host - module revoked existing host certificates even if ``user_certificate`` - was not given (https://github.com/ansible-collections/community.general/pull/9694). - - keycloak_client - in check mode, detect whether the lists in before client - (for example redirect URI list) contain items that the lists in the desired - client do not contain (https://github.com/ansible-collections/community.general/pull/9739). - - lldp - fix crash caused by certain lldpctl output where an attribute is - defined as branch and leaf (https://github.com/ansible-collections/community.general/pull/9657). - - onepassword_doc lookup plugin - ensure that 1Password Connect support also - works for this plugin (https://github.com/ansible-collections/community.general/pull/9625). - - passwordstore lookup plugin - fix subkey creation even when ``create=false`` - (https://github.com/ansible-collections/community.general/issues/9105, https://github.com/ansible-collections/community.general/pull/9106). - - 'proxmox inventory plugin - plugin did not update cache correctly after - ``meta: refresh_inventory`` (https://github.com/ansible-collections/community.general/issues/9710, - https://github.com/ansible-collections/community.general/pull/9760).' - - 'redhat_subscription - use the "enable_content" option (when available) - when - - registering using D-Bus, to ensure that subscription-manager enables the - - content on registration; this is particular important on EL 10+ and Fedora - - 41+ - - (https://github.com/ansible-collections/community.general/pull/9778). - - ' - - zfs - fix handling of multi-line values of user-defined ZFS properties (https://github.com/ansible-collections/community.general/pull/6264). - - zfs_facts - parameter ``type`` now accepts multple values as documented - (https://github.com/ansible-collections/community.general/issues/5909, https://github.com/ansible-collections/community.general/pull/9697). - deprecated_features: - - profitbricks - module is deprecated and will be removed in community.general - 11.0.0 (https://github.com/ansible-collections/community.general/pull/9733). - - profitbricks_datacenter - module is deprecated and will be removed in community.general - 11.0.0 (https://github.com/ansible-collections/community.general/pull/9733). - - profitbricks_nic - module is deprecated and will be removed in community.general - 11.0.0 (https://github.com/ansible-collections/community.general/pull/9733). - - profitbricks_volume - module is deprecated and will be removed in community.general - 11.0.0 (https://github.com/ansible-collections/community.general/pull/9733). - - profitbricks_volume_attachments - module is deprecated and will be removed - in community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/9733). - minor_changes: - - bitwarden lookup plugin - add new option ``collection_name`` to filter results - by collection name, and new option ``result_count`` to validate number of - results (https://github.com/ansible-collections/community.general/pull/9728). - - incus connection plugin - adds ``remote_user`` and ``incus_become_method`` - parameters for allowing a non-root user to connect to an Incus instance - (https://github.com/ansible-collections/community.general/pull/9743). - - iocage inventory plugin - the new parameter ``hooks_results`` of the plugin - is a list of files inside a jail that provide configuration parameters for - the inventory. The inventory plugin reads the files from the jails and put - the contents into the items of created variable ``iocage_hooks`` (https://github.com/ansible-collections/community.general/issues/9650, - https://github.com/ansible-collections/community.general/pull/9651). - - jira - adds ``client_cert`` and ``client_key`` parameters for supporting - client certificate authentification when connecting to Jira (https://github.com/ansible-collections/community.general/pull/9753). - - lldp - adds ``multivalues`` parameter to control behavior when lldpctl outputs - an attribute multiple times (https://github.com/ansible-collections/community.general/pull/9657). - - lvg - add ``remove_extra_pvs`` parameter to control if ansible should remove - physical volumes which are not in the ``pvs`` parameter (https://github.com/ansible-collections/community.general/pull/9698). - - lxd connection plugin - adds ``remote_user`` and ``lxd_become_method`` parameters - for allowing a non-root user to connect to an LXD instance (https://github.com/ansible-collections/community.general/pull/9659). - - nmcli - adds VRF support with new ``type`` value ``vrf`` and new ``slave_type`` - value ``vrf`` as well as new ``table`` parameter (https://github.com/ansible-collections/community.general/pull/9658, - https://github.com/ansible-collections/community.general/issues/8014). - - proxmox_kvm - allow hibernation and suspending of VMs (https://github.com/ansible-collections/community.general/issues/9620, - https://github.com/ansible-collections/community.general/pull/9653). - - redfish_command - add ``PowerFullPowerCycle`` to power command options (https://github.com/ansible-collections/community.general/pull/9729). - - ssh_config - add ``other_options`` option (https://github.com/ansible-collections/community.general/issues/8053, - https://github.com/ansible-collections/community.general/pull/9684). - - xen_orchestra inventory plugin - add ``use_vm_uuid`` and ``use_host_uuid`` - boolean options to allow switching over to using VM/Xen name labels instead - of UUIDs as item names (https://github.com/ansible-collections/community.general/pull/9787). - release_summary: Regular bugfix and feature release. - fragments: - - 10.4.0.yaml - - 6264-zfs-multiline-property-value.yml - - 9106-passwordstore-fix-subkey-creation-even-when-create-==-false.yml - - 9625-onepassword_doc.yml - - 9651-iocage-inventory-hooks.yml - - 9653-proxmox-kvm-allow-vm-hibernation.yml - - 9657-lldp-handling-attributes-defined-multiple-times.yml - - 9658-add-vrf-commands-to-nmcli-module.yml - - 9659-lxd_connection-nonroot-user.yml - - 9694-ipa-host-certificate-revoked.yml - - 9697-zfs-facts-type.yml - - 9698-lvg-remove-extra-pvs-parameter.yml - - 9728-bitwarden-collection-name-filter.yml - - 9729-redfish-fullpowercycle-command.yml - - 9733-profitbrick-deprecation.yml - - 9739-keycloak_client-compare-before-desired-directly.yml - - 9743-incus_connection-nonroot-user.yml - - 9753-jira-add-client-certificate-auth.yml - - 9760-proxmox-inventory.yml - - 9762-apache2_mod_proxy.yml - - 9774-fix-elasticsearch_plugin-proxy-settings.yml - - 9778-redhat_subscription-ensure-to-enable-content.yml - - 9787-xoa_allow_using_names_in_inventory.yml - - ssh_config_add_other_options.yml - modules: - - description: Gather C(systemd) unit info. - name: systemd_info - namespace: '' - release_date: '2025-02-24' - 10.5.0: - changes: - bugfixes: - - cloudlare_dns - handle exhausted response stream in case of HTTP errors - to show nice error message to the user (https://github.com/ansible-collections/community.general/issues/9782, - https://github.com/ansible-collections/community.general/pull/9818). - - dnf_versionlock - add support for dnf5 (https://github.com/ansible-collections/community.general/issues/9556). - - homebrew - fix crash when package names include tap (https://github.com/ansible-collections/community.general/issues/9777, - https://github.com/ansible-collections/community.general/pull/9803). - - homebrew_cask - handle unusual brew version strings (https://github.com/ansible-collections/community.general/issues/8432, - https://github.com/ansible-collections/community.general/pull/9881). - - nmcli - enable changing only the order of DNS servers or search suffixes - (https://github.com/ansible-collections/community.general/issues/8724, https://github.com/ansible-collections/community.general/pull/9880). - - proxmox - add missing key selection of ``'status'`` key to ``get_lxc_status`` - (https://github.com/ansible-collections/community.general/issues/9696, https://github.com/ansible-collections/community.general/pull/9809). - - proxmox_vm_info - the module no longer expects that the key ``template`` - exists in a dictionary returned by Proxmox (https://github.com/ansible-collections/community.general/issues/9875, - https://github.com/ansible-collections/community.general/pull/9910). - - sudoers - display stdout and stderr raised while failed validation (https://github.com/ansible-collections/community.general/issues/9674, - https://github.com/ansible-collections/community.general/pull/9871). - minor_changes: - - CmdRunner module utils - the convenience method ``cmd_runner_fmt.as_fixed()`` - now accepts multiple arguments as a list (https://github.com/ansible-collections/community.general/pull/9893). - - apache2_mod_proxy - code simplification, no change in functionality (https://github.com/ansible-collections/community.general/pull/9457). - - consul_token - fix idempotency when ``policies`` or ``roles`` are supplied - by name (https://github.com/ansible-collections/community.general/issues/9841, - https://github.com/ansible-collections/community.general/pull/9845). - - keycloak_realm - remove ID requirement when creating a realm to allow Keycloak - generating its own realm ID (https://github.com/ansible-collections/community.general/pull/9768). - - nmap inventory plugin - adds ``dns_servers`` option for specifying DNS servers - for name resolution. Accepts hostnames or IP addresses in the same format - as the ``exclude`` option (https://github.com/ansible-collections/community.general/pull/9849). - - proxmox_kvm - add missing audio hardware device handling (https://github.com/ansible-collections/community.general/issues/5192, - https://github.com/ansible-collections/community.general/pull/9847). - - redfish_config - add command ``SetPowerRestorePolicy`` to set the desired - power state of the system when power is restored (https://github.com/ansible-collections/community.general/pull/9837). - - redfish_info - add command ``GetPowerRestorePolicy`` to get the desired - power state of the system when power is restored (https://github.com/ansible-collections/community.general/pull/9824). - - rocketchat - option ``is_pre740`` has been added to control the format of - the payload. For Rocket.Chat 7.4.0 or newer, it must be set to ``false`` - (https://github.com/ansible-collections/community.general/pull/9882). - - slack callback plugin - add ``http_agent`` option to enable the user to - set a custom user agent for slack callback plugin (https://github.com/ansible-collections/community.general/issues/9813, - https://github.com/ansible-collections/community.general/pull/9836). - - systemd_info - add wildcard expression support in ``unitname`` option (https://github.com/ansible-collections/community.general/pull/9821). - - systemd_info - extend support to timer units (https://github.com/ansible-collections/community.general/pull/9891). - - vmadm - add new options ``flexible_disk_size`` and ``owner_uuid`` (https://github.com/ansible-collections/community.general/pull/9892). - release_summary: Regular bugfix and feature release. - fragments: - - 10.5.0.yml - - 9457-apache2-mod-proxy-revamp.yml - - 9768-keycloak_realm-remove-id-requirement.yaml - - 9777-homebrew-fix-crash-when-packages-include-tap.yml - - 9809-proxmox-fix-status-getter.yml - - 9818-cloudflare-dns-exhausted-response.yml - - 9821-systemd_info-add-wildcards.yml - - 9824-redfish-implement-obtaining-powerrestorepolicy.yml - - 9836-option-for-http-agent-for-user-to-callback-slack.yml - - 9837-redfish-implement-setting-powerrestorepolicy.yml - - 9845-consul_token_idempotency.yml - - 9847-Adding_audio_device-support_to_proxmox_kvm.yml - - 9849-nmap_dns_servers.yml - - 9875-proxmox-dont-expect-key-template-to-exist.yml - - 9880-nmcli-fix-reorder-same-dns-nameservers-search-suffixes.yml - - 9882-fix-payload-to-match-rocketchat-740-requirement.yml - - 9891-systemd_info-add_timer.yml - - 9892-vmadm-add-new-options.yml - - 9893-cmdrunner-as-fixed-args.yml - - dnf_versionlock.yml - - homebrew_cask.yml - - sudoers.yml - modules: - - description: Manage pacemaker resources. - name: pacemaker_resource - namespace: '' - release_date: '2025-03-24' +ancestor: 10.0.0 +releases: {} diff --git a/changelogs/fragments/10005-fix-method-exists-in-sysrc.yml b/changelogs/fragments/10005-fix-method-exists-in-sysrc.yml new file mode 100644 index 0000000000..218a9eca06 --- /dev/null +++ b/changelogs/fragments/10005-fix-method-exists-in-sysrc.yml @@ -0,0 +1,2 @@ +bugfixes: + - sysrc - no longer always reporting ``changed=true`` when ``state=absent``. This fixes the method ``exists()`` (https://github.com/ansible-collections/community.general/issues/10004, https://github.com/ansible-collections/community.general/pull/10005). diff --git a/changelogs/fragments/10011-github_deploy_key-check-key-present.yml b/changelogs/fragments/10011-github_deploy_key-check-key-present.yml new file mode 100644 index 0000000000..1f3857794c --- /dev/null +++ b/changelogs/fragments/10011-github_deploy_key-check-key-present.yml @@ -0,0 +1,2 @@ +bugfixes: + - "github_deploy_key - check that key really exists on 422 to avoid masking other errors (https://github.com/ansible-collections/community.general/issues/6718, https://github.com/ansible-collections/community.general/pull/10011)." diff --git a/changelogs/fragments/10012-improve-error-handling-homebrew-missing-tap.yml b/changelogs/fragments/10012-improve-error-handling-homebrew-missing-tap.yml new file mode 100644 index 0000000000..443be8358c --- /dev/null +++ b/changelogs/fragments/10012-improve-error-handling-homebrew-missing-tap.yml @@ -0,0 +1,2 @@ +bugfixes: + - homebrew - emit a useful error message if ``brew info`` reports a package tap is ``null`` (https://github.com/ansible-collections/community.general/pull/10013, https://github.com/ansible-collections/community.general/issues/10012). diff --git a/changelogs/fragments/10014-puppet-improve-param.yml b/changelogs/fragments/10014-puppet-improve-param.yml new file mode 100644 index 0000000000..5d888523b7 --- /dev/null +++ b/changelogs/fragments/10014-puppet-improve-param.yml @@ -0,0 +1,2 @@ +minor_changes: + - puppet - improve parameter formatting, no impact to user (https://github.com/ansible-collections/community.general/pull/10014). diff --git a/changelogs/fragments/10026-stackpath-compute-deprecation.yml b/changelogs/fragments/10026-stackpath-compute-deprecation.yml new file mode 100644 index 0000000000..dfd3f7e236 --- /dev/null +++ b/changelogs/fragments/10026-stackpath-compute-deprecation.yml @@ -0,0 +1,2 @@ +deprecated_features: + - stackpath_compute inventory plugin - plugin is deprecated and will be removed in community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/10026). diff --git a/changelogs/fragments/10028-manifold-deprecation.yml b/changelogs/fragments/10028-manifold-deprecation.yml new file mode 100644 index 0000000000..1bb1948026 --- /dev/null +++ b/changelogs/fragments/10028-manifold-deprecation.yml @@ -0,0 +1,2 @@ +deprecated_features: + - manifold lookup plugin - plugin is deprecated and will be removed in community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/10028). diff --git a/changelogs/fragments/5932-launchd-plist.yml b/changelogs/fragments/5932-launchd-plist.yml new file mode 100644 index 0000000000..bf2530841a --- /dev/null +++ b/changelogs/fragments/5932-launchd-plist.yml @@ -0,0 +1,2 @@ +minor_changes: + - launchd - add ``plist`` option for services such as sshd, where the plist filename doesn't match the service name (https://github.com/ansible-collections/community.general/pull/9102). diff --git a/changelogs/fragments/6264-zfs-multiline-property-value.yml b/changelogs/fragments/6264-zfs-multiline-property-value.yml new file mode 100644 index 0000000000..30e06f7919 --- /dev/null +++ b/changelogs/fragments/6264-zfs-multiline-property-value.yml @@ -0,0 +1,2 @@ +bugfixes: + - zfs - fix handling of multi-line values of user-defined ZFS properties (https://github.com/ansible-collections/community.general/pull/6264). diff --git a/changelogs/fragments/7402-proxmox-template-support-server-side-artifact-fetching.yaml b/changelogs/fragments/7402-proxmox-template-support-server-side-artifact-fetching.yaml new file mode 100644 index 0000000000..4a5fefdc96 --- /dev/null +++ b/changelogs/fragments/7402-proxmox-template-support-server-side-artifact-fetching.yaml @@ -0,0 +1,2 @@ +minor_changes: + - proxmox_template - add server side artifact fetching support (https://github.com/ansible-collections/community.general/pull/9113). \ No newline at end of file diff --git a/changelogs/fragments/9076-remove-duplicated-homebrew-package-name-validation.yml b/changelogs/fragments/9076-remove-duplicated-homebrew-package-name-validation.yml new file mode 100644 index 0000000000..b067625c0c --- /dev/null +++ b/changelogs/fragments/9076-remove-duplicated-homebrew-package-name-validation.yml @@ -0,0 +1,2 @@ +minor_changes: + - homebrew - remove duplicated package name validation (https://github.com/ansible-collections/community.general/pull/9076). diff --git a/changelogs/fragments/9077-keycloak_client-fix-attributes-dict-turned-into-list.yml b/changelogs/fragments/9077-keycloak_client-fix-attributes-dict-turned-into-list.yml new file mode 100644 index 0000000000..d693c2e139 --- /dev/null +++ b/changelogs/fragments/9077-keycloak_client-fix-attributes-dict-turned-into-list.yml @@ -0,0 +1,2 @@ +bugfixes: + - keycloak_client - fix diff by removing code that turns the attributes dict which contains additional settings into a list (https://github.com/ansible-collections/community.general/pull/9077). \ No newline at end of file diff --git a/changelogs/fragments/9082-keycloak_clientscope-fix-attributes-dict-turned-into-list.yml b/changelogs/fragments/9082-keycloak_clientscope-fix-attributes-dict-turned-into-list.yml new file mode 100644 index 0000000000..c9d61780b2 --- /dev/null +++ b/changelogs/fragments/9082-keycloak_clientscope-fix-attributes-dict-turned-into-list.yml @@ -0,0 +1,2 @@ +bugfixes: + - keycloak_clientscope - fix diff and ``end_state`` by removing the code that turns the attributes dict, which contains additional config items, into a list (https://github.com/ansible-collections/community.general/pull/9082). \ No newline at end of file diff --git a/changelogs/fragments/9096-alternatives-add-family-parameter.yml b/changelogs/fragments/9096-alternatives-add-family-parameter.yml new file mode 100644 index 0000000000..a0b021f892 --- /dev/null +++ b/changelogs/fragments/9096-alternatives-add-family-parameter.yml @@ -0,0 +1,2 @@ +minor_changes: + - alternatives - add ``family`` parameter that allows to utilize the ``--family`` option available in RedHat version of update-alternatives (https://github.com/ansible-collections/community.general/issues/5060, https://github.com/ansible-collections/community.general/pull/9096). diff --git a/changelogs/fragments/9106-passwordstore-fix-subkey-creation-even-when-create-==-false.yml b/changelogs/fragments/9106-passwordstore-fix-subkey-creation-even-when-create-==-false.yml new file mode 100644 index 0000000000..b804d2eed9 --- /dev/null +++ b/changelogs/fragments/9106-passwordstore-fix-subkey-creation-even-when-create-==-false.yml @@ -0,0 +1,2 @@ +bugfixes: + - passwordstore lookup plugin - fix subkey creation even when ``create=false`` (https://github.com/ansible-collections/community.general/issues/9105, https://github.com/ansible-collections/community.general/pull/9106). diff --git a/changelogs/fragments/9114-redfish-utils-update-remove-default-applytime.yml b/changelogs/fragments/9114-redfish-utils-update-remove-default-applytime.yml new file mode 100644 index 0000000000..672545a0a8 --- /dev/null +++ b/changelogs/fragments/9114-redfish-utils-update-remove-default-applytime.yml @@ -0,0 +1,2 @@ +bugfixes: + - redfish_utils module utils - remove undocumented default applytime (https://github.com/ansible-collections/community.general/pull/9114). diff --git a/changelogs/fragments/9123-redfish-command-custom-oem-params.yml b/changelogs/fragments/9123-redfish-command-custom-oem-params.yml new file mode 100644 index 0000000000..a09219515a --- /dev/null +++ b/changelogs/fragments/9123-redfish-command-custom-oem-params.yml @@ -0,0 +1,2 @@ +minor_changes: + - redfish_command - add ``update_custom_oem_header``, ``update_custom_oem_params``, and ``update_custom_oem_mime_type`` options (https://github.com/ansible-collections/community.general/pull/9123). diff --git a/changelogs/fragments/9124-dnf_config_manager.yml b/changelogs/fragments/9124-dnf_config_manager.yml new file mode 100644 index 0000000000..9c87f02d64 --- /dev/null +++ b/changelogs/fragments/9124-dnf_config_manager.yml @@ -0,0 +1,2 @@ +bugfixes: + - dnf_config_manager - fix hanging when prompting to import GPG keys (https://github.com/ansible-collections/community.general/pull/9124, https://github.com/ansible-collections/community.general/issues/8830). diff --git a/changelogs/fragments/9128-homebrew_cask-name-regex-fix.yml b/changelogs/fragments/9128-homebrew_cask-name-regex-fix.yml new file mode 100644 index 0000000000..69765958fb --- /dev/null +++ b/changelogs/fragments/9128-homebrew_cask-name-regex-fix.yml @@ -0,0 +1,2 @@ +bugfixes: + - homebrew_cask - allow ``+`` symbol in Homebrew cask name validation regex (https://github.com/ansible-collections/community.general/pull/9128). diff --git a/changelogs/fragments/9132-cloudflare_dns-comment-and-tags.yml b/changelogs/fragments/9132-cloudflare_dns-comment-and-tags.yml new file mode 100644 index 0000000000..b601e39f55 --- /dev/null +++ b/changelogs/fragments/9132-cloudflare_dns-comment-and-tags.yml @@ -0,0 +1,2 @@ +minor_changes: + - cloudflare_dns - add support for ``comment`` and ``tags`` (https://github.com/ansible-collections/community.general/pull/9132). diff --git a/changelogs/fragments/9157-fix-dnf_config_manager-locale.yml b/changelogs/fragments/9157-fix-dnf_config_manager-locale.yml new file mode 100644 index 0000000000..f2084dfa5f --- /dev/null +++ b/changelogs/fragments/9157-fix-dnf_config_manager-locale.yml @@ -0,0 +1,2 @@ +bugfixes: + - dnf_config_manager - forces locale to ``C`` before module starts. If the locale was set to non-English, the output of the ``dnf config-manager`` could not be parsed (https://github.com/ansible-collections/community.general/pull/9157, https://github.com/ansible-collections/community.general/issues/9046). \ No newline at end of file diff --git a/changelogs/fragments/9159-iso-extract_add_password.yml b/changelogs/fragments/9159-iso-extract_add_password.yml new file mode 100644 index 0000000000..f1b2650d4f --- /dev/null +++ b/changelogs/fragments/9159-iso-extract_add_password.yml @@ -0,0 +1,2 @@ +minor_changes: + - iso_extract - adds ``password`` parameter that is passed to 7z (https://github.com/ansible-collections/community.general/pull/9159). diff --git a/changelogs/fragments/9167-rpm_ostree_pkg-apply_live.yml b/changelogs/fragments/9167-rpm_ostree_pkg-apply_live.yml new file mode 100644 index 0000000000..e473dedd0b --- /dev/null +++ b/changelogs/fragments/9167-rpm_ostree_pkg-apply_live.yml @@ -0,0 +1,3 @@ +minor_changes: +- rpm_ostree_pkg - added the options ``apply_live`` (https://github.com/ansible-collections/community.general/pull/9167). +- rpm_ostree_pkg - added the return value ``needs_reboot`` (https://github.com/ansible-collections/community.general/pull/9167). diff --git a/changelogs/fragments/9168-nmcli-add-sriov-parameter.yml b/changelogs/fragments/9168-nmcli-add-sriov-parameter.yml new file mode 100644 index 0000000000..77f28e73bf --- /dev/null +++ b/changelogs/fragments/9168-nmcli-add-sriov-parameter.yml @@ -0,0 +1,2 @@ +minor_changes: + - nmcli - add ``sriov`` parameter that enables support for SR-IOV settings (https://github.com/ansible-collections/community.general/pull/9168). diff --git a/changelogs/fragments/9171-gio-mime-fix-version.yml b/changelogs/fragments/9171-gio-mime-fix-version.yml new file mode 100644 index 0000000000..ca9dbddd7f --- /dev/null +++ b/changelogs/fragments/9171-gio-mime-fix-version.yml @@ -0,0 +1,2 @@ +bugfixes: + - gio_mime - fix command line when determining version of ``gio`` (https://github.com/ansible-collections/community.general/pull/9171, https://github.com/ansible-collections/community.general/issues/9158). diff --git a/changelogs/fragments/9172-opkg-deprecate-force-none.yml b/changelogs/fragments/9172-opkg-deprecate-force-none.yml new file mode 100644 index 0000000000..1b11419c5a --- /dev/null +++ b/changelogs/fragments/9172-opkg-deprecate-force-none.yml @@ -0,0 +1,2 @@ +deprecated_features: + - opkg - deprecate value ``""`` for parameter ``force`` (https://github.com/ansible-collections/community.general/pull/9172). diff --git a/changelogs/fragments/9174-xbps-support-rootdir-and-repository.yml b/changelogs/fragments/9174-xbps-support-rootdir-and-repository.yml new file mode 100644 index 0000000000..9197607684 --- /dev/null +++ b/changelogs/fragments/9174-xbps-support-rootdir-and-repository.yml @@ -0,0 +1,2 @@ +minor_changes: + - xbps - add ``root`` and ``repository`` options to enable bootstrapping new void installations (https://github.com/ansible-collections/community.general/pull/9174). diff --git a/changelogs/fragments/9179-deps-tests.yml b/changelogs/fragments/9179-deps-tests.yml new file mode 100644 index 0000000000..1ddf109033 --- /dev/null +++ b/changelogs/fragments/9179-deps-tests.yml @@ -0,0 +1,2 @@ +minor_changes: + - deps module utils - add ``deps.clear()`` to clear out previously declared dependencies (https://github.com/ansible-collections/community.general/pull/9179). diff --git a/changelogs/fragments/9180-pipx-version.yml b/changelogs/fragments/9180-pipx-version.yml new file mode 100644 index 0000000000..f07d66c83c --- /dev/null +++ b/changelogs/fragments/9180-pipx-version.yml @@ -0,0 +1,3 @@ +minor_changes: + - pipx - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9180). + - pipx_info - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9180). diff --git a/changelogs/fragments/9181-improve-homebrew-module-performance.yml b/changelogs/fragments/9181-improve-homebrew-module-performance.yml new file mode 100644 index 0000000000..b3b6ba2ca4 --- /dev/null +++ b/changelogs/fragments/9181-improve-homebrew-module-performance.yml @@ -0,0 +1,2 @@ +minor_changes: + - homebrew - greatly speed up module when multiple packages are passed in the ``name`` option (https://github.com/ansible-collections/community.general/pull/9181). \ No newline at end of file diff --git a/changelogs/fragments/9186-fix-broken-check-mode-in-github-key.yml b/changelogs/fragments/9186-fix-broken-check-mode-in-github-key.yml new file mode 100644 index 0000000000..dbf1f145d5 --- /dev/null +++ b/changelogs/fragments/9186-fix-broken-check-mode-in-github-key.yml @@ -0,0 +1,2 @@ +bugfixes: + - github_key - in check mode, a faulty call to ```datetime.strftime(...)``` was being made which generated an exception (https://github.com/ansible-collections/community.general/issues/9185). \ No newline at end of file diff --git a/changelogs/fragments/9187-flatpak-lang.yml b/changelogs/fragments/9187-flatpak-lang.yml new file mode 100644 index 0000000000..159923cbdc --- /dev/null +++ b/changelogs/fragments/9187-flatpak-lang.yml @@ -0,0 +1,2 @@ +bugfixes: + - flatpak - force the locale language to ``C`` when running the flatpak command (https://github.com/ansible-collections/community.general/pull/9187, https://github.com/ansible-collections/community.general/issues/8883). diff --git a/changelogs/fragments/9189-scalway-lb-simplify-return.yml b/changelogs/fragments/9189-scalway-lb-simplify-return.yml new file mode 100644 index 0000000000..39d161f06b --- /dev/null +++ b/changelogs/fragments/9189-scalway-lb-simplify-return.yml @@ -0,0 +1,2 @@ +minor_changes: + - scaleway_lb - minor simplification in the code (https://github.com/ansible-collections/community.general/pull/9189). diff --git a/changelogs/fragments/9190-redfish-utils-unused-code.yml b/changelogs/fragments/9190-redfish-utils-unused-code.yml new file mode 100644 index 0000000000..47f7588b96 --- /dev/null +++ b/changelogs/fragments/9190-redfish-utils-unused-code.yml @@ -0,0 +1,4 @@ +minor_changes: + - redfish_utils module utils - remove redundant code (https://github.com/ansible-collections/community.general/pull/9190). +deprecated_features: + - redfish_utils module utils - deprecate method ``RedfishUtils._init_session()`` (https://github.com/ansible-collections/community.general/pull/9190). diff --git a/changelogs/fragments/9198-fail-if-slack-api-response-is-not-ok-with-error-message.yml b/changelogs/fragments/9198-fail-if-slack-api-response-is-not-ok-with-error-message.yml new file mode 100644 index 0000000000..56ab25f578 --- /dev/null +++ b/changelogs/fragments/9198-fail-if-slack-api-response-is-not-ok-with-error-message.yml @@ -0,0 +1,2 @@ +bugfixes: + - slack - fail if Slack API response is not OK with error message (https://github.com/ansible-collections/community.general/pull/9198). diff --git a/changelogs/fragments/9202-keycloak_clientscope_type-sort-lists.yml b/changelogs/fragments/9202-keycloak_clientscope_type-sort-lists.yml new file mode 100644 index 0000000000..ef9fc7a6f7 --- /dev/null +++ b/changelogs/fragments/9202-keycloak_clientscope_type-sort-lists.yml @@ -0,0 +1,2 @@ +bugfixes: + - keycloak_clientscope_type - sort the default and optional clientscope lists to improve the diff (https://github.com/ansible-collections/community.general/pull/9202). \ No newline at end of file diff --git a/changelogs/fragments/9223-proxmox-backup-bugfixes.yml b/changelogs/fragments/9223-proxmox-backup-bugfixes.yml new file mode 100644 index 0000000000..559e1f45bc --- /dev/null +++ b/changelogs/fragments/9223-proxmox-backup-bugfixes.yml @@ -0,0 +1,2 @@ +bugfixes: + - proxmox_backup - fix incorrect key lookup in vmid permission check (https://github.com/ansible-collections/community.general/pull/9223). diff --git a/changelogs/fragments/9225-proxmox-module-refactoring.yml b/changelogs/fragments/9225-proxmox-module-refactoring.yml new file mode 100644 index 0000000000..4e49037ab2 --- /dev/null +++ b/changelogs/fragments/9225-proxmox-module-refactoring.yml @@ -0,0 +1,11 @@ +minor_changes: + - proxmox - refactors the proxmox module (https://github.com/ansible-collections/community.general/pull/9225). + +bugfixes: + - proxmox - fixes idempotency of template conversions (https://github.com/ansible-collections/community.general/pull/9225, https://github.com/ansible-collections/community.general/issues/8811). + - proxmox - fixes issues with disk_volume variable (https://github.com/ansible-collections/community.general/pull/9225, https://github.com/ansible-collections/community.general/issues/9065). + - proxmox - fixes incorrect parsing for bind-only mounts (https://github.com/ansible-collections/community.general/pull/9225, https://github.com/ansible-collections/community.general/issues/8982). + - proxmox module utils - fixes ignoring of ``choose_first_if_multiple`` argument in ``get_vmid`` (https://github.com/ansible-collections/community.general/pull/9225). + +deprecated_features: + - proxmox - removes default value ``false`` of ``update`` parameter. This will be changed to a default of ``true`` in community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/9225). diff --git a/changelogs/fragments/9226-xfconf-version.yml b/changelogs/fragments/9226-xfconf-version.yml new file mode 100644 index 0000000000..517beb9b96 --- /dev/null +++ b/changelogs/fragments/9226-xfconf-version.yml @@ -0,0 +1,3 @@ +minor_changes: + - xfconf - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9226). + - xfconf_info - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9226). diff --git a/changelogs/fragments/9228-fix-issue-header.yml b/changelogs/fragments/9228-fix-issue-header.yml new file mode 100644 index 0000000000..450a23f8e5 --- /dev/null +++ b/changelogs/fragments/9228-fix-issue-header.yml @@ -0,0 +1,2 @@ +minor_changes: + - proxmox inventory plugin - strip whitespace from ``user``, ``token_id``, and ``token_secret`` (https://github.com/ansible-collections/community.general/issues/9227, https://github.com/ansible-collections/community.general/pull/9228/). diff --git a/changelogs/fragments/9234-fix-verify-bios-attributes-multi-system.yml b/changelogs/fragments/9234-fix-verify-bios-attributes-multi-system.yml new file mode 100644 index 0000000000..95bafed8d8 --- /dev/null +++ b/changelogs/fragments/9234-fix-verify-bios-attributes-multi-system.yml @@ -0,0 +1,2 @@ +bugfixes: + - redfish_utils module utils - Fix ``VerifyBiosAttributes`` command on multi system resource nodes (https://github.com/ansible-collections/community.general/pull/9234). diff --git a/changelogs/fragments/9238-locale-gen-rewrite.yml b/changelogs/fragments/9238-locale-gen-rewrite.yml new file mode 100644 index 0000000000..c2c9160bfb --- /dev/null +++ b/changelogs/fragments/9238-locale-gen-rewrite.yml @@ -0,0 +1,13 @@ +minor_changes: + - "locale_gen - invert the logic to determine ``ubuntu_mode``, making it look first for ``/etc/locale.gen`` (set ``ubuntu_mode`` to ``False``) + and only then looking for ``/var/lib/locales/supported.d/`` (set ``ubuntu_mode`` to ``True``) + (https://github.com/ansible-collections/community.general/pull/9238, + https://github.com/ansible-collections/community.general/issues/9131, + https://github.com/ansible-collections/community.general/issues/8487)." + - > + locale_gen - new return value ``mechanism`` to better express the semantics of the ``ubuntu_mode``, with the possible values being either + ``glibc`` (``ubuntu_mode=False``) or ``ubuntu_legacy`` (``ubuntu_mode=True``) (https://github.com/ansible-collections/community.general/pull/9238). +deprecated_features: + - > + locale_gen - ``ubuntu_mode=True``, or ``mechanism=ubuntu_legacy`` is deprecated and will be removed in community.general 13.0.0 + (https://github.com/ansible-collections/community.general/pull/9238). diff --git a/changelogs/fragments/9239-proxmox-backup-refactor.yml b/changelogs/fragments/9239-proxmox-backup-refactor.yml new file mode 100644 index 0000000000..4f73fe6dde --- /dev/null +++ b/changelogs/fragments/9239-proxmox-backup-refactor.yml @@ -0,0 +1,2 @@ +minor_changes: + - proxmox_backup - refactor permission checking to improve code readability and maintainability (https://github.com/ansible-collections/community.general/pull/9239). diff --git a/changelogs/fragments/9255-fix-handling-of-aliased-homebrew-packages.yml b/changelogs/fragments/9255-fix-handling-of-aliased-homebrew-packages.yml new file mode 100644 index 0000000000..350e81af8e --- /dev/null +++ b/changelogs/fragments/9255-fix-handling-of-aliased-homebrew-packages.yml @@ -0,0 +1,2 @@ +bugfixes: + - homebrew - fix incorrect handling of aliased homebrew modules when the alias is requested (https://github.com/ansible-collections/community.general/pull/9255, https://github.com/ansible-collections/community.general/issues/9240). \ No newline at end of file diff --git a/changelogs/fragments/9256-proxmox_disk-fix-async-method-of-resize_disk.yml b/changelogs/fragments/9256-proxmox_disk-fix-async-method-of-resize_disk.yml new file mode 100644 index 0000000000..0b0a826a0d --- /dev/null +++ b/changelogs/fragments/9256-proxmox_disk-fix-async-method-of-resize_disk.yml @@ -0,0 +1,4 @@ +bugfixes: + - proxmox_disk - fix async method and make ``resize_disk`` method handle errors correctly (https://github.com/ansible-collections/community.general/pull/9256). +minor_changes: + - proxmox module utils - add method ``api_task_complete`` that can wait for task completion and return error message (https://github.com/ansible-collections/community.general/pull/9256). diff --git a/changelogs/fragments/9263-kc_authentication-api-priority.yaml b/changelogs/fragments/9263-kc_authentication-api-priority.yaml new file mode 100644 index 0000000000..a943e659ad --- /dev/null +++ b/changelogs/fragments/9263-kc_authentication-api-priority.yaml @@ -0,0 +1,2 @@ +security_fixes: + - keycloak_authentication - API calls did not properly set the ``priority`` during update resulting in incorrectly sorted authentication flows. This apparently only affects Keycloak 25 or newer (https://github.com/ansible-collections/community.general/pull/9263). \ No newline at end of file diff --git a/changelogs/fragments/9270-zypper-add-simple_errors.yaml b/changelogs/fragments/9270-zypper-add-simple_errors.yaml new file mode 100644 index 0000000000..9fcdf3403c --- /dev/null +++ b/changelogs/fragments/9270-zypper-add-simple_errors.yaml @@ -0,0 +1,3 @@ +minor_changes: + - zypper - add ``simple_errors`` option (https://github.com/ansible-collections/community.general/pull/9270). + - zypper - add ``quiet`` option (https://github.com/ansible-collections/community.general/pull/9270). \ No newline at end of file diff --git a/changelogs/fragments/9277-proxmox_template-fix-the-wrong-path-called-on-proxmox_template.task_status.yaml b/changelogs/fragments/9277-proxmox_template-fix-the-wrong-path-called-on-proxmox_template.task_status.yaml new file mode 100644 index 0000000000..166c040e3b --- /dev/null +++ b/changelogs/fragments/9277-proxmox_template-fix-the-wrong-path-called-on-proxmox_template.task_status.yaml @@ -0,0 +1,2 @@ +bugfixes: + - proxmox_template - fix the wrong path called on ``proxmox_template.task_status`` (https://github.com/ansible-collections/community.general/issues/9276, https://github.com/ansible-collections/community.general/pull/9277). diff --git a/changelogs/fragments/9284-add-keycloak-action-group.yml b/changelogs/fragments/9284-add-keycloak-action-group.yml new file mode 100644 index 0000000000..b25c370346 --- /dev/null +++ b/changelogs/fragments/9284-add-keycloak-action-group.yml @@ -0,0 +1,2 @@ +minor_changes: + - keycloak - add an action group for Keycloak modules to allow ``module_defaults`` to be set for Keycloak tasks (https://github.com/ansible-collections/community.general/pull/9284). diff --git a/changelogs/fragments/9318-fstr-actionplugins.yml b/changelogs/fragments/9318-fstr-actionplugins.yml new file mode 100644 index 0000000000..7df54f3c19 --- /dev/null +++ b/changelogs/fragments/9318-fstr-actionplugins.yml @@ -0,0 +1,3 @@ +minor_changes: + - iptables_state action plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9318). + - shutdown action plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9318). diff --git a/changelogs/fragments/9319-fstr-become-plugins.yml b/changelogs/fragments/9319-fstr-become-plugins.yml new file mode 100644 index 0000000000..dcdc4b3f52 --- /dev/null +++ b/changelogs/fragments/9319-fstr-become-plugins.yml @@ -0,0 +1,10 @@ +minor_changes: + - doas become plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9319). + - dzdo become plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9319). + - ksu become plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9319). + - machinectl become plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9319). + - pbrun become plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9319). + - pfexec become plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9319). + - pmrun become plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9319). + - sesu become plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9319). + - sudosu become plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9319). diff --git a/changelogs/fragments/9320-fstr-cache-plugins.yml b/changelogs/fragments/9320-fstr-cache-plugins.yml new file mode 100644 index 0000000000..cc1aa6ea2e --- /dev/null +++ b/changelogs/fragments/9320-fstr-cache-plugins.yml @@ -0,0 +1,3 @@ +minor_changes: + - memcached cache plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9320). + - redis cache plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9320). diff --git a/changelogs/fragments/9321-fstr-callback-plugins.yml b/changelogs/fragments/9321-fstr-callback-plugins.yml new file mode 100644 index 0000000000..d79d3cbfa0 --- /dev/null +++ b/changelogs/fragments/9321-fstr-callback-plugins.yml @@ -0,0 +1,22 @@ +minor_changes: + - cgroup_memory_recap callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). + - context_demo callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). + - counter_enabled callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). + - dense callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). + - diy callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). + - elastic callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). + - jabber callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). + - log_plays callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). + - loganalytics callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). + - logdna callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). + - logentries callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). + - mail callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). + - nrdp callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). + - opentelemetry callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). + - say callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). + - selective callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). + - slack callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). + - splunk callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). + - timestamp callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). + - unixy callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). + - yaml callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). diff --git a/changelogs/fragments/9322-fstr-connection-plugins.yml b/changelogs/fragments/9322-fstr-connection-plugins.yml new file mode 100644 index 0000000000..4b3e264cfb --- /dev/null +++ b/changelogs/fragments/9322-fstr-connection-plugins.yml @@ -0,0 +1,11 @@ +minor_changes: + - chroot connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). + - funcd connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). + - incus connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). + - iocage connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). + - jail connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). + - lxc connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). + - lxd connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). + - qubes connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). + - saltstack connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). + - zone connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). diff --git a/changelogs/fragments/9323-fstr-inventory-plugins.yml b/changelogs/fragments/9323-fstr-inventory-plugins.yml new file mode 100644 index 0000000000..03ded1f0ec --- /dev/null +++ b/changelogs/fragments/9323-fstr-inventory-plugins.yml @@ -0,0 +1,14 @@ +minor_changes: + - cobbler inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). + - gitlab_runners inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). + - icinga2 inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). + - linode inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). + - lxd inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). + - nmap inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). + - online inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). + - opennebula inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). + - proxmox inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). + - scaleway inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). + - stackpath_compute inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). + - virtualbox inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). + - xen_orchestra inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). diff --git a/changelogs/fragments/9324-fstr-lookup-plugins.yml b/changelogs/fragments/9324-fstr-lookup-plugins.yml new file mode 100644 index 0000000000..a448ae0d48 --- /dev/null +++ b/changelogs/fragments/9324-fstr-lookup-plugins.yml @@ -0,0 +1,29 @@ +minor_changes: + - bitwarden lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). + - chef_databag lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). + - collection_version lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). + - consul_kv lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). + - credstash lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). + - cyberarkpassword lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). + - dependent lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). + - dig lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). + - dnstxt lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). + - dsv lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). + - etcd lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). + - etcd3 lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). + - filetree lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). + - github_app_access_token lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). + - hiera lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). + - keyring lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). + - lastpass lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). + - lmdb_kv lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). + - manifold lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). + - merge_variables lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). + - onepassword lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). + - onepassword_doc lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). + - passwordstore lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). + - random_pet lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). + - redis lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). + - revbitspss lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). + - shelvefile lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). + - tss lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). diff --git a/changelogs/fragments/9334-qubes-conn.yml b/changelogs/fragments/9334-qubes-conn.yml new file mode 100644 index 0000000000..3faa8d7981 --- /dev/null +++ b/changelogs/fragments/9334-qubes-conn.yml @@ -0,0 +1,2 @@ +bugfixes: + - qubes connection plugin - fix the printing of debug information (https://github.com/ansible-collections/community.general/pull/9334). diff --git a/changelogs/fragments/9363-dig-nonameservers.yml b/changelogs/fragments/9363-dig-nonameservers.yml new file mode 100644 index 0000000000..daa48febec --- /dev/null +++ b/changelogs/fragments/9363-dig-nonameservers.yml @@ -0,0 +1,2 @@ +bugfixes: + - "dig lookup plugin - correctly handle ``NoNameserver`` exception (https://github.com/ansible-collections/community.general/pull/9363, https://github.com/ansible-collections/community.general/issues/9362)." diff --git a/changelogs/fragments/9379-refactor.yml b/changelogs/fragments/9379-refactor.yml new file mode 100644 index 0000000000..0a87b2d0c1 --- /dev/null +++ b/changelogs/fragments/9379-refactor.yml @@ -0,0 +1,26 @@ +minor_changes: + - "shutdown action plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." + - "redis cache plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." + - "logentries callback plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." + - "slack callback plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." + - "chroot connection plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." + - "from_csv filter plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." + - "from_ini filter plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." + - "to_ini filter plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." + - "cobbler inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." + - "gitlab_runners inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." + - "iocage inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." + - "lxd inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." + - "nmap inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." + - "opennebula inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." + - "proxmox inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." + - "scaleway inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." + - "virtualbox inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." + - "cyberarkpassword lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." + - "dig lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." + - "dnstxt lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." + - "etcd3 lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." + - "lmdb_kv lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." + - "manifold lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." + - "onepassword lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." + - "tss lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." diff --git a/changelogs/fragments/9387-pacemaker-cluster-cmd.yml b/changelogs/fragments/9387-pacemaker-cluster-cmd.yml new file mode 100644 index 0000000000..d9cc4c35a4 --- /dev/null +++ b/changelogs/fragments/9387-pacemaker-cluster-cmd.yml @@ -0,0 +1,3 @@ +minor_changes: + - pacemaker_cluster - using safer mechanism to run external command (https://github.com/ansible-collections/community.general/pull/9471). + - pacemaker_cluster - remove unused code (https://github.com/ansible-collections/community.general/pull/9471). diff --git a/changelogs/fragments/9403-redfish-add-get-accountservice.yml b/changelogs/fragments/9403-redfish-add-get-accountservice.yml new file mode 100644 index 0000000000..a57ecfec61 --- /dev/null +++ b/changelogs/fragments/9403-redfish-add-get-accountservice.yml @@ -0,0 +1,2 @@ +minor_changes: + - redfish_info - add command ``GetAccountServiceConfig`` to get full information about AccountService configuration (https://github.com/ansible-collections/community.general/pull/9403). diff --git a/changelogs/fragments/9425-gitlab-instance-raw-variable.yml b/changelogs/fragments/9425-gitlab-instance-raw-variable.yml new file mode 100644 index 0000000000..c9d6ec7d4b --- /dev/null +++ b/changelogs/fragments/9425-gitlab-instance-raw-variable.yml @@ -0,0 +1,2 @@ +minor_changes: + - gitlab_instance_variable - add support for ``raw`` variables suboption (https://github.com/ansible-collections/community.general/pull/9425). diff --git a/changelogs/fragments/9432-deprecate-pure.yml b/changelogs/fragments/9432-deprecate-pure.yml new file mode 100644 index 0000000000..21cc8f8633 --- /dev/null +++ b/changelogs/fragments/9432-deprecate-pure.yml @@ -0,0 +1,3 @@ +deprecated_features: + - purestorage doc fragments - the doc fragment is deprecated and will be removed from community.general 12.0.0. The modules using this were removed in community.general 3.0.0 (https://github.com/ansible-collections/community.general/pull/9432). + - pure module utils - the module utils is deprecated and will be removed from community.general 12.0.0. The modules using this were removed in community.general 3.0.0 (https://github.com/ansible-collections/community.general/pull/9432). diff --git a/changelogs/fragments/9443-slack-prepend_hash.yml b/changelogs/fragments/9443-slack-prepend_hash.yml new file mode 100644 index 0000000000..98151ba51e --- /dev/null +++ b/changelogs/fragments/9443-slack-prepend_hash.yml @@ -0,0 +1,3 @@ +deprecated_features: + - "slack - the default value ``auto`` of the ``prepend_hash`` option is deprecated and will change to ``never`` in community.general 12.0.0 + (https://github.com/ansible-collections/community.general/pull/9443)." diff --git a/changelogs/fragments/9449-manageiq-alert-profiles-reqs.yml b/changelogs/fragments/9449-manageiq-alert-profiles-reqs.yml new file mode 100644 index 0000000000..710cf672cc --- /dev/null +++ b/changelogs/fragments/9449-manageiq-alert-profiles-reqs.yml @@ -0,0 +1,2 @@ +minor_changes: + - manageiq_alert_profiles - improve handling of parameter requirements (https://github.com/ansible-collections/community.general/pull/9449). diff --git a/changelogs/fragments/9451-facter-deprecation.yml b/changelogs/fragments/9451-facter-deprecation.yml new file mode 100644 index 0000000000..63924e9358 --- /dev/null +++ b/changelogs/fragments/9451-facter-deprecation.yml @@ -0,0 +1,2 @@ +deprecated_features: + - facter - module is deprecated and will be removed in community.general 12.0.0, use ``community.general.facter_facts`` instead (https://github.com/ansible-collections/community.general/pull/9451). diff --git a/changelogs/fragments/9456-yaml-callback-deprecation.yml b/changelogs/fragments/9456-yaml-callback-deprecation.yml new file mode 100644 index 0000000000..47c0708c20 --- /dev/null +++ b/changelogs/fragments/9456-yaml-callback-deprecation.yml @@ -0,0 +1,2 @@ +deprecated_features: + - yaml callback plugin - deprecate plugin in favor of ``result_format=yaml`` in plugin ``ansible.bulitin.default`` (https://github.com/ansible-collections/community.general/pull/9456). diff --git a/changelogs/fragments/9457-apache2-mod-proxy-revamp.yml b/changelogs/fragments/9457-apache2-mod-proxy-revamp.yml new file mode 100644 index 0000000000..e85b4b61da --- /dev/null +++ b/changelogs/fragments/9457-apache2-mod-proxy-revamp.yml @@ -0,0 +1,2 @@ +minor_changes: + - apache2_mod_proxy - code simplification, no change in functionality (https://github.com/ansible-collections/community.general/pull/9457). diff --git a/changelogs/fragments/9482-opentelemetry-python-37.yml b/changelogs/fragments/9482-opentelemetry-python-37.yml new file mode 100644 index 0000000000..3cc291265f --- /dev/null +++ b/changelogs/fragments/9482-opentelemetry-python-37.yml @@ -0,0 +1,2 @@ +minor_changes: + - opentelemetry callback plugin - remove code handling Python versions prior to 3.7 (https://github.com/ansible-collections/community.general/pull/9482). diff --git a/changelogs/fragments/9483-sensu-deprecation.yml b/changelogs/fragments/9483-sensu-deprecation.yml new file mode 100644 index 0000000000..daa219202d --- /dev/null +++ b/changelogs/fragments/9483-sensu-deprecation.yml @@ -0,0 +1,6 @@ +deprecated_features: + - sensu_check - module is deprecated and will be removed in community.general 13.0.0, use collection ``sensu.sensu_go`` instead (https://github.com/ansible-collections/community.general/pull/9483). + - sensu_client - module is deprecated and will be removed in community.general 13.0.0, use collection ``sensu.sensu_go`` instead (https://github.com/ansible-collections/community.general/pull/9483). + - sensu_handler - module is deprecated and will be removed in community.general 13.0.0, use collection ``sensu.sensu_go`` instead (https://github.com/ansible-collections/community.general/pull/9483). + - sensu_silence - module is deprecated and will be removed in community.general 13.0.0, use collection ``sensu.sensu_go`` instead (https://github.com/ansible-collections/community.general/pull/9483). + - sensu_subscription - module is deprecated and will be removed in community.general 13.0.0, use collection ``sensu.sensu_go`` instead (https://github.com/ansible-collections/community.general/pull/9483). diff --git a/changelogs/fragments/9487-atomic-deprecation.yml b/changelogs/fragments/9487-atomic-deprecation.yml new file mode 100644 index 0000000000..80897cdccc --- /dev/null +++ b/changelogs/fragments/9487-atomic-deprecation.yml @@ -0,0 +1,4 @@ +deprecated_features: + - atomic_container - module is deprecated and will be removed in community.general 13.0.0 (https://github.com/ansible-collections/community.general/pull/9487). + - atomic_host - module is deprecated and will be removed in community.general 13.0.0 (https://github.com/ansible-collections/community.general/pull/9487). + - atomic_image - module is deprecated and will be removed in community.general 13.0.0 (https://github.com/ansible-collections/community.general/pull/9487). diff --git a/changelogs/fragments/9490-htpasswd-permissions.yml b/changelogs/fragments/9490-htpasswd-permissions.yml new file mode 100644 index 0000000000..71d174814e --- /dev/null +++ b/changelogs/fragments/9490-htpasswd-permissions.yml @@ -0,0 +1,3 @@ +bugfixes: + - "htpasswd - report changes when file permissions are adjusted + (https://github.com/ansible-collections/community.general/issues/9485, https://github.com/ansible-collections/community.general/pull/9490)." diff --git a/changelogs/fragments/9494-keycloak-modules-retry-request-on-authentication-error.yaml b/changelogs/fragments/9494-keycloak-modules-retry-request-on-authentication-error.yaml new file mode 100644 index 0000000000..7e5c71ade1 --- /dev/null +++ b/changelogs/fragments/9494-keycloak-modules-retry-request-on-authentication-error.yaml @@ -0,0 +1,2 @@ +minor_changes: + - keycloak_* modules - ``refresh_token`` parameter added. When multiple authentication parameters are provided (``token``, ``refresh_token``, and ``auth_username``/``auth_password``), modules will now automatically retry requests upon authentication errors (401), using in order the token, refresh token, and username/password (https://github.com/ansible-collections/community.general/pull/9494). diff --git a/changelogs/fragments/9503-opentelemetry-remove-unused-code.yml b/changelogs/fragments/9503-opentelemetry-remove-unused-code.yml new file mode 100644 index 0000000000..1381f02554 --- /dev/null +++ b/changelogs/fragments/9503-opentelemetry-remove-unused-code.yml @@ -0,0 +1,2 @@ +minor_changes: + - opentelemetry callback plugin - remove code handling Python versions prior to 3.7 (https://github.com/ansible-collections/community.general/pull/9503). diff --git a/changelogs/fragments/9539-iocage-inventory-dhcp.yml b/changelogs/fragments/9539-iocage-inventory-dhcp.yml new file mode 100644 index 0000000000..2432669d25 --- /dev/null +++ b/changelogs/fragments/9539-iocage-inventory-dhcp.yml @@ -0,0 +1,2 @@ +bugfixes: + - iocage inventory plugin - the plugin parses the IP4 tab of the jails list and put the elements into the new variable ``iocage_ip4_dict``. In multiple interface format the variable ``iocage_ip4`` keeps the comma-separated list of IP4 (https://github.com/ansible-collections/community.general/issues/9538). diff --git a/changelogs/fragments/9546-fix-handling-of-tap-homebrew-packages.yml b/changelogs/fragments/9546-fix-handling-of-tap-homebrew-packages.yml new file mode 100644 index 0000000000..a8e3f33393 --- /dev/null +++ b/changelogs/fragments/9546-fix-handling-of-tap-homebrew-packages.yml @@ -0,0 +1,2 @@ +bugfixes: + - homebrew - fix incorrect handling of homebrew modules when a tap is requested (https://github.com/ansible-collections/community.general/pull/9546, https://github.com/ansible-collections/community.general/issues/9533). \ No newline at end of file diff --git a/changelogs/fragments/9547-one_template-filter.yml b/changelogs/fragments/9547-one_template-filter.yml new file mode 100644 index 0000000000..f67575d640 --- /dev/null +++ b/changelogs/fragments/9547-one_template-filter.yml @@ -0,0 +1,2 @@ +minor_changes: + - one_template - adds ``filter`` option for retrieving templates which are not owned by the user (https://github.com/ansible-collections/community.general/pull/9547, https://github.com/ansible-collections/community.general/issues/9278). diff --git a/changelogs/fragments/9554-add-cpanm-option_with-recommends-and-suggests.yml b/changelogs/fragments/9554-add-cpanm-option_with-recommends-and-suggests.yml new file mode 100644 index 0000000000..5cdaf24e9e --- /dev/null +++ b/changelogs/fragments/9554-add-cpanm-option_with-recommends-and-suggests.yml @@ -0,0 +1,3 @@ +minor_changes: + - cpanm - enable usage of option ``--with-recommends`` (https://github.com/ansible-collections/community.general/issues/9554, https://github.com/ansible-collections/community.general/pull/9555). + - cpanm - enable usage of option ``--with-suggests`` (https://github.com/ansible-collections/community.general/pull/9555). diff --git a/changelogs/fragments/9570-feat-nmcli-add-fail-over-mac-parameter.yml b/changelogs/fragments/9570-feat-nmcli-add-fail-over-mac-parameter.yml new file mode 100644 index 0000000000..c46526e2f6 --- /dev/null +++ b/changelogs/fragments/9570-feat-nmcli-add-fail-over-mac-parameter.yml @@ -0,0 +1,2 @@ +minor_changes: + - nmcli - add a option ``fail_over_mac`` (https://github.com/ansible-collections/community.general/issues/9570, https://github.com/ansible-collections/community.general/pull/9571). \ No newline at end of file diff --git a/changelogs/fragments/9573-iocage-inventory-sudo.yml b/changelogs/fragments/9573-iocage-inventory-sudo.yml new file mode 100644 index 0000000000..f636f34055 --- /dev/null +++ b/changelogs/fragments/9573-iocage-inventory-sudo.yml @@ -0,0 +1,2 @@ +minor_changes: + - iocage inventory plugin - the new parameter ``sudo`` of the plugin lets the command ``iocage list -l`` to run as root on the iocage host. This is needed to get the IPv4 of a running DHCP jail (https://github.com/ansible-collections/community.general/issues/9572, https://github.com/ansible-collections/community.general/pull/9573). diff --git a/changelogs/fragments/9577-mh-delegate-debug.yml b/changelogs/fragments/9577-mh-delegate-debug.yml new file mode 100644 index 0000000000..9d50f68806 --- /dev/null +++ b/changelogs/fragments/9577-mh-delegate-debug.yml @@ -0,0 +1,6 @@ +minor_changes: + - MH module utils - delegate ``debug`` to the underlying ``AnsibleModule`` instance or issues a warning if an attribute already exists with that name (https://github.com/ansible-collections/community.general/pull/9577). +deprecated_features: + - > + MH module utils - attribute ``debug`` definition in subclasses of MH is now deprecated, as that name will become a delegation to ``AnsibleModule`` in + community.general 12.0.0, and any such attribute will be overridden by that delegation in that version (https://github.com/ansible-collections/community.general/pull/9577). diff --git a/changelogs/fragments/9578-redhat_subscription-no-remove-on-unregister.yml b/changelogs/fragments/9578-redhat_subscription-no-remove-on-unregister.yml new file mode 100644 index 0000000000..1403b2faa1 --- /dev/null +++ b/changelogs/fragments/9578-redhat_subscription-no-remove-on-unregister.yml @@ -0,0 +1,7 @@ +bugfixes: + - | + redhat_subscription - do not try to unsubscribe (i.e. remove subscriptions) + when unregistering a system: newer versions of subscription-manager, as + available in EL 10 and Fedora 41+, do not support entitlements anymore, and + thus unsubscribing will fail + (https://github.com/ansible-collections/community.general/pull/9578). diff --git a/changelogs/fragments/9579-with-open.yml b/changelogs/fragments/9579-with-open.yml new file mode 100644 index 0000000000..449ba8b1b1 --- /dev/null +++ b/changelogs/fragments/9579-with-open.yml @@ -0,0 +1,11 @@ +minor_changes: + - known_hosts - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). + - cloud_init_data_facts - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). + - cronvar - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). + - crypttab - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). + - parted - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). + - pulp_repo - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). + - redhat_subscription - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). + - solaris_zone - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). + - sorcery - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). + - timezone - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). diff --git a/changelogs/fragments/9582-add-support-for-vrrp.yml b/changelogs/fragments/9582-add-support-for-vrrp.yml new file mode 100644 index 0000000000..473ccbf258 --- /dev/null +++ b/changelogs/fragments/9582-add-support-for-vrrp.yml @@ -0,0 +1,2 @@ +minor_changes: + - ufw - add support for ``vrrp`` protocol (https://github.com/ansible-collections/community.general/issues/9562, https://github.com/ansible-collections/community.general/pull/9582). diff --git a/changelogs/fragments/9583-py3-imports-actionbecomecachecallback.yml b/changelogs/fragments/9583-py3-imports-actionbecomecachecallback.yml new file mode 100644 index 0000000000..3838e52ae9 --- /dev/null +++ b/changelogs/fragments/9583-py3-imports-actionbecomecachecallback.yml @@ -0,0 +1,43 @@ +minor_changes: + - iptables_state action plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - shutdown action plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - doas become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - dzdo become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - ksu become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - machinectl become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - pbrun become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - pfexec become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - pmrun become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - run0 become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - sesu become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - sudosu become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - memcached cache plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - pickle cache plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - redis cache plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - yaml cache plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - cgroup_memory_recap callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - context_demo callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - counter_enabled callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - default_without_diff callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - dense callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - diy callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - elastic callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - jabber callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - log_plays callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - loganalytics callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - logdna callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - logentries callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - logstash callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - mail callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - nrdp callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - null callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - opentelemetry callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - say callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - selective callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - slack callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - splunk callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - sumologic callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - syslog_json callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - timestamp callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - unixy callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). + - yaml callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). diff --git a/changelogs/fragments/9584-py3-imports-connectioninventory.yml b/changelogs/fragments/9584-py3-imports-connectioninventory.yml new file mode 100644 index 0000000000..0b50cdf052 --- /dev/null +++ b/changelogs/fragments/9584-py3-imports-connectioninventory.yml @@ -0,0 +1,26 @@ +minor_changes: + - chroot connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). + - funcd connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). + - incus connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). + - iocage connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). + - jail connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). + - lxc connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). + - lxd connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). + - proxmox_pct_remote connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). + - qubes connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). + - saltstack connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). + - zone connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). + - cobbler inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). + - gitlab_runners inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). + - icinga2 inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). + - iocage inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). + - linode inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). + - lxd inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). + - nmap inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). + - online inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). + - opennebula inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). + - proxmox inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). + - scaleway inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). + - stackpath_compute inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). + - virtualbox inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). + - xen_orchestra inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). diff --git a/changelogs/fragments/9585-py3-imports-filter.yml b/changelogs/fragments/9585-py3-imports-filter.yml new file mode 100644 index 0000000000..88644996b2 --- /dev/null +++ b/changelogs/fragments/9585-py3-imports-filter.yml @@ -0,0 +1,22 @@ +minor_changes: + - counter filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). + - crc32 filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). + - dict filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). + - dict_kv filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). + - from_csv filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). + - from_ini filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). + - groupby_as_dict filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). + - hashids filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). + - jc filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). + - json_query filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). + - keep_keys filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). + - lists filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). + - lists_mergeby filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). + - random_mac filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). + - remove_keys filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). + - replace_keys filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). + - reveal_ansible_type filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). + - time filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). + - to_ini filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). + - unicode_normalize filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). + - version_sort filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). diff --git a/changelogs/fragments/9586-allow-transition-id-jira.yml b/changelogs/fragments/9586-allow-transition-id-jira.yml new file mode 100644 index 0000000000..3c10231376 --- /dev/null +++ b/changelogs/fragments/9586-allow-transition-id-jira.yml @@ -0,0 +1,2 @@ +minor_changes: + - jira - transition operation now has ``status_id`` to directly reference wanted transition (https://github.com/ansible-collections/community.general/pull/9602). diff --git a/changelogs/fragments/9598-snap-version.yml b/changelogs/fragments/9598-snap-version.yml new file mode 100644 index 0000000000..d6b5ebb67c --- /dev/null +++ b/changelogs/fragments/9598-snap-version.yml @@ -0,0 +1,3 @@ +minor_changes: + - snap - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9598). + - snap_alias - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9598). diff --git a/changelogs/fragments/9599-apache2-mod-proxy-revamp1.yml b/changelogs/fragments/9599-apache2-mod-proxy-revamp1.yml new file mode 100644 index 0000000000..8f72117d52 --- /dev/null +++ b/changelogs/fragments/9599-apache2-mod-proxy-revamp1.yml @@ -0,0 +1,2 @@ +minor_changes: + - apache2_mod_proxy - refactor repeated code into method (https://github.com/ansible-collections/community.general/pull/9599). diff --git a/changelogs/fragments/9600-apache2-mod-proxy-revamp2.yml b/changelogs/fragments/9600-apache2-mod-proxy-revamp2.yml new file mode 100644 index 0000000000..c4e5eea2d3 --- /dev/null +++ b/changelogs/fragments/9600-apache2-mod-proxy-revamp2.yml @@ -0,0 +1,2 @@ +minor_changes: + - apache2_mod_proxy - change type of ``state`` to a list of strings. No change for the users (https://github.com/ansible-collections/community.general/pull/9600). diff --git a/changelogs/fragments/9601-proxmox-template-support-for-checksums.yml b/changelogs/fragments/9601-proxmox-template-support-for-checksums.yml new file mode 100644 index 0000000000..40ffbfbec0 --- /dev/null +++ b/changelogs/fragments/9601-proxmox-template-support-for-checksums.yml @@ -0,0 +1,2 @@ +minor_changes: + - proxmox_template - add support for checksum validation with new options ``checksum_algorithm`` and ``checksum`` (https://github.com/ansible-collections/community.general/issues/9553, https://github.com/ansible-collections/community.general/pull/9601). \ No newline at end of file diff --git a/changelogs/fragments/9608-apache2-mod-proxy-revamp3.yml b/changelogs/fragments/9608-apache2-mod-proxy-revamp3.yml new file mode 100644 index 0000000000..4641ae1d9e --- /dev/null +++ b/changelogs/fragments/9608-apache2-mod-proxy-revamp3.yml @@ -0,0 +1,2 @@ +minor_changes: + - apache2_mod_proxy - improve readability when using results from ``fecth_url()`` (https://github.com/ansible-collections/community.general/pull/9608). diff --git a/changelogs/fragments/9609-apache2-mod-proxy-revamp4.yml b/changelogs/fragments/9609-apache2-mod-proxy-revamp4.yml new file mode 100644 index 0000000000..009a2a582d --- /dev/null +++ b/changelogs/fragments/9609-apache2-mod-proxy-revamp4.yml @@ -0,0 +1,2 @@ +minor_changes: + - apache2_mod_proxy - better handling regexp extraction (https://github.com/ansible-collections/community.general/pull/9609). diff --git a/changelogs/fragments/9612-apache2-mod-proxy-revamp5.yml b/changelogs/fragments/9612-apache2-mod-proxy-revamp5.yml new file mode 100644 index 0000000000..57fdccbf3e --- /dev/null +++ b/changelogs/fragments/9612-apache2-mod-proxy-revamp5.yml @@ -0,0 +1,2 @@ +minor_changes: + - apache2_mod_proxy - use ``deps`` to handle dependencies (https://github.com/ansible-collections/community.general/pull/9612). diff --git a/changelogs/fragments/9614-apache2-mod-proxy-revamp7.yml b/changelogs/fragments/9614-apache2-mod-proxy-revamp7.yml new file mode 100644 index 0000000000..e808413318 --- /dev/null +++ b/changelogs/fragments/9614-apache2-mod-proxy-revamp7.yml @@ -0,0 +1,3 @@ +minor_changes: + - apache2_mod_proxy - simplified and improved string manipulation (https://github.com/ansible-collections/community.general/pull/9614). + - apache2_mod_proxy - remove unused parameter and code from ``Balancer`` constructor (https://github.com/ansible-collections/community.general/pull/9614). diff --git a/changelogs/fragments/9621-keycloak_client-sanitize-saml-encryption-key.yml b/changelogs/fragments/9621-keycloak_client-sanitize-saml-encryption-key.yml new file mode 100644 index 0000000000..5d3401e430 --- /dev/null +++ b/changelogs/fragments/9621-keycloak_client-sanitize-saml-encryption-key.yml @@ -0,0 +1,2 @@ +security_fixes: + - keycloak_client - Sanitize ``saml.encryption.private.key`` so it does not show in the logs (https://github.com/ansible-collections/community.general/pull/9621). \ No newline at end of file diff --git a/changelogs/fragments/9623-pipx-global-latest.yml b/changelogs/fragments/9623-pipx-global-latest.yml new file mode 100644 index 0000000000..c939ea5847 --- /dev/null +++ b/changelogs/fragments/9623-pipx-global-latest.yml @@ -0,0 +1,2 @@ +bugfixes: + - pipx - honor option ``global`` when ``state=latest`` (https://github.com/ansible-collections/community.general/pull/9623). diff --git a/changelogs/fragments/9625-onepassword_doc.yml b/changelogs/fragments/9625-onepassword_doc.yml new file mode 100644 index 0000000000..e4c4cd5b65 --- /dev/null +++ b/changelogs/fragments/9625-onepassword_doc.yml @@ -0,0 +1,2 @@ +bugfixes: + - "onepassword_doc lookup plugin - ensure that 1Password Connect support also works for this plugin (https://github.com/ansible-collections/community.general/pull/9625)." diff --git a/changelogs/fragments/9633-onepassword_ssh_key.yml b/changelogs/fragments/9633-onepassword_ssh_key.yml new file mode 100644 index 0000000000..bd4676319e --- /dev/null +++ b/changelogs/fragments/9633-onepassword_ssh_key.yml @@ -0,0 +1,2 @@ +minor_changes: + - "onepassword_ssh_key - refactor to move code to lookup class (https://github.com/ansible-collections/community.general/pull/9633)." diff --git a/changelogs/fragments/9644-kc_client-test-improvement-and-fix.yaml b/changelogs/fragments/9644-kc_client-test-improvement-and-fix.yaml new file mode 100644 index 0000000000..63cba99198 --- /dev/null +++ b/changelogs/fragments/9644-kc_client-test-improvement-and-fix.yaml @@ -0,0 +1,2 @@ +bugfixes: + - keycloak_client - fix and improve existing tests. The module showed a diff without actual changes, solved by improving the ``normalise_cr()`` function (https://github.com/ansible-collections/community.general/pull/9644). diff --git a/changelogs/fragments/9645-proxmox-fix-pubkey.yml b/changelogs/fragments/9645-proxmox-fix-pubkey.yml new file mode 100644 index 0000000000..786daf88df --- /dev/null +++ b/changelogs/fragments/9645-proxmox-fix-pubkey.yml @@ -0,0 +1,3 @@ +bugfixes: + - proxmox - fixes a typo in the translation of the ``pubkey`` parameter to proxmox' ``ssh-public-keys`` (https://github.com/ansible-collections/community.general/issues/9642, https://github.com/ansible-collections/community.general/pull/9645). + - proxmox - adds the ``pubkey`` parameter (back to) the ``update`` state (https://github.com/ansible-collections/community.general/issues/9642, https://github.com/ansible-collections/community.general/pull/9645). diff --git a/changelogs/fragments/9646-hpilo-fix-idempotency.yml b/changelogs/fragments/9646-hpilo-fix-idempotency.yml new file mode 100644 index 0000000000..074fce62fe --- /dev/null +++ b/changelogs/fragments/9646-hpilo-fix-idempotency.yml @@ -0,0 +1,2 @@ +minor_changes: + - "hpilo_boot - add option to get an idempotent behavior while powering on server, resulting in success instead of failure when using ``state: boot_once`` option (https://github.com/ansible-collections/community.general/pull/9646)." diff --git a/changelogs/fragments/9649-cloudflare_dns-fix-crash-when-deleting-record.yml b/changelogs/fragments/9649-cloudflare_dns-fix-crash-when-deleting-record.yml new file mode 100644 index 0000000000..c345947575 --- /dev/null +++ b/changelogs/fragments/9649-cloudflare_dns-fix-crash-when-deleting-record.yml @@ -0,0 +1,2 @@ +bugfixes: + - cloudflare_dns - fix crash when deleting a DNS record or when updating a record with ``solo=true`` (https://github.com/ansible-collections/community.general/issues/9652, https://github.com/ansible-collections/community.general/pull/9649). diff --git a/changelogs/fragments/9651-iocage-inventory-hooks.yml b/changelogs/fragments/9651-iocage-inventory-hooks.yml new file mode 100644 index 0000000000..268348ba3c --- /dev/null +++ b/changelogs/fragments/9651-iocage-inventory-hooks.yml @@ -0,0 +1,2 @@ +minor_changes: + - iocage inventory plugin - the new parameter ``hooks_results`` of the plugin is a list of files inside a jail that provide configuration parameters for the inventory. The inventory plugin reads the files from the jails and put the contents into the items of created variable ``iocage_hooks`` (https://github.com/ansible-collections/community.general/issues/9650, https://github.com/ansible-collections/community.general/pull/9651). diff --git a/changelogs/fragments/9653-proxmox-kvm-allow-vm-hibernation.yml b/changelogs/fragments/9653-proxmox-kvm-allow-vm-hibernation.yml new file mode 100644 index 0000000000..b9c347e767 --- /dev/null +++ b/changelogs/fragments/9653-proxmox-kvm-allow-vm-hibernation.yml @@ -0,0 +1,2 @@ +minor_changes: + - proxmox_kvm - allow hibernation and suspending of VMs (https://github.com/ansible-collections/community.general/issues/9620, https://github.com/ansible-collections/community.general/pull/9653). diff --git a/changelogs/fragments/9657-lldp-handling-attributes-defined-multiple-times.yml b/changelogs/fragments/9657-lldp-handling-attributes-defined-multiple-times.yml new file mode 100644 index 0000000000..364013afc8 --- /dev/null +++ b/changelogs/fragments/9657-lldp-handling-attributes-defined-multiple-times.yml @@ -0,0 +1,4 @@ +bugfixes: + - lldp - fix crash caused by certain lldpctl output where an attribute is defined as branch and leaf (https://github.com/ansible-collections/community.general/pull/9657). +minor_changes: + - lldp - adds ``multivalues`` parameter to control behavior when lldpctl outputs an attribute multiple times (https://github.com/ansible-collections/community.general/pull/9657). diff --git a/changelogs/fragments/9658-add-vrf-commands-to-nmcli-module.yml b/changelogs/fragments/9658-add-vrf-commands-to-nmcli-module.yml new file mode 100644 index 0000000000..a62fc823c5 --- /dev/null +++ b/changelogs/fragments/9658-add-vrf-commands-to-nmcli-module.yml @@ -0,0 +1,2 @@ +minor_changes: + - nmcli - adds VRF support with new ``type`` value ``vrf`` and new ``slave_type`` value ``vrf`` as well as new ``table`` parameter (https://github.com/ansible-collections/community.general/pull/9658, https://github.com/ansible-collections/community.general/issues/8014). diff --git a/changelogs/fragments/9659-lxd_connection-nonroot-user.yml b/changelogs/fragments/9659-lxd_connection-nonroot-user.yml new file mode 100644 index 0000000000..760921f054 --- /dev/null +++ b/changelogs/fragments/9659-lxd_connection-nonroot-user.yml @@ -0,0 +1,2 @@ +minor_changes: + - lxd connection plugin - adds ``remote_user`` and ``lxd_become_method`` parameters for allowing a non-root user to connect to an LXD instance (https://github.com/ansible-collections/community.general/pull/9659). diff --git a/changelogs/fragments/9665-more-resilient-handling-of-homebrew-packages-names.yml b/changelogs/fragments/9665-more-resilient-handling-of-homebrew-packages-names.yml new file mode 100644 index 0000000000..4e79dd6ea2 --- /dev/null +++ b/changelogs/fragments/9665-more-resilient-handling-of-homebrew-packages-names.yml @@ -0,0 +1,2 @@ +bugfixes: + - homebrew - make package name parsing more resilient (https://github.com/ansible-collections/community.general/pull/9665, https://github.com/ansible-collections/community.general/issues/9641). diff --git a/changelogs/fragments/9691-keycloak-module-utils-replace-missing-return-in-get_role_composites.yml b/changelogs/fragments/9691-keycloak-module-utils-replace-missing-return-in-get_role_composites.yml new file mode 100644 index 0000000000..bf48f5f609 --- /dev/null +++ b/changelogs/fragments/9691-keycloak-module-utils-replace-missing-return-in-get_role_composites.yml @@ -0,0 +1,2 @@ +bugfixes: + - keycloak module utils - replaces missing return in get_role_composites method which caused it to return None instead of composite roles (https://github.com/ansible-collections/community.general/issues/9678, https://github.com/ansible-collections/community.general/pull/9691). diff --git a/changelogs/fragments/9694-ipa-host-certificate-revoked.yml b/changelogs/fragments/9694-ipa-host-certificate-revoked.yml new file mode 100644 index 0000000000..71dcbb2a17 --- /dev/null +++ b/changelogs/fragments/9694-ipa-host-certificate-revoked.yml @@ -0,0 +1,2 @@ +bugfixes: + - ipa_host - module revoked existing host certificates even if ``user_certificate`` was not given (https://github.com/ansible-collections/community.general/pull/9694). diff --git a/changelogs/fragments/9695-xml-close-file.yml b/changelogs/fragments/9695-xml-close-file.yml new file mode 100644 index 0000000000..d2a1843278 --- /dev/null +++ b/changelogs/fragments/9695-xml-close-file.yml @@ -0,0 +1,2 @@ +bugfixes: + - xml - ensure file descriptor is closed (https://github.com/ansible-collections/community.general/pull/9695). diff --git a/changelogs/fragments/9697-zfs-facts-type.yml b/changelogs/fragments/9697-zfs-facts-type.yml new file mode 100644 index 0000000000..b738d3ae9f --- /dev/null +++ b/changelogs/fragments/9697-zfs-facts-type.yml @@ -0,0 +1,2 @@ +bugfixes: + - zfs_facts - parameter ``type`` now accepts multple values as documented (https://github.com/ansible-collections/community.general/issues/5909, https://github.com/ansible-collections/community.general/pull/9697). diff --git a/changelogs/fragments/9698-lvg-remove-extra-pvs-parameter.yml b/changelogs/fragments/9698-lvg-remove-extra-pvs-parameter.yml new file mode 100644 index 0000000000..51c0423e8b --- /dev/null +++ b/changelogs/fragments/9698-lvg-remove-extra-pvs-parameter.yml @@ -0,0 +1,2 @@ +minor_changes: + - lvg - add ``remove_extra_pvs`` parameter to control if ansible should remove physical volumes which are not in the ``pvs`` parameter (https://github.com/ansible-collections/community.general/pull/9698). diff --git a/changelogs/fragments/9728-bitwarden-collection-name-filter.yml b/changelogs/fragments/9728-bitwarden-collection-name-filter.yml new file mode 100644 index 0000000000..f96710072f --- /dev/null +++ b/changelogs/fragments/9728-bitwarden-collection-name-filter.yml @@ -0,0 +1,2 @@ +minor_changes: + - bitwarden lookup plugin - add new option ``collection_name`` to filter results by collection name, and new option ``result_count`` to validate number of results (https://github.com/ansible-collections/community.general/pull/9728). \ No newline at end of file diff --git a/changelogs/fragments/9729-redfish-fullpowercycle-command.yml b/changelogs/fragments/9729-redfish-fullpowercycle-command.yml new file mode 100644 index 0000000000..2d9974c3d6 --- /dev/null +++ b/changelogs/fragments/9729-redfish-fullpowercycle-command.yml @@ -0,0 +1,2 @@ +minor_changes: + - redfish_command - add ``PowerFullPowerCycle`` to power command options (https://github.com/ansible-collections/community.general/pull/9729). diff --git a/changelogs/fragments/9733-profitbrick-deprecation.yml b/changelogs/fragments/9733-profitbrick-deprecation.yml new file mode 100644 index 0000000000..094f2672a4 --- /dev/null +++ b/changelogs/fragments/9733-profitbrick-deprecation.yml @@ -0,0 +1,6 @@ +deprecated_features: + - profitbricks - module is deprecated and will be removed in community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/9733). + - profitbricks_datacenter - module is deprecated and will be removed in community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/9733). + - profitbricks_nic - module is deprecated and will be removed in community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/9733). + - profitbricks_volume - module is deprecated and will be removed in community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/9733). + - profitbricks_volume_attachments - module is deprecated and will be removed in community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/9733). diff --git a/changelogs/fragments/9739-keycloak_client-compare-before-desired-directly.yml b/changelogs/fragments/9739-keycloak_client-compare-before-desired-directly.yml new file mode 100644 index 0000000000..1d1a3da737 --- /dev/null +++ b/changelogs/fragments/9739-keycloak_client-compare-before-desired-directly.yml @@ -0,0 +1,2 @@ +bugfixes: + - keycloak_client - in check mode, detect whether the lists in before client (for example redirect URI list) contain items that the lists in the desired client do not contain (https://github.com/ansible-collections/community.general/pull/9739). \ No newline at end of file diff --git a/changelogs/fragments/9743-incus_connection-nonroot-user.yml b/changelogs/fragments/9743-incus_connection-nonroot-user.yml new file mode 100644 index 0000000000..f1a7aa9b5f --- /dev/null +++ b/changelogs/fragments/9743-incus_connection-nonroot-user.yml @@ -0,0 +1,2 @@ +minor_changes: + - incus connection plugin - adds ``remote_user`` and ``incus_become_method`` parameters for allowing a non-root user to connect to an Incus instance (https://github.com/ansible-collections/community.general/pull/9743). diff --git a/changelogs/fragments/9753-jira-add-client-certificate-auth.yml b/changelogs/fragments/9753-jira-add-client-certificate-auth.yml new file mode 100644 index 0000000000..8eeb5d01d7 --- /dev/null +++ b/changelogs/fragments/9753-jira-add-client-certificate-auth.yml @@ -0,0 +1,2 @@ +minor_changes: + - jira - adds ``client_cert`` and ``client_key`` parameters for supporting client certificate authentification when connecting to Jira (https://github.com/ansible-collections/community.general/pull/9753). \ No newline at end of file diff --git a/changelogs/fragments/9760-proxmox-inventory.yml b/changelogs/fragments/9760-proxmox-inventory.yml new file mode 100644 index 0000000000..c0405eee32 --- /dev/null +++ b/changelogs/fragments/9760-proxmox-inventory.yml @@ -0,0 +1,2 @@ +bugfixes: + - "proxmox inventory plugin - plugin did not update cache correctly after ``meta: refresh_inventory`` (https://github.com/ansible-collections/community.general/issues/9710, https://github.com/ansible-collections/community.general/pull/9760)." diff --git a/changelogs/fragments/9762-apache2_mod_proxy.yml b/changelogs/fragments/9762-apache2_mod_proxy.yml new file mode 100644 index 0000000000..423577905e --- /dev/null +++ b/changelogs/fragments/9762-apache2_mod_proxy.yml @@ -0,0 +1,5 @@ +bugfixes: + - "apache2_mod_proxy - make compatible with Python 3 (https://github.com/ansible-collections/community.general/pull/9762)." + - "apache2_mod_proxy - passing the cluster's page as referer for the member's pages. This makes the module actually work again for halfway modern Apache versions. + According to some comments founds on the net the referer was required since at least 2019 for some versions of Apache 2 + (https://github.com/ansible-collections/community.general/pull/9762)." diff --git a/changelogs/fragments/9768-keycloak_realm-remove-id-requirement.yaml b/changelogs/fragments/9768-keycloak_realm-remove-id-requirement.yaml new file mode 100644 index 0000000000..592ac472d9 --- /dev/null +++ b/changelogs/fragments/9768-keycloak_realm-remove-id-requirement.yaml @@ -0,0 +1,2 @@ +minor_changes: + - keycloak_realm - remove ID requirement when creating a realm to allow Keycloak generating its own realm ID (https://github.com/ansible-collections/community.general/pull/9768). \ No newline at end of file diff --git a/changelogs/fragments/9774-fix-elasticsearch_plugin-proxy-settings.yml b/changelogs/fragments/9774-fix-elasticsearch_plugin-proxy-settings.yml new file mode 100644 index 0000000000..d610032bc4 --- /dev/null +++ b/changelogs/fragments/9774-fix-elasticsearch_plugin-proxy-settings.yml @@ -0,0 +1,2 @@ +bugfixes: + - "elasticsearch_plugin - fix ``ERROR: D is not a recognized option`` issue when configuring proxy settings (https://github.com/ansible-collections/community.general/pull/9774, https://github.com/ansible-collections/community.general/issues/9773)." \ No newline at end of file diff --git a/changelogs/fragments/9777-homebrew-fix-crash-when-packages-include-tap.yml b/changelogs/fragments/9777-homebrew-fix-crash-when-packages-include-tap.yml new file mode 100644 index 0000000000..a7649988bc --- /dev/null +++ b/changelogs/fragments/9777-homebrew-fix-crash-when-packages-include-tap.yml @@ -0,0 +1,2 @@ +bugfixes: + - homebrew - fix crash when package names include tap (https://github.com/ansible-collections/community.general/issues/9777, https://github.com/ansible-collections/community.general/pull/9803). diff --git a/changelogs/fragments/9778-redhat_subscription-ensure-to-enable-content.yml b/changelogs/fragments/9778-redhat_subscription-ensure-to-enable-content.yml new file mode 100644 index 0000000000..7163865b6e --- /dev/null +++ b/changelogs/fragments/9778-redhat_subscription-ensure-to-enable-content.yml @@ -0,0 +1,7 @@ +bugfixes: + - | + redhat_subscription - use the "enable_content" option (when available) when + registering using D-Bus, to ensure that subscription-manager enables the + content on registration; this is particular important on EL 10+ and Fedora + 41+ + (https://github.com/ansible-collections/community.general/pull/9778). diff --git a/changelogs/fragments/9787-xoa_allow_using_names_in_inventory.yml b/changelogs/fragments/9787-xoa_allow_using_names_in_inventory.yml new file mode 100644 index 0000000000..161e94f148 --- /dev/null +++ b/changelogs/fragments/9787-xoa_allow_using_names_in_inventory.yml @@ -0,0 +1,2 @@ +minor_changes: + - xen_orchestra inventory plugin - add ``use_vm_uuid`` and ``use_host_uuid`` boolean options to allow switching over to using VM/Xen name labels instead of UUIDs as item names (https://github.com/ansible-collections/community.general/pull/9787). diff --git a/changelogs/fragments/9809-proxmox-fix-status-getter.yml b/changelogs/fragments/9809-proxmox-fix-status-getter.yml new file mode 100644 index 0000000000..eef4ab072e --- /dev/null +++ b/changelogs/fragments/9809-proxmox-fix-status-getter.yml @@ -0,0 +1,2 @@ +bugfixes: + - proxmox - add missing key selection of ``'status'`` key to ``get_lxc_status`` (https://github.com/ansible-collections/community.general/issues/9696, https://github.com/ansible-collections/community.general/pull/9809). diff --git a/changelogs/fragments/9818-cloudflare-dns-exhausted-response.yml b/changelogs/fragments/9818-cloudflare-dns-exhausted-response.yml new file mode 100644 index 0000000000..a60f3145b4 --- /dev/null +++ b/changelogs/fragments/9818-cloudflare-dns-exhausted-response.yml @@ -0,0 +1,2 @@ +bugfixes: + - cloudlare_dns - handle exhausted response stream in case of HTTP errors to show nice error message to the user (https://github.com/ansible-collections/community.general/issues/9782, https://github.com/ansible-collections/community.general/pull/9818). diff --git a/changelogs/fragments/9821-systemd_info-add-wildcards.yml b/changelogs/fragments/9821-systemd_info-add-wildcards.yml new file mode 100644 index 0000000000..a1349f8533 --- /dev/null +++ b/changelogs/fragments/9821-systemd_info-add-wildcards.yml @@ -0,0 +1,2 @@ +minor_changes: + - systemd_info - add wildcard expression support in ``unitname`` option (https://github.com/ansible-collections/community.general/pull/9821). \ No newline at end of file diff --git a/changelogs/fragments/9824-redfish-implement-obtaining-powerrestorepolicy.yml b/changelogs/fragments/9824-redfish-implement-obtaining-powerrestorepolicy.yml new file mode 100644 index 0000000000..da8e391cb7 --- /dev/null +++ b/changelogs/fragments/9824-redfish-implement-obtaining-powerrestorepolicy.yml @@ -0,0 +1,2 @@ +minor_changes: + - redfish_info - add command ``GetPowerRestorePolicy`` to get the desired power state of the system when power is restored (https://github.com/ansible-collections/community.general/pull/9824). diff --git a/changelogs/fragments/9833-data-tagging.yml b/changelogs/fragments/9833-data-tagging.yml new file mode 100644 index 0000000000..a3f0cb2d25 --- /dev/null +++ b/changelogs/fragments/9833-data-tagging.yml @@ -0,0 +1,9 @@ +bugfixes: + - "dependent look plugin - make compatible with ansible-core's Data Tagging feature (https://github.com/ansible-collections/community.general/pull/9833)." + - "reveal_ansible_type filter plugin and ansible_type test plugin - make compatible with ansible-core's Data Tagging feature (https://github.com/ansible-collections/community.general/pull/9833)." + - "diy callback plugin - make compatible with ansible-core's Data Tagging feature (https://github.com/ansible-collections/community.general/pull/9833)." + - "yaml callback plugin - use ansible-core internals to avoid breakage with Data Tagging (https://github.com/ansible-collections/community.general/pull/9833)." +known_issues: + - "reveal_ansible_type filter plugin and ansible_type test plugin - note that ansible-core's Data Tagging feature implements new aliases, + such as ``_AnsibleTaggedStr`` for ``str``, ``_AnsibleTaggedInt`` for ``int``, and ``_AnsibleTaggedFloat`` for ``float`` + (https://github.com/ansible-collections/community.general/pull/9833)." diff --git a/changelogs/fragments/9836-option-for-http-agent-for-user-to-callback-slack.yml b/changelogs/fragments/9836-option-for-http-agent-for-user-to-callback-slack.yml new file mode 100644 index 0000000000..0a1af56fc2 --- /dev/null +++ b/changelogs/fragments/9836-option-for-http-agent-for-user-to-callback-slack.yml @@ -0,0 +1,2 @@ +minor_changes: + - slack callback plugin - add ``http_agent`` option to enable the user to set a custom user agent for slack callback plugin (https://github.com/ansible-collections/community.general/issues/9813, https://github.com/ansible-collections/community.general/pull/9836). diff --git a/changelogs/fragments/9837-redfish-implement-setting-powerrestorepolicy.yml b/changelogs/fragments/9837-redfish-implement-setting-powerrestorepolicy.yml new file mode 100644 index 0000000000..d4b1f505e1 --- /dev/null +++ b/changelogs/fragments/9837-redfish-implement-setting-powerrestorepolicy.yml @@ -0,0 +1,2 @@ +minor_changes: + - redfish_config - add command ``SetPowerRestorePolicy`` to set the desired power state of the system when power is restored (https://github.com/ansible-collections/community.general/pull/9837). diff --git a/changelogs/fragments/9845-consul_token_idempotency.yml b/changelogs/fragments/9845-consul_token_idempotency.yml new file mode 100644 index 0000000000..6fe536bbd0 --- /dev/null +++ b/changelogs/fragments/9845-consul_token_idempotency.yml @@ -0,0 +1,2 @@ +minor_changes: + - consul_token - fix idempotency when ``policies`` or ``roles`` are supplied by name (https://github.com/ansible-collections/community.general/issues/9841, https://github.com/ansible-collections/community.general/pull/9845). diff --git a/changelogs/fragments/9847-Adding_audio_device-support_to_proxmox_kvm.yml b/changelogs/fragments/9847-Adding_audio_device-support_to_proxmox_kvm.yml new file mode 100644 index 0000000000..27633edfb0 --- /dev/null +++ b/changelogs/fragments/9847-Adding_audio_device-support_to_proxmox_kvm.yml @@ -0,0 +1,2 @@ +minor_changes: + - proxmox_kvm - add missing audio hardware device handling (https://github.com/ansible-collections/community.general/issues/5192, https://github.com/ansible-collections/community.general/pull/9847). diff --git a/changelogs/fragments/9849-nmap_dns_servers.yml b/changelogs/fragments/9849-nmap_dns_servers.yml new file mode 100644 index 0000000000..d4b0eef27f --- /dev/null +++ b/changelogs/fragments/9849-nmap_dns_servers.yml @@ -0,0 +1,3 @@ +--- +minor_changes: + - nmap inventory plugin - adds ``dns_servers`` option for specifying DNS servers for name resolution. Accepts hostnames or IP addresses in the same format as the ``exclude`` option (https://github.com/ansible-collections/community.general/pull/9849). diff --git a/changelogs/fragments/9875-proxmox-dont-expect-key-template-to-exist.yml b/changelogs/fragments/9875-proxmox-dont-expect-key-template-to-exist.yml new file mode 100644 index 0000000000..ff926e9cb3 --- /dev/null +++ b/changelogs/fragments/9875-proxmox-dont-expect-key-template-to-exist.yml @@ -0,0 +1,2 @@ +bugfixes: + - proxmox_vm_info - the module no longer expects that the key ``template`` exists in a dictionary returned by Proxmox (https://github.com/ansible-collections/community.general/issues/9875, https://github.com/ansible-collections/community.general/pull/9910). diff --git a/changelogs/fragments/9880-nmcli-fix-reorder-same-dns-nameservers-search-suffixes.yml b/changelogs/fragments/9880-nmcli-fix-reorder-same-dns-nameservers-search-suffixes.yml new file mode 100644 index 0000000000..cefa79f387 --- /dev/null +++ b/changelogs/fragments/9880-nmcli-fix-reorder-same-dns-nameservers-search-suffixes.yml @@ -0,0 +1,2 @@ +bugfixes: + - "nmcli - enable changing only the order of DNS servers or search suffixes (https://github.com/ansible-collections/community.general/issues/8724, https://github.com/ansible-collections/community.general/pull/9880)." diff --git a/changelogs/fragments/9882-fix-payload-to-match-rocketchat-740-requirement.yml b/changelogs/fragments/9882-fix-payload-to-match-rocketchat-740-requirement.yml new file mode 100644 index 0000000000..8d3c76d963 --- /dev/null +++ b/changelogs/fragments/9882-fix-payload-to-match-rocketchat-740-requirement.yml @@ -0,0 +1,2 @@ +minor_changes: + - rocketchat - option ``is_pre740`` has been added to control the format of the payload. For Rocket.Chat 7.4.0 or newer, it must be set to ``false`` (https://github.com/ansible-collections/community.general/pull/9882). diff --git a/changelogs/fragments/9891-systemd_info-add_timer.yml b/changelogs/fragments/9891-systemd_info-add_timer.yml new file mode 100644 index 0000000000..e6239c0dfa --- /dev/null +++ b/changelogs/fragments/9891-systemd_info-add_timer.yml @@ -0,0 +1,2 @@ +minor_changes: + - systemd_info - extend support to timer units (https://github.com/ansible-collections/community.general/pull/9891). \ No newline at end of file diff --git a/changelogs/fragments/9892-vmadm-add-new-options.yml b/changelogs/fragments/9892-vmadm-add-new-options.yml new file mode 100644 index 0000000000..0e2be951d8 --- /dev/null +++ b/changelogs/fragments/9892-vmadm-add-new-options.yml @@ -0,0 +1,2 @@ +minor_changes: + - vmadm - add new options ``flexible_disk_size`` and ``owner_uuid`` (https://github.com/ansible-collections/community.general/pull/9892). diff --git a/changelogs/fragments/9893-cmdrunner-as-fixed-args.yml b/changelogs/fragments/9893-cmdrunner-as-fixed-args.yml new file mode 100644 index 0000000000..109b552385 --- /dev/null +++ b/changelogs/fragments/9893-cmdrunner-as-fixed-args.yml @@ -0,0 +1,2 @@ +minor_changes: + - CmdRunner module utils - the convenience method ``cmd_runner_fmt.as_fixed()`` now accepts multiple arguments as a list (https://github.com/ansible-collections/community.general/pull/9893). diff --git a/changelogs/fragments/9895-proxmox_tags_with_uppercase_chars.yml b/changelogs/fragments/9895-proxmox_tags_with_uppercase_chars.yml new file mode 100644 index 0000000000..d14b5e21b4 --- /dev/null +++ b/changelogs/fragments/9895-proxmox_tags_with_uppercase_chars.yml @@ -0,0 +1,2 @@ +minor_changes: + - proxmox and proxmox_kvm modules - allow uppercase characters in VM/container tags (https://github.com/ansible-collections/community.general/issues/9895, https://github.com/ansible-collections/community.general/pull/10024). diff --git a/changelogs/fragments/9898-keycloak_user-supports-subgroups.yaml b/changelogs/fragments/9898-keycloak_user-supports-subgroups.yaml new file mode 100644 index 0000000000..092ba686e5 --- /dev/null +++ b/changelogs/fragments/9898-keycloak_user-supports-subgroups.yaml @@ -0,0 +1,9 @@ +minor_changes: + - keycloak module_utils - user groups can now be referenced by their name, like ``staff``, or their path, like + ``/staff/engineering``. + The path syntax allows users to reference subgroups, which is not possible otherwise + (https://github.com/ansible-collections/community.general/pull/9898). + - keycloak_user module - user groups can now be referenced by their name, like ``staff``, or their path, like + ``/staff/engineering``. + The path syntax allows users to reference subgroups, which is not possible otherwise + (https://github.com/ansible-collections/community.general/pull/9898). diff --git a/changelogs/fragments/9951-mod-php-identifier.yml b/changelogs/fragments/9951-mod-php-identifier.yml new file mode 100644 index 0000000000..29d88091db --- /dev/null +++ b/changelogs/fragments/9951-mod-php-identifier.yml @@ -0,0 +1,2 @@ +minor_changes: + - apache2_module - added workaround for new PHP module name, from ``php7_module`` to ``php_module`` (https://github.com/ansible-collections/community.general/pull/9951). diff --git a/changelogs/fragments/9952-proxmox-inventory-plugin-improve-ansible_host.yml b/changelogs/fragments/9952-proxmox-inventory-plugin-improve-ansible_host.yml new file mode 100644 index 0000000000..dc973835c7 --- /dev/null +++ b/changelogs/fragments/9952-proxmox-inventory-plugin-improve-ansible_host.yml @@ -0,0 +1,2 @@ +bugfixes: + - proxmox inventory plugin - fix ``ansible_host`` staying empty for certain Proxmox nodes (https://github.com/ansible-collections/community.general/issues/5906, https://github.com/ansible-collections/community.general/pull/9952). diff --git a/changelogs/fragments/9953-gitlab-project-members-support-owner-level.yml b/changelogs/fragments/9953-gitlab-project-members-support-owner-level.yml new file mode 100644 index 0000000000..64cde71053 --- /dev/null +++ b/changelogs/fragments/9953-gitlab-project-members-support-owner-level.yml @@ -0,0 +1,2 @@ +minor_changes: + - gitlab_project_members - extend choices parameter ``access_level`` by missing upstream valid value ``owner`` (https://github.com/ansible-collections/community.general/pull/9953). diff --git a/changelogs/fragments/9959-update-opennebula-onevm-updateconf-params.yml b/changelogs/fragments/9959-update-opennebula-onevm-updateconf-params.yml new file mode 100644 index 0000000000..db3484ef08 --- /dev/null +++ b/changelogs/fragments/9959-update-opennebula-onevm-updateconf-params.yml @@ -0,0 +1,14 @@ +minor_changes: + - | + one_vm - update allowed values for ``updateconf`` to include new parameters as per the latest OpenNebula API documentation. + Added parameters: + + * ``OS``: ``FIRMWARE``; + * ``CPU_MODEL``: ``MODEL``, ``FEATURES``; + * ``FEATURES``: ``VIRTIO_BLK_QUEUES``, ``VIRTIO_SCSI_QUEUES``, ``IOTHREADS``; + * ``GRAPHICS``: ``PORT``, ``COMMAND``; + * ``VIDEO``: ``ATS``, ``IOMMU``, ``RESOLUTION``, ``TYPE``, ``VRAM``; + * ``RAW``: ``VALIDATE``; + * ``BACKUP_CONFIG``: ``FS_FREEZE``, ``KEEP_LAST``, ``BACKUP_VOLATILE``, ``MODE``, ``INCREMENT_MODE``. + + (https://github.com/ansible-collections/community.general/pull/9959). \ No newline at end of file diff --git a/changelogs/fragments/9960-gitlab_project-add-build_timeout-option.yml b/changelogs/fragments/9960-gitlab_project-add-build_timeout-option.yml new file mode 100644 index 0000000000..4178484509 --- /dev/null +++ b/changelogs/fragments/9960-gitlab_project-add-build_timeout-option.yml @@ -0,0 +1,2 @@ +minor_changes: + - gitlab_project - add option ``build_timeout`` (https://github.com/ansible-collections/community.general/pull/9960). diff --git a/changelogs/fragments/9962-nmcli-add-infiniband-mac-support.yml b/changelogs/fragments/9962-nmcli-add-infiniband-mac-support.yml new file mode 100644 index 0000000000..0942788868 --- /dev/null +++ b/changelogs/fragments/9962-nmcli-add-infiniband-mac-support.yml @@ -0,0 +1,2 @@ +minor_changes: + - nmcli - add support for Infiniband MAC setting when ``type`` is ``infiniband`` (https://github.com/ansible-collections/community.general/pull/9962). diff --git a/changelogs/fragments/9963-proxmox_disk-storage.yml b/changelogs/fragments/9963-proxmox_disk-storage.yml new file mode 100644 index 0000000000..a93fb7d022 --- /dev/null +++ b/changelogs/fragments/9963-proxmox_disk-storage.yml @@ -0,0 +1,2 @@ +bugfixes: + - "proxmox_disk - fail gracefully if ``storage`` is required but not provided by the user (https://github.com/ansible-collections/community.general/issues/9941, https://github.com/ansible-collections/community.general/pull/9963)." diff --git a/changelogs/fragments/9964-redfish-tls.yml b/changelogs/fragments/9964-redfish-tls.yml new file mode 100644 index 0000000000..edb8e942ff --- /dev/null +++ b/changelogs/fragments/9964-redfish-tls.yml @@ -0,0 +1,7 @@ +minor_changes: + - "redfish module utils - add ``REDFISH_COMMON_ARGUMENT_SPEC``, a corresponding ``redfish`` docs fragment, and support for its ``validate_certs``, ``ca_path``, and ``ciphers`` options (https://github.com/ansible-collections/community.general/issues/3686, https://github.com/ansible-collections/community.general/pull/9964)." + - "idrac_redfish_command, idrac_redfish_config, idrac_redfish_info - add ``validate_certs``, ``ca_path``, and ``ciphers`` options to configure TLS/SSL (https://github.com/ansible-collections/community.general/issues/3686, https://github.com/ansible-collections/community.general/pull/9964)." + - "ilo_redfish_command, ilo_redfish_config, ilo_redfish_info - add ``validate_certs``, ``ca_path``, and ``ciphers`` options to configure TLS/SSL (https://github.com/ansible-collections/community.general/issues/3686, https://github.com/ansible-collections/community.general/pull/9964)." + - "redfish_command, redfish_config, redfish_info - add ``validate_certs`` and ``ca_path`` options to configure TLS/SSL (https://github.com/ansible-collections/community.general/issues/3686, https://github.com/ansible-collections/community.general/pull/9964)." + - "wdc_redfish_command, wdc_redfish_info - add ``validate_certs``, ``ca_path``, and ``ciphers`` options to configure TLS/SSL (https://github.com/ansible-collections/community.general/issues/3686, https://github.com/ansible-collections/community.general/pull/9964)." + - "xcc_redfish_command - add ``validate_certs``, ``ca_path``, and ``ciphers`` options to configure TLS/SSL (https://github.com/ansible-collections/community.general/issues/3686, https://github.com/ansible-collections/community.general/pull/9964)." diff --git a/changelogs/fragments/9965-fix-duplicate-jsonify-payload-for-rocketchat-pre740.yml b/changelogs/fragments/9965-fix-duplicate-jsonify-payload-for-rocketchat-pre740.yml new file mode 100644 index 0000000000..3364b4acc8 --- /dev/null +++ b/changelogs/fragments/9965-fix-duplicate-jsonify-payload-for-rocketchat-pre740.yml @@ -0,0 +1,2 @@ +minor_changes: + - rocketchat - fix duplicate JSON conversion for Rocket.Chat < 7.4.0 (https://github.com/ansible-collections/community.general/pull/9965). diff --git a/changelogs/fragments/9970-pkcs12_alias_cert_alias_optional.yml b/changelogs/fragments/9970-pkcs12_alias_cert_alias_optional.yml new file mode 100644 index 0000000000..aff7b126c3 --- /dev/null +++ b/changelogs/fragments/9970-pkcs12_alias_cert_alias_optional.yml @@ -0,0 +1,2 @@ +bugfixes: + - java_cert - the module no longer fails if the optional parameters ``pkcs12_alias`` and ``cert_alias`` are not provided (https://github.com/ansible-collections/community.general/pull/9970). diff --git a/changelogs/fragments/9972-zypper-skip-post-errors.yml b/changelogs/fragments/9972-zypper-skip-post-errors.yml new file mode 100644 index 0000000000..097ec67df0 --- /dev/null +++ b/changelogs/fragments/9972-zypper-skip-post-errors.yml @@ -0,0 +1,2 @@ +minor_changes: + - zypper - adds ``skip_post_errors`` that allows to skip RPM post-install errors (Zypper return code 107) (https://github.com/ansible-collections/community.general/issues/9972). diff --git a/changelogs/fragments/9976-keycloak_client-fix-idempotency-regression.yml b/changelogs/fragments/9976-keycloak_client-fix-idempotency-regression.yml new file mode 100644 index 0000000000..593298d303 --- /dev/null +++ b/changelogs/fragments/9976-keycloak_client-fix-idempotency-regression.yml @@ -0,0 +1,2 @@ +bugfixes: + - keycloak_client - fix the idempotency regression by normalizing the Keycloak response for ``after_client`` (https://github.com/ansible-collections/community.general/issues/9905, https://github.com/ansible-collections/community.general/pull/9976). diff --git a/changelogs/fragments/9987-keycloak-auth-flow-fix-config.yaml b/changelogs/fragments/9987-keycloak-auth-flow-fix-config.yaml new file mode 100644 index 0000000000..b7df120f4a --- /dev/null +++ b/changelogs/fragments/9987-keycloak-auth-flow-fix-config.yaml @@ -0,0 +1,2 @@ +bugfixes: + - keycloak_authentication - fix authentification config duplication for Keycloak < 26.2.0 (https://github.com/ansible-collections/community.general/pull/9987). \ No newline at end of file diff --git a/changelogs/fragments/9992-filtertypeerror.yml b/changelogs/fragments/9992-filtertypeerror.yml new file mode 100644 index 0000000000..ccb2ff8c0c --- /dev/null +++ b/changelogs/fragments/9992-filtertypeerror.yml @@ -0,0 +1,2 @@ +bugfixes: + - "hashids and unicode_normalize filter plugins - avoid deprecated ``AnsibleFilterTypeError`` on ansible-core 2.19 (https://github.com/ansible-collections/community.general/pull/9992)." diff --git a/changelogs/fragments/dnf_versionlock.yml b/changelogs/fragments/dnf_versionlock.yml new file mode 100644 index 0000000000..35a53ff134 --- /dev/null +++ b/changelogs/fragments/dnf_versionlock.yml @@ -0,0 +1,3 @@ +--- +bugfixes: + - dnf_versionlock - add support for dnf5 (https://github.com/ansible-collections/community.general/issues/9556). diff --git a/changelogs/fragments/homebrew_cask.yml b/changelogs/fragments/homebrew_cask.yml new file mode 100644 index 0000000000..623a982455 --- /dev/null +++ b/changelogs/fragments/homebrew_cask.yml @@ -0,0 +1,3 @@ +--- +bugfixes: + - homebrew_cask - handle unusual brew version strings (https://github.com/ansible-collections/community.general/issues/8432, https://github.com/ansible-collections/community.general/pull/9881). diff --git a/changelogs/fragments/ssh_config_add_dynamicforward_option.yml b/changelogs/fragments/ssh_config_add_dynamicforward_option.yml new file mode 100644 index 0000000000..0252c94c46 --- /dev/null +++ b/changelogs/fragments/ssh_config_add_dynamicforward_option.yml @@ -0,0 +1,2 @@ +minor_changes: + - ssh_config - add ``dynamicforward`` option (https://github.com/ansible-collections/community.general/pull/9192). \ No newline at end of file diff --git a/changelogs/fragments/ssh_config_add_other_options.yml b/changelogs/fragments/ssh_config_add_other_options.yml new file mode 100644 index 0000000000..032bd2c073 --- /dev/null +++ b/changelogs/fragments/ssh_config_add_other_options.yml @@ -0,0 +1,2 @@ +minor_changes: + - ssh_config - add ``other_options`` option (https://github.com/ansible-collections/community.general/issues/8053, https://github.com/ansible-collections/community.general/pull/9684). \ No newline at end of file diff --git a/changelogs/fragments/sudoers.yml b/changelogs/fragments/sudoers.yml new file mode 100644 index 0000000000..f16a007de9 --- /dev/null +++ b/changelogs/fragments/sudoers.yml @@ -0,0 +1,3 @@ +--- +bugfixes: + - sudoers - display stdout and stderr raised while failed validation (https://github.com/ansible-collections/community.general/issues/9674, https://github.com/ansible-collections/community.general/pull/9871). diff --git a/galaxy.yml b/galaxy.yml index e6250a5bf2..d7ea0257b5 100644 --- a/galaxy.yml +++ b/galaxy.yml @@ -5,7 +5,7 @@ namespace: community name: general -version: 10.5.0 +version: 10.7.0 readme: README.md authors: - Ansible (https://github.com/ansible) diff --git a/meta/runtime.yml b/meta/runtime.yml index 6499587af7..8d003a6816 100644 --- a/meta/runtime.yml +++ b/meta/runtime.yml @@ -98,6 +98,10 @@ plugin_routing: redirect: community.google.gcp_storage_file hashi_vault: redirect: community.hashi_vault.hashi_vault + manifold: + deprecation: + removal_version: 11.0.0 + warning_text: Company was acquired in 2021 and service was ceased afterwards. nios: redirect: infoblox.nios_modules.nios_lookup nios_next_ip: @@ -964,6 +968,10 @@ plugin_routing: redirect: community.docker.docker_swarm kubevirt: redirect: community.kubevirt.kubevirt + stackpath_compute: + deprecation: + removal_version: 11.0.0 + warning_text: The company and the service were sunset in June 2024. filter: path_join: # The ansible.builtin.path_join filter has been added in ansible-base 2.10. diff --git a/noxfile.py b/noxfile.py new file mode 100644 index 0000000000..9b2f92a9e1 --- /dev/null +++ b/noxfile.py @@ -0,0 +1,38 @@ +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later +# SPDX-FileCopyrightText: 2025 Felix Fontein + +# /// script +# dependencies = ["nox>=2025.02.09", "antsibull-nox"] +# /// + +import sys + +import nox + + +try: + import antsibull_nox +except ImportError: + print("You need to install antsibull-nox in the same Python environment as nox.") + sys.exit(1) + + +antsibull_nox.load_antsibull_nox_toml() + + +@nox.session(name="aliases", python=False, default=True) +def aliases(session: nox.Session) -> None: + session.run("python", "tests/sanity/extra/aliases.py") + + +@nox.session(name="botmeta", default=True) +def botmeta(session: nox.Session) -> None: + session.install("PyYAML", "voluptuous") + session.run("python", "tests/sanity/extra/botmeta.py") + + +# Allow to run the noxfile with `python noxfile.py`, `pipx run noxfile.py`, or similar. +# Requires nox >= 2025.02.09 +if __name__ == "__main__": + nox.main() diff --git a/plugins/callback/diy.py b/plugins/callback/diy.py index b3cd0cdbce..a4369daadd 100644 --- a/plugins/callback/diy.py +++ b/plugins/callback/diy.py @@ -785,6 +785,12 @@ from ansible.vars.manager import VariableManager from ansible.plugins.callback.default import CallbackModule as Default from ansible.module_utils.common.text.converters import to_text +try: + from ansible.template import trust_as_template # noqa: F401, pylint: disable=unused-import + SUPPORTS_DATA_TAGGING = True +except ImportError: + SUPPORTS_DATA_TAGGING = False + class DummyStdout(object): def flush(self): @@ -838,7 +844,10 @@ class CallbackModule(Default): return _ret def _using_diy(self, spec): - return (spec['msg'] is not None) and (spec['msg'] != spec['vars']['omit']) + sentinel = object() + omit = spec['vars'].get('omit', sentinel) + # With Data Tagging, omit is sentinel + return (spec['msg'] is not None) and (spec['msg'] != omit or omit is sentinel) def _parent_has_callback(self): return hasattr(super(CallbackModule, self), sys._getframe(1).f_code.co_name) @@ -894,7 +903,7 @@ class CallbackModule(Default): ) _ret.update(_all) - _ret.update(_ret.get(self.DIY_NS, {self.DIY_NS: CallbackDIYDict()})) + _ret.update(_ret.get(self.DIY_NS, {self.DIY_NS: {} if SUPPORTS_DATA_TAGGING else CallbackDIYDict()})) _ret[self.DIY_NS].update({'playbook': {}}) _playbook_attributes = ['entries', 'file_name', 'basedir'] diff --git a/plugins/callback/yaml.py b/plugins/callback/yaml.py index 25c797e236..3393e363d5 100644 --- a/plugins/callback/yaml.py +++ b/plugins/callback/yaml.py @@ -53,29 +53,77 @@ def should_use_block(value): return False -class MyDumper(AnsibleDumper): - def represent_scalar(self, tag, value, style=None): - """Uses block style for multi-line strings""" - if style is None: - if should_use_block(value): - style = '|' - # we care more about readable than accuracy, so... - # ...no trailing space - value = value.rstrip() - # ...and non-printable characters - value = ''.join(x for x in value if x in string.printable or ord(x) >= 0xA0) - # ...tabs prevent blocks from expanding - value = value.expandtabs() - # ...and odd bits of whitespace - value = re.sub(r'[\x0b\x0c\r]', '', value) - # ...as does trailing space - value = re.sub(r' +\n', '\n', value) - else: - style = self.default_style - node = yaml.representer.ScalarNode(tag, value, style=style) - if self.alias_key is not None: - self.represented_objects[self.alias_key] = node - return node +try: + class MyDumper(AnsibleDumper): # pylint: disable=inherit-non-class + def represent_scalar(self, tag, value, style=None): + """Uses block style for multi-line strings""" + if style is None: + if should_use_block(value): + style = '|' + # we care more about readable than accuracy, so... + # ...no trailing space + value = value.rstrip() + # ...and non-printable characters + value = ''.join(x for x in value if x in string.printable or ord(x) >= 0xA0) + # ...tabs prevent blocks from expanding + value = value.expandtabs() + # ...and odd bits of whitespace + value = re.sub(r'[\x0b\x0c\r]', '', value) + # ...as does trailing space + value = re.sub(r' +\n', '\n', value) + else: + style = self.default_style + node = yaml.representer.ScalarNode(tag, value, style=style) + if self.alias_key is not None: + self.represented_objects[self.alias_key] = node + return node +except: # noqa: E722, pylint: disable=bare-except + # This happens with Data Tagging, see https://github.com/ansible/ansible/issues/84781 + # Until there is a better solution we'll resort to using ansible-core internals. + from ansible._internal._yaml import _dumper + import typing as t + + class MyDumper(_dumper._BaseDumper): + # This code is mostly taken from ansible._internal._yaml._dumper + @classmethod + def _register_representers(cls) -> None: + cls.add_multi_representer(_dumper.AnsibleTaggedObject, cls.represent_ansible_tagged_object) + cls.add_multi_representer(_dumper.Tripwire, cls.represent_tripwire) + cls.add_multi_representer(_dumper.c.Mapping, _dumper.SafeRepresenter.represent_dict) + cls.add_multi_representer(_dumper.c.Sequence, _dumper.SafeRepresenter.represent_list) + + def represent_ansible_tagged_object(self, data): + if ciphertext := _dumper.VaultHelper.get_ciphertext(data, with_tags=False): + return self.represent_scalar('!vault', ciphertext, style='|') + + return self.represent_data(_dumper.AnsibleTagHelper.as_native_type(data)) # automatically decrypts encrypted strings + + def represent_tripwire(self, data: _dumper.Tripwire) -> t.NoReturn: + data.trip() + + # The following function is the same as in the try/except + def represent_scalar(self, tag, value, style=None): + """Uses block style for multi-line strings""" + if style is None: + if should_use_block(value): + style = '|' + # we care more about readable than accuracy, so... + # ...no trailing space + value = value.rstrip() + # ...and non-printable characters + value = ''.join(x for x in value if x in string.printable or ord(x) >= 0xA0) + # ...tabs prevent blocks from expanding + value = value.expandtabs() + # ...and odd bits of whitespace + value = re.sub(r'[\x0b\x0c\r]', '', value) + # ...as does trailing space + value = re.sub(r' +\n', '\n', value) + else: + style = self.default_style + node = yaml.representer.ScalarNode(tag, value, style=style) + if self.alias_key is not None: + self.represented_objects[self.alias_key] = node + return node class CallbackModule(Default): diff --git a/plugins/connection/wsl.py b/plugins/connection/wsl.py new file mode 100644 index 0000000000..886ac5c60f --- /dev/null +++ b/plugins/connection/wsl.py @@ -0,0 +1,786 @@ +# -*- coding: utf-8 -*- +# Derived from ansible/plugins/connection/proxmox_pct_remote.py (c) 2024 Nils Stein (@mietzen) +# Derived from ansible/plugins/connection/paramiko_ssh.py (c) 2012, Michael DeHaan +# Copyright (c) 2025 Rui Lopes (@rgl) +# Copyright (c) 2025 Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +from __future__ import annotations + +DOCUMENTATION = r""" +author: Rui Lopes (@rgl) +name: wsl +short_description: Run tasks in WSL distribution using wsl.exe CLI via SSH +requirements: + - paramiko +description: + - Run commands or put/fetch files to an existing WSL distribution using wsl.exe CLI via SSH. + - Uses the Python SSH implementation (Paramiko) to connect to the WSL host. +version_added: "10.6.0" +options: + remote_addr: + description: + - Address of the remote target. + default: inventory_hostname + type: string + vars: + - name: inventory_hostname + - name: ansible_host + - name: ansible_ssh_host + - name: ansible_paramiko_host + port: + description: Remote port to connect to. + type: int + default: 22 + ini: + - section: defaults + key: remote_port + - section: paramiko_connection + key: remote_port + env: + - name: ANSIBLE_REMOTE_PORT + - name: ANSIBLE_REMOTE_PARAMIKO_PORT + vars: + - name: ansible_port + - name: ansible_ssh_port + - name: ansible_paramiko_port + keyword: + - name: port + remote_user: + description: + - User to login/authenticate as. + - Can be set from the CLI via the C(--user) or C(-u) options. + type: string + vars: + - name: ansible_user + - name: ansible_ssh_user + - name: ansible_paramiko_user + env: + - name: ANSIBLE_REMOTE_USER + - name: ANSIBLE_PARAMIKO_REMOTE_USER + ini: + - section: defaults + key: remote_user + - section: paramiko_connection + key: remote_user + keyword: + - name: remote_user + password: + description: + - Secret used to either login the SSH server or as a passphrase for SSH keys that require it. + - Can be set from the CLI via the C(--ask-pass) option. + type: string + vars: + - name: ansible_password + - name: ansible_ssh_pass + - name: ansible_ssh_password + - name: ansible_paramiko_pass + - name: ansible_paramiko_password + use_rsa_sha2_algorithms: + description: + - Whether or not to enable RSA SHA2 algorithms for pubkeys and hostkeys. + - On paramiko versions older than 2.9, this only affects hostkeys. + - For behavior matching paramiko<2.9 set this to V(false). + vars: + - name: ansible_paramiko_use_rsa_sha2_algorithms + ini: + - {key: use_rsa_sha2_algorithms, section: paramiko_connection} + env: + - {name: ANSIBLE_PARAMIKO_USE_RSA_SHA2_ALGORITHMS} + default: true + type: boolean + host_key_auto_add: + description: "Automatically add host keys to C(~/.ssh/known_hosts)." + env: + - name: ANSIBLE_PARAMIKO_HOST_KEY_AUTO_ADD + ini: + - key: host_key_auto_add + section: paramiko_connection + type: boolean + look_for_keys: + default: True + description: "Set to V(false) to disable searching for private key files in C(~/.ssh/)." + env: + - name: ANSIBLE_PARAMIKO_LOOK_FOR_KEYS + ini: + - {key: look_for_keys, section: paramiko_connection} + type: boolean + proxy_command: + default: "" + description: + - Proxy information for running the connection via a jumphost. + - This option is supported by paramiko version 1.9.0 or newer. + type: string + env: + - name: ANSIBLE_PARAMIKO_PROXY_COMMAND + ini: + - {key: proxy_command, section: paramiko_connection} + vars: + - name: ansible_paramiko_proxy_command + record_host_keys: + default: True + description: "Save the host keys to a file." + env: + - name: ANSIBLE_PARAMIKO_RECORD_HOST_KEYS + ini: + - section: paramiko_connection + key: record_host_keys + type: boolean + host_key_checking: + description: "Set this to V(false) if you want to avoid host key checking by the underlying tools Ansible uses to connect to the host." + type: boolean + default: true + env: + - name: ANSIBLE_HOST_KEY_CHECKING + - name: ANSIBLE_SSH_HOST_KEY_CHECKING + - name: ANSIBLE_PARAMIKO_HOST_KEY_CHECKING + ini: + - section: defaults + key: host_key_checking + - section: paramiko_connection + key: host_key_checking + vars: + - name: ansible_host_key_checking + - name: ansible_ssh_host_key_checking + - name: ansible_paramiko_host_key_checking + use_persistent_connections: + description: "Toggles the use of persistence for connections." + type: boolean + default: False + env: + - name: ANSIBLE_USE_PERSISTENT_CONNECTIONS + ini: + - section: defaults + key: use_persistent_connections + banner_timeout: + type: float + default: 30 + description: + - Configures, in seconds, the amount of time to wait for the SSH + banner to be presented. + - This option is supported by paramiko version 1.15.0 or newer. + ini: + - section: paramiko_connection + key: banner_timeout + env: + - name: ANSIBLE_PARAMIKO_BANNER_TIMEOUT + timeout: + type: int + default: 10 + description: + - Number of seconds until the plugin gives up on failing to establish a TCP connection. + - This option is supported by paramiko version 2.2.0 or newer. + ini: + - section: defaults + key: timeout + - section: ssh_connection + key: timeout + - section: paramiko_connection + key: timeout + env: + - name: ANSIBLE_TIMEOUT + - name: ANSIBLE_SSH_TIMEOUT + - name: ANSIBLE_PARAMIKO_TIMEOUT + vars: + - name: ansible_ssh_timeout + - name: ansible_paramiko_timeout + cli: + - name: timeout + lock_file_timeout: + type: int + default: 60 + description: Number of seconds until the plugin gives up on trying to write a lock file when writing SSH known host keys. + vars: + - name: ansible_lock_file_timeout + env: + - name: ANSIBLE_LOCK_FILE_TIMEOUT + private_key_file: + description: + - Path to private key file to use for authentication. + type: path + ini: + - section: defaults + key: private_key_file + - section: paramiko_connection + key: private_key_file + env: + - name: ANSIBLE_PRIVATE_KEY_FILE + - name: ANSIBLE_PARAMIKO_PRIVATE_KEY_FILE + vars: + - name: ansible_private_key_file + - name: ansible_ssh_private_key_file + - name: ansible_paramiko_private_key_file + cli: + - name: private_key_file + option: "--private-key" + user_known_hosts_file: + description: + - Path to the user known hosts file. + - Used to verify the ssh hosts keys. + type: path + default: ~/.ssh/known_hosts + ini: + - section: paramiko_connection + key: user_known_hosts_file + vars: + - name: ansible_paramiko_user_known_hosts_file + wsl_distribution: + description: + - WSL distribution name + type: string + required: true + vars: + - name: wsl_distribution + wsl_user: + description: + - WSL distribution user + type: string + vars: + - name: wsl_user + become_user: + description: + - WSL distribution user + type: string + default: root + vars: + - name: become_user + - name: ansible_become_user + become: + description: + - whether to use the user defined by ansible_become_user. + type: bool + default: false + vars: + - name: become + - name: ansible_become +""" + +EXAMPLES = r""" +# ------------------------ +# Inventory: inventory.yml +# ------------------------ +--- +all: + children: + wsl: + hosts: + example-wsl-ubuntu: + ansible_host: 10.0.0.10 + wsl_distribution: ubuntu + wsl_user: ubuntu + vars: + ansible_connection: community.general.wsl + ansible_user: vagrant +# ---------------------- +# Playbook: playbook.yml +# ---------------------- +--- +- name: WSL Example + hosts: wsl + gather_facts: true + become: true + tasks: + - name: Ping + ansible.builtin.ping: + - name: Id (with become false) + become: false + changed_when: false + args: + executable: /bin/bash + ansible.builtin.shell: | + exec 2>&1 + set -x + echo "$0" + pwd + id + - name: Id (with become true) + changed_when: false + args: + executable: /bin/bash + ansible.builtin.shell: | + exec 2>&1 + set -x + echo "$0" + pwd + id + - name: Reboot + ansible.builtin.reboot: + boot_time_command: systemctl show -p ActiveEnterTimestamp init.scope +""" + +import io +import os +import pathlib +import shlex +import socket +import tempfile +import typing as t + +from ansible.errors import ( + AnsibleAuthenticationFailure, + AnsibleConnectionFailure, + AnsibleError, +) +from ansible_collections.community.general.plugins.module_utils._filelock import FileLock, LockTimeout +from ansible.module_utils.common.text.converters import to_bytes, to_native, to_text +from ansible.module_utils.compat.paramiko import PARAMIKO_IMPORT_ERR, paramiko +from ansible.module_utils.compat.version import LooseVersion +from ansible.playbook.play_context import PlayContext +from ansible.plugins.connection import ConnectionBase +from ansible.utils.display import Display +from ansible.utils.path import makedirs_safe +from binascii import hexlify +from subprocess import list2cmdline + + +if t.TYPE_CHECKING and paramiko: + from paramiko import MissingHostKeyPolicy + from paramiko.client import SSHClient + from paramiko.pkey import PKey +else: + MissingHostKeyPolicy: type = object + SSHClient: type = object + PKey: type = object + + +display = Display() + + +def authenticity_msg(hostname: str, ktype: str, fingerprint: str) -> str: + msg = f""" + paramiko: The authenticity of host '{hostname}' can't be established. + The {ktype} key fingerprint is {fingerprint}. + Are you sure you want to continue connecting (yes/no)? + """ + return msg + + +class MyAddPolicy(MissingHostKeyPolicy): + """ + Based on AutoAddPolicy in paramiko so we can determine when keys are added + + and also prompt for input. + + Policy for automatically adding the hostname and new host key to the + local L{HostKeys} object, and saving it. This is used by L{SSHClient}. + """ + + def __init__(self, connection: Connection) -> None: + self.connection = connection + self._options = connection._options + + def missing_host_key(self, client: SSHClient, hostname: str, key: PKey) -> None: + + if all((self.connection.get_option('host_key_checking'), not self.connection.get_option('host_key_auto_add'))): + + fingerprint = hexlify(key.get_fingerprint()) + ktype = key.get_name() + + if self.connection.get_option('use_persistent_connections') or self.connection.force_persistence: + # don't print the prompt string since the user cannot respond + # to the question anyway + raise AnsibleError(authenticity_msg(hostname, ktype, fingerprint)[1:92]) + + inp = to_text( + display.prompt_until(authenticity_msg(hostname, ktype, fingerprint), private=False), + errors='surrogate_or_strict' + ) + + if inp.lower() not in ['yes', 'y', '']: + raise AnsibleError('host connection rejected by user') + + key._added_by_ansible_this_time = True + + # existing implementation below: + client._host_keys.add(hostname, key.get_name(), key) + + # host keys are actually saved in close() function below + # in order to control ordering. + + +class Connection(ConnectionBase): + """ SSH based connections (paramiko) to WSL """ + + transport = 'community.general.wsl' + _log_channel: str | None = None + + def __init__(self, play_context: PlayContext, new_stdin: io.TextIOWrapper | None = None, *args: t.Any, **kwargs: t.Any): + super(Connection, self).__init__(play_context, new_stdin, *args, **kwargs) + + def _set_log_channel(self, name: str) -> None: + """ Mimic paramiko.SSHClient.set_log_channel """ + self._log_channel = name + + def _parse_proxy_command(self, port: int = 22) -> dict[str, t.Any]: + proxy_command = self.get_option('proxy_command') or None + + sock_kwarg = {} + if proxy_command: + replacers: t.Dict[str, str] = { + '%h': self.get_option('remote_addr'), + '%p': str(port), + '%r': self.get_option('remote_user') + } + for find, replace in replacers.items(): + proxy_command = proxy_command.replace(find, replace) + try: + sock_kwarg = {'sock': paramiko.ProxyCommand(proxy_command)} + display.vvv(f'CONFIGURE PROXY COMMAND FOR CONNECTION: {proxy_command}', host=self.get_option('remote_addr')) + except AttributeError: + display.warning('Paramiko ProxyCommand support unavailable. ' + 'Please upgrade to Paramiko 1.9.0 or newer. ' + 'Not using configured ProxyCommand') + + return sock_kwarg + + def _connect(self) -> Connection: + """ activates the connection object """ + + if paramiko is None: + raise AnsibleError(f'paramiko is not installed: {to_native(PARAMIKO_IMPORT_ERR)}') + + port = self.get_option('port') + display.vvv(f'ESTABLISH PARAMIKO SSH CONNECTION FOR USER: {self.get_option("remote_user")} on PORT {to_text(port)} TO {self.get_option("remote_addr")}', + host=self.get_option('remote_addr')) + + ssh = paramiko.SSHClient() + + # Set pubkey and hostkey algorithms to disable, the only manipulation allowed currently + # is keeping or omitting rsa-sha2 algorithms + # default_keys: t.Tuple[str] = () + paramiko_preferred_pubkeys = getattr(paramiko.Transport, '_preferred_pubkeys', ()) + paramiko_preferred_hostkeys = getattr(paramiko.Transport, '_preferred_keys', ()) + use_rsa_sha2_algorithms = self.get_option('use_rsa_sha2_algorithms') + disabled_algorithms: t.Dict[str, t.Iterable[str]] = {} + if not use_rsa_sha2_algorithms: + if paramiko_preferred_pubkeys: + disabled_algorithms['pubkeys'] = tuple(a for a in paramiko_preferred_pubkeys if 'rsa-sha2' in a) + if paramiko_preferred_hostkeys: + disabled_algorithms['keys'] = tuple(a for a in paramiko_preferred_hostkeys if 'rsa-sha2' in a) + + # override paramiko's default logger name + if self._log_channel is not None: + ssh.set_log_channel(self._log_channel) + + self.keyfile = os.path.expanduser(self.get_option('user_known_hosts_file')) + + if self.get_option('host_key_checking'): + for ssh_known_hosts in ('/etc/ssh/ssh_known_hosts', '/etc/openssh/ssh_known_hosts', self.keyfile): + try: + ssh.load_system_host_keys(ssh_known_hosts) + break + except IOError: + pass # file was not found, but not required to function + except paramiko.hostkeys.InvalidHostKey as e: + raise AnsibleConnectionFailure(f'Invalid host key: {to_text(e.line)}') + try: + ssh.load_system_host_keys() + except paramiko.hostkeys.InvalidHostKey as e: + raise AnsibleConnectionFailure(f'Invalid host key: {to_text(e.line)}') + + ssh_connect_kwargs = self._parse_proxy_command(port) + ssh.set_missing_host_key_policy(MyAddPolicy(self)) + conn_password = self.get_option('password') + allow_agent = True + + if conn_password is not None: + allow_agent = False + + try: + key_filename = None + if self.get_option('private_key_file'): + key_filename = os.path.expanduser(self.get_option('private_key_file')) + + # paramiko 2.2 introduced auth_timeout parameter + if LooseVersion(paramiko.__version__) >= LooseVersion('2.2.0'): + ssh_connect_kwargs['auth_timeout'] = self.get_option('timeout') + + # paramiko 1.15 introduced banner timeout parameter + if LooseVersion(paramiko.__version__) >= LooseVersion('1.15.0'): + ssh_connect_kwargs['banner_timeout'] = self.get_option('banner_timeout') + + ssh.connect( + self.get_option('remote_addr').lower(), + username=self.get_option('remote_user'), + allow_agent=allow_agent, + look_for_keys=self.get_option('look_for_keys'), + key_filename=key_filename, + password=conn_password, + timeout=self.get_option('timeout'), + port=port, + disabled_algorithms=disabled_algorithms, + **ssh_connect_kwargs, + ) + except paramiko.ssh_exception.BadHostKeyException as e: + raise AnsibleConnectionFailure(f'host key mismatch for {to_text(e.hostname)}') + except paramiko.ssh_exception.AuthenticationException as e: + msg = f'Failed to authenticate: {e}' + raise AnsibleAuthenticationFailure(msg) + except Exception as e: + msg = to_text(e) + if u'PID check failed' in msg: + raise AnsibleError('paramiko version issue, please upgrade paramiko on the machine running ansible') + elif u'Private key file is encrypted' in msg: + msg = f'ssh {self.get_option("remote_user")}@{self.get_options("remote_addr")}:{port} : ' + \ + f'{msg}\nTo connect as a different user, use -u .' + raise AnsibleConnectionFailure(msg) + else: + raise AnsibleConnectionFailure(msg) + self.ssh = ssh + self._connected = True + return self + + def _any_keys_added(self) -> bool: + for hostname, keys in self.ssh._host_keys.items(): + for keytype, key in keys.items(): + added_this_time = getattr(key, '_added_by_ansible_this_time', False) + if added_this_time: + return True + return False + + def _save_ssh_host_keys(self, filename: str) -> None: + """ + not using the paramiko save_ssh_host_keys function as we want to add new SSH keys at the bottom so folks + don't complain about it :) + """ + + if not self._any_keys_added(): + return + + path = os.path.expanduser('~/.ssh') + makedirs_safe(path) + + with open(filename, 'w') as f: + for hostname, keys in self.ssh._host_keys.items(): + for keytype, key in keys.items(): + # was f.write + added_this_time = getattr(key, '_added_by_ansible_this_time', False) + if not added_this_time: + f.write(f'{hostname} {keytype} {key.get_base64()}\n') + + for hostname, keys in self.ssh._host_keys.items(): + for keytype, key in keys.items(): + added_this_time = getattr(key, '_added_by_ansible_this_time', False) + if added_this_time: + f.write(f'{hostname} {keytype} {key.get_base64()}\n') + + def _build_wsl_command(self, cmd: str) -> str: + wsl_distribution = self.get_option('wsl_distribution') + become = self.get_option('become') + become_user = self.get_option('become_user') + if become and become_user: + wsl_user = become_user + else: + wsl_user = self.get_option('wsl_user') + args = ['wsl.exe', '--distribution', wsl_distribution] + if wsl_user: + args.extend(['--user', wsl_user]) + args.extend(['--']) + args.extend(shlex.split(cmd)) + if os.getenv('_ANSIBLE_TEST_WSL_CONNECTION_PLUGIN_Waeri5tepheeSha2fae8'): + return shlex.join(args) + return list2cmdline(args) # see https://github.com/python/cpython/blob/3.11/Lib/subprocess.py#L576 + + def exec_command(self, cmd: str, in_data: bytes | None = None, sudoable: bool = True) -> tuple[int, bytes, bytes]: + """ run a command on inside a WSL distribution """ + + cmd = self._build_wsl_command(cmd) + + super(Connection, self).exec_command(cmd, in_data=in_data, sudoable=sudoable) + + bufsize = 4096 + + try: + self.ssh.get_transport().set_keepalive(5) + chan = self.ssh.get_transport().open_session() + except Exception as e: + text_e = to_text(e) + msg = 'Failed to open session' + if text_e: + msg += f': {text_e}' + raise AnsibleConnectionFailure(to_native(msg)) + + display.vvv(f'EXEC {cmd}', host=self.get_option('remote_addr')) + + cmd = to_bytes(cmd, errors='surrogate_or_strict') + + no_prompt_out = b'' + no_prompt_err = b'' + become_output = b'' + + try: + chan.exec_command(cmd) + if self.become and self.become.expect_prompt(): + password_prompt = False + become_success = False + while not (become_success or password_prompt): + display.debug('Waiting for Privilege Escalation input') + + chunk = chan.recv(bufsize) + display.debug(f'chunk is: {to_text(chunk)}') + if not chunk: + if b'unknown user' in become_output: + n_become_user = to_native(self.become.get_option('become_user')) + raise AnsibleError(f'user {n_become_user} does not exist') + else: + break + # raise AnsibleError('ssh connection closed waiting for password prompt') + become_output += chunk + + # need to check every line because we might get lectured + # and we might get the middle of a line in a chunk + for line in become_output.splitlines(True): + if self.become.check_success(line): + become_success = True + break + elif self.become.check_password_prompt(line): + password_prompt = True + break + + if password_prompt: + if self.become: + become_pass = self.become.get_option('become_pass') + chan.sendall(to_bytes(become_pass + '\n', errors='surrogate_or_strict')) + else: + raise AnsibleError('A password is required but none was supplied') + else: + no_prompt_out += become_output + no_prompt_err += become_output + + if in_data: + for i in range(0, len(in_data), bufsize): + chan.send(in_data[i:i + bufsize]) + chan.shutdown_write() + elif in_data == b'': + chan.shutdown_write() + + except socket.timeout: + raise AnsibleError('ssh timed out waiting for privilege escalation.\n' + to_text(become_output)) + + stdout = b''.join(chan.makefile('rb', bufsize)) + stderr = b''.join(chan.makefile_stderr('rb', bufsize)) + returncode = chan.recv_exit_status() + + # NB the full english error message is: + # 'wsl.exe' is not recognized as an internal or external command, + # operable program or batch file. + if "'wsl.exe' is not recognized" in stderr.decode('utf-8'): + raise AnsibleError( + f'wsl.exe not found in path of host: {to_text(self.get_option("remote_addr"))}') + + return (returncode, no_prompt_out + stdout, no_prompt_out + stderr) + + def put_file(self, in_path: str, out_path: str) -> None: + """ transfer a file from local to remote """ + + display.vvv(f'PUT {in_path} TO {out_path}', host=self.get_option('remote_addr')) + try: + with open(in_path, 'rb') as f: + data = f.read() + returncode, stdout, stderr = self.exec_command( + ' '.join([ + self._shell.executable, '-c', + self._shell.quote(f'cat > {out_path}')]), + in_data=data, + sudoable=False) + if returncode != 0: + if 'cat: not found' in stderr.decode('utf-8'): + raise AnsibleError( + f'cat not found in path of WSL distribution: {to_text(self.get_option("wsl_distribution"))}') + raise AnsibleError( + f'{to_text(stdout)}\n{to_text(stderr)}') + except Exception as e: + raise AnsibleError( + f'error occurred while putting file from {in_path} to {out_path}!\n{to_text(e)}') + + def fetch_file(self, in_path: str, out_path: str) -> None: + """ save a remote file to the specified path """ + + display.vvv(f'FETCH {in_path} TO {out_path}', host=self.get_option('remote_addr')) + try: + returncode, stdout, stderr = self.exec_command( + ' '.join([ + self._shell.executable, '-c', + self._shell.quote(f'cat {in_path}')]), + sudoable=False) + if returncode != 0: + if 'cat: not found' in stderr.decode('utf-8'): + raise AnsibleError( + f'cat not found in path of WSL distribution: {to_text(self.get_option("wsl_distribution"))}') + raise AnsibleError( + f'{to_text(stdout)}\n{to_text(stderr)}') + with open(out_path, 'wb') as f: + f.write(stdout) + except Exception as e: + raise AnsibleError( + f'error occurred while fetching file from {in_path} to {out_path}!\n{to_text(e)}') + + def reset(self) -> None: + """ reset the connection """ + + if not self._connected: + return + self.close() + self._connect() + + def close(self) -> None: + """ terminate the connection """ + + if self.get_option('host_key_checking') and self.get_option('record_host_keys') and self._any_keys_added(): + # add any new SSH host keys -- warning -- this could be slow + # (This doesn't acquire the connection lock because it needs + # to exclude only other known_hosts writers, not connections + # that are starting up.) + lockfile = os.path.basename(self.keyfile) + dirname = os.path.dirname(self.keyfile) + makedirs_safe(dirname) + tmp_keyfile_name = None + try: + with FileLock().lock_file(lockfile, dirname, self.get_option('lock_file_timeout')): + # just in case any were added recently + + self.ssh.load_system_host_keys() + self.ssh._host_keys.update(self.ssh._system_host_keys) + + # gather information about the current key file, so + # we can ensure the new file has the correct mode/owner + + key_dir = os.path.dirname(self.keyfile) + if os.path.exists(self.keyfile): + key_stat = os.stat(self.keyfile) + mode = key_stat.st_mode & 0o777 + uid = key_stat.st_uid + gid = key_stat.st_gid + else: + mode = 0o644 + uid = os.getuid() + gid = os.getgid() + + # Save the new keys to a temporary file and move it into place + # rather than rewriting the file. We set delete=False because + # the file will be moved into place rather than cleaned up. + + with tempfile.NamedTemporaryFile(dir=key_dir, delete=False) as tmp_keyfile: + tmp_keyfile_name = tmp_keyfile.name + os.chmod(tmp_keyfile_name, mode) + os.chown(tmp_keyfile_name, uid, gid) + self._save_ssh_host_keys(tmp_keyfile_name) + + os.rename(tmp_keyfile_name, self.keyfile) + except LockTimeout: + raise AnsibleError( + f'writing lock file for {self.keyfile} ran in to the timeout of {self.get_option("lock_file_timeout")}s') + except paramiko.hostkeys.InvalidHostKey as e: + raise AnsibleConnectionFailure(f'Invalid host key: {e.line}') + except Exception as e: + # unable to save keys, including scenario when key was invalid + # and caught earlier + raise AnsibleError( + f'error occurred while writing SSH host keys!\n{to_text(e)}') + finally: + if tmp_keyfile_name is not None: + pathlib.Path(tmp_keyfile_name).unlink(missing_ok=True) + + self.ssh.close() + self._connected = False diff --git a/plugins/doc_fragments/redfish.py b/plugins/doc_fragments/redfish.py new file mode 100644 index 0000000000..f2e6b37485 --- /dev/null +++ b/plugins/doc_fragments/redfish.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2025 Ansible community +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + + +class ModuleDocFragment(object): + + # Use together with the community.general.redfish module utils' REDFISH_COMMON_ARGUMENT_SPEC + DOCUMENTATION = r""" +options: + validate_certs: + description: + - If V(false), TLS/SSL certificates will not be validated. + - Set this to V(true) to enable certificate checking. Should be used together with O(ca_path). + type: bool + default: false + ca_path: + description: + - PEM formatted file that contains a CA certificate to be used for validation. + - Only used if O(validate_certs=true). + type: path + ciphers: + required: false + description: + - TLS/SSL Ciphers to use for the request. + - When a list is provided, all ciphers are joined in order with V(:). + - See the L(OpenSSL Cipher List Format,https://www.openssl.org/docs/manmaster/man1/openssl-ciphers.html#CIPHER-LIST-FORMAT) + for more details. + - The available ciphers is dependent on the Python and OpenSSL/LibreSSL versions. + type: list + elements: str +""" diff --git a/plugins/filter/hashids.py b/plugins/filter/hashids.py index 6ec64d5f59..76e6aaa3a5 100644 --- a/plugins/filter/hashids.py +++ b/plugins/filter/hashids.py @@ -9,12 +9,16 @@ from __future__ import annotations from ansible.errors import ( AnsibleError, AnsibleFilterError, - AnsibleFilterTypeError, ) from ansible.module_utils.common.text.converters import to_native from ansible.module_utils.common.collections import is_sequence +try: + from ansible.errors import AnsibleTypeError +except ImportError: + from ansible.errors import AnsibleFilterTypeError as AnsibleTypeError + try: from hashids import Hashids HAS_HASHIDS = True @@ -63,7 +67,7 @@ def hashids_encode(nums, salt=None, alphabet=None, min_length=None): try: hashid = hashids.encode(*nums) except TypeError as e: - raise AnsibleFilterTypeError( + raise AnsibleTypeError( "Data to encode must by a tuple or list of ints: %s" % to_native(e) ) diff --git a/plugins/filter/reveal_ansible_type.py b/plugins/filter/reveal_ansible_type.py index 36fcba3df2..f2f0d6780b 100644 --- a/plugins/filter/reveal_ansible_type.py +++ b/plugins/filter/reveal_ansible_type.py @@ -23,29 +23,29 @@ options: """ EXAMPLES = r""" -# Substitution converts str to AnsibleUnicode -# ------------------------------------------- +# Substitution converts str to AnsibleUnicode or _AnsibleTaggedStr +# ---------------------------------------------------------------- -# String. AnsibleUnicode. +# String. AnsibleUnicode or _AnsibleTaggedStr. - data: "abc" result: '{{ data | community.general.reveal_ansible_type }}' -# result => AnsibleUnicode +# result => AnsibleUnicode (or _AnsibleTaggedStr) -# String. AnsibleUnicode alias str. -- alias: {"AnsibleUnicode": "str"} +# String. AnsibleUnicode/_AnsibleTaggedStr alias str. +- alias: {"AnsibleUnicode": "str", "_AnsibleTaggedStr": "str"} data: "abc" result: '{{ data | community.general.reveal_ansible_type(alias) }}' # result => str -# List. All items are AnsibleUnicode. +# List. All items are AnsibleUnicode/_AnsibleTaggedStr. - data: ["a", "b", "c"] result: '{{ data | community.general.reveal_ansible_type }}' -# result => list[AnsibleUnicode] +# result => list[AnsibleUnicode] or list[_AnsibleTaggedStr] -# Dictionary. All keys are AnsibleUnicode. All values are AnsibleUnicode. +# Dictionary. All keys and values are AnsibleUnicode/_AnsibleTaggedStr. - data: {"a": "foo", "b": "bar", "c": "baz"} result: '{{ data | community.general.reveal_ansible_type }}' -# result => dict[AnsibleUnicode, AnsibleUnicode] +# result => dict[AnsibleUnicode, AnsibleUnicode] or dict[_AnsibleTaggedStr, _AnsibleTaggedStr] # No substitution and no alias. Type of strings is str # ---------------------------------------------------- @@ -82,29 +82,43 @@ EXAMPLES = r""" - result: '{{ {"a": 1, "b": 2} | community.general.reveal_ansible_type }}' # result => dict[str, int] -# Type of strings is AnsibleUnicode or str -# ---------------------------------------- +# Type of strings is AnsibleUnicode, _AnsibleTaggedStr, or str +# ------------------------------------------------------------ # Dictionary. The keys are integers or strings. All values are strings. -- alias: {"AnsibleUnicode": "str"} +- alias: + AnsibleUnicode: str + _AnsibleTaggedStr: str + _AnsibleTaggedInt: int data: {1: 'a', 'b': 'b'} result: '{{ data | community.general.reveal_ansible_type(alias) }}' # result => dict[int|str, str] # Dictionary. All keys are integers. All values are keys. -- alias: {"AnsibleUnicode": "str"} +- alias: + AnsibleUnicode: str + _AnsibleTaggedStr: str + _AnsibleTaggedInt: int data: {1: 'a', 2: 'b'} result: '{{ data | community.general.reveal_ansible_type(alias) }}' # result => dict[int, str] # Dictionary. All keys are strings. Multiple types values. -- alias: {"AnsibleUnicode": "str"} +- alias: + AnsibleUnicode: str + _AnsibleTaggedStr: str + _AnsibleTaggedInt: int + _AnsibleTaggedFloat: float data: {'a': 1, 'b': 1.1, 'c': 'abc', 'd': true, 'e': ['x', 'y', 'z'], 'f': {'x': 1, 'y': 2}} result: '{{ data | community.general.reveal_ansible_type(alias) }}' # result => dict[str, bool|dict|float|int|list|str] # List. Multiple types items. -- alias: {"AnsibleUnicode": "str"} +- alias: + AnsibleUnicode: str + _AnsibleTaggedStr: str + _AnsibleTaggedInt: int + _AnsibleTaggedFloat: float data: [1, 2, 1.1, 'abc', true, ['x', 'y', 'z'], {'x': 1, 'y': 2}] result: '{{ data | community.general.reveal_ansible_type(alias) }}' # result => list[bool|dict|float|int|list|str] @@ -122,6 +136,7 @@ from ansible_collections.community.general.plugins.plugin_utils.ansible_type imp def reveal_ansible_type(data, alias=None): """Returns data type""" + # TODO: expose use_native_type parameter return _ansible_type(data, alias) diff --git a/plugins/filter/unicode_normalize.py b/plugins/filter/unicode_normalize.py index e897bb9cee..aed7979de8 100644 --- a/plugins/filter/unicode_normalize.py +++ b/plugins/filter/unicode_normalize.py @@ -48,9 +48,14 @@ _value: from unicodedata import normalize -from ansible.errors import AnsibleFilterError, AnsibleFilterTypeError +from ansible.errors import AnsibleFilterError from ansible.module_utils.six import text_type +try: + from ansible.errors import AnsibleTypeError +except ImportError: + from ansible.errors import AnsibleFilterTypeError as AnsibleTypeError + def unicode_normalize(data, form='NFC'): """Applies normalization to 'unicode' strings. @@ -65,7 +70,7 @@ def unicode_normalize(data, form='NFC'): """ if not isinstance(data, text_type): - raise AnsibleFilterTypeError("%s is not a valid input type" % type(data)) + raise AnsibleTypeError("%s is not a valid input type" % type(data)) if form not in ('NFC', 'NFD', 'NFKC', 'NFKD'): raise AnsibleFilterError("%s is not a valid form" % form) diff --git a/plugins/inventory/proxmox.py b/plugins/inventory/proxmox.py index f2efef9bf8..0f41cabe7d 100644 --- a/plugins/inventory/proxmox.py +++ b/plugins/inventory/proxmox.py @@ -366,11 +366,26 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable): def _get_node_ip(self, node): ret = self._get_json(f"{self.proxmox_url}/api2/json/nodes/{node}/network") + # sort interface by iface name to make selection as stable as possible + ret.sort(key=lambda x: x['iface']) + for iface in ret: try: + # only process interfaces adhering to these rules + if 'active' not in iface: + self.display.vvv(f"Interface {iface['iface']} on node {node} does not have an active state") + continue + if 'address' not in iface: + self.display.vvv(f"Interface {iface['iface']} on node {node} does not have an address") + continue + if 'gateway' not in iface: + self.display.vvv(f"Interface {iface['iface']} on node {node} does not have a gateway") + continue + self.display.vv(f"Using interface {iface['iface']} on node {node} with address {iface['address']} as node ip for ansible_host") return iface['address'] except Exception: - return None + continue + return None def _get_lxc_interfaces(self, properties, node, vmid): status_key = self._fact('status') diff --git a/plugins/inventory/stackpath_compute.py b/plugins/inventory/stackpath_compute.py index bc55027155..e219f92641 100644 --- a/plugins/inventory/stackpath_compute.py +++ b/plugins/inventory/stackpath_compute.py @@ -6,60 +6,60 @@ from __future__ import annotations -DOCUMENTATION = ''' - name: stackpath_compute - short_description: StackPath Edge Computing inventory source - version_added: 1.2.0 - author: - - UNKNOWN (@shayrybak) - extends_documentation_fragment: - - inventory_cache - - constructed +DOCUMENTATION = r""" +name: stackpath_compute +short_description: StackPath Edge Computing inventory source +version_added: 1.2.0 +author: + - UNKNOWN (@shayrybak) +deprecated: + removed_in: 11.0.0 + why: Stackpath (the company) ceased its operations in June 2024. The API URL this plugin relies on is not found in DNS. + alternative: There is none. +extends_documentation_fragment: + - inventory_cache + - constructed +description: + - Get inventory hosts from StackPath Edge Computing. + - Uses a YAML configuration file that ends with stackpath_compute.(yml|yaml). +options: + plugin: description: - - Get inventory hosts from StackPath Edge Computing. - - Uses a YAML configuration file that ends with stackpath_compute.(yml|yaml). - options: - plugin: - description: - - A token that ensures this is a source file for the plugin. - required: true - type: string - choices: ['community.general.stackpath_compute'] - client_id: - description: - - An OAuth client ID generated from the API Management section of the StackPath customer portal - U(https://control.stackpath.net/api-management). - required: true - type: str - client_secret: - description: - - An OAuth client secret generated from the API Management section of the StackPath customer portal - U(https://control.stackpath.net/api-management). - required: true - type: str - stack_slugs: - description: - - A list of Stack slugs to query instances in. If no entry then get instances in all stacks on the account. - type: list - elements: str - use_internal_ip: - description: - - Whether or not to use internal IP addresses, If false, uses external IP addresses, internal otherwise. - - If an instance doesn't have an external IP it will not be returned when this option is set to false. - type: bool -''' + - A token that ensures this is a source file for the plugin. + required: true + type: string + choices: ['community.general.stackpath_compute'] + client_id: + description: + - An OAuth client ID generated from the API Management section of the StackPath customer portal U(https://control.stackpath.net/api-management). + required: true + type: str + client_secret: + description: + - An OAuth client secret generated from the API Management section of the StackPath customer portal U(https://control.stackpath.net/api-management). + required: true + type: str + stack_slugs: + description: + - A list of Stack slugs to query instances in. If no entry then get instances in all stacks on the account. + type: list + elements: str + use_internal_ip: + description: + - Whether or not to use internal IP addresses, If false, uses external IP addresses, internal otherwise. + - If an instance doesn't have an external IP it will not be returned when this option is set to false. + type: bool +""" -EXAMPLES = ''' -# Example using credentials to fetch all workload instances in a stack. ---- +EXAMPLES = r""" plugin: community.general.stackpath_compute client_id: my_client_id client_secret: my_client_secret stack_slugs: -- my_first_stack_slug -- my_other_stack_slug + - my_first_stack_slug + - my_other_stack_slug use_internal_ip: false -''' +""" import traceback import json diff --git a/plugins/lookup/dependent.py b/plugins/lookup/dependent.py index 1ec4369b32..2b7f293872 100644 --- a/plugins/lookup/dependent.py +++ b/plugins/lookup/dependent.py @@ -130,12 +130,24 @@ from ansible.template import Templar from ansible_collections.community.general.plugins.module_utils.version import LooseVersion +try: + from ansible.template import trust_as_template as _trust_as_template + HAS_DATATAGGING = True +except ImportError: + HAS_DATATAGGING = False + # Whether Templar has a cache, which can be controlled by Templar.template()'s cache option. # The cache was removed for ansible-core 2.14 (https://github.com/ansible/ansible/pull/78419) _TEMPLAR_HAS_TEMPLATE_CACHE = LooseVersion(ansible_version) < LooseVersion('2.14.0') +def _make_safe(value): + if HAS_DATATAGGING and isinstance(value, str): + return _trust_as_template(value) + return value + + class LookupModule(LookupBase): def __evaluate(self, expression, templar, variables): """Evaluate expression with templar. @@ -144,10 +156,13 @@ class LookupModule(LookupBase): ``variables`` are the variables to use. """ templar.available_variables = variables or {} - expression = "{0}{1}{2}".format("{{", expression, "}}") + quoted_expression = "{0}{1}{2}".format("{{", expression, "}}") if _TEMPLAR_HAS_TEMPLATE_CACHE: - return templar.template(expression, cache=False) - return templar.template(expression) + return templar.template(quoted_expression, cache=False) + if hasattr(templar, 'evaluate_expression'): + # This is available since the Data Tagging PR has been merged + return templar.evaluate_expression(_make_safe(expression)) + return templar.template(quoted_expression) def __process(self, result, terms, index, current, templar, variables): """Fills ``result`` list with evaluated items. diff --git a/plugins/lookup/manifold.py b/plugins/lookup/manifold.py index 9dbd2e118f..08e63fd7ee 100644 --- a/plugins/lookup/manifold.py +++ b/plugins/lookup/manifold.py @@ -13,6 +13,10 @@ DOCUMENTATION = ''' short_description: get credentials from Manifold.co description: - Retrieves resources' credentials from Manifold.co + deprecated: + removed_in: 11.0.0 + why: Manifold (the company) has been acquired in 2021 and the services used by this plugin are no longer operational. + alternative: There is none. options: _terms: description: diff --git a/plugins/module_utils/identity/keycloak/keycloak.py b/plugins/module_utils/identity/keycloak/keycloak.py index da5080bbfe..648cad76bc 100644 --- a/plugins/module_utils/identity/keycloak/keycloak.py +++ b/plugins/module_utils/identity/keycloak/keycloak.py @@ -2224,6 +2224,23 @@ class KeycloakAPI(object): except Exception as e: self.fail_request(e, msg="Unable to add authenticationConfig %s: %s" % (executionId, str(e))) + def delete_authentication_config(self, configId, realm='master'): + """ Delete authenticator config + + :param configId: id of authentication config + :param realm: realm of authentication config to be deleted + """ + try: + # Send a DELETE request to remove the specified authentication config from the Keycloak server. + self._request( + URL_AUTHENTICATION_CONFIG.format( + url=self.baseurl, + realm=realm, + id=configId), + method='DELETE') + except Exception as e: + self.fail_request(e, msg="Unable to delete authentication config %s: %s" % (configId, str(e))) + def create_subflow(self, subflowName, flowAlias, realm='master', flowType='basic-flow'): """ Create new sublow on the flow @@ -2810,29 +2827,33 @@ class KeycloakAPI(object): def get_user_groups(self, user_id, realm='master'): """ - Get groups for a user. + Get the group names for a user. :param user_id: User ID :param realm: Realm - :return: Representation of the client groups. + :return: The client group names as a list of strings. + """ + user_groups = self.get_user_group_details(user_id, realm) + return [user_group['name'] for user_group in user_groups if 'name' in user_group] + + def get_user_group_details(self, user_id, realm='master'): + """ + Get the group details for a user. + :param user_id: User ID + :param realm: Realm + :return: The client group details as a list of dictionaries. """ try: - groups = [] - user_groups_url = URL_USER_GROUPS.format( - url=self.baseurl, - realm=realm, - id=user_id) - user_groups = json.load( - self._request( - user_groups_url, - method='GET')) - for user_group in user_groups: - groups.append(user_group["name"]) - return groups + user_groups_url = URL_USER_GROUPS.format(url=self.baseurl, realm=realm, id=user_id) + return self._request_and_deserialize(user_groups_url, method='GET') except Exception as e: self.fail_request(e, msg='Could not get groups for user %s in realm %s: %s' % (user_id, realm, str(e))) def add_user_in_group(self, user_id, group_id, realm='master'): + """DEPRECATED: Call add_user_to_group(...) instead. This method is scheduled for removal in community.general 13.0.0.""" + return self.add_user_to_group(user_id, group_id, realm) + + def add_user_to_group(self, user_id, group_id, realm='master'): """ Add a user to a group. :param user_id: User ID @@ -2850,7 +2871,7 @@ class KeycloakAPI(object): user_group_url, method='PUT') except Exception as e: - self.fail_request(e, msg='Could not add user %s in group %s in realm %s: %s' + self.fail_request(e, msg='Could not add user %s to group %s in realm %s: %s' % (user_id, group_id, realm, str(e))) def remove_user_from_group(self, user_id, group_id, realm='master'): @@ -2881,49 +2902,72 @@ class KeycloakAPI(object): :param realm: Realm :return: True if group membership has been changed. False Otherwise. """ - changed = False try: - user_existing_groups = self.get_user_groups( - user_id=userrep['id'], - realm=realm) - groups_to_add_and_remove = self.extract_groups_to_add_to_and_remove_from_user(groups) - # If group membership need to be changed - if not is_struct_included(groups_to_add_and_remove['add'], user_existing_groups): - # Get available groups in the realm - realm_groups = self.get_groups(realm=realm) - for realm_group in realm_groups: - if "name" in realm_group and realm_group["name"] in groups_to_add_and_remove['add']: - self.add_user_in_group( - user_id=userrep["id"], - group_id=realm_group["id"], - realm=realm) - changed = True - elif "name" in realm_group and realm_group['name'] in groups_to_add_and_remove['remove']: - self.remove_user_from_group( - user_id=userrep['id'], - group_id=realm_group['id'], - realm=realm) - changed = True - return changed + groups_to_add, groups_to_remove = self.extract_groups_to_add_to_and_remove_from_user(groups) + if not groups_to_add and not groups_to_remove: + return False + + user_groups = self.get_user_group_details(user_id=userrep['id'], realm=realm) + user_group_names = [user_group['name'] for user_group in user_groups if 'name' in user_group] + user_group_paths = [user_group['path'] for user_group in user_groups if 'path' in user_group] + + groups_to_add = [group_to_add for group_to_add in groups_to_add + if group_to_add not in user_group_names and group_to_add not in user_group_paths] + groups_to_remove = [group_to_remove for group_to_remove in groups_to_remove + if group_to_remove in user_group_names or group_to_remove in user_group_paths] + if not groups_to_add and not groups_to_remove: + return False + + for group_to_add in groups_to_add: + realm_group = self.find_group_by_path(group_to_add, realm=realm) + if realm_group: + self.add_user_to_group(user_id=userrep['id'], group_id=realm_group['id'], realm=realm) + + for group_to_remove in groups_to_remove: + realm_group = self.find_group_by_path(group_to_remove, realm=realm) + if realm_group: + self.remove_user_from_group(user_id=userrep['id'], group_id=realm_group['id'], realm=realm) + + return True except Exception as e: self.module.fail_json(msg='Could not update group membership for user %s in realm %s: %s' - % (userrep['id]'], realm, str(e))) + % (userrep['username'], realm, e)) def extract_groups_to_add_to_and_remove_from_user(self, groups): - groups_extract = {} groups_to_add = [] groups_to_remove = [] - if isinstance(groups, list) and len(groups) > 0: + if isinstance(groups, list): for group in groups: group_name = group['name'] if isinstance(group, dict) and 'name' in group else group - if isinstance(group, dict) and ('state' not in group or group['state'] == 'present'): - groups_to_add.append(group_name) - else: - groups_to_remove.append(group_name) - groups_extract['add'] = groups_to_add - groups_extract['remove'] = groups_to_remove + if isinstance(group, dict): + if 'state' not in group or group['state'] == 'present': + groups_to_add.append(group_name) + else: + groups_to_remove.append(group_name) + return groups_to_add, groups_to_remove - return groups_extract + def find_group_by_path(self, target, realm='master'): + """ + Finds a realm group by path, e.g. '/my/group'. + The path is formed by prepending a '/' character to `target` unless it's already present. + This adds support for finding top level groups by name and subgroups by path. + """ + groups = self.get_groups(realm=realm) + path = target if target.startswith('/') else '/' + target + for segment in path.split('/'): + if not segment: + continue + abort = True + for group in groups: + if group['path'] == path: + return self.get_group_by_groupid(group['id'], realm=realm) + if group['name'] == segment: + groups = self.get_subgroups(group, realm=realm) + abort = False + break + if abort: + break + return None def convert_user_group_list_of_str_to_list_of_dict(self, groups): list_of_groups = [] diff --git a/plugins/module_utils/puppet.py b/plugins/module_utils/puppet.py index e06683b3ee..251d5618d3 100644 --- a/plugins/module_utils/puppet.py +++ b/plugins/module_utils/puppet.py @@ -95,10 +95,7 @@ def puppet_runner(module): skip_tags=cmd_runner_fmt.as_func(lambda v: ["--skip_tags", ",".join(v)]), certname=cmd_runner_fmt.as_opt_eq_val("--certname"), noop=cmd_runner_fmt.as_func(noop_func), - use_srv_records=cmd_runner_fmt.as_map({ - True: "--usr_srv_records", - False: "--no-usr_srv_records", - }), + use_srv_records=cmd_runner_fmt.as_bool("--usr_srv_records", "--no-usr_srv_records", ignore_none=True), logdest=cmd_runner_fmt.as_map(_logdest_map, default=[]), modulepath=cmd_runner_fmt.as_opt_eq_val("--modulepath"), _execute=cmd_runner_fmt.as_func(execute_func), diff --git a/plugins/module_utils/redfish_utils.py b/plugins/module_utils/redfish_utils.py index f4e8cd5a36..f7332aa99b 100644 --- a/plugins/module_utils/redfish_utils.py +++ b/plugins/module_utils/redfish_utils.py @@ -38,6 +38,21 @@ FAIL_MSG = 'Issuing a data modification command without specifying the '\ 'than one %(resource)s is no longer allowed. Use the `resource_id` '\ 'option to specify the target %(resource)s ID.' +# Use together with the community.general.redfish docs fragment +REDFISH_COMMON_ARGUMENT_SPEC = { + "validate_certs": { + "type": "bool", + "default": False, + }, + "ca_path": { + "type": "path", + }, + "ciphers": { + "type": "list", + "elements": "str", + }, +} + class RedfishUtils(object): @@ -53,8 +68,10 @@ class RedfishUtils(object): self.resource_id = resource_id self.data_modification = data_modification self.strip_etag_quotes = strip_etag_quotes - self.ciphers = ciphers + self.ciphers = ciphers if ciphers is not None else module.params.get("ciphers") self._vendor = None + self.validate_certs = module.params.get("validate_certs", False) + self.ca_path = module.params.get("ca_path") def _auth_params(self, headers): """ @@ -132,6 +149,17 @@ class RedfishUtils(object): resp['msg'] = 'Properties in %s are already set' % uri return resp + def _request(self, uri, **kwargs): + kwargs.setdefault("validate_certs", self.validate_certs) + kwargs.setdefault("follow_redirects", "all") + kwargs.setdefault("use_proxy", True) + kwargs.setdefault("timeout", self.timeout) + kwargs.setdefault("ciphers", self.ciphers) + kwargs.setdefault("ca_path", self.ca_path) + resp = open_url(uri, **kwargs) + headers = {k.lower(): v for (k, v) in resp.info().items()} + return resp, headers + # The following functions are to send GET/POST/PATCH/DELETE requests def get_request(self, uri, override_headers=None, allow_no_resp=False, timeout=None): req_headers = dict(GET_HEADERS) @@ -145,12 +173,15 @@ class RedfishUtils(object): # in case the caller will be using sessions later. if uri == (self.root_uri + self.service_root): basic_auth = False - resp = open_url(uri, method="GET", headers=req_headers, - url_username=username, url_password=password, - force_basic_auth=basic_auth, validate_certs=False, - follow_redirects='all', - use_proxy=True, timeout=timeout, ciphers=self.ciphers) - headers = {k.lower(): v for (k, v) in resp.info().items()} + resp, headers = self._request( + uri, + method="GET", + headers=req_headers, + url_username=username, + url_password=password, + force_basic_auth=basic_auth, + timeout=timeout, + ) try: if headers.get('content-encoding') == 'gzip' and LooseVersion(ansible_version) < LooseVersion('2.14'): # Older versions of Ansible do not automatically decompress the data @@ -194,18 +225,20 @@ class RedfishUtils(object): req_headers['content-type'] = multipart_encoder[1] else: data = json.dumps(pyld) - resp = open_url(uri, data=data, - headers=req_headers, method="POST", - url_username=username, url_password=password, - force_basic_auth=basic_auth, validate_certs=False, - follow_redirects='all', - use_proxy=True, timeout=self.timeout, ciphers=self.ciphers) + resp, headers = self._request( + uri, + data=data, + headers=req_headers, + method="POST", + url_username=username, + url_password=password, + force_basic_auth=basic_auth, + ) try: data = json.loads(to_native(resp.read())) except Exception as e: # No response data; this is okay in many cases data = None - headers = {k.lower(): v for (k, v) in resp.info().items()} except HTTPError as e: msg, data = self._get_extended_message(e) return {'ret': False, @@ -248,12 +281,15 @@ class RedfishUtils(object): username, password, basic_auth = self._auth_params(req_headers) try: - resp = open_url(uri, data=json.dumps(pyld), - headers=req_headers, method="PATCH", - url_username=username, url_password=password, - force_basic_auth=basic_auth, validate_certs=False, - follow_redirects='all', - use_proxy=True, timeout=self.timeout, ciphers=self.ciphers) + resp, dummy = self._request( + uri, + data=json.dumps(pyld), + headers=req_headers, + method="PATCH", + url_username=username, + url_password=password, + force_basic_auth=basic_auth, + ) except HTTPError as e: msg, data = self._get_extended_message(e) return {'ret': False, 'changed': False, @@ -283,12 +319,15 @@ class RedfishUtils(object): req_headers['If-Match'] = etag username, password, basic_auth = self._auth_params(req_headers) try: - resp = open_url(uri, data=json.dumps(pyld), - headers=req_headers, method="PUT", - url_username=username, url_password=password, - force_basic_auth=basic_auth, validate_certs=False, - follow_redirects='all', - use_proxy=True, timeout=self.timeout, ciphers=self.ciphers) + resp, dummy = self._request( + uri, + data=json.dumps(pyld), + headers=req_headers, + method="PUT", + url_username=username, + url_password=password, + force_basic_auth=basic_auth, + ) except HTTPError as e: msg, data = self._get_extended_message(e) return {'ret': False, @@ -309,12 +348,15 @@ class RedfishUtils(object): username, password, basic_auth = self._auth_params(req_headers) try: data = json.dumps(pyld) if pyld else None - resp = open_url(uri, data=data, - headers=req_headers, method="DELETE", - url_username=username, url_password=password, - force_basic_auth=basic_auth, validate_certs=False, - follow_redirects='all', - use_proxy=True, timeout=self.timeout, ciphers=self.ciphers) + resp, dummy = self._request( + uri, + data=data, + headers=req_headers, + method="DELETE", + url_username=username, + url_password=password, + force_basic_auth=basic_auth, + ) except HTTPError as e: msg, data = self._get_extended_message(e) return {'ret': False, diff --git a/plugins/modules/apache2_module.py b/plugins/modules/apache2_module.py index cacb870ee0..2007b5d1f1 100644 --- a/plugins/modules/apache2_module.py +++ b/plugins/modules/apache2_module.py @@ -194,6 +194,7 @@ def create_apache_identifier(name): # re expressions to extract subparts of names re_workarounds = [ + ('php8', re.compile(r'^(php)[\d\.]+')), ('php', re.compile(r'^(php\d)\.')), ] diff --git a/plugins/modules/btrfs_subvolume.py b/plugins/modules/btrfs_subvolume.py index b1593a8ecd..7e085d6103 100644 --- a/plugins/modules/btrfs_subvolume.py +++ b/plugins/modules/btrfs_subvolume.py @@ -120,7 +120,7 @@ EXAMPLES = r""" community.general.btrfs_subvolume: name: /@ snapshot_source: / - default: Yes + default: true filesystem_device: /dev/vda2 - name: Create a snapshot of the /@ subvolume and recursively creating intermediate subvolumes as required diff --git a/plugins/modules/github_deploy_key.py b/plugins/modules/github_deploy_key.py index 509a67c491..2e5f9125ad 100644 --- a/plugins/modules/github_deploy_key.py +++ b/plugins/modules/github_deploy_key.py @@ -259,7 +259,12 @@ class GithubDeployKey(object): key_id = response_body["id"] self.module.exit_json(changed=True, msg="Deploy key successfully added", id=key_id) elif status_code == 422: - self.module.exit_json(changed=False, msg="Deploy key already exists") + # there might be multiple reasons for a 422 + # so we must check if the reason is that the key already exists + if self.get_existing_key(): + self.module.exit_json(changed=False, msg="Deploy key already exists") + else: + self.handle_error(method="POST", info=info) else: self.handle_error(method="POST", info=info) diff --git a/plugins/modules/gitlab_project.py b/plugins/modules/gitlab_project.py index 8ef73de1fd..eec2b0fa7a 100644 --- a/plugins/modules/gitlab_project.py +++ b/plugins/modules/gitlab_project.py @@ -44,6 +44,12 @@ options: - This option is only used on creation, not for updates. type: path version_added: "4.2.0" + build_timeout: + description: + - Maximum number of seconds a CI job can run. + - If not specified on creation, GitLab will impose a default value. + type: int + version_added: "10.6.0" builds_access_level: description: - V(private) means that repository CI/CD is allowed only to project members. @@ -430,6 +436,7 @@ class GitLabProject(object): project_options = { 'allow_merge_on_skipped_pipeline': options['allow_merge_on_skipped_pipeline'], 'builds_access_level': options['builds_access_level'], + 'build_timeout': options['build_timeout'], 'ci_config_path': options['ci_config_path'], 'container_expiration_policy': options['container_expiration_policy'], 'container_registry_access_level': options['container_registry_access_level'], @@ -591,6 +598,7 @@ def main(): allow_merge_on_skipped_pipeline=dict(type='bool'), avatar_path=dict(type='path'), builds_access_level=dict(type='str', choices=['private', 'disabled', 'enabled']), + build_timeout=dict(type='int'), ci_config_path=dict(type='str'), container_expiration_policy=dict(type='dict', default=None, options=dict( cadence=dict(type='str', choices=["1d", "7d", "14d", "1month", "3month"]), @@ -664,6 +672,7 @@ def main(): allow_merge_on_skipped_pipeline = module.params['allow_merge_on_skipped_pipeline'] avatar_path = module.params['avatar_path'] builds_access_level = module.params['builds_access_level'] + build_timeout = module.params['build_timeout'] ci_config_path = module.params['ci_config_path'] container_expiration_policy = module.params['container_expiration_policy'] container_registry_access_level = module.params['container_registry_access_level'] @@ -748,6 +757,7 @@ def main(): "allow_merge_on_skipped_pipeline": allow_merge_on_skipped_pipeline, "avatar_path": avatar_path, "builds_access_level": builds_access_level, + "build_timeout": build_timeout, "ci_config_path": ci_config_path, "container_expiration_policy": container_expiration_policy, "container_registry_access_level": container_registry_access_level, diff --git a/plugins/modules/gitlab_project_members.py b/plugins/modules/gitlab_project_members.py index 228af9a062..b5d0f6e2d1 100644 --- a/plugins/modules/gitlab_project_members.py +++ b/plugins/modules/gitlab_project_members.py @@ -48,8 +48,9 @@ options: description: - The access level for the user. - Required if O(state=present), user state is set to present. + - V(owner) was added in community.general 10.6.0. type: str - choices: ['guest', 'reporter', 'developer', 'maintainer'] + choices: ['guest', 'reporter', 'developer', 'maintainer', 'owner'] gitlab_users_access: description: - Provide a list of user to access level mappings. @@ -67,8 +68,9 @@ options: description: - The access level for the user. - Required if O(state=present), user state is set to present. + - V(owner) was added in community.general 10.6.0. type: str - choices: ['guest', 'reporter', 'developer', 'maintainer'] + choices: ['guest', 'reporter', 'developer', 'maintainer', 'owner'] required: true version_added: 3.7.0 state: @@ -84,9 +86,10 @@ options: - Adds/remove users of the given access_level to match the given O(gitlab_user)/O(gitlab_users_access) list. If omitted do not purge orphaned members. - Is only used when O(state=present). + - V(owner) was added in community.general 10.6.0. type: list elements: str - choices: ['guest', 'reporter', 'developer', 'maintainer'] + choices: ['guest', 'reporter', 'developer', 'maintainer', 'owner'] version_added: 3.7.0 """ @@ -239,16 +242,16 @@ def main(): project=dict(type='str', required=True), gitlab_user=dict(type='list', elements='str'), state=dict(type='str', default='present', choices=['present', 'absent']), - access_level=dict(type='str', choices=['guest', 'reporter', 'developer', 'maintainer']), + access_level=dict(type='str', choices=['guest', 'reporter', 'developer', 'maintainer', 'owner']), purge_users=dict(type='list', elements='str', choices=[ - 'guest', 'reporter', 'developer', 'maintainer']), + 'guest', 'reporter', 'developer', 'maintainer', 'owner']), gitlab_users_access=dict( type='list', elements='dict', options=dict( name=dict(type='str', required=True), access_level=dict(type='str', choices=[ - 'guest', 'reporter', 'developer', 'maintainer'], required=True), + 'guest', 'reporter', 'developer', 'maintainer', 'owner'], required=True), ) ), )) @@ -286,6 +289,7 @@ def main(): 'reporter': gitlab.const.REPORTER_ACCESS, 'developer': gitlab.const.DEVELOPER_ACCESS, 'maintainer': gitlab.const.MAINTAINER_ACCESS, + 'owner': gitlab.const.OWNER_ACCESS, } gitlab_project = module.params['project'] diff --git a/plugins/modules/homebrew.py b/plugins/modules/homebrew.py index bdc6f65724..25d4fc37e2 100644 --- a/plugins/modules/homebrew.py +++ b/plugins/modules/homebrew.py @@ -399,10 +399,15 @@ class Homebrew(object): name = package_detail["name"] full_name = package_detail["full_name"] - tapped_name = package_detail["tap"] + "/" + name + # Issue https://github.com/ansible-collections/community.general/issues/9803: + # name can include the tap as a prefix, in order to disambiguate, + # e.g. casks from identically named formulae. + # + # Issue https://github.com/ansible-collections/community.general/issues/10012: + # package_detail["tap"] is None if package is no longer available. + tapped_name = [package_detail["tap"] + "/" + name] if package_detail["tap"] else [] aliases = package_detail.get("aliases", []) - - package_names = set([name, full_name, tapped_name] + aliases) + package_names = set([name, full_name] + tapped_name + aliases) # Finally, identify which of all those package names was the one supplied by the user. package_names = package_names & set(self.packages) diff --git a/plugins/modules/hpilo_boot.py b/plugins/modules/hpilo_boot.py index ecef60f66a..c3d14564d6 100644 --- a/plugins/modules/hpilo_boot.py +++ b/plugins/modules/hpilo_boot.py @@ -76,6 +76,12 @@ options: default: TLSv1 type: str choices: ["SSLv3", "SSLv23", "TLSv1", "TLSv1_1", "TLSv1_2"] + idempotent_boot_once: + description: + - "This option makes O(state=boot_once) succeed instead of failing when the server is already powered on." + type: bool + default: false + version_added: 10.6.0 requirements: - python-hpilo notes: @@ -138,6 +144,7 @@ def main(): image=dict(type='str'), state=dict(type='str', default='boot_once', choices=['boot_always', 'boot_once', 'connect', 'disconnect', 'no_boot', 'poweroff']), force=dict(type='bool', default=False), + idempotent_boot_once=dict(type='bool', default=False), ssl_version=dict(type='str', default='TLSv1', choices=['SSLv3', 'SSLv23', 'TLSv1', 'TLSv1_1', 'TLSv1_2']), ) ) @@ -152,6 +159,7 @@ def main(): image = module.params['image'] state = module.params['state'] force = module.params['force'] + idempotent_boot_once = module.params['idempotent_boot_once'] ssl_version = getattr(hpilo.ssl, 'PROTOCOL_' + module.params.get('ssl_version').upper().replace('V', 'v')) ilo = hpilo.Ilo(host, login=login, password=password, ssl_version=ssl_version) @@ -187,13 +195,21 @@ def main(): power_status = ilo.get_host_power_status() - if not force and power_status == 'ON': - module.fail_json(msg='HP iLO (%s) reports that the server is already powered on !' % host) - if power_status == 'ON': - ilo.warm_boot_server() -# ilo.cold_boot_server() - changed = True + if not force and not idempotent_boot_once: + # module.deprecate( + # 'The failure of the module when the server is already powered on is being deprecated.' + # ' Please set the parameter "idempotent_boot_once=true" to start using the new behavior.', + # version='11.0.0', + # collection_name='community.general' + # ) + module.fail_json(msg='HP iLO (%s) reports that the server is already powered on !' % host) + elif not force and idempotent_boot_once: + pass + elif force: + ilo.warm_boot_server() + # ilo.cold_boot_server() + changed = True else: ilo.press_pwr_btn() # ilo.reset_server() diff --git a/plugins/modules/htpasswd.py b/plugins/modules/htpasswd.py index de94765130..f13cd5a610 100644 --- a/plugins/modules/htpasswd.py +++ b/plugins/modules/htpasswd.py @@ -85,7 +85,7 @@ EXAMPLES = r""" password: '9s36?;fyNp' owner: root group: www-data - mode: 0640 + mode: '0640' - name: Remove a user from a password file community.general.htpasswd: diff --git a/plugins/modules/idrac_redfish_command.py b/plugins/modules/idrac_redfish_command.py index 531da53162..fa4f29e5f5 100644 --- a/plugins/modules/idrac_redfish_command.py +++ b/plugins/modules/idrac_redfish_command.py @@ -16,6 +16,7 @@ description: - For use with Dell iDRAC operations that require Redfish OEM extensions. extends_documentation_fragment: - community.general.attributes + - community.general.redfish attributes: check_mode: support: none @@ -62,6 +63,12 @@ options: - ID of the System, Manager or Chassis to modify. type: str version_added: '0.2.0' + validate_certs: + version_added: 10.6.0 + ca_path: + version_added: 10.6.0 + ciphers: + version_added: 10.6.0 author: "Jose Delarosa (@jose-delarosa)" """ @@ -93,7 +100,7 @@ return_values: import re from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.redfish_utils import RedfishUtils +from ansible_collections.community.general.plugins.module_utils.redfish_utils import RedfishUtils, REDFISH_COMMON_ARGUMENT_SPEC from ansible.module_utils.common.text.converters import to_native @@ -147,17 +154,19 @@ CATEGORY_COMMANDS_ALL = { def main(): result = {} return_values = {} + argument_spec = dict( + category=dict(required=True), + command=dict(required=True, type='list', elements='str'), + baseuri=dict(required=True), + username=dict(), + password=dict(no_log=True), + auth_token=dict(no_log=True), + timeout=dict(type='int', default=10), + resource_id=dict() + ) + argument_spec.update(REDFISH_COMMON_ARGUMENT_SPEC) module = AnsibleModule( - argument_spec=dict( - category=dict(required=True), - command=dict(required=True, type='list', elements='str'), - baseuri=dict(required=True), - username=dict(), - password=dict(no_log=True), - auth_token=dict(no_log=True), - timeout=dict(type='int', default=10), - resource_id=dict() - ), + argument_spec, required_together=[ ('username', 'password'), ], diff --git a/plugins/modules/idrac_redfish_config.py b/plugins/modules/idrac_redfish_config.py index 97d7a62d04..466e0b344c 100644 --- a/plugins/modules/idrac_redfish_config.py +++ b/plugins/modules/idrac_redfish_config.py @@ -16,6 +16,7 @@ description: - Builds Redfish URIs locally and sends them to remote iDRAC controllers to set or update a configuration attribute. extends_documentation_fragment: - community.general.attributes + - community.general.redfish attributes: check_mode: support: none @@ -71,6 +72,12 @@ options: - ID of the System, Manager or Chassis to modify. type: str version_added: '0.2.0' + validate_certs: + version_added: 10.6.0 + ca_path: + version_added: 10.6.0 + ciphers: + version_added: 10.6.0 author: "Jose Delarosa (@jose-delarosa)" """ @@ -154,7 +161,7 @@ from ansible.module_utils.common.validation import ( check_mutually_exclusive, check_required_arguments ) -from ansible_collections.community.general.plugins.module_utils.redfish_utils import RedfishUtils +from ansible_collections.community.general.plugins.module_utils.redfish_utils import RedfishUtils, REDFISH_COMMON_ARGUMENT_SPEC from ansible.module_utils.common.text.converters import to_native @@ -246,18 +253,20 @@ CATEGORY_COMMANDS_MUTUALLY_EXCLUSIVE = { def main(): result = {} + argument_spec = dict( + category=dict(required=True), + command=dict(required=True, type='list', elements='str'), + baseuri=dict(required=True), + username=dict(), + password=dict(no_log=True), + auth_token=dict(no_log=True), + manager_attributes=dict(type='dict', default={}), + timeout=dict(type='int', default=10), + resource_id=dict() + ) + argument_spec.update(REDFISH_COMMON_ARGUMENT_SPEC) module = AnsibleModule( - argument_spec=dict( - category=dict(required=True), - command=dict(required=True, type='list', elements='str'), - baseuri=dict(required=True), - username=dict(), - password=dict(no_log=True), - auth_token=dict(no_log=True), - manager_attributes=dict(type='dict', default={}), - timeout=dict(type='int', default=10), - resource_id=dict() - ), + argument_spec, required_together=[ ('username', 'password'), ], diff --git a/plugins/modules/idrac_redfish_info.py b/plugins/modules/idrac_redfish_info.py index 3a8ea8103f..4b9745f7c2 100644 --- a/plugins/modules/idrac_redfish_info.py +++ b/plugins/modules/idrac_redfish_info.py @@ -17,6 +17,7 @@ description: extends_documentation_fragment: - community.general.attributes - community.general.attributes.info_module + - community.general.redfish attributes: check_mode: version_added: 3.3.0 @@ -57,6 +58,12 @@ options: - Timeout in seconds for HTTP requests to iDRAC. default: 10 type: int + validate_certs: + version_added: 10.6.0 + ca_path: + version_added: 10.6.0 + ciphers: + version_added: 10.6.0 author: "Jose Delarosa (@jose-delarosa)" """ @@ -124,7 +131,7 @@ msg: """ from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.redfish_utils import RedfishUtils +from ansible_collections.community.general.plugins.module_utils.redfish_utils import RedfishUtils, REDFISH_COMMON_ARGUMENT_SPEC from ansible.module_utils.common.text.converters import to_native @@ -177,16 +184,18 @@ CATEGORY_COMMANDS_ALL = { def main(): result = {} + argument_spec = dict( + category=dict(required=True), + command=dict(required=True, type='list', elements='str'), + baseuri=dict(required=True), + username=dict(), + password=dict(no_log=True), + auth_token=dict(no_log=True), + timeout=dict(type='int', default=10) + ) + argument_spec.update(REDFISH_COMMON_ARGUMENT_SPEC) module = AnsibleModule( - argument_spec=dict( - category=dict(required=True), - command=dict(required=True, type='list', elements='str'), - baseuri=dict(required=True), - username=dict(), - password=dict(no_log=True), - auth_token=dict(no_log=True), - timeout=dict(type='int', default=10) - ), + argument_spec, required_together=[ ('username', 'password'), ], diff --git a/plugins/modules/ilo_redfish_command.py b/plugins/modules/ilo_redfish_command.py index 3e698fc049..52b08f8654 100644 --- a/plugins/modules/ilo_redfish_command.py +++ b/plugins/modules/ilo_redfish_command.py @@ -19,6 +19,7 @@ attributes: support: none extends_documentation_fragment: - community.general.attributes + - community.general.redfish options: category: required: true @@ -58,6 +59,12 @@ options: - Timeout in seconds for HTTP requests to iLO. default: 60 type: int + validate_certs: + version_added: 10.6.0 + ca_path: + version_added: 10.6.0 + ciphers: + version_added: 10.6.0 author: - Varni H P (@varini-hp) """ @@ -96,22 +103,25 @@ CATEGORY_COMMANDS_ALL = { } from ansible_collections.community.general.plugins.module_utils.ilo_redfish_utils import iLORedfishUtils +from ansible_collections.community.general.plugins.module_utils.redfish_utils import REDFISH_COMMON_ARGUMENT_SPEC from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.common.text.converters import to_native def main(): result = {} + argument_spec = dict( + category=dict(required=True, choices=list(CATEGORY_COMMANDS_ALL.keys())), + command=dict(required=True, type='list', elements='str'), + baseuri=dict(required=True), + timeout=dict(type="int", default=60), + username=dict(), + password=dict(no_log=True), + auth_token=dict(no_log=True) + ) + argument_spec.update(REDFISH_COMMON_ARGUMENT_SPEC) module = AnsibleModule( - argument_spec=dict( - category=dict(required=True, choices=list(CATEGORY_COMMANDS_ALL.keys())), - command=dict(required=True, type='list', elements='str'), - baseuri=dict(required=True), - timeout=dict(type="int", default=60), - username=dict(), - password=dict(no_log=True), - auth_token=dict(no_log=True) - ), + argument_spec, required_together=[ ('username', 'password'), ], diff --git a/plugins/modules/ilo_redfish_config.py b/plugins/modules/ilo_redfish_config.py index fdda339ab3..95c45590e1 100644 --- a/plugins/modules/ilo_redfish_config.py +++ b/plugins/modules/ilo_redfish_config.py @@ -15,6 +15,7 @@ description: - For use with HPE iLO operations that require Redfish OEM extensions. extends_documentation_fragment: - community.general.attributes + - community.general.redfish attributes: check_mode: support: none @@ -65,6 +66,12 @@ options: description: - Value of the attribute to be configured. type: str + validate_certs: + version_added: 10.6.0 + ca_path: + version_added: 10.6.0 + ciphers: + version_added: 10.6.0 author: - "Bhavya B (@bhavya06)" """ @@ -113,25 +120,28 @@ CATEGORY_COMMANDS_ALL = { } from ansible_collections.community.general.plugins.module_utils.ilo_redfish_utils import iLORedfishUtils +from ansible_collections.community.general.plugins.module_utils.redfish_utils import REDFISH_COMMON_ARGUMENT_SPEC from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.common.text.converters import to_native def main(): result = {} + argument_spec = dict( + category=dict(required=True, choices=list( + CATEGORY_COMMANDS_ALL.keys())), + command=dict(required=True, type='list', elements='str'), + baseuri=dict(required=True), + username=dict(), + password=dict(no_log=True), + auth_token=dict(no_log=True), + attribute_name=dict(required=True), + attribute_value=dict(type='str'), + timeout=dict(type='int', default=10) + ) + argument_spec.update(REDFISH_COMMON_ARGUMENT_SPEC) module = AnsibleModule( - argument_spec=dict( - category=dict(required=True, choices=list( - CATEGORY_COMMANDS_ALL.keys())), - command=dict(required=True, type='list', elements='str'), - baseuri=dict(required=True), - username=dict(), - password=dict(no_log=True), - auth_token=dict(no_log=True), - attribute_name=dict(required=True), - attribute_value=dict(type='str'), - timeout=dict(type='int', default=10) - ), + argument_spec, required_together=[ ('username', 'password'), ], diff --git a/plugins/modules/ilo_redfish_info.py b/plugins/modules/ilo_redfish_info.py index 3bd379e80a..daa43b004e 100644 --- a/plugins/modules/ilo_redfish_info.py +++ b/plugins/modules/ilo_redfish_info.py @@ -16,6 +16,7 @@ description: extends_documentation_fragment: - community.general.attributes - community.general.attributes.info_module + - community.general.redfish options: category: required: true @@ -51,6 +52,12 @@ options: - Timeout in seconds for HTTP requests to iLO. default: 10 type: int + validate_certs: + version_added: 10.6.0 + ca_path: + version_added: 10.6.0 + ciphers: + version_added: 10.6.0 author: - "Bhavya B (@bhavya06)" """ @@ -108,21 +115,24 @@ CATEGORY_COMMANDS_DEFAULT = { from ansible.module_utils.basic import AnsibleModule from ansible_collections.community.general.plugins.module_utils.ilo_redfish_utils import iLORedfishUtils +from ansible_collections.community.general.plugins.module_utils.redfish_utils import REDFISH_COMMON_ARGUMENT_SPEC def main(): result = {} category_list = [] + argument_spec = dict( + category=dict(required=True, type='list', elements='str'), + command=dict(required=True, type='list', elements='str'), + baseuri=dict(required=True), + username=dict(), + password=dict(no_log=True), + auth_token=dict(no_log=True), + timeout=dict(type='int', default=10) + ) + argument_spec.update(REDFISH_COMMON_ARGUMENT_SPEC) module = AnsibleModule( - argument_spec=dict( - category=dict(required=True, type='list', elements='str'), - command=dict(required=True, type='list', elements='str'), - baseuri=dict(required=True), - username=dict(), - password=dict(no_log=True), - auth_token=dict(no_log=True), - timeout=dict(type='int', default=10) - ), + argument_spec, required_together=[ ('username', 'password'), ], diff --git a/plugins/modules/irc.py b/plugins/modules/irc.py index cbeb3fafa0..36fc31fc37 100644 --- a/plugins/modules/irc.py +++ b/plugins/modules/irc.py @@ -124,7 +124,7 @@ EXAMPLES = r""" server: irc.example.net use_tls: true validate_certs: true - channel: #t1 + channel: '#t1' msg: Hello world - name: Send a message to an IRC channel @@ -134,7 +134,7 @@ EXAMPLES = r""" server: irc.example.net use_tls: true validate_certs: true - channel: #t1 + channel: '#t1' msg: 'All finished at {{ ansible_date_time.iso8601 }}' color: red nick: ansibleIRC @@ -146,7 +146,7 @@ EXAMPLES = r""" server: irc.example.net use_tls: true validate_certs: true - channel: #t1 + channel: '#t1' nick_to: - nick1 - nick2 diff --git a/plugins/modules/java_cert.py b/plugins/modules/java_cert.py index 8746c2d617..b75021fc57 100644 --- a/plugins/modules/java_cert.py +++ b/plugins/modules/java_cert.py @@ -315,12 +315,13 @@ def _export_public_cert_from_pkcs12(module, executable, pkcs_file, alias, passwo "-noprompt", "-keystore", pkcs_file, - "-alias", - alias, "-storetype", "pkcs12", "-rfc" ] + # Append optional alias + if alias: + export_cmd.extend(["-alias", alias]) (export_rc, export_stdout, export_err) = module.run_command(export_cmd, data=password, check_rc=False) if export_rc != 0: @@ -393,6 +394,10 @@ def import_pkcs12_path(module, executable, pkcs12_path, pkcs12_pass, pkcs12_alia keystore_path, keystore_pass, keystore_alias, keystore_type): ''' Import pkcs12 from path into keystore located on keystore_path as alias ''' + optional_aliases = { + "-destalias": keystore_alias, + "-srcalias": pkcs12_alias + } import_cmd = [ executable, "-importkeystore", @@ -401,13 +406,14 @@ def import_pkcs12_path(module, executable, pkcs12_path, pkcs12_pass, pkcs12_alia "pkcs12", "-srckeystore", pkcs12_path, - "-srcalias", - pkcs12_alias, "-destkeystore", keystore_path, - "-destalias", - keystore_alias ] + # Append optional aliases + for flag, value in optional_aliases.items(): + if value: + import_cmd.extend([flag, value]) + import_cmd += _get_keystore_type_keytool_parameters(keystore_type) secret_data = "%s\n%s" % (keystore_pass, pkcs12_pass) diff --git a/plugins/modules/keycloak_authentication.py b/plugins/modules/keycloak_authentication.py index a117c730e6..a0daf42b35 100644 --- a/plugins/modules/keycloak_authentication.py +++ b/plugins/modules/keycloak_authentication.py @@ -308,6 +308,8 @@ def create_or_update_executions(kc, config, realm='master'): } # add the execution configuration if new_exec["authenticationConfig"] is not None: + if "authenticationConfig" in execution and "id" in execution["authenticationConfig"]: + kc.delete_authentication_config(execution["authenticationConfig"]["id"], realm=realm) kc.add_authenticationConfig_to_execution(updated_exec["id"], new_exec["authenticationConfig"], realm=realm) for key in new_exec: # remove unwanted key for the next API call diff --git a/plugins/modules/keycloak_client.py b/plugins/modules/keycloak_client.py index 70ff21a915..e7a2de7c85 100644 --- a/plugins/modules/keycloak_client.py +++ b/plugins/modules/keycloak_client.py @@ -775,6 +775,13 @@ def normalise_cr(clientrep, remove_ids=False): return clientrep +def normalize_kc_resp(clientrep): + # kc drops the variable 'authorizationServicesEnabled' if set to false + # to minimize diff/changes we set it to false if not set by kc + if clientrep and 'authorizationServicesEnabled' not in clientrep: + clientrep['authorizationServicesEnabled'] = False + + def sanitize_cr(clientrep): """ Removes probably sensitive details from a client representation. @@ -966,10 +973,7 @@ def main(): else: before_client = kc.get_client_by_id(cid, realm=realm) - # kc drops the variable 'authorizationServicesEnabled' if set to false - # to minimize diff/changes we set it to false if not set by kc - if before_client and 'authorizationServicesEnabled' not in before_client: - before_client['authorizationServicesEnabled'] = False + normalize_kc_resp(before_client) if before_client is None: before_client = {} @@ -1050,6 +1054,8 @@ def main(): kc.update_client(cid, desired_client, realm=realm) after_client = kc.get_client_by_id(cid, realm=realm) + normalize_kc_resp(after_client) + if before_client == after_client: result['changed'] = False if module._diff: diff --git a/plugins/modules/keycloak_user.py b/plugins/modules/keycloak_user.py index 9c2c110903..71e793ae21 100644 --- a/plugins/modules/keycloak_user.py +++ b/plugins/modules/keycloak_user.py @@ -101,6 +101,9 @@ options: groups: description: - List of groups for the user. + Groups can be referenced by their name, like V(staff), or their path, like V(/staff/engineering). + The path syntax allows you to reference subgroups, which is not possible otherwise. + This is possible since community.general 10.6.0. type: list elements: dict default: [] diff --git a/plugins/modules/lxd_container.py b/plugins/modules/lxd_container.py index 4fc0e4293d..f347df7492 100644 --- a/plugins/modules/lxd_container.py +++ b/plugins/modules/lxd_container.py @@ -342,7 +342,7 @@ EXAMPLES = r""" # nodes - 'node01' and 'node02'. In 'target:', 'node01' and 'node02' are names of LXD cluster # members that LXD cluster recognizes, not ansible inventory names, see: 'lxc cluster list'. # LXD API calls can be made to any LXD member, in this example, we send API requests to -#'node01.example.com', which matches ansible inventory name. +# 'node01.example.com', which matches ansible inventory name. - hosts: node01.example.com tasks: - name: Create LXD container diff --git a/plugins/modules/nmcli.py b/plugins/modules/nmcli.py index 3c895e76ec..751f9dd948 100644 --- a/plugins/modules/nmcli.py +++ b/plugins/modules/nmcli.py @@ -99,6 +99,11 @@ options: type: str choices: [datagram, connected] version_added: 5.8.0 + infiniband_mac: + description: + - MAC address of the Infiniband IPoIB devices. + type: str + version_added: 10.6.0 slave_type: description: - Type of the device of this slave's master connection (for example V(bond)). @@ -1222,7 +1227,6 @@ EXAMPLES = r""" # ``` - ## playbook-add.yml example - hosts: openstack-stage @@ -1259,7 +1263,7 @@ EXAMPLES = r""" with_items: - '{{ nmcli_team_slave }}' -###### Working with all cloud nodes - Bonding +##### Working with all cloud nodes - Bonding - name: Try nmcli add bond - conn_name only & ip4 gw4 mode community.general.nmcli: type: bond @@ -1764,6 +1768,7 @@ class Nmcli(object): self.wireguard = module.params['wireguard'] self.vpn = module.params['vpn'] self.transport_mode = module.params['transport_mode'] + self.infiniband_mac = module.params['infiniband_mac'] self.sriov = module.params['sriov'] if self.method4: @@ -2034,6 +2039,8 @@ class Nmcli(object): options.update({ 'infiniband.transport-mode': self.transport_mode, }) + if self.infiniband_mac: + options['infiniband.mac-address'] = self.infiniband_mac elif self.type == 'vrf': options.update({ 'table': self.table, @@ -2708,9 +2715,12 @@ def main(): tap=dict(type='bool'))), wireguard=dict(type='dict'), vpn=dict(type='dict'), - transport_mode=dict(type='str', choices=['datagram', 'connected']), sriov=dict(type='dict'), table=dict(type='int'), + # infiniband specific vars + transport_mode=dict(type='str', choices=['datagram', 'connected']), + infiniband_mac=dict(type='str'), + ), mutually_exclusive=[['never_default4', 'gw4'], ['routes4_extended', 'routes4'], diff --git a/plugins/modules/one_vm.py b/plugins/modules/one_vm.py index 0b6d27aae9..2139da5d4c 100644 --- a/plugins/modules/one_vm.py +++ b/plugins/modules/one_vm.py @@ -2,6 +2,7 @@ # -*- coding: utf-8 -*- # Copyright (c) 2017, Milan Ilic # Copyright (c) 2019, Jan Meerkamp +# Copyright (c) 2025, Tom Paine # GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) # SPDX-License-Identifier: GPL-3.0-or-later @@ -194,6 +195,16 @@ options: - When O(instance_ids) is provided, updates running VMs with the C(updateconf) API call. - When new VMs are being created, emulates the C(updateconf) API call using direct template merge. - Allows for complete modifications of the C(CONTEXT) attribute. + - "Supported attributes include:" + - B(BACKUP_CONFIG:) V(BACKUP_VOLATILE), V(FS_FREEZE), V(INCREMENT_MODE), V(KEEP_LAST), V(MODE); + - B(CONTEXT:) (Any value, except V(ETH*). Variable substitution will be made); + - B(CPU_MODEL:) V(FEATURES), V(MODEL); + - B(FEATURES:) V(ACPI), V(APIC), V(GUEST_AGENT), V(HYPERV), V(IOTHREADS), V(LOCALTIME), V(PAE), V(VIRTIO_BLK_QUEUES), V(VIRTIO_SCSI_QUEUES); + - B(GRAPHICS:) V(COMMAND), V(KEYMAP), V(LISTEN), V(PASSWD), V(PORT), V(TYPE); + - B(INPUT:) V(BUS), V(TYPE); + - B(OS:) V(ARCH), V(BOOT), V(BOOTLOADER), V(FIRMWARE), V(INITRD), V(KERNEL), V(KERNEL_CMD), V(MACHINE), V(ROOT), V(SD_DISK_BUS), V(UUID); + - B(RAW:) V(DATA), V(DATA_VMX), V(TYPE), V(VALIDATE); + - B(VIDEO:) V(ATS), V(IOMMU), V(RESOLUTION), V(TYPE), V(VRAM). type: dict version_added: 6.3.0 author: @@ -658,13 +669,17 @@ from ansible.module_utils.common.dict_transformations import dict_merge from ansible_collections.community.general.plugins.module_utils.opennebula import flatten, render +# Updateconf attributes documentation: https://docs.opennebula.io/6.10/integration_and_development/system_interfaces/api.html#one-vm-updateconf UPDATECONF_ATTRIBUTES = { - "OS": ["ARCH", "MACHINE", "KERNEL", "INITRD", "BOOTLOADER", "BOOT", "SD_DISK_BUS", "UUID"], - "FEATURES": ["ACPI", "PAE", "APIC", "LOCALTIME", "HYPERV", "GUEST_AGENT"], + "OS": ["ARCH", "MACHINE", "KERNEL", "INITRD", "BOOTLOADER", "BOOT", "SD_DISK_BUS", "UUID", "FIRMWARE"], + "CPU_MODEL": ["MODEL", "FEATURES"], + "FEATURES": ["ACPI", "PAE", "APIC", "LOCALTIME", "HYPERV", "GUEST_AGENT", "VIRTIO_BLK_QUEUES", "VIRTIO_SCSI_QUEUES", "IOTHREADS"], "INPUT": ["TYPE", "BUS"], - "GRAPHICS": ["TYPE", "LISTEN", "PASSWD", "KEYMAP"], - "RAW": ["DATA", "DATA_VMX", "TYPE"], + "GRAPHICS": ["TYPE", "LISTEN", "PORT", "PASSWD", "KEYMAP", "COMMAND"], + "VIDEO": ["ATS", "IOMMU", "RESOLUTION", "TYPE", "VRAM"], + "RAW": ["DATA", "DATA_VMX", "TYPE", "VALIDATE"], "CONTEXT": [], + "BACKUP_CONFIG": ["FS_FREEZE", "KEEP_LAST", "BACKUP_VOLATILE", "MODE", "INCREMENT_MODE"], } diff --git a/plugins/modules/proxmox.py b/plugins/modules/proxmox.py index 035de02521..9dd4b13d5c 100644 --- a/plugins/modules/proxmox.py +++ b/plugins/modules/proxmox.py @@ -1696,7 +1696,7 @@ class ProxmoxLxcAnsible(ProxmoxAnsible): def validate_tags(self, tags): """Check if the specified tags are valid.""" - re_tag = re.compile(r"^[a-z0-9_][a-z0-9_\-\+\.]*$") + re_tag = re.compile(r"^[a-zA-Z0-9_][a-zA-Z0-9_\-\+\.]*$") for tag in tags: if not re_tag.match(tag): self.module.fail_json(msg="%s is not a valid tag" % tag) diff --git a/plugins/modules/proxmox_disk.py b/plugins/modules/proxmox_disk.py index 8bf8e96108..75eb0001e6 100644 --- a/plugins/modules/proxmox_disk.py +++ b/plugins/modules/proxmox_disk.py @@ -554,6 +554,8 @@ class ProxmoxDiskAnsible(ProxmoxAnsible): ok_str = "CD-ROM was created on %s bus in VM %s" else: config_str = self.module.params["storage"] + if not config_str: + self.module.fail_json(msg="The storage option must be specified.") if self.module.params.get("media") != "cdrom": config_str += ":%s" % (self.module.params["size"]) ok_str = "Disk %s created in VM %s" diff --git a/plugins/modules/proxmox_kvm.py b/plugins/modules/proxmox_kvm.py index 714633eaa2..c159ced6e6 100644 --- a/plugins/modules/proxmox_kvm.py +++ b/plugins/modules/proxmox_kvm.py @@ -1126,7 +1126,7 @@ class ProxmoxKvmAnsible(ProxmoxAnsible): # VM tags are expected to be valid and presented as a comma/semi-colon delimited string if 'tags' in kwargs: - re_tag = re.compile(r'^[a-z0-9_][a-z0-9_\-\+\.]*$') + re_tag = re.compile(r'^[a-zA-Z0-9_][a-zA-Z0-9_\-\+\.]*$') for tag in kwargs['tags']: if not re_tag.match(tag): self.module.fail_json(msg='%s is not a valid tag' % tag) diff --git a/plugins/modules/redfish_command.py b/plugins/modules/redfish_command.py index 545506f924..25f92bd1f7 100644 --- a/plugins/modules/redfish_command.py +++ b/plugins/modules/redfish_command.py @@ -18,6 +18,7 @@ description: - Manages system power ex. on, off, graceful and forced reboot. extends_documentation_fragment: - community.general.attributes + - community.general.redfish attributes: check_mode: support: none @@ -324,16 +325,11 @@ options: default: 120 version_added: 9.1.0 ciphers: - required: false - description: - - SSL/TLS Ciphers to use for the request. - - When a list is provided, all ciphers are joined in order with V(:). - - See the L(OpenSSL Cipher List Format,https://www.openssl.org/docs/manmaster/man1/openssl-ciphers.html#CIPHER-LIST-FORMAT) - for more details. - - The available ciphers is dependent on the Python and OpenSSL/LibreSSL versions. - type: list - elements: str version_added: 9.2.0 + validate_certs: + version_added: 10.6.0 + ca_path: + version_added: 10.6.0 author: - "Jose Delarosa (@jose-delarosa)" @@ -846,7 +842,7 @@ return_values: """ from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.redfish_utils import RedfishUtils +from ansible_collections.community.general.plugins.module_utils.redfish_utils import RedfishUtils, REDFISH_COMMON_ARGUMENT_SPEC from ansible.module_utils.common.text.converters import to_native @@ -873,67 +869,68 @@ CATEGORY_COMMANDS_ALL = { def main(): result = {} return_values = {} - module = AnsibleModule( - argument_spec=dict( - category=dict(required=True), - command=dict(required=True, type='list', elements='str'), - baseuri=dict(required=True), - username=dict(), - password=dict(no_log=True), - auth_token=dict(no_log=True), - session_uri=dict(), - id=dict(aliases=["account_id"]), - new_username=dict(aliases=["account_username"]), - new_password=dict(aliases=["account_password"], no_log=True), - roleid=dict(aliases=["account_roleid"]), - account_types=dict(type='list', elements='str', aliases=["account_accounttypes"]), - oem_account_types=dict(type='list', elements='str', aliases=["account_oemaccounttypes"]), - update_username=dict(type='str', aliases=["account_updatename"]), - account_properties=dict(type='dict', default={}), - bootdevice=dict(), - timeout=dict(type='int', default=60), - uefi_target=dict(), - boot_next=dict(), - boot_override_mode=dict(choices=['Legacy', 'UEFI']), - resource_id=dict(), - update_image_uri=dict(), - update_image_file=dict(type='path'), - update_protocol=dict(), - update_targets=dict(type='list', elements='str', default=[]), - update_oem_params=dict(type='dict'), - update_custom_oem_header=dict(type='str'), - update_custom_oem_mime_type=dict(type='str'), - update_custom_oem_params=dict(type='raw'), - update_creds=dict( - type='dict', - options=dict( - username=dict(), - password=dict(no_log=True) - ) - ), - update_apply_time=dict(choices=['Immediate', 'OnReset', 'AtMaintenanceWindowStart', - 'InMaintenanceWindowOnReset', 'OnStartUpdateRequest']), - update_handle=dict(), - virtual_media=dict( - type='dict', - options=dict( - media_types=dict(type='list', elements='str', default=[]), - image_url=dict(), - inserted=dict(type='bool', default=True), - write_protected=dict(type='bool', default=True), - username=dict(), - password=dict(no_log=True), - transfer_protocol_type=dict(), - transfer_method=dict(), - ) - ), - strip_etag_quotes=dict(type='bool', default=False), - reset_to_defaults_mode=dict(choices=['ResetAll', 'PreserveNetworkAndUsers', 'PreserveNetwork']), - bios_attributes=dict(type="dict"), - wait=dict(type='bool', default=False), - wait_timeout=dict(type='int', default=120), - ciphers=dict(type='list', elements='str'), + argument_spec = dict( + category=dict(required=True), + command=dict(required=True, type='list', elements='str'), + baseuri=dict(required=True), + username=dict(), + password=dict(no_log=True), + auth_token=dict(no_log=True), + session_uri=dict(), + id=dict(aliases=["account_id"]), + new_username=dict(aliases=["account_username"]), + new_password=dict(aliases=["account_password"], no_log=True), + roleid=dict(aliases=["account_roleid"]), + account_types=dict(type='list', elements='str', aliases=["account_accounttypes"]), + oem_account_types=dict(type='list', elements='str', aliases=["account_oemaccounttypes"]), + update_username=dict(type='str', aliases=["account_updatename"]), + account_properties=dict(type='dict', default={}), + bootdevice=dict(), + timeout=dict(type='int', default=60), + uefi_target=dict(), + boot_next=dict(), + boot_override_mode=dict(choices=['Legacy', 'UEFI']), + resource_id=dict(), + update_image_uri=dict(), + update_image_file=dict(type='path'), + update_protocol=dict(), + update_targets=dict(type='list', elements='str', default=[]), + update_oem_params=dict(type='dict'), + update_custom_oem_header=dict(type='str'), + update_custom_oem_mime_type=dict(type='str'), + update_custom_oem_params=dict(type='raw'), + update_creds=dict( + type='dict', + options=dict( + username=dict(), + password=dict(no_log=True) + ) ), + update_apply_time=dict(choices=['Immediate', 'OnReset', 'AtMaintenanceWindowStart', + 'InMaintenanceWindowOnReset', 'OnStartUpdateRequest']), + update_handle=dict(), + virtual_media=dict( + type='dict', + options=dict( + media_types=dict(type='list', elements='str', default=[]), + image_url=dict(), + inserted=dict(type='bool', default=True), + write_protected=dict(type='bool', default=True), + username=dict(), + password=dict(no_log=True), + transfer_protocol_type=dict(), + transfer_method=dict(), + ) + ), + strip_etag_quotes=dict(type='bool', default=False), + reset_to_defaults_mode=dict(choices=['ResetAll', 'PreserveNetworkAndUsers', 'PreserveNetwork']), + bios_attributes=dict(type="dict"), + wait=dict(type='bool', default=False), + wait_timeout=dict(type='int', default=120), + ) + argument_spec.update(REDFISH_COMMON_ARGUMENT_SPEC) + module = AnsibleModule( + argument_spec, required_together=[ ('username', 'password'), ('update_custom_oem_header', 'update_custom_oem_params'), @@ -1006,14 +1003,10 @@ def main(): # BIOS Attributes options bios_attributes = module.params['bios_attributes'] - # ciphers - ciphers = module.params['ciphers'] - # Build root URI root_uri = "https://" + module.params['baseuri'] rf_utils = RedfishUtils(creds, root_uri, timeout, module, - resource_id=resource_id, data_modification=True, strip_etag_quotes=strip_etag_quotes, - ciphers=ciphers) + resource_id=resource_id, data_modification=True, strip_etag_quotes=strip_etag_quotes) # Check that Category is valid if category not in CATEGORY_COMMANDS_ALL: diff --git a/plugins/modules/redfish_config.py b/plugins/modules/redfish_config.py index 817cc18787..8700d4b8de 100644 --- a/plugins/modules/redfish_config.py +++ b/plugins/modules/redfish_config.py @@ -17,6 +17,7 @@ description: - Manages OOB controller configuration settings. extends_documentation_fragment: - community.general.attributes + - community.general.redfish attributes: check_mode: support: none @@ -181,16 +182,11 @@ options: - LastState version_added: '10.5.0' ciphers: - required: false - description: - - SSL/TLS Ciphers to use for the request. - - When a list is provided, all ciphers are joined in order with V(:). - - See the L(OpenSSL Cipher List Format,https://www.openssl.org/docs/manmaster/man1/openssl-ciphers.html#CIPHER-LIST-FORMAT) - for more details. - - The available ciphers is dependent on the Python and OpenSSL/LibreSSL versions. - type: list - elements: str version_added: 9.2.0 + validate_certs: + version_added: 10.6.0 + ca_path: + version_added: 10.6.0 author: - "Jose Delarosa (@jose-delarosa)" @@ -395,7 +391,7 @@ msg: """ from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.redfish_utils import RedfishUtils +from ansible_collections.community.general.plugins.module_utils.redfish_utils import RedfishUtils, REDFISH_COMMON_ARGUMENT_SPEC from ansible.module_utils.common.text.converters import to_native @@ -411,40 +407,41 @@ CATEGORY_COMMANDS_ALL = { def main(): result = {} - module = AnsibleModule( - argument_spec=dict( - category=dict(required=True), - command=dict(required=True, type='list', elements='str'), - baseuri=dict(required=True), - username=dict(), - password=dict(no_log=True), - auth_token=dict(no_log=True), - bios_attributes=dict(type='dict', default={}), - timeout=dict(type='int', default=60), - boot_order=dict(type='list', elements='str', default=[]), - network_protocols=dict( - type='dict', - default={} - ), - resource_id=dict(), - service_id=dict(), - nic_addr=dict(default='null'), - nic_config=dict( - type='dict', - default={} - ), - strip_etag_quotes=dict(type='bool', default=False), - hostinterface_config=dict(type='dict', default={}), - hostinterface_id=dict(), - sessions_config=dict(type='dict', default={}), - storage_subsystem_id=dict(type='str', default=''), - storage_none_volume_deletion=dict(type='bool', default=False), - volume_ids=dict(type='list', default=[], elements='str'), - secure_boot_enable=dict(type='bool', default=True), - volume_details=dict(type='dict', default={}), - power_restore_policy=dict(choices=['AlwaysOn', 'AlwaysOff', 'LastState']), - ciphers=dict(type='list', elements='str'), + argument_spec = dict( + category=dict(required=True), + command=dict(required=True, type='list', elements='str'), + baseuri=dict(required=True), + username=dict(), + password=dict(no_log=True), + auth_token=dict(no_log=True), + bios_attributes=dict(type='dict', default={}), + timeout=dict(type='int', default=60), + boot_order=dict(type='list', elements='str', default=[]), + network_protocols=dict( + type='dict', + default={} ), + resource_id=dict(), + service_id=dict(), + nic_addr=dict(default='null'), + nic_config=dict( + type='dict', + default={} + ), + strip_etag_quotes=dict(type='bool', default=False), + hostinterface_config=dict(type='dict', default={}), + hostinterface_id=dict(), + sessions_config=dict(type='dict', default={}), + storage_subsystem_id=dict(type='str', default=''), + storage_none_volume_deletion=dict(type='bool', default=False), + volume_ids=dict(type='list', default=[], elements='str'), + secure_boot_enable=dict(type='bool', default=True), + volume_details=dict(type='dict', default={}), + power_restore_policy=dict(choices=['AlwaysOn', 'AlwaysOff', 'LastState']), + ) + argument_spec.update(REDFISH_COMMON_ARGUMENT_SPEC) + module = AnsibleModule( + argument_spec, required_together=[ ('username', 'password'), ], @@ -511,14 +508,10 @@ def main(): # Power Restore Policy power_restore_policy = module.params['power_restore_policy'] - # ciphers - ciphers = module.params['ciphers'] - # Build root URI root_uri = "https://" + module.params['baseuri'] rf_utils = RedfishUtils(creds, root_uri, timeout, module, - resource_id=resource_id, data_modification=True, strip_etag_quotes=strip_etag_quotes, - ciphers=ciphers) + resource_id=resource_id, data_modification=True, strip_etag_quotes=strip_etag_quotes) # Check that Category is valid if category not in CATEGORY_COMMANDS_ALL: diff --git a/plugins/modules/redfish_info.py b/plugins/modules/redfish_info.py index 66d41883e5..fb87bef8c6 100644 --- a/plugins/modules/redfish_info.py +++ b/plugins/modules/redfish_info.py @@ -17,6 +17,7 @@ description: extends_documentation_fragment: - community.general.attributes - community.general.attributes.info_module + - community.general.redfish attributes: check_mode: version_added: 3.3.0 @@ -71,16 +72,11 @@ options: type: str version_added: '6.1.0' ciphers: - required: false - description: - - SSL/TLS Ciphers to use for the request. - - When a list is provided, all ciphers are joined in order with V(:). - - See the L(OpenSSL Cipher List Format,https://www.openssl.org/docs/manmaster/man1/openssl-ciphers.html#CIPHER-LIST-FORMAT) - for more details. - - The available ciphers is dependent on the Python and OpenSSL/LibreSSL versions. - type: list - elements: str version_added: 9.2.0 + validate_certs: + version_added: 10.6.0 + ca_path: + version_added: 10.6.0 author: "Jose Delarosa (@jose-delarosa)" """ @@ -404,7 +400,7 @@ result: """ from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.redfish_utils import RedfishUtils +from ansible_collections.community.general.plugins.module_utils.redfish_utils import RedfishUtils, REDFISH_COMMON_ARGUMENT_SPEC CATEGORY_COMMANDS_ALL = { "Systems": ["GetSystemInventory", "GetPsuInventory", "GetCpuInventory", @@ -437,19 +433,20 @@ CATEGORY_COMMANDS_DEFAULT = { def main(): result = {} category_list = [] + argument_spec = dict( + category=dict(type='list', elements='str', default=['Systems']), + command=dict(type='list', elements='str'), + baseuri=dict(required=True), + username=dict(), + password=dict(no_log=True), + auth_token=dict(no_log=True), + timeout=dict(type='int', default=60), + update_handle=dict(), + manager=dict(), + ) + argument_spec.update(REDFISH_COMMON_ARGUMENT_SPEC) module = AnsibleModule( - argument_spec=dict( - category=dict(type='list', elements='str', default=['Systems']), - command=dict(type='list', elements='str'), - baseuri=dict(required=True), - username=dict(), - password=dict(no_log=True), - auth_token=dict(no_log=True), - timeout=dict(type='int', default=60), - update_handle=dict(), - manager=dict(), - ciphers=dict(type='list', elements='str'), - ), + argument_spec, required_together=[ ('username', 'password'), ], @@ -476,12 +473,9 @@ def main(): # manager manager = module.params['manager'] - # ciphers - ciphers = module.params['ciphers'] - # Build root URI root_uri = "https://" + module.params['baseuri'] - rf_utils = RedfishUtils(creds, root_uri, timeout, module, ciphers=ciphers) + rf_utils = RedfishUtils(creds, root_uri, timeout, module) # Build Category list if "all" in module.params['category']: diff --git a/plugins/modules/rocketchat.py b/plugins/modules/rocketchat.py index 91192875dc..c09d75ace2 100644 --- a/plugins/modules/rocketchat.py +++ b/plugins/modules/rocketchat.py @@ -206,7 +206,7 @@ def build_payload_for_rocketchat(module, text, channel, username, icon_url, icon payload = module.jsonify(payload) if is_pre740: - payload = "payload=" + module.jsonify(payload) + payload = "payload=" + payload return payload diff --git a/plugins/modules/rpm_ostree_pkg.py b/plugins/modules/rpm_ostree_pkg.py index db084c9091..652801ca67 100644 --- a/plugins/modules/rpm_ostree_pkg.py +++ b/plugins/modules/rpm_ostree_pkg.py @@ -78,7 +78,7 @@ EXAMPLES = r""" register: rpm_ostree_pkg until: rpm_ostree_pkg is not failed retries: 10 - dealy: 30 + delay: 30 """ RETURN = r""" diff --git a/plugins/modules/sysrc.py b/plugins/modules/sysrc.py index d93bccd620..3387483e46 100644 --- a/plugins/modules/sysrc.py +++ b/plugins/modules/sysrc.py @@ -122,14 +122,19 @@ class Sysrc(object): return err.find("unknown variable") > 0 or out.find("unknown variable") > 0 def exists(self): - # sysrc doesn't really use exit codes - (rc, out, err) = self.run_sysrc(self.name) + """ + Tests whether the name is in the file. If parameter value is defined, + then tests whether name=value is in the file. These tests are necessary + because sysrc doesn't use exit codes. Instead, let sysrc read the + file's content and create a dictionary comprising the configuration. + Use this dictionary to preform the tests. + """ + (rc, out, err) = self.run_sysrc('-e', '-a') + conf = dict([i.split('=') for i in out.splitlines()]) if self.value is None: - regex = "%s: " % re.escape(self.name) + return self.name in conf else: - regex = "%s: %s$" % (re.escape(self.name), re.escape(self.value)) - - return not self.has_unknown_variable(out, err) and re.match(regex, out) is not None + return self.name in conf and conf[self.name] == '"%s"' % self.value def contains(self): (rc, out, err) = self.run_sysrc('-n', self.name) @@ -142,13 +147,10 @@ class Sysrc(object): if self.exists(): return - if self.module.check_mode: - self.changed = True - return + if not self.module.check_mode: + (rc, out, err) = self.run_sysrc("%s=%s" % (self.name, self.value)) - (rc, out, err) = self.run_sysrc("%s=%s" % (self.name, self.value)) - if out.find("%s:" % self.name) == 0 and re.search("-> %s$" % re.escape(self.value), out) is not None: - self.changed = True + self.changed = True def absent(self): if not self.exists(): diff --git a/plugins/modules/wdc_redfish_command.py b/plugins/modules/wdc_redfish_command.py index 680bd4b3f9..20afa8add1 100644 --- a/plugins/modules/wdc_redfish_command.py +++ b/plugins/modules/wdc_redfish_command.py @@ -17,6 +17,7 @@ description: - Manages OOB controller firmware. For example, Firmware Activate, Update and Activate. extends_documentation_fragment: - community.general.attributes + - community.general.redfish attributes: check_mode: support: full @@ -87,6 +88,12 @@ options: description: - The password for retrieving the update image. type: str + validate_certs: + version_added: 10.6.0 + ca_path: + version_added: 10.6.0 + ciphers: + version_added: 10.6.0 notes: - In the inventory, you can specify baseuri or ioms. See the EXAMPLES section. - Ioms is a list of FQDNs for the enclosure's IOMs. @@ -195,6 +202,7 @@ msg: """ from ansible_collections.community.general.plugins.module_utils.wdc_redfish_utils import WdcRedfishUtils +from ansible_collections.community.general.plugins.module_utils.redfish_utils import REDFISH_COMMON_ARGUMENT_SPEC from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.common.text.converters import to_native @@ -213,26 +221,28 @@ CATEGORY_COMMANDS_ALL = { def main(): - module = AnsibleModule( - argument_spec=dict( - category=dict(required=True), - command=dict(required=True, type='list', elements='str'), - ioms=dict(type='list', elements='str'), - baseuri=dict(), - username=dict(), - password=dict(no_log=True), - auth_token=dict(no_log=True), - update_creds=dict( - type='dict', - options=dict( - username=dict(), - password=dict(no_log=True) - ) - ), - resource_id=dict(), - update_image_uri=dict(), - timeout=dict(type='int', default=10) + argument_spec = dict( + category=dict(required=True), + command=dict(required=True, type='list', elements='str'), + ioms=dict(type='list', elements='str'), + baseuri=dict(), + username=dict(), + password=dict(no_log=True), + auth_token=dict(no_log=True), + update_creds=dict( + type='dict', + options=dict( + username=dict(), + password=dict(no_log=True) + ) ), + resource_id=dict(), + update_image_uri=dict(), + timeout=dict(type='int', default=10) + ) + argument_spec.update(REDFISH_COMMON_ARGUMENT_SPEC) + module = AnsibleModule( + argument_spec, required_together=[ ('username', 'password'), ], diff --git a/plugins/modules/wdc_redfish_info.py b/plugins/modules/wdc_redfish_info.py index caaa9c7fd9..19a513c00d 100644 --- a/plugins/modules/wdc_redfish_info.py +++ b/plugins/modules/wdc_redfish_info.py @@ -17,6 +17,7 @@ description: extends_documentation_fragment: - community.general.attributes - community.general.attributes.info_module + - community.general.redfish options: category: required: true @@ -55,6 +56,12 @@ options: - Timeout in seconds for URL requests to OOB controller. default: 10 type: int + validate_certs: + version_added: 10.6.0 + ca_path: + version_added: 10.6.0 + ciphers: + version_added: 10.6.0 notes: - In the inventory, you can specify baseuri or ioms. See the EXAMPLES section. @@ -118,6 +125,7 @@ StatusCode: from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.common.text.converters import to_native from ansible_collections.community.general.plugins.module_utils.wdc_redfish_utils import WdcRedfishUtils +from ansible_collections.community.general.plugins.module_utils.redfish_utils import REDFISH_COMMON_ARGUMENT_SPEC CATEGORY_COMMANDS_ALL = { "Update": ["SimpleUpdateStatus"] @@ -126,17 +134,19 @@ CATEGORY_COMMANDS_ALL = { def main(): result = {} + argument_spec = dict( + category=dict(required=True), + command=dict(required=True, type='list', elements='str'), + ioms=dict(type='list', elements='str'), + baseuri=dict(), + username=dict(), + password=dict(no_log=True), + auth_token=dict(no_log=True), + timeout=dict(type='int', default=10) + ) + argument_spec.update(REDFISH_COMMON_ARGUMENT_SPEC) module = AnsibleModule( - argument_spec=dict( - category=dict(required=True), - command=dict(required=True, type='list', elements='str'), - ioms=dict(type='list', elements='str'), - baseuri=dict(), - username=dict(), - password=dict(no_log=True), - auth_token=dict(no_log=True), - timeout=dict(type='int', default=10) - ), + argument_spec, required_together=[ ('username', 'password'), ], diff --git a/plugins/modules/xcc_redfish_command.py b/plugins/modules/xcc_redfish_command.py index 509c70e4e9..8e5cbf7d3e 100644 --- a/plugins/modules/xcc_redfish_command.py +++ b/plugins/modules/xcc_redfish_command.py @@ -21,6 +21,7 @@ description: - Supports performing an action using POST method. extends_documentation_fragment: - community.general.attributes + - community.general.redfish attributes: check_mode: support: none @@ -117,6 +118,12 @@ options: description: - The request body to patch or post. type: dict + validate_certs: + version_added: 10.6.0 + ca_path: + version_added: 10.6.0 + ciphers: + version_added: 10.6.0 author: "Yuyan Pan (@panyy3)" """ @@ -297,7 +304,7 @@ redfish_facts: from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.common.text.converters import to_native -from ansible_collections.community.general.plugins.module_utils.redfish_utils import RedfishUtils +from ansible_collections.community.general.plugins.module_utils.redfish_utils import RedfishUtils, REDFISH_COMMON_ARGUMENT_SPEC class XCCRedfishUtils(RedfishUtils): @@ -678,34 +685,36 @@ CATEGORY_COMMANDS_ALL = { def main(): result = {} - module = AnsibleModule( - argument_spec=dict( - category=dict(required=True), - command=dict(required=True, type='list', elements='str'), - baseuri=dict(required=True), - username=dict(), - password=dict(no_log=True), - auth_token=dict(no_log=True), - timeout=dict(type='int', default=10), - resource_id=dict(), - virtual_media=dict( - type='dict', - options=dict( - media_types=dict(type='list', elements='str', default=[]), - image_url=dict(), - inserted=dict(type='bool', default=True), - write_protected=dict(type='bool', default=True), - username=dict(), - password=dict(no_log=True), - transfer_protocol_type=dict(), - transfer_method=dict(), - ) - ), - resource_uri=dict(), - request_body=dict( - type='dict', - ), + argument_spec = dict( + category=dict(required=True), + command=dict(required=True, type='list', elements='str'), + baseuri=dict(required=True), + username=dict(), + password=dict(no_log=True), + auth_token=dict(no_log=True), + timeout=dict(type='int', default=10), + resource_id=dict(), + virtual_media=dict( + type='dict', + options=dict( + media_types=dict(type='list', elements='str', default=[]), + image_url=dict(), + inserted=dict(type='bool', default=True), + write_protected=dict(type='bool', default=True), + username=dict(), + password=dict(no_log=True), + transfer_protocol_type=dict(), + transfer_method=dict(), + ) ), + resource_uri=dict(), + request_body=dict( + type='dict', + ), + ) + argument_spec.update(REDFISH_COMMON_ARGUMENT_SPEC) + module = AnsibleModule( + argument_spec, required_together=[ ('username', 'password'), ], diff --git a/plugins/modules/zypper.py b/plugins/modules/zypper.py index fb3be3a5d0..8ed359d32e 100644 --- a/plugins/modules/zypper.py +++ b/plugins/modules/zypper.py @@ -158,6 +158,13 @@ options: description: - Adds C(--quiet) option to I(zypper) install/update command. version_added: '10.2.0' + skip_post_errors: + type: bool + required: false + default: false + description: + - When set to V(true), ignore I(zypper) return code 107 (post install script errors). + version_added: '10.6.0' notes: - When used with a C(loop:) each package is processed individually, it is much more efficient to pass the list directly to the O(name) option. @@ -248,6 +255,12 @@ EXAMPLES = r""" state: present environment: ZYPP_LOCK_TIMEOUT: 20 + +- name: Install the package with post-install error without failing + community.general.zypper: + name: + state: present + skip_post_errors: true """ import os.path @@ -344,12 +357,13 @@ def parse_zypper_xml(m, cmd, fail_not_found=True, packages=None): m.fail_json(msg=errmsg, rc=rc, stdout=stdout, stderr=stderr, cmd=cmd) else: return {}, rc, stdout, stderr - elif rc in [0, 102, 103, 106]: + elif rc in [0, 102, 103, 106, 107]: # zypper exit codes # 0: success # 106: signature verification failed # 102: ZYPPER_EXIT_INF_REBOOT_NEEDED - Returned after a successful installation of a patch which requires reboot of computer. # 103: zypper was upgraded, run same command again + # 107: ZYPPER_EXIT_INF_RPM_SCRIPT_FAILED - Some of the packages %post install scripts returned an error, but package is installed. if packages is None: firstrun = True packages = {} @@ -368,14 +382,18 @@ def parse_zypper_xml(m, cmd, fail_not_found=True, packages=None): # if this was the first run and it failed with 103 # run zypper again with the same command to complete update return parse_zypper_xml(m, cmd, fail_not_found=fail_not_found, packages=packages) + if rc == 107 and m.params['skip_post_errors'] and firstrun: + # if this was the first run and it failed with 107 with skip_post_errors flag + # run zypper again with the same command to complete update + return parse_zypper_xml(m, cmd, fail_not_found=fail_not_found, packages=packages) - # apply simple_errors logic to rc 0,102,103,106 + # apply simple_errors logic to rc 0,102,103,106,107 if m.params['simple_errors']: stdout = get_simple_errors(dom) or stdout return packages, rc, stdout, stderr - # apply simple_errors logic to rc other than 0,102,103,106 + # apply simple_errors logic to rc other than 0,102,103,106,107 if m.params['simple_errors']: stdout = get_simple_errors(dom) or stdout @@ -602,6 +620,7 @@ def main(): clean_deps=dict(required=False, default=False, type='bool'), simple_errors=dict(required=False, default=False, type='bool'), quiet=dict(required=False, default=True, type='bool'), + skip_post_errors=dict(required=False, default=False, type='bool'), ), supports_check_mode=True ) diff --git a/plugins/plugin_utils/ansible_type.py b/plugins/plugin_utils/ansible_type.py index ab78b78927..53348ba0f4 100644 --- a/plugins/plugin_utils/ansible_type.py +++ b/plugins/plugin_utils/ansible_type.py @@ -8,17 +8,31 @@ __metaclass__ = type from ansible.errors import AnsibleFilterError from ansible.module_utils.common._collections_compat import Mapping +try: + # Introduced with Data Tagging (https://github.com/ansible/ansible/pull/84621): + from ansible.module_utils.datatag import native_type_name as _native_type_name +except ImportError: + _native_type_name = None -def _atype(data, alias): + +def _atype(data, alias, *, use_native_type: bool = False): """ Returns the name of the type class. """ - data_type = type(data).__name__ + if use_native_type and _native_type_name: + data_type = _native_type_name(data) + else: + data_type = type(data).__name__ + # The following types were introduced with Data Tagging (https://github.com/ansible/ansible/pull/84621): + if data_type == "_AnsibleLazyTemplateDict": + data_type = "dict" + elif data_type == "_AnsibleLazyTemplateList": + data_type = "list" return alias.get(data_type, data_type) -def _ansible_type(data, alias): +def _ansible_type(data, alias, *, use_native_type: bool = False): """ Returns the Ansible data type. """ @@ -30,16 +44,16 @@ def _ansible_type(data, alias): msg = "The argument alias must be a dictionary. %s is %s" raise AnsibleFilterError(msg % (alias, type(alias))) - data_type = _atype(data, alias) + data_type = _atype(data, alias, use_native_type=use_native_type) if data_type == 'list' and len(data) > 0: - items = [_atype(i, alias) for i in data] + items = [_atype(i, alias, use_native_type=use_native_type) for i in data] items_type = '|'.join(sorted(set(items))) return ''.join((data_type, '[', items_type, ']')) if data_type == 'dict' and len(data) > 0: - keys = [_atype(i, alias) for i in data.keys()] - vals = [_atype(i, alias) for i in data.values()] + keys = [_atype(i, alias, use_native_type=use_native_type) for i in data.keys()] + vals = [_atype(i, alias, use_native_type=use_native_type) for i in data.values()] keys_type = '|'.join(sorted(set(keys))) vals_type = '|'.join(sorted(set(vals))) return ''.join((data_type, '[', keys_type, ', ', vals_type, ']')) diff --git a/plugins/test/ansible_type.py b/plugins/test/ansible_type.py index 9ac5e138eb..f7c004f33f 100644 --- a/plugins/test/ansible_type.py +++ b/plugins/test/ansible_type.py @@ -28,30 +28,36 @@ DOCUMENTATION = ''' EXAMPLES = ''' -# Substitution converts str to AnsibleUnicode -# ------------------------------------------- +# Substitution converts str to AnsibleUnicode or _AnsibleTaggedStr +# ---------------------------------------------------------------- -# String. AnsibleUnicode. -dtype: AnsibleUnicode +# String. AnsibleUnicode or _AnsibleTaggedStr. +dtype: + - AnsibleUnicode + - _AnsibleTaggedStr data: "abc" result: '{{ data is community.general.ansible_type(dtype) }}' # result => true -# String. AnsibleUnicode alias str. -alias: {"AnsibleUnicode": "str"} +# String. AnsibleUnicode/_AnsibleTaggedStr alias str. +alias: {"AnsibleUnicode": "str", "_AnsibleTaggedStr": "str"} dtype: str data: "abc" result: '{{ data is community.general.ansible_type(dtype, alias) }}' # result => true -# List. All items are AnsibleUnicode. -dtype: list[AnsibleUnicode] +# List. All items are AnsibleUnicode/_AnsibleTaggedStr. +dtype: + - list[AnsibleUnicode] + - list[_AnsibleTaggedStr] data: ["a", "b", "c"] result: '{{ data is community.general.ansible_type(dtype) }}' # result => true -# Dictionary. All keys are AnsibleUnicode. All values are AnsibleUnicode. -dtype: dict[AnsibleUnicode, AnsibleUnicode] +# Dictionary. All keys and values are AnsibleUnicode/_AnsibleTaggedStr. +dtype: + - dict[AnsibleUnicode, AnsibleUnicode] + - dict[_AnsibleTaggedStr, _AnsibleTaggedStr] data: {"a": "foo", "b": "bar", "c": "baz"} result: '{{ data is community.general.ansible_type(dtype) }}' # result => true @@ -99,32 +105,46 @@ dtype: dict[str, int] result: '{{ {"a": 1, "b": 2} is community.general.ansible_type(dtype) }}' # result => true -# Type of strings is AnsibleUnicode or str -# ---------------------------------------- +# Type of strings is AnsibleUnicode, _AnsibleTaggedStr, or str +# ------------------------------------------------------------ # Dictionary. The keys are integers or strings. All values are strings. -alias: {"AnsibleUnicode": "str"} +alias: + AnsibleUnicode: str + _AnsibleTaggedStr: str + _AnsibleTaggedInt: int dtype: dict[int|str, str] data: {1: 'a', 'b': 'b'} result: '{{ data is community.general.ansible_type(dtype, alias) }}' # result => true # Dictionary. All keys are integers. All values are keys. -alias: {"AnsibleUnicode": "str"} +alias: + AnsibleUnicode: str + _AnsibleTaggedStr: str + _AnsibleTaggedInt: int dtype: dict[int, str] data: {1: 'a', 2: 'b'} result: '{{ data is community.general.ansible_type(dtype, alias) }}' # result => true # Dictionary. All keys are strings. Multiple types values. -alias: {"AnsibleUnicode": "str"} +alias: + AnsibleUnicode: str + _AnsibleTaggedStr: str + _AnsibleTaggedInt: int + _AnsibleTaggedFloat: float dtype: dict[str, bool|dict|float|int|list|str] data: {'a': 1, 'b': 1.1, 'c': 'abc', 'd': True, 'e': ['x', 'y', 'z'], 'f': {'x': 1, 'y': 2}} result: '{{ data is community.general.ansible_type(dtype, alias) }}' # result => true # List. Multiple types items. -alias: {"AnsibleUnicode": "str"} +alias: + AnsibleUnicode: str + _AnsibleTaggedStr: str + _AnsibleTaggedInt: int + _AnsibleTaggedFloat: float dtype: list[bool|dict|float|int|list|str] data: [1, 2, 1.1, 'abc', True, ['x', 'y', 'z'], {'x': 1, 'y': 2}] result: '{{ data is community.general.ansible_type(dtype, alias) }}' @@ -133,20 +153,20 @@ result: '{{ data is community.general.ansible_type(dtype, alias) }}' # Option dtype is list # -------------------- -# AnsibleUnicode or str -dtype: ['AnsibleUnicode', 'str'] +# AnsibleUnicode, _AnsibleTaggedStr, or str +dtype: ['AnsibleUnicode', '_AnsibleTaggedStr', 'str'] data: abc result: '{{ data is community.general.ansible_type(dtype) }}' # result => true # float or int -dtype: ['float', 'int'] +dtype: ['float', 'int', "_AnsibleTaggedInt", "_AnsibleTaggedFloat"] data: 123 result: '{{ data is community.general.ansible_type(dtype) }}' # result => true # float or int -dtype: ['float', 'int'] +dtype: ['float', 'int', "_AnsibleTaggedInt", "_AnsibleTaggedFloat"] data: 123.45 result: '{{ data is community.general.ansible_type(dtype) }}' # result => true @@ -155,14 +175,22 @@ result: '{{ data is community.general.ansible_type(dtype) }}' # -------------- # int alias number -alias: {"int": "number", "float": "number"} +alias: + int: number + float: number + _AnsibleTaggedInt: number + _AnsibleTaggedFloat: float dtype: number data: 123 result: '{{ data is community.general.ansible_type(dtype, alias) }}' # result => true # float alias number -alias: {"int": "number", "float": "number"} +alias: + int: number + float: number + _AnsibleTaggedInt: number + _AnsibleTaggedFloat: float dtype: number data: 123.45 result: '{{ data is community.general.ansible_type(dtype, alias) }}' @@ -192,6 +220,7 @@ def ansible_type(data, dtype, alias=None): else: data_types = dtype + # TODO: expose use_native_type parameter return _ansible_type(data, alias) in data_types diff --git a/tests/integration/targets/callback_log_plays/runme.sh b/tests/integration/targets/callback_log_plays/runme.sh index 88eea16266..54e1c1938f 100755 --- a/tests/integration/targets/callback_log_plays/runme.sh +++ b/tests/integration/targets/callback_log_plays/runme.sh @@ -17,5 +17,5 @@ ansible-playbook ping_log.yml -v "$@" # now force it to fail export ANSIBLE_LOG_FOLDER="logit.file" touch "${ANSIBLE_LOG_FOLDER}" -ansible-playbook ping_log.yml -v "$@" 2>&1| grep 'Failure using method (v2_runner_on_ok) in callback plugin' +ansible-playbook ping_log.yml -v "$@" 2>&1| grep -E "(Failure using method \(v2_runner_on_ok\) in callback plugin|Callback dispatch 'v2_runner_on_ok' failed for plugin)" [[ ! -f "${ANSIBLE_LOG_FOLDER}/localhost" ]] diff --git a/tests/integration/targets/callback_yaml/tasks/main.yml b/tests/integration/targets/callback_yaml/tasks/main.yml index f3c36663da..a66892e0f0 100644 --- a/tests/integration/targets/callback_yaml/tasks/main.yml +++ b/tests/integration/targets/callback_yaml/tasks/main.yml @@ -67,7 +67,7 @@ ANSIBLE_NOCOLOR: 'true' ANSIBLE_FORCE_COLOR: 'false' ANSIBLE_STDOUT_CALLBACK: community.general.yaml - playbook: | + playbook: !unsafe | - hosts: testhost gather_facts: false vars: @@ -78,9 +78,7 @@ tasks: - name: Test to_yaml debug: - msg: "{{ '{{' }}'{{ '{{' }}'{{ '}}' }} data | to_yaml {{ '{{' }}'{{ '}}' }}'{{ '}}' }}" - # The above should be: msg: "{{ data | to_yaml }}" - # Unfortunately, the way Ansible handles templating, we need to do some funny 'escaping' tricks... + msg: "{{ data | to_yaml }}" expected_output: [ "", "PLAY [testhost] ****************************************************************", diff --git a/tests/integration/targets/cmd_runner/action_plugins/_unsafe_assert.py b/tests/integration/targets/cmd_runner/action_plugins/_unsafe_assert.py index 498e8258d0..a25e8aa38c 100644 --- a/tests/integration/targets/cmd_runner/action_plugins/_unsafe_assert.py +++ b/tests/integration/targets/cmd_runner/action_plugins/_unsafe_assert.py @@ -9,6 +9,12 @@ from ansible.errors import AnsibleError from ansible.playbook.conditional import Conditional from ansible.plugins.action import ActionBase +try: + from ansible.utils.datatag import trust_value as _trust_value +except ImportError: + def _trust_value(input): + return input + class ActionModule(ActionBase): ''' Fail with custom message ''' @@ -36,12 +42,16 @@ class ActionModule(ActionBase): thats = self._task.args['that'] - cond = Conditional(loader=self._loader) result['_ansible_verbose_always'] = True for that in thats: - cond.when = [str(self._make_safe(that))] - test_result = cond.evaluate_conditional(templar=self._templar, all_vars=task_vars) + if hasattr(self._templar, 'evaluate_conditional'): + trusted_that = _trust_value(that) if _trust_value else that + test_result = self._templar.evaluate_conditional(conditional=trusted_that) + else: + cond = Conditional(loader=self._loader) + cond.when = [str(self._make_safe(that))] + test_result = cond.evaluate_conditional(templar=self._templar, all_vars=task_vars) if not test_result: result['failed'] = True result['evaluated_to'] = test_result diff --git a/tests/integration/targets/connection_wsl/aliases b/tests/integration/targets/connection_wsl/aliases new file mode 100644 index 0000000000..aeb39c141a --- /dev/null +++ b/tests/integration/targets/connection_wsl/aliases @@ -0,0 +1,11 @@ +# Derived from ../connection_proxmox_pct_remote/aliases Copyright (c) 2025 Nils Stein (@mietzen) +# Copyright (c) 2025 Rui Lopes (@rgl) +# Copyright (c) 2025 Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +azp/posix/3 +destructive +needs/root +needs/target/connection +skip/macos diff --git a/tests/integration/targets/connection_wsl/dependencies.yml b/tests/integration/targets/connection_wsl/dependencies.yml new file mode 100644 index 0000000000..fdf36f5e95 --- /dev/null +++ b/tests/integration/targets/connection_wsl/dependencies.yml @@ -0,0 +1,19 @@ +--- +# Derived from ../connection_proxmox_pct_remote/dependencies.yml Copyright (c) 2025 Nils Stein (@mietzen) +# Copyright (c) 2025 Rui Lopes (@rgl) +# Copyright (c) 2025 Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +- hosts: localhost + gather_facts: true + serial: 1 + tasks: + - name: Copy wsl.exe mock + copy: + src: files/wsl.exe + dest: /usr/local/bin/wsl.exe + mode: '0755' + - name: Install paramiko + pip: + name: "paramiko>=3.0.0" diff --git a/tests/integration/targets/connection_wsl/files/wsl.exe b/tests/integration/targets/connection_wsl/files/wsl.exe new file mode 100755 index 0000000000..0c6aafaf0f --- /dev/null +++ b/tests/integration/targets/connection_wsl/files/wsl.exe @@ -0,0 +1,72 @@ +#!/usr/bin/env bash +# Derived from ../../connection_proxmox_pct_remote/files/pct Copyright (c) 2025 Nils Stein (@mietzen) +# Copyright (c) 2025 Rui Lopes (@rgl) +# Copyright (c) 2025 Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +# Shell script to mock wsl.exe behavior + +set -euo pipefail + +function quote_args { + local quoted_args=() + for arg in "$@"; do + if [[ -z "$arg" || "$arg" =~ [^a-zA-Z0-9@%+=:,./-] ]]; then + local escaped_arg=${arg//\'/\'\\\'\'} + quoted_args+=("'$escaped_arg'") + else + quoted_args+=("$arg") + fi + done + echo -n "${quoted_args[@]}" +} + +declare -a mock_args=() +declare -a cmd_args=() +wsl_distribution="" +wsl_user="" + +while [[ $# -gt 0 ]]; do + case $1 in + --distribution|-d) + wsl_distribution="$2" + mock_args+=("$1" "$2") + shift 2 + ;; + --user|-u) + wsl_user="$2" + mock_args+=("$1" "$2") + shift 2 + ;; + --) + mock_args+=("$1") + shift + while [[ $# -gt 0 ]]; do + mock_args+=("$1") + cmd_args+=("$1") + shift + done + ;; + *) + >&2 echo "unexpected args: $@" + exit 1 + ;; + esac +done + +mock_cmd="wsl.exe $(quote_args "${mock_args[@]}")" +cmd="$(quote_args "${cmd_args[@]}")" + +>&2 echo "[INFO] MOCKING: $mock_cmd" +>&2 echo "[INFO] CMD: $cmd" + +tmp_dir="/tmp/ansible-remote/wsl/integration_test/wsl_distribution_${wsl_distribution}" + +mkdir -p "$tmp_dir" + +pushd "$tmp_dir" >/dev/null + +eval "$cmd" + +popd >/dev/null diff --git a/tests/integration/targets/connection_wsl/plugin-specific-tests.yml b/tests/integration/targets/connection_wsl/plugin-specific-tests.yml new file mode 100644 index 0000000000..228c34dc51 --- /dev/null +++ b/tests/integration/targets/connection_wsl/plugin-specific-tests.yml @@ -0,0 +1,31 @@ +--- +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +- hosts: "{{ target_hosts }}" + gather_facts: false + tasks: + - name: create file without content + copy: + content: "" + dest: "{{ remote_tmp }}/test_empty.txt" + force: no + mode: '0644' + + - name: assert file without content exists + stat: + path: "{{ remote_tmp }}/test_empty.txt" + register: empty_file_stat + + - name: verify file without content exists + assert: + that: + - empty_file_stat.stat.exists + fail_msg: "The file {{ remote_tmp }}/test_empty.txt does not exist." + + - name: verify file without content is empty + assert: + that: + - empty_file_stat.stat.size == 0 + fail_msg: "The file {{ remote_tmp }}/test_empty.txt is not empty." diff --git a/tests/integration/targets/connection_wsl/runme.sh b/tests/integration/targets/connection_wsl/runme.sh new file mode 100755 index 0000000000..cb1e5b9cd0 --- /dev/null +++ b/tests/integration/targets/connection_wsl/runme.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +# Derived from ../connection_proxmox_pct_remote/runme.sh Copyright (c) 2025 Nils Stein (@mietzen) +# Copyright (c) 2025 Rui Lopes (@rgl) +# Copyright (c) 2025 Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +set -eux + +# signal the wsl connection plugin that its running under the integration testing mode. +# NB while running integration tests, the mock wsl.exe implementation is actually +# running on unix, instead of on running windows, so the wsl.exe command line +# construction must use unix rules instead of windows rules. +export _ANSIBLE_TEST_WSL_CONNECTION_PLUGIN_Waeri5tepheeSha2fae8=1 + +ANSIBLE_ROLES_PATH=../ \ + ansible-playbook dependencies.yml -v "$@" + +./test.sh "$@" + +ansible-playbook plugin-specific-tests.yml -i "./test_connection.inventory" \ + -e target_hosts=wsl \ + -e action_prefix= \ + -e local_tmp=/tmp/ansible-local \ + -e remote_tmp=/tmp/ansible-remote \ + "$@" diff --git a/tests/integration/targets/connection_wsl/test.sh b/tests/integration/targets/connection_wsl/test.sh new file mode 120000 index 0000000000..70aa5dbdba --- /dev/null +++ b/tests/integration/targets/connection_wsl/test.sh @@ -0,0 +1 @@ +../connection_posix/test.sh \ No newline at end of file diff --git a/tests/integration/targets/connection_wsl/test_connection.inventory b/tests/integration/targets/connection_wsl/test_connection.inventory new file mode 100644 index 0000000000..53b9a3a031 --- /dev/null +++ b/tests/integration/targets/connection_wsl/test_connection.inventory @@ -0,0 +1,15 @@ +# Derived from ../connection_proxmox_pct_remote/test_connection.inventory Copyright (c) 2025 Nils Stein (@mietzen) +# Copyright (c) 2025 Rui Lopes (@rgl) +# Copyright (c) 2025 Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +[wsl] +wsl-pipelining ansible_ssh_pipelining=true +wsl-no-pipelining ansible_ssh_pipelining=false +[wsl:vars] +ansible_host=localhost +ansible_user=root +ansible_python_interpreter="{{ ansible_playbook_python }}" +ansible_connection=community.general.wsl +wsl_distribution=test diff --git a/tests/integration/targets/filter_reveal_ansible_type/tasks/tasks.yml b/tests/integration/targets/filter_reveal_ansible_type/tasks/tasks.yml index 528c01addb..79b42ff7b2 100644 --- a/tests/integration/targets/filter_reveal_ansible_type/tasks/tasks.yml +++ b/tests/integration/targets/filter_reveal_ansible_type/tasks/tasks.yml @@ -2,53 +2,60 @@ # GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) # SPDX-License-Identifier: GPL-3.0-or-later -# Substitution converts str to AnsibleUnicode -# ------------------------------------------- +# Substitution converts str to AnsibleUnicode/_AnsibleTaggedStr +# ------------------------------------------------------------- -- name: String. AnsibleUnicode. +- name: String. AnsibleUnicode/_AnsibleTaggedStr. assert: - that: result == dtype - success_msg: '"abc" is {{ dtype }}' - fail_msg: '"abc" is {{ result }}' + that: result in dtype + success_msg: '"abc" is one of {{ dtype }}' + fail_msg: '"abc" is {{ result }}, not one of {{ dtype }}' quiet: '{{ quiet_test | default(true) | bool }}' vars: data: "abc" result: '{{ data | community.general.reveal_ansible_type }}' - dtype: 'AnsibleUnicode' + dtype: + - 'AnsibleUnicode' + - '_AnsibleTaggedStr' -- name: String. AnsibleUnicode alias str. +- name: String. AnsibleUnicode/_AnsibleTaggedStr alias str. assert: - that: result == dtype - success_msg: '"abc" is {{ dtype }}' - fail_msg: '"abc" is {{ result }}' + that: result in dtype + success_msg: '"abc" is one of {{ dtype }}' + fail_msg: '"abc" is {{ result }}, not one of {{ dtype }}' quiet: '{{ quiet_test | default(true) | bool }}' vars: - alias: {"AnsibleUnicode": "str"} + alias: {"AnsibleUnicode": "str", "_AnsibleTaggedStr": "str"} data: "abc" result: '{{ data | community.general.reveal_ansible_type(alias) }}' - dtype: 'str' + dtype: + - 'str' -- name: List. All items are AnsibleUnicode. +- name: List. All items are AnsibleUnicode/_AnsibleTaggedStr. assert: - that: result == dtype - success_msg: '["a", "b", "c"] is {{ dtype }}' - fail_msg: '["a", "b", "c"] is {{ result }}' + that: result in dtype + success_msg: '["a", "b", "c"] is one of {{ dtype }}' + fail_msg: '["a", "b", "c"] is {{ result }}, not one of {{ dtype }}' quiet: '{{ quiet_test | default(true) | bool }}' vars: data: ["a", "b", "c"] result: '{{ data | community.general.reveal_ansible_type }}' - dtype: 'list[AnsibleUnicode]' + dtype: + - 'list[AnsibleUnicode]' + - 'list[_AnsibleTaggedStr]' -- name: Dictionary. All keys are AnsibleUnicode. All values are AnsibleUnicode. +- name: Dictionary. All keys and values are AnsibleUnicode/_AnsibleTaggedStr. assert: - that: result == dtype - success_msg: '{"a": "foo", "b": "bar", "c": "baz"} is {{ dtype }}' - fail_msg: '{"a": "foo", "b": "bar", "c": "baz"} is {{ result }}' + that: result in dtype + success_msg: '{"a": "foo", "b": "bar", "c": "baz"} is one of {{ dtype }}' + fail_msg: '{"a": "foo", "b": "bar", "c": "baz"} is {{ result }}, not one of {{ dtype }}' quiet: '{{ quiet_test | default(true) | bool }}' vars: data: {"a": "foo", "b": "bar", "c": "baz"} result: '{{ data | community.general.reveal_ansible_type }}' - dtype: 'dict[AnsibleUnicode, AnsibleUnicode]' + dtype: + - 'dict[AnsibleUnicode, AnsibleUnicode]' + - 'dict[_AnsibleTaggedStr, _AnsibleTaggedStr]' # No substitution and no alias. Type of strings is str # ---------------------------------------------------- @@ -57,7 +64,7 @@ assert: that: result == dtype success_msg: '"abc" is {{ dtype }}' - fail_msg: '"abc" is {{ result }}' + fail_msg: '"abc" is {{ result }}, not {{ dtype }}' quiet: '{{ quiet_test | default(true) | bool }}' vars: result: '{{ "abc" | community.general.reveal_ansible_type }}' @@ -67,7 +74,7 @@ assert: that: result == dtype success_msg: '123 is {{ dtype }}' - fail_msg: '123 is {{ result }}' + fail_msg: '123 is {{ result }}, not {{ dtype }}' quiet: '{{ quiet_test | default(true) | bool }}' vars: result: '{{ 123 | community.general.reveal_ansible_type }}' @@ -77,7 +84,7 @@ assert: that: result == dtype success_msg: '123.45 is {{ dtype }}' - fail_msg: '123.45 is {{ result }}' + fail_msg: '123.45 is {{ result }}, not {{ dtype }}' quiet: '{{ quiet_test | default(true) | bool }}' vars: result: '{{ 123.45 | community.general.reveal_ansible_type }}' @@ -87,7 +94,7 @@ assert: that: result == dtype success_msg: 'true is {{ dtype }}' - fail_msg: 'true is {{ result }}' + fail_msg: 'true is {{ result }}, not {{ dtype }}' quiet: '{{ quiet_test | default(true) | bool }}' vars: result: '{{ true | community.general.reveal_ansible_type }}' @@ -97,7 +104,7 @@ assert: that: result == dtype success_msg: '["a", "b", "c"] is {{ dtype }}' - fail_msg: '["a", "b", "c"] is {{ result }}' + fail_msg: '["a", "b", "c"] is {{ result }}, not {{ dtype }}' quiet: '{{ quiet_test | default(true) | bool }}' vars: result: '{{ ["a", "b", "c"] | community.general.reveal_ansible_type }}' @@ -107,7 +114,7 @@ assert: that: result == dtype success_msg: '[{"a": 1}, {"b": 2}] is {{ dtype }}' - fail_msg: '[{"a": 1}, {"b": 2}] is {{ result }}' + fail_msg: '[{"a": 1}, {"b": 2}] is {{ result }}, not {{ dtype }}' quiet: '{{ quiet_test | default(true) | bool }}' vars: result: '{{ [{"a": 1}, {"b": 2}] | community.general.reveal_ansible_type }}' @@ -117,7 +124,7 @@ assert: that: result == dtype success_msg: '{"a": 1} is {{ dtype }}' - fail_msg: '{"a": 1} is {{ result }}' + fail_msg: '{"a": 1} is {{ result }}, not {{ dtype }}' quiet: '{{ quiet_test | default(true) | bool }}' vars: result: '{{ {"a": 1} | community.general.reveal_ansible_type }}' @@ -127,23 +134,23 @@ assert: that: result == dtype success_msg: '{"a": 1, "b": 2} is {{ dtype }}' - fail_msg: '{"a": 1, "b": 2} is {{ result }}' + fail_msg: '{"a": 1, "b": 2} is {{ result }}, not {{ dtype }}' quiet: '{{ quiet_test | default(true) | bool }}' vars: result: '{{ {"a": 1, "b": 2} | community.general.reveal_ansible_type }}' dtype: dict[str, int] -# Type of strings is AnsibleUnicode or str -# ---------------------------------------- +# Type of strings is AnsibleUnicode/_AnsibleTaggedStr or str +# ---------------------------------------------------------- - name: Dictionary. The keys are integers or strings. All values are strings. assert: that: result == dtype success_msg: 'data is {{ dtype }}' - fail_msg: 'data is {{ result }}' + fail_msg: 'data is {{ result }}, not {{ dtype }}' quiet: '{{ quiet_test | default(true) | bool }}' vars: - alias: {"AnsibleUnicode": "str"} + alias: {"AnsibleUnicode": "str", "_AnsibleTaggedStr": "str", "_AnsibleTaggedInt": "int"} data: {1: 'a', 'b': 'b'} result: '{{ data | community.general.reveal_ansible_type(alias) }}' dtype: dict[int|str, str] @@ -152,10 +159,10 @@ assert: that: result == dtype success_msg: 'data is {{ dtype }}' - fail_msg: 'data is {{ result }}' + fail_msg: 'data is {{ result }}, not {{ dtype }}' quiet: '{{ quiet_test | default(true) | bool }}' vars: - alias: {"AnsibleUnicode": "str"} + alias: {"AnsibleUnicode": "str", "_AnsibleTaggedStr": "str", "_AnsibleTaggedInt": "int"} data: {1: 'a', 2: 'b'} result: '{{ data | community.general.reveal_ansible_type(alias) }}' dtype: dict[int, str] @@ -164,10 +171,10 @@ assert: that: result == dtype success_msg: 'data is {{ dtype }}' - fail_msg: 'data is {{ result }}' + fail_msg: 'data is {{ result }}, not {{ dtype }}' quiet: '{{ quiet_test | default(true) | bool }}' vars: - alias: {"AnsibleUnicode": "str"} + alias: {"AnsibleUnicode": "str", "_AnsibleTaggedStr": "str", "_AnsibleTaggedInt": "int", "_AnsibleTaggedFloat": "float"} data: {'a': 1, 'b': 1.1, 'c': 'abc', 'd': True, 'e': ['x', 'y', 'z'], 'f': {'x': 1, 'y': 2}} result: '{{ data | community.general.reveal_ansible_type(alias) }}' dtype: dict[str, bool|dict|float|int|list|str] @@ -176,10 +183,10 @@ assert: that: result == dtype success_msg: 'data is {{ dtype }}' - fail_msg: 'data is {{ result }}' + fail_msg: 'data is {{ result }}, not {{ dtype }}' quiet: '{{ quiet_test | default(true) | bool }}' vars: - alias: {"AnsibleUnicode": "str"} + alias: {"AnsibleUnicode": "str", "_AnsibleTaggedStr": "str", "_AnsibleTaggedInt": "int", "_AnsibleTaggedFloat": "float"} data: [1, 2, 1.1, 'abc', True, ['x', 'y', 'z'], {'x': 1, 'y': 2}] result: '{{ data | community.general.reveal_ansible_type(alias) }}' dtype: list[bool|dict|float|int|list|str] diff --git a/tests/integration/targets/gitlab_project_members/defaults/main.yml b/tests/integration/targets/gitlab_project_members/defaults/main.yml index 72d5a68f15..47062478a8 100644 --- a/tests/integration/targets/gitlab_project_members/defaults/main.yml +++ b/tests/integration/targets/gitlab_project_members/defaults/main.yml @@ -16,3 +16,5 @@ dedicated_access_users: access_level: "developer" - name: username2 access_level: "maintainer" + - name: username3 + access_level: "owner" diff --git a/tests/integration/targets/gitlab_project_members/tasks/main.yml b/tests/integration/targets/gitlab_project_members/tasks/main.yml index 215abad44f..d08896f239 100644 --- a/tests/integration/targets/gitlab_project_members/tasks/main.yml +++ b/tests/integration/targets/gitlab_project_members/tasks/main.yml @@ -10,7 +10,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later - name: Install required library - pip: + ansible.builtin.pip: name: python-gitlab state: present @@ -20,6 +20,7 @@ api_token: "{{ gitlab_api_access_token }}" project: "{{ gitlab_project }}" gitlab_user: "{{ username }}" + access_level: "{{ gitlab_access_level }}" state: absent - name: Add a User to A GitLab Project @@ -58,6 +59,7 @@ api_token: "{{ gitlab_api_access_token }}" project: "{{ gitlab_project }}" gitlab_user: "{{ username }}" + access_level: "{{ gitlab_access_level }}" state: absent register: remove_gitlab_project_members_state @@ -72,6 +74,7 @@ api_token: "{{ gitlab_api_access_token }}" project: "{{ gitlab_project }}" gitlab_user: "{{ username }}" + access_level: "{{ gitlab_access_level }}" state: absent register: remove_gitlab_project_members_state_again @@ -90,15 +93,16 @@ state: present - name: Remove a list of Users to A GitLab Project - community.general.gitlab_project_members:: + community.general.gitlab_project_members: api_url: "{{ gitlab_server_url }}" api_token: "{{ gitlab_api_access_token }}" project: "{{ gitlab_project }}" gitlab_user: "{{ userlist }}" + access_level: "{{ gitlab_access_level }}" state: absent - name: Add a list of Users with Dedicated Access Levels to A GitLab Project - community.general.gitlab_project_members:: + community.general.gitlab_project_members: api_url: "{{ gitlab_server_url }}" api_token: "{{ gitlab_api_access_token }}" project: "{{ gitlab_project }}" @@ -106,7 +110,7 @@ state: present - name: Remove a list of Users with Dedicated Access Levels to A GitLab Project - community.general.gitlab_project_members:: + community.general.gitlab_project_members: api_url: "{{ gitlab_server_url }}" api_token: "{{ gitlab_api_access_token }}" project: "{{ gitlab_project }}" @@ -114,11 +118,11 @@ state: absent - name: Add a user, remove all others which might be on this access level - community.general.gitlab_project_members:: + community.general.gitlab_project_members: api_url: "{{ gitlab_server_url }}" api_token: "{{ gitlab_api_access_token }}" project: "{{ gitlab_project }}" gitlab_user: "{{ username }}" access_level: "{{ gitlab_access_level }}" - pruge_users: "{{ gitlab_access_level }}" + purge_users: "{{ gitlab_access_level }}" state: present diff --git a/tests/integration/targets/hg/aliases b/tests/integration/targets/hg/aliases index e1d7ab2a2d..f59e9307a5 100644 --- a/tests/integration/targets/hg/aliases +++ b/tests/integration/targets/hg/aliases @@ -3,5 +3,6 @@ # SPDX-License-Identifier: GPL-3.0-or-later azp/posix/2 -skip/python3 skip/aix +skip/macos +disabled # TODO osdn.net is out of business, so cloning a repo from there does not work diff --git a/tests/integration/targets/hg/meta/main.yml b/tests/integration/targets/hg/meta/main.yml index ca1915e05c..c1a55fdbb4 100644 --- a/tests/integration/targets/hg/meta/main.yml +++ b/tests/integration/targets/hg/meta/main.yml @@ -6,3 +6,4 @@ dependencies: - setup_pkg_mgr - setup_remote_tmp_dir + - setup_epel diff --git a/tests/integration/targets/hg/tasks/install.yml b/tests/integration/targets/hg/tasks/install.yml index 1b89168808..caa2e21512 100644 --- a/tests/integration/targets/hg/tasks/install.yml +++ b/tests/integration/targets/hg/tasks/install.yml @@ -26,6 +26,12 @@ shell: apt-get -y update && apt-get -y install mercurial when: ansible_facts.pkg_mgr == 'apt' +- name: install packages (apk) + package: + name: mercurial + state: present + when: ansible_facts.pkg_mgr in ['apk', 'community.general.apk'] + - name: install mercurial (dnf) dnf: name: mercurial @@ -36,6 +42,11 @@ name: mercurial when: ansible_facts.pkg_mgr == 'yum' +- name: install mercurial (pacman) + package: + name: mercurial + when: ansible_facts.pkg_mgr in ['pacman', 'community.general.pacman'] + - name: install mercurial (pkgng) package: name: mercurial diff --git a/tests/integration/targets/hg/tasks/uninstall.yml b/tests/integration/targets/hg/tasks/uninstall.yml index 4a26995ef4..b2274caf1f 100644 --- a/tests/integration/targets/hg/tasks/uninstall.yml +++ b/tests/integration/targets/hg/tasks/uninstall.yml @@ -16,6 +16,12 @@ line: "#!{{ stat_hg_interpreter.stat.path }}" when: stat_hg_interpreter.stat.islnk +- name: uninstall packages which were not originally installed (apk) + package: + name: mercurial + state: absent + when: ansible_facts.pkg_mgr in ['apk', 'community.general.apk'] + # using the apt module prevents autoremove from working, so call apt-get via shell instead - name: uninstall packages which were not originally installed (apt) shell: apt-get -y remove mercurial && apt-get -y autoremove @@ -33,6 +39,12 @@ shell: yum -y autoremove mercurial when: ansible_facts.pkg_mgr == 'yum' +- name: uninstall packages which were not originally installed (pacman) + package: + name: mercurial + state: absent + when: ansible_facts.pkg_mgr in ['pacman', 'community.general.pacman'] + - name: uninstall packages which were not originally installed (pkgng) package: name: mercurial diff --git a/tests/integration/targets/java_cert/tasks/main.yml b/tests/integration/targets/java_cert/tasks/main.yml index 25ec87e8f9..f572f22ee2 100644 --- a/tests/integration/targets/java_cert/tasks/main.yml +++ b/tests/integration/targets/java_cert/tasks/main.yml @@ -10,7 +10,6 @@ - when: has_java_keytool block: - - name: prep pkcs12 file ansible.builtin.copy: src: "{{ test_pkcs12_path }}" @@ -33,6 +32,21 @@ that: - result_success is successful + - name: import pkcs12 without alias params + community.general.java_cert: + pkcs12_path: "{{ remote_tmp_dir }}/{{ test_pkcs12_path }}" + pkcs12_password: changeit + keystore_path: "{{ remote_tmp_dir }}/{{ test_keystore_path }}" + keystore_pass: changeme_keystore + keystore_create: true + state: present + register: result_success_excl_aliases + + - name: verify success + ansible.builtin.assert: + that: + - result_success_excl_aliases is successful + - name: import pkcs12 with wrong password community.general.java_cert: pkcs12_path: "{{ remote_tmp_dir }}/{{ test_pkcs12_path }}" diff --git a/tests/integration/targets/keycloak_authentication/README.md b/tests/integration/targets/keycloak_authentication/README.md new file mode 100644 index 0000000000..03ca31b199 --- /dev/null +++ b/tests/integration/targets/keycloak_authentication/README.md @@ -0,0 +1,10 @@ + +# Running keycloak_authentication module integration test + +Run integration tests: + + ansible-test integration -v keycloak_authentication --allow-unsupported --docker fedora35 --docker-network host \ No newline at end of file diff --git a/tests/integration/targets/keycloak_authentication/aliases b/tests/integration/targets/keycloak_authentication/aliases new file mode 100644 index 0000000000..bd1f024441 --- /dev/null +++ b/tests/integration/targets/keycloak_authentication/aliases @@ -0,0 +1,5 @@ +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +unsupported diff --git a/tests/integration/targets/keycloak_authentication/tasks/access_token.yml b/tests/integration/targets/keycloak_authentication/tasks/access_token.yml new file mode 100644 index 0000000000..145f4708bc --- /dev/null +++ b/tests/integration/targets/keycloak_authentication/tasks/access_token.yml @@ -0,0 +1,25 @@ +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later +--- +- name: Get access token + ansible.builtin.uri: + url: "{{ url }}/realms/{{ admin_realm }}/protocol/openid-connect/token" + method: POST + status_code: 200 + headers: + Accept: application/json + User-agent: Ansible + body_format: form-urlencoded + body: + grant_type: "password" + client_id: "admin-cli" + username: "{{ admin_user }}" + password: "{{ admin_password }}" + register: token_response + no_log: true + +- name: Extract access token + ansible.builtin.set_fact: + access_token: "{{ token_response.json['access_token'] }}" + no_log: true diff --git a/tests/integration/targets/keycloak_authentication/tasks/main.yml b/tests/integration/targets/keycloak_authentication/tasks/main.yml new file mode 100644 index 0000000000..d286b70a35 --- /dev/null +++ b/tests/integration/targets/keycloak_authentication/tasks/main.yml @@ -0,0 +1,185 @@ +--- +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later +- name: Install required packages + pip: + name: + - jmespath + - requests + register: result + until: result is success + +- name: Start container + community.docker.docker_container: + name: mykeycloak + image: "quay.io/keycloak/keycloak:{{ keycloak_version }}" + command: start-dev + env: + KC_HTTP_RELATIVE_PATH: /auth + KEYCLOAK_ADMIN: admin + KEYCLOAK_ADMIN_PASSWORD: password + ports: + - "{{ keycloak_port }}:8080" + detach: true + auto_remove: true + memory: 2200M + +- name: Wait for Keycloak + uri: + url: "{{ url }}/admin/" + status_code: 200 + validate_certs: no + register: result + until: result.status == 200 + retries: 10 + delay: 10 + +- name: Delete realm if exists + community.general.keycloak_realm: + auth_keycloak_url: "{{ url }}" + auth_realm: "{{ admin_realm }}" + auth_username: "{{ admin_user }}" + auth_password: "{{ admin_password }}" + realm: "{{ realm }}" + state: absent + +- name: Create realm + community.general.keycloak_realm: + auth_keycloak_url: "{{ url }}" + auth_realm: "{{ admin_realm }}" + auth_username: "{{ admin_user }}" + auth_password: "{{ admin_password }}" + id: "{{ realm }}" + realm: "{{ realm }}" + state: present + +- name: Create an authentication flow from first broker login and add an execution to it. + community.general.keycloak_authentication: + auth_keycloak_url: "{{ url }}" + auth_realm: "{{ admin_realm }}" + auth_username: "{{ admin_user }}" + auth_password: "{{ admin_password }}" + realm: "{{ realm }}" + alias: "Test first broker login" + copyFrom: "first broker login" + authenticationExecutions: + - providerId: "idp-review-profile" + requirement: "REQUIRED" + authenticationConfig: + alias: "Test review profile config" + config: + update.profile.on.first.login: "missing" + +- name: Create auth flow + community.general.keycloak_authentication: + auth_keycloak_url: "{{ url }}" + auth_realm: "{{ admin_realm }}" + auth_username: "{{ admin_user }}" + auth_password: "{{ admin_password }}" + realm: "{{ realm }}" + alias: "My conditionnal browser otp" + description: "browser based authentication with otp" + providerId: "basic-flow" + authenticationExecutions: + - displayName: Cookie + providerId: auth-cookie + requirement: ALTERNATIVE + - displayName: Kerberos + providerId: auth-spnego + requirement: DISABLED + - displayName: Identity Provider Redirector + providerId: identity-provider-redirector + requirement: ALTERNATIVE + - displayName: My browser otp forms + requirement: ALTERNATIVE + - displayName: Username Password Form + flowAlias: My browser otp forms + providerId: auth-username-password-form + requirement: REQUIRED + - displayName: My browser otp Browser - Conditional OTP + flowAlias: My browser otp forms + requirement: REQUIRED + providerId: "auth-conditional-otp-form" + authenticationConfig: + alias: my-conditional-otp-config + config: + defaultOtpOutcome: "force" + noOtpRequiredForHeaderPattern: "{{ keycloak_no_otp_required_pattern_orinale }}" + state: present + +- name: Modified auth flow with new config + community.general.keycloak_authentication: + auth_keycloak_url: "{{ url }}" + auth_realm: "{{ admin_realm }}" + auth_username: "{{ admin_user }}" + auth_password: "{{ admin_password }}" + realm: "{{ realm }}" + alias: "My conditionnal browser otp" + description: "browser based authentication with otp" + providerId: "basic-flow" + authenticationExecutions: + - displayName: Cookie + providerId: auth-cookie + requirement: ALTERNATIVE + - displayName: Kerberos + providerId: auth-spnego + requirement: DISABLED + - displayName: Identity Provider Redirector + providerId: identity-provider-redirector + requirement: ALTERNATIVE + - displayName: My browser otp forms + requirement: ALTERNATIVE + - displayName: Username Password Form + flowAlias: My browser otp forms + providerId: auth-username-password-form + requirement: REQUIRED + - displayName: My browser otp Browser - Conditional OTP + flowAlias: My browser otp forms + requirement: REQUIRED + providerId: "auth-conditional-otp-form" + authenticationConfig: + alias: my-conditional-otp-config + config: + defaultOtpOutcome: "force" + noOtpRequiredForHeaderPattern: "{{ keycloak_no_otp_required_pattern_modifed }}" + state: present + register: result + +- name: Retrive access + ansible.builtin.include_tasks: + file: access_token.yml + +- name: Export realm + ansible.builtin.uri: + url: "{{ url }}/admin/realms/{{ realm }}/partial-export?exportClients=false&exportGroupsAndRoles=false" + method: POST + headers: + Accept: application/json + User-agent: Ansible + Authorization: "Bearer {{ access_token }}" + body_format: form-urlencoded + body: {} + register: exported_realm + no_log: true + +- name: Assert `my-conditional-otp-config` exists only once + ansible.builtin.assert: + that: + - exported_realm.json | community.general.json_query('authenticatorConfig[?alias==`my-conditional-otp-config`]') | length == 1 + +- name: Delete auth flow + community.general.keycloak_authentication: + auth_keycloak_url: "{{ url }}" + auth_realm: "{{ admin_realm }}" + auth_username: "{{ admin_user }}" + auth_password: "{{ admin_password }}" + realm: "{{ realm }}" + alias: "My conditionnal browser otp" + state: absent + register: result + +- name: Remove container + community.docker.docker_container: + name: mykeycloak + state: absent \ No newline at end of file diff --git a/tests/integration/targets/keycloak_authentication/vars/main.yml b/tests/integration/targets/keycloak_authentication/vars/main.yml new file mode 100644 index 0000000000..03244e18c0 --- /dev/null +++ b/tests/integration/targets/keycloak_authentication/vars/main.yml @@ -0,0 +1,16 @@ +--- +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later +keycloak_version: latest +keycloak_port: 8080 + +url: "http://localhost:{{ keycloak_port }}/auth" +admin_realm: master +admin_user: admin +admin_password: password +realm: myrealm + + +keycloak_no_otp_required_pattern_orinale: "X-Forwarded-For: 10\\.[0-9\\.:]+" +keycloak_no_otp_required_pattern_modifed: "X-Original-Forwarded-For: 10\\.[0-9\\.:]+" \ No newline at end of file diff --git a/tests/integration/targets/module_helper/tasks/mdepfail.yml b/tests/integration/targets/module_helper/tasks/mdepfail.yml index 1655be54e3..f0be8340e3 100644 --- a/tests/integration/targets/module_helper/tasks/mdepfail.yml +++ b/tests/integration/targets/module_helper/tasks/mdepfail.yml @@ -8,11 +8,15 @@ ignore_errors: true register: result +- name: Show results + debug: + var: result + - name: assert failing dependency assert: that: - result is failed - '"Failed to import" in result.msg' - '"nopackagewiththisname" in result.msg' - - '"ModuleNotFoundError:" in result.exception or "ImportError:" in result.exception' - - '"nopackagewiththisname" in result.exception' + - '"ModuleNotFoundError:" in result.exception or "ImportError:" in result.exception or "(traceback unavailable)" in result.exception' + - '"nopackagewiththisname" in result.exception or "(traceback unavailable)" in result.exception' diff --git a/tests/integration/targets/module_helper/tasks/msimpleda.yml b/tests/integration/targets/module_helper/tasks/msimpleda.yml index e01b65e12c..5fe727ca5e 100644 --- a/tests/integration/targets/module_helper/tasks/msimpleda.yml +++ b/tests/integration/targets/module_helper/tasks/msimpleda.yml @@ -3,15 +3,19 @@ # SPDX-License-Identifier: GPL-3.0-or-later - set_fact: - attr2_d: + attr2_depr_dict: msg: Attribute attr2 is deprecated version: 9.9.9 collection_name: community.general - attr2_d_29: + # With Data Tagging, the deprecation dict looks a bit different: + attr2_depr_dict_dt: msg: Attribute attr2 is deprecated version: 9.9.9 -- set_fact: - attr2_depr_dict: "{{ ((ansible_version.major, ansible_version.minor) < (2, 10))|ternary(attr2_d_29, attr2_d) }}" + plugin: + requested_name: msimpleda + resolved_name: msimpleda + type: module + collection_name: null # should be "community.general"; this will hopefully change back because this seriously sucks - name: test msimpleda 1 msimpleda: @@ -23,17 +27,21 @@ that: - simple1.a == 1 - simple1.attr1 == "abc" - - ("deprecations" not in simple1) or attr2_depr_dict not in simple1.deprecations + - ("deprecations" not in simple1) or (attr2_depr_dict not in simple1.deprecations and attr2_depr_dict_dt not in simple1.deprecations) - name: test msimpleda 2 msimpleda: a: 2 register: simple2 +- name: Show results + debug: + var: simple2 + - name: assert simple2 assert: that: - simple2.a == 2 - simple2.attr2 == "def" - '"deprecations" in simple2' - - attr2_depr_dict in simple2.deprecations + - attr2_depr_dict in simple2.deprecations or attr2_depr_dict_dt in simple2.deprecations diff --git a/tests/integration/targets/proxmox/tasks/main.yml b/tests/integration/targets/proxmox/tasks/main.yml index 1ce9767b70..4e393cbf3b 100644 --- a/tests/integration/targets/proxmox/tasks/main.yml +++ b/tests/integration/targets/proxmox/tasks/main.yml @@ -165,6 +165,8 @@ name: test-instance clone: 'yes' state: present + tags: + - TagWithUppercaseChars timeout: 500 register: results_kvm diff --git a/tests/integration/targets/supervisorctl/aliases b/tests/integration/targets/supervisorctl/aliases index 58524f1fb1..77ed76c52d 100644 --- a/tests/integration/targets/supervisorctl/aliases +++ b/tests/integration/targets/supervisorctl/aliases @@ -4,5 +4,6 @@ azp/posix/2 destructive -skip/python3 skip/aix +skip/rhel # TODO executables are installed in /usr/local/bin, which isn't part of $PATH +skip/macos # TODO executables are installed in /Library/Frameworks/Python.framework/Versions/3.11/bin, which isn't part of $PATH diff --git a/tests/integration/targets/supervisorctl/tasks/install_pip.yml b/tests/integration/targets/supervisorctl/tasks/install_pip.yml index b1d3bd7796..89c03371d0 100644 --- a/tests/integration/targets/supervisorctl/tasks/install_pip.yml +++ b/tests/integration/targets/supervisorctl/tasks/install_pip.yml @@ -5,5 +5,5 @@ - name: install supervisord pip: - name: supervisor<4.0.0 # supervisor version 4.0.0 fails tests + name: supervisor state: present diff --git a/tests/integration/targets/supervisorctl/tasks/main.yml b/tests/integration/targets/supervisorctl/tasks/main.yml index 6f8c7968c0..24b505d9ad 100644 --- a/tests/integration/targets/supervisorctl/tasks/main.yml +++ b/tests/integration/targets/supervisorctl/tasks/main.yml @@ -8,50 +8,52 @@ # GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) # SPDX-License-Identifier: GPL-3.0-or-later -- block: - - tempfile: - state: directory - suffix: supervisorctl-tests - register: supervisord_sock_path +- when: + # setuptools is too old on RHEL/CentOS 6 (https://github.com/Supervisor/meld3/issues/23) + - ansible_os_family != 'RedHat' or ansible_distribution_major_version|int > 6 + # For some reason CentOS 7 and OpenSuSE 15 do not work on ansible-core 2.16 + - ansible_version.minor != 16 or ansible_distribution not in ['CentOS', 'openSUSE Leap'] + block: + - block: + - tempfile: + state: directory + suffix: supervisorctl-tests + register: supervisord_sock_path - - command: 'echo {{ remote_tmp_dir }}' - register: echo - - set_fact: - remote_dir: '{{ echo.stdout }}' + - command: 'echo {{ remote_tmp_dir }}' + register: echo + - set_fact: + remote_dir: '{{ echo.stdout }}' - - include_vars: '{{ item }}' - with_first_found: - - files: - - '{{ ansible_distribution }}.yml' - - '{{ ansible_os_family }}.yml' - - 'defaults.yml' + - include_vars: '{{ item }}' + with_first_found: + - files: + - '{{ ansible_distribution }}.yml' + - '{{ ansible_os_family }}.yml' + - 'defaults.yml' - - include_tasks: '{{ item }}' - with_first_found: - - files: - - 'install_{{ ansible_distribution }}.yml' # CentOS - - 'install_{{ ansible_os_family }}.yml' # RedHat - - 'install_{{ ansible_system }}.yml' # Linux + - include_tasks: '{{ item }}' + with_first_found: + - files: + - 'install_{{ ansible_distribution }}.yml' # CentOS + - 'install_{{ ansible_os_family }}.yml' # RedHat + - 'install_{{ ansible_system }}.yml' # Linux - - include_tasks: test.yml - with_items: - - { username: '', password: '' } - - { username: 'testétest', password: 'passéword' } # non-ASCII credentials - loop_control: - loop_var: credentials + - include_tasks: test.yml + with_items: + - { username: '', password: '' } + - { username: 'testétest', password: 'passéword' } # non-ASCII credentials + loop_control: + loop_var: credentials - # setuptools is too old on RHEL/CentOS 6 (https://github.com/Supervisor/meld3/issues/23) - when: ansible_os_family != 'RedHat' or ansible_distribution_major_version|int > 6 + always: + - include_tasks: '{{ item }}' + with_first_found: + - files: + - 'uninstall_{{ ansible_distribution }}.yml' # CentOS + - 'uninstall_{{ ansible_os_family }}.yml' # RedHat + - 'uninstall_{{ ansible_system }}.yml' # Linux - always: - - include_tasks: '{{ item }}' - when: ansible_os_family != 'RedHat' or ansible_distribution_major_version|int > 6 - with_first_found: - - files: - - 'uninstall_{{ ansible_distribution }}.yml' # CentOS - - 'uninstall_{{ ansible_os_family }}.yml' # RedHat - - 'uninstall_{{ ansible_system }}.yml' # Linux - - - file: - path: '{{ supervisord_sock_path.path }}' - state: absent + - file: + path: '{{ supervisord_sock_path.path }}' + state: absent diff --git a/tests/integration/targets/supervisorctl/tasks/test.yml b/tests/integration/targets/supervisorctl/tasks/test.yml index 5d1a867edc..f3fb9b4c81 100644 --- a/tests/integration/targets/supervisorctl/tasks/test.yml +++ b/tests/integration/targets/supervisorctl/tasks/test.yml @@ -7,6 +7,7 @@ template: src: supervisord.conf dest: '{{ remote_dir }}/supervisord.conf' + diff: true - block: - import_tasks: start_supervisord.yml diff --git a/tests/integration/targets/supervisorctl/tasks/test_start.yml b/tests/integration/targets/supervisorctl/tasks/test_start.yml index b814486cdb..da310eb657 100644 --- a/tests/integration/targets/supervisorctl/tasks/test_start.yml +++ b/tests/integration/targets/supervisorctl/tasks/test_start.yml @@ -22,6 +22,8 @@ when: credentials.username != '' - command: "supervisorctl -c {{ remote_dir }}/supervisord.conf {% if credentials.username %}-u {{ credentials.username }} -p {{ credentials.password }}{% endif %} status" + register: result_cmd + failed_when: result_cmd.rc not in [0, 3] - name: check that service is started assert: @@ -30,8 +32,9 @@ - (result is changed and result_with_auth is skip) or (result is skip and result_with_auth is changed) - name: check that service is running (part1) # py1.log content is checked below - script: "files/sendProcessStdin.py 'pys:py1' 2 \ - '{{ credentials.username }}' '{{ credentials.password }}'" + script: + cmd: "files/sendProcessStdin.py 'pys:py1' 2 '{{ credentials.username }}' '{{ credentials.password }}'" + executable: "{{ ansible_facts.python.executable }}" - name: try again to start py1 service (without auth) supervisorctl: diff --git a/tests/integration/targets/supervisorctl/tasks/test_stop.yml b/tests/integration/targets/supervisorctl/tasks/test_stop.yml index 8d8fdd42af..8e8a28b6eb 100644 --- a/tests/integration/targets/supervisorctl/tasks/test_stop.yml +++ b/tests/integration/targets/supervisorctl/tasks/test_stop.yml @@ -24,6 +24,8 @@ when: credentials.username != '' - command: "supervisorctl -c {{ remote_dir }}/supervisord.conf {% if credentials.username %}-u {{ credentials.username }} -p {{ credentials.password }}{% endif %} status" + register: result_cmd + failed_when: result_cmd.rc not in [0, 3] - name: check that service is stopped assert: @@ -32,8 +34,9 @@ - (result is changed and result_with_auth is skip) or (result is skip and result_with_auth is changed) - name: "check that service isn't running" - script: "files/sendProcessStdin.py 'pys:py1' 1 \ - '{{ credentials.username }}' '{{ credentials.password }}'" + script: + cmd: "files/sendProcessStdin.py 'pys:py1' 1 '{{ credentials.username }}' '{{ credentials.password }}'" + executable: "{{ ansible_facts.python.executable }}" register: is_py1_alive failed_when: is_py1_alive is success diff --git a/tests/integration/targets/test_ansible_type/tasks/tasks.yml b/tests/integration/targets/test_ansible_type/tasks/tasks.yml index d962838106..eb1ba2ec66 100644 --- a/tests/integration/targets/test_ansible_type/tasks/tasks.yml +++ b/tests/integration/targets/test_ansible_type/tasks/tasks.yml @@ -14,7 +14,9 @@ vars: data: "abc" result: '{{ data | community.general.reveal_ansible_type }}' - dtype: 'AnsibleUnicode' + dtype: + - 'AnsibleUnicode' + - '_AnsibleTaggedStr' - name: String. AnsibleUnicode alias str. assert: @@ -23,7 +25,7 @@ fail_msg: '"abc" is {{ result }}' quiet: '{{ quiet_test | default(true) | bool }}' vars: - alias: {"AnsibleUnicode": "str"} + alias: {"AnsibleUnicode": "str", "_AnsibleTaggedStr": "str"} data: "abc" result: '{{ data | community.general.reveal_ansible_type(alias) }}' dtype: 'str' @@ -37,7 +39,9 @@ vars: data: ["a", "b", "c"] result: '{{ data | community.general.reveal_ansible_type }}' - dtype: 'list[AnsibleUnicode]' + dtype: + - 'list[AnsibleUnicode]' + - 'list[_AnsibleTaggedStr]' - name: Dictionary. All keys are AnsibleUnicode. All values are AnsibleUnicode. assert: @@ -48,7 +52,9 @@ vars: data: {"a": "foo", "b": "bar", "c": "baz"} result: '{{ data | community.general.reveal_ansible_type }}' - dtype: 'dict[AnsibleUnicode, AnsibleUnicode]' + dtype: + - 'dict[AnsibleUnicode, AnsibleUnicode]' + - 'dict[_AnsibleTaggedStr, _AnsibleTaggedStr]' # No substitution and no alias. Type of strings is str # ---------------------------------------------------- @@ -143,7 +149,10 @@ fail_msg: '{"1": "a", "b": "b"} is {{ result }}' quiet: '{{ quiet_test | default(true) | bool }}' vars: - alias: {"AnsibleUnicode": "str"} + alias: + AnsibleUnicode: str + _AnsibleTaggedStr: str + _AnsibleTaggedInt: int data: {1: 'a', 'b': 'b'} result: '{{ data | community.general.reveal_ansible_type(alias) }}' dtype: dict[int|str, str] @@ -155,7 +164,10 @@ fail_msg: '{"1": "a", "2": "b"} is {{ result }}' quiet: '{{ quiet_test | default(true) | bool }}' vars: - alias: {"AnsibleUnicode": "str"} + alias: + AnsibleUnicode: str + _AnsibleTaggedStr: str + _AnsibleTaggedInt: int data: {1: 'a', 2: 'b'} result: '{{ data | community.general.reveal_ansible_type(alias) }}' dtype: dict[int, str] @@ -167,7 +179,11 @@ fail_msg: '{"a": 1, "b": 1.1, "c": "abc", "d": true, "e": ["x", "y", "z"], "f": {"x": 1, "y": 2}} is {{ result }}' quiet: '{{ quiet_test | default(true) | bool }}' vars: - alias: {"AnsibleUnicode": "str"} + alias: + AnsibleUnicode: str + _AnsibleTaggedStr: str + _AnsibleTaggedInt: int + _AnsibleTaggedFloat: float data: {'a': 1, 'b': 1.1, 'c': 'abc', 'd': True, 'e': ['x', 'y', 'z'], 'f': {'x': 1, 'y': 2}} result: '{{ data | community.general.reveal_ansible_type(alias) }}' dtype: dict[str, bool|dict|float|int|list|str] @@ -179,7 +195,11 @@ fail_msg: '[1, 2, 1.1, "abc", true, ["x", "y", "z"], {"x": 1, "y": 2}] is {{ result }}' quiet: '{{ quiet_test | default(true) | bool }}' vars: - alias: {"AnsibleUnicode": "str"} + alias: + AnsibleUnicode: str + _AnsibleTaggedStr: str + _AnsibleTaggedInt: int + _AnsibleTaggedFloat: float data: [1, 2, 1.1, 'abc', True, ['x', 'y', 'z'], {'x': 1, 'y': 2}] result: '{{ data | community.general.reveal_ansible_type(alias) }}' dtype: list[bool|dict|float|int|list|str] @@ -196,7 +216,10 @@ vars: data: abc result: '{{ data | community.general.reveal_ansible_type }}' - dtype: ['AnsibleUnicode', 'str'] + dtype: + - 'AnsibleUnicode' + - '_AnsibleTaggedStr' + - 'str' - name: float or int assert: @@ -207,7 +230,11 @@ vars: data: 123 result: '{{ data | community.general.reveal_ansible_type }}' - dtype: ['float', 'int'] + dtype: + - 'float' + - 'int' + - '_AnsibleTaggedInt' + - '_AnsibleTaggedFloat' - name: float or int assert: @@ -218,7 +245,11 @@ vars: data: 123.45 result: '{{ data | community.general.reveal_ansible_type }}' - dtype: ['float', 'int'] + dtype: + - 'float' + - 'int' + - '_AnsibleTaggedInt' + - '_AnsibleTaggedFloat' # Multiple alias # -------------- @@ -230,7 +261,11 @@ fail_msg: '123 is {{ result }}' quiet: '{{ quiet_test | default(true) | bool }}' vars: - alias: {"int": "number", "float": "number"} + alias: + int: number + float: number + _AnsibleTaggedInt: number + _AnsibleTaggedFloat: number data: 123 result: '{{ data | community.general.reveal_ansible_type(alias) }}' dtype: number @@ -242,7 +277,11 @@ fail_msg: '123.45 is {{ result }}' quiet: '{{ quiet_test | default(true) | bool }}' vars: - alias: {"int": "number", "float": "number"} + alias: + int: number + float: number + _AnsibleTaggedInt: number + _AnsibleTaggedFloat: number data: 123.45 result: '{{ data | community.general.reveal_ansible_type(alias) }}' dtype: number diff --git a/tests/integration/targets/zypper/files/post_error.spec b/tests/integration/targets/zypper/files/post_error.spec new file mode 100644 index 0000000000..af5bc03108 --- /dev/null +++ b/tests/integration/targets/zypper/files/post_error.spec @@ -0,0 +1,15 @@ +Summary: Post error RPM +Name: post_error +Version: 1 +Release: 0 +License: GPLv3 +Group: Applications/System +BuildArch: noarch + +%description +Post error RPM + +%files + +%post +exit 1 diff --git a/tests/sanity/extra/action-group.json.license b/tests/integration/targets/zypper/files/post_error.spec.license similarity index 100% rename from tests/sanity/extra/action-group.json.license rename to tests/integration/targets/zypper/files/post_error.spec.license diff --git a/tests/integration/targets/zypper/tasks/zypper.yml b/tests/integration/targets/zypper/tasks/zypper.yml index 3eefddbdfc..818bdd9f42 100644 --- a/tests/integration/targets/zypper/tasks/zypper.yml +++ b/tests/integration/targets/zypper/tasks/zypper.yml @@ -255,6 +255,91 @@ that: - "stat_result.stat.exists == true" +# Build and install an empty rpm with error in post script +- name: uninstall post_error + zypper: + name: post_error + state: removed + +- name: install rpmbuild + zypper: + name: rpmbuild + state: present + +- name: clean zypper RPM cache + file: + name: /var/cache/zypper/RPMS + state: absent + +- name: create directory + file: + path: "{{ remote_tmp_dir | expanduser }}/zypper2" + state: directory + +- name: copy spec file + copy: + src: post_error.spec + dest: "{{ remote_tmp_dir | expanduser }}/zypper2/post_error.spec" + +- name: build rpm + command: | + rpmbuild -bb \ + --define "_topdir {{remote_tmp_dir | expanduser }}/zypper2/rpm-build" + --define "_builddir %{_topdir}" \ + --define "_rpmdir %{_topdir}" \ + --define "_srcrpmdir %{_topdir}" \ + --define "_specdir {{remote_tmp_dir | expanduser}}/zypper2" \ + --define "_sourcedir %{_topdir}" \ + {{ remote_tmp_dir }}/zypper2/post_error.spec + register: rpm_build_result + +- name: install post_error rpm with skip_post_errors + zypper: + name: "{{ remote_tmp_dir | expanduser }}/zypper2/rpm-build/noarch/post_error-1-0.noarch.rpm" + disable_gpg_check: true + skip_post_errors: true + register: zypper_result + +- name: check post_error rpm + shell: rpm -q post_error + failed_when: false + register: rpm_result + +- name: verify installation of post_error + assert: + that: + - "zypper_result.rc == 0" + - "zypper_result.changed" + - "rpm_result.rc == 0" + +- name: uninstall post_error + zypper: + name: post_error + state: removed + +- name: install post_error rpm without skip_post_errors + zypper: + name: "{{ remote_tmp_dir | expanduser }}/zypper2/rpm-build/noarch/post_error-1-0.noarch.rpm" + disable_gpg_check: true + register: zypper_result + ignore_errors: true + +- name: check post_error rpm + shell: rpm -q post_error + failed_when: false + register: rpm_result + +- name: verify installation of post_error + assert: + that: + - "zypper_result.rc == 107" + - "not zypper_result.changed" + - "rpm_result.rc == 0" + +- name: uninstall post_error + zypper: + name: post_error + state: removed # test simultaneous remove and install using +- prefixes diff --git a/tests/sanity/extra/action-group.json b/tests/sanity/extra/action-group.json deleted file mode 100644 index db6a92bcb7..0000000000 --- a/tests/sanity/extra/action-group.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "include_symlinks": true, - "prefixes": [ - "meta/runtime.yml", - "plugins/modules/", - "tests/sanity/extra/action-group." - ], - "output": "path-message", - "requirements": [ - "pyyaml" - ] -} diff --git a/tests/sanity/extra/action-group.py b/tests/sanity/extra/action-group.py deleted file mode 100755 index 9c82ff8619..0000000000 --- a/tests/sanity/extra/action-group.py +++ /dev/null @@ -1,134 +0,0 @@ -#!/usr/bin/env python -# Copyright (c) 2024, Felix Fontein -# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) -# SPDX-License-Identifier: GPL-3.0-or-later -"""Make sure all modules that should show up in the action group.""" - -from __future__ import annotations - -import os -import re -import yaml - - -ACTION_GROUPS = { - # The format is as follows: - # * 'pattern': a regular expression matching all module names potentially belonging to the action group; - # * 'exclusions': a list of modules that are not part of the action group; all other modules matching 'pattern' must be part of it; - # * 'doc_fragment': the docs fragment that documents membership of the action group. - 'consul': { - 'pattern': re.compile('^consul_.*$'), - 'exclusions': [ - 'consul_acl_bootstrap', - 'consul_kv', - ], - 'doc_fragment': 'community.general.consul.actiongroup_consul', - }, - 'keycloak': { - 'pattern': re.compile('^keycloak_.*$'), - 'exclusions': [ - 'keycloak_realm_info', - ], - 'doc_fragment': 'community.general.keycloak.actiongroup_keycloak', - }, - 'proxmox': { - 'pattern': re.compile('^proxmox(_.*)?$'), - 'exclusions': [], - 'doc_fragment': 'community.general.proxmox.actiongroup_proxmox', - }, -} - - -def main(): - """Main entry point.""" - - # Load redirects - meta_runtime = 'meta/runtime.yml' - self_path = 'tests/sanity/extra/action-group.py' - try: - with open(meta_runtime, 'rb') as f: - data = yaml.safe_load(f) - action_groups = data['action_groups'] - except Exception as exc: - print(f'{meta_runtime}: cannot load action groups: {exc}') - return - - for action_group in action_groups: - if action_group not in ACTION_GROUPS: - print(f'{meta_runtime}: found unknown action group {action_group!r}; likely {self_path} needs updating') - for action_group, action_group_data in list(ACTION_GROUPS.items()): - if action_group not in action_groups: - print(f'{meta_runtime}: cannot find action group {action_group!r}; likely {self_path} needs updating') - - modules_directory = 'plugins/modules/' - modules_suffix = '.py' - - for file in os.listdir(modules_directory): - if not file.endswith(modules_suffix): - continue - module_name = file[:-len(modules_suffix)] - - for action_group, action_group_data in ACTION_GROUPS.items(): - action_group_content = action_groups.get(action_group) or [] - path = os.path.join(modules_directory, file) - - if not action_group_data['pattern'].match(module_name): - if module_name in action_group_content: - print(f'{path}: module is in action group {action_group!r} despite not matching its pattern as defined in {self_path}') - continue - - should_be_in_action_group = module_name not in action_group_data['exclusions'] - - if should_be_in_action_group: - if module_name not in action_group_content: - print(f'{meta_runtime}: module {module_name!r} is not part of {action_group!r} action group') - else: - action_group_content.remove(module_name) - - documentation = [] - in_docs = False - with open(path, 'r', encoding='utf-8') as f: - for line in f: - if line.startswith('DOCUMENTATION ='): - in_docs = True - elif line.startswith(("'''", '"""')) and in_docs: - in_docs = False - elif in_docs: - documentation.append(line) - if in_docs: - print(f'{path}: cannot find DOCUMENTATION end') - if not documentation: - print(f'{path}: cannot find DOCUMENTATION') - continue - - try: - docs = yaml.safe_load('\n'.join(documentation)) - if not isinstance(docs, dict): - raise Exception('is not a top-level dictionary') - except Exception as exc: - print(f'{path}: cannot load DOCUMENTATION as YAML: {exc}') - continue - - docs_fragments = docs.get('extends_documentation_fragment') or [] - is_in_action_group = action_group_data['doc_fragment'] in docs_fragments - - if should_be_in_action_group != is_in_action_group: - if should_be_in_action_group: - print( - f'{path}: module does not document itself as part of action group {action_group!r}, but it should;' - f' you need to add {action_group_data["doc_fragment"]} to "extends_documentation_fragment" in DOCUMENTATION' - ) - else: - print(f'{path}: module documents itself as part of action group {action_group!r}, but it should not be') - - for action_group, action_group_data in ACTION_GROUPS.items(): - action_group_content = action_groups.get(action_group) or [] - for module_name in action_group_content: - print( - f'{meta_runtime}: module {module_name} mentioned in {action_group!r} action group' - f' does not exist or does not match pattern defined in {self_path}' - ) - - -if __name__ == '__main__': - main() diff --git a/tests/sanity/extra/aliases.json b/tests/sanity/extra/aliases.json deleted file mode 100644 index dabdcd6a1d..0000000000 --- a/tests/sanity/extra/aliases.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "include_symlinks": false, - "prefixes": [ - ".azure-pipelines/azure-pipelines.yml", - "tests/integration/targets/" - ], - "output": "path-message", - "requirements": [ - "PyYAML" - ] -} diff --git a/tests/sanity/extra/aliases.json.license b/tests/sanity/extra/aliases.json.license deleted file mode 100644 index edff8c7685..0000000000 --- a/tests/sanity/extra/aliases.json.license +++ /dev/null @@ -1,3 +0,0 @@ -GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) -SPDX-License-Identifier: GPL-3.0-or-later -SPDX-FileCopyrightText: Ansible Project diff --git a/tests/sanity/extra/aliases.py b/tests/sanity/extra/aliases.py old mode 100755 new mode 100644 index c1dcba0df5..8eb2e9aadb --- a/tests/sanity/extra/aliases.py +++ b/tests/sanity/extra/aliases.py @@ -6,6 +6,7 @@ from __future__ import (absolute_import, division, print_function) __metaclass__ = type +import glob import sys import yaml @@ -13,9 +14,6 @@ import yaml def main(): """Main entry point.""" - paths = sys.argv[1:] or sys.stdin.read().splitlines() - paths = [path for path in paths if path.endswith('/aliases')] - with open('.azure-pipelines/azure-pipelines.yml', 'rb') as f: azp = yaml.safe_load(f) @@ -27,6 +25,9 @@ def main(): for group in job['parameters']['groups']: allowed_targets.add('azp/posix/{0}'.format(group)) + paths = glob.glob("tests/integration/targets/*/aliases") + + has_errors = False for path in paths: targets = [] skip = False @@ -56,10 +57,14 @@ def main(): if 'targets/setup_' in path: continue print('%s: %s' % (path, 'found no targets')) + has_errors = True for target in targets: if target not in allowed_targets: print('%s: %s' % (path, 'found invalid target "{0}"'.format(target))) + has_errors = True + + return 1 if has_errors else 0 if __name__ == '__main__': - main() + sys.exit(main()) diff --git a/tests/sanity/extra/botmeta.json b/tests/sanity/extra/botmeta.json deleted file mode 100644 index c546ab5fd7..0000000000 --- a/tests/sanity/extra/botmeta.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "include_symlinks": false, - "output": "path-line-column-message", - "requirements": [ - "PyYAML", - "voluptuous==0.12.1" - ] -} diff --git a/tests/sanity/extra/botmeta.json.license b/tests/sanity/extra/botmeta.json.license deleted file mode 100644 index edff8c7685..0000000000 --- a/tests/sanity/extra/botmeta.json.license +++ /dev/null @@ -1,3 +0,0 @@ -GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) -SPDX-License-Identifier: GPL-3.0-or-later -SPDX-FileCopyrightText: Ansible Project diff --git a/tests/sanity/extra/botmeta.py b/tests/sanity/extra/botmeta.py old mode 100755 new mode 100644 index 9f7e977ea2..b9cdbd8a6c --- a/tests/sanity/extra/botmeta.py +++ b/tests/sanity/extra/botmeta.py @@ -54,184 +54,194 @@ IGNORE_NO_MAINTAINERS = [ 'plugins/filter/random_mac.py', ] -FILENAME = '.github/BOTMETA.yml' -LIST_ENTRIES = frozenset(('supershipit', 'maintainers', 'labels', 'keywords', 'notify', 'ignore')) +class BotmetaCheck: + def __init__(self): + self.errors: list[str] = [] + self.botmeta_filename = '.github/BOTMETA.yml' + self.list_entries = frozenset(('supershipit', 'maintainers', 'labels', 'keywords', 'notify', 'ignore')) + self.author_regex = re.compile(r'^\w.*\(@([\w-]+)\)(?![\w.])') -AUTHOR_REGEX = re.compile(r'^\w.*\(@([\w-]+)\)(?![\w.])') + def report_error(self, error: str) -> None: + self.errors.append(error) + def read_authors(self, filename: str) -> list[str]: + data = {} + try: + documentation = [] + in_docs = False + with open(filename, 'r', encoding='utf-8') as f: + for line in f: + if line.startswith('DOCUMENTATION ='): + in_docs = True + elif line.startswith(("'''", '"""')) and in_docs: + in_docs = False + elif in_docs: + documentation.append(line) + if in_docs: + self.report_error(f'{filename}: cannot find DOCUMENTATION end') + return [] + if not documentation: + self.report_error(f'{filename}: cannot find DOCUMENTATION') + return [] -def read_authors(filename): - data = {} - try: - documentation = [] - in_docs = False - with open(filename, 'r', encoding='utf-8') as f: - for line in f: - if line.startswith('DOCUMENTATION ='): - in_docs = True - elif line.startswith(("'''", '"""')) and in_docs: - in_docs = False - elif in_docs: - documentation.append(line) - if in_docs: - print(f'{filename}: cannot find DOCUMENTATION end') - return [] - if not documentation: - print(f'{filename}: cannot find DOCUMENTATION') + data = yaml.safe_load('\n'.join(documentation)) + + except Exception as e: + self.report_error(f'{filename}:0:0: Cannot load DOCUMENTATION: {e}') return [] - data = yaml.safe_load('\n'.join(documentation)) + author = data.get('author') or [] + if isinstance(author, str): + author = [author] + return author - except Exception as e: - print(f'{filename}:0:0: Cannot load DOCUMENTATION: {e}') - return [] + def extract_author_name(self, author: str) -> str | None: + m = self.author_regex.match(author) + if m: + return m.group(1) + if author == 'Ansible Core Team': + return '$team_ansible_core' + return None - author = data.get('author') or [] - if isinstance(author, str): - author = [author] - return author + def validate(self, filename: str, filedata: dict) -> None: + if not filename.startswith('plugins/'): + return + if filename.startswith(('plugins/doc_fragments/', 'plugins/module_utils/')): + return + # Compile list of all active and inactive maintainers + all_maintainers = filedata['maintainers'] + filedata['ignore'] + if not filename.startswith(('plugins/action/', 'plugins/doc_fragments/', 'plugins/filter/', 'plugins/module_utils/', 'plugins/plugin_utils/')): + maintainers = self.read_authors(filename) + for maintainer in maintainers: + maintainer = self.extract_author_name(maintainer) + if maintainer is not None and maintainer not in all_maintainers: + others = ', '.join(all_maintainers) + msg = f'Author {maintainer} not mentioned as active or inactive maintainer for {filename} (mentioned are: {others})' + self.report_error(f'{self.botmeta_filename}:0:0: {msg}') + should_have_no_maintainer = filename in IGNORE_NO_MAINTAINERS + if not all_maintainers and not should_have_no_maintainer: + self.report_error(f'{self.botmeta_filename}:0:0: No (active or inactive) maintainer mentioned for {filename}') + if all_maintainers and should_have_no_maintainer: + own_path = os.path.relpath(__file__, os.getcwd()) + self.report_error(f'{self.botmeta_filename}:0:0: Please remove {filename} from the ignore list of {own_path}') + + def run(self) -> None: + try: + with open(self.botmeta_filename, 'rb') as f: + botmeta = yaml.safe_load(f) + except yaml.error.MarkedYAMLError as ex: + msg = re.sub(r'\s+', ' ', str(ex)) + self.report_error('f{self.botmeta_filename}:{ex.context_mark.line + 1}:{ex.context_mark.column + 1}: YAML load failed: {msg}') + return + except Exception as ex: # pylint: disable=broad-except + msg = re.sub(r'\s+', ' ', str(ex)) + self.report_error(f'{self.botmeta_filename}:0:0: YAML load failed: {msg}') + return + + # Validate schema + + MacroSchema = Schema({ + (str): Any(str, None), + }, extra=PREVENT_EXTRA) + + FilesSchema = Schema({ + (str): { + ('supershipit'): str, + ('support'): Any('community'), + ('maintainers'): str, + ('labels'): str, + ('keywords'): str, + ('notify'): str, + ('ignore'): str, + }, + }, extra=PREVENT_EXTRA) + + schema = Schema({ + ('notifications'): bool, + ('automerge'): bool, + ('macros'): MacroSchema, + ('files'): FilesSchema, + }, extra=PREVENT_EXTRA) + + try: + schema(botmeta) + except MultipleInvalid as ex: + for error in ex.errors: + # No way to get line/column numbers + self.report_error(f'{self.botmeta_filename}:0:0: {humanize_error(botmeta, error)}') + return + + # Preprocess (substitute macros, convert to lists) + macros = botmeta.get('macros') or {} + macro_re = re.compile(r'\$([a-zA-Z_]+)') + + def convert_macros(text, macros): + def f(m): + macro = m.group(1) + replacement = (macros[macro] or '') + if macro == 'team_ansible_core': + return f'$team_ansible_core {replacement}' + return replacement + + return macro_re.sub(f, text) + + files = {} + try: + for file, filedata in (botmeta.get('files') or {}).items(): + file = convert_macros(file, macros) + filedata = {k: convert_macros(v, macros) for k, v in filedata.items()} + files[file] = filedata + for k, v in filedata.items(): + if k in self.list_entries: + filedata[k] = v.split() + except KeyError as e: + self.report_error(f'{self.botmeta_filename}:0:0: Found unknown macro {e}') + return + + # Scan all files + unmatched = set(files) + for dirs in ('docs/docsite/rst', 'plugins', 'tests', 'changelogs'): + for dirpath, _dirnames, filenames in os.walk(dirs): + for file in sorted(filenames): + if file.endswith('.pyc'): + continue + filename = os.path.join(dirpath, file) + if os.path.islink(filename): + continue + if os.path.isfile(filename): + matching_files = [] + for file, filedata in files.items(): + if filename.startswith(file): + matching_files.append((file, filedata)) + if file in unmatched: + unmatched.remove(file) + if not matching_files: + self.report_error(f'{self.botmeta_filename}:0:0: Did not find any entry for {filename}') + + matching_files.sort(key=lambda kv: kv[0]) + filedata = {} + for k in self.list_entries: + filedata[k] = [] + for dummy, data in matching_files: + for k, v in data.items(): + if k in self.list_entries: + v = filedata[k] + v + filedata[k] = v + self.validate(filename, filedata) + + for file in unmatched: + self.report_error(f'{self.botmeta_filename}:0:0: Entry {file} was not used') -def extract_author_name(author): - m = AUTHOR_REGEX.match(author) - if m: - return m.group(1) - if author == 'Ansible Core Team': - return '$team_ansible_core' - return None - - -def validate(filename, filedata): - if not filename.startswith('plugins/'): - return - if filename.startswith(('plugins/doc_fragments/', 'plugins/module_utils/')): - return - # Compile list of all active and inactive maintainers - all_maintainers = filedata['maintainers'] + filedata['ignore'] - if not filename.startswith(('plugins/action/', 'plugins/doc_fragments/', 'plugins/filter/', 'plugins/module_utils/', 'plugins/plugin_utils/')): - maintainers = read_authors(filename) - for maintainer in maintainers: - maintainer = extract_author_name(maintainer) - if maintainer is not None and maintainer not in all_maintainers: - others = ', '.join(all_maintainers) - msg = f'Author {maintainer} not mentioned as active or inactive maintainer for {filename} (mentioned are: {others})' - print(f'{FILENAME}:0:0: {msg}') - should_have_no_maintainer = filename in IGNORE_NO_MAINTAINERS - if not all_maintainers and not should_have_no_maintainer: - print(f'{FILENAME}:0:0: No (active or inactive) maintainer mentioned for {filename}') - if all_maintainers and should_have_no_maintainer: - print(f'{FILENAME}:0:0: Please remove {filename} from the ignore list of {sys.argv[0]}') - - -def main(): +def main() -> int: """Main entry point.""" - try: - with open(FILENAME, 'rb') as f: - botmeta = yaml.safe_load(f) - except yaml.error.MarkedYAMLError as ex: - msg = re.sub(r'\s+', ' ', str(ex)) - print('f{FILENAME}:{ex.context_mark.line + 1}:{ex.context_mark.column + 1}: YAML load failed: {msg}') - return - except Exception as ex: # pylint: disable=broad-except - msg = re.sub(r'\s+', ' ', str(ex)) - print(f'{FILENAME}:0:0: YAML load failed: {msg}') - return - - # Validate schema - - MacroSchema = Schema({ - (str): Any(str, None), - }, extra=PREVENT_EXTRA) - - FilesSchema = Schema({ - (str): { - ('supershipit'): str, - ('support'): Any('community'), - ('maintainers'): str, - ('labels'): str, - ('keywords'): str, - ('notify'): str, - ('ignore'): str, - }, - }, extra=PREVENT_EXTRA) - - schema = Schema({ - ('notifications'): bool, - ('automerge'): bool, - ('macros'): MacroSchema, - ('files'): FilesSchema, - }, extra=PREVENT_EXTRA) - - try: - schema(botmeta) - except MultipleInvalid as ex: - for error in ex.errors: - # No way to get line/column numbers - print(f'{FILENAME}:0:0: {humanize_error(botmeta, error)}') - return - - # Preprocess (substitute macros, convert to lists) - macros = botmeta.get('macros') or {} - macro_re = re.compile(r'\$([a-zA-Z_]+)') - - def convert_macros(text, macros): - def f(m): - macro = m.group(1) - replacement = (macros[macro] or '') - if macro == 'team_ansible_core': - return f'$team_ansible_core {replacement}' - return replacement - - return macro_re.sub(f, text) - - files = {} - try: - for file, filedata in (botmeta.get('files') or {}).items(): - file = convert_macros(file, macros) - filedata = {k: convert_macros(v, macros) for k, v in filedata.items()} - files[file] = filedata - for k, v in filedata.items(): - if k in LIST_ENTRIES: - filedata[k] = v.split() - except KeyError as e: - print(f'{FILENAME}:0:0: Found unknown macro {e}') - return - - # Scan all files - unmatched = set(files) - for dirs in ('docs/docsite/rst', 'plugins', 'tests', 'changelogs'): - for dirpath, _dirnames, filenames in os.walk(dirs): - for file in sorted(filenames): - if file.endswith('.pyc'): - continue - filename = os.path.join(dirpath, file) - if os.path.islink(filename): - continue - if os.path.isfile(filename): - matching_files = [] - for file, filedata in files.items(): - if filename.startswith(file): - matching_files.append((file, filedata)) - if file in unmatched: - unmatched.remove(file) - if not matching_files: - print(f'{FILENAME}:0:0: Did not find any entry for {filename}') - - matching_files.sort(key=lambda kv: kv[0]) - filedata = {} - for k in LIST_ENTRIES: - filedata[k] = [] - for dummy, data in matching_files: - for k, v in data.items(): - if k in LIST_ENTRIES: - v = filedata[k] + v - filedata[k] = v - validate(filename, filedata) - - for file in unmatched: - print(f'{FILENAME}:0:0: Entry {file} was not used') + check = BotmetaCheck() + check.run() + for error in sorted(check.errors): + print(error) + return 1 if check.errors else 0 if __name__ == '__main__': - main() + sys.exit(main()) diff --git a/tests/sanity/extra/extra-docs.json b/tests/sanity/extra/extra-docs.json deleted file mode 100644 index 9a28d174fd..0000000000 --- a/tests/sanity/extra/extra-docs.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "include_symlinks": false, - "prefixes": [ - "docs/docsite/", - "plugins/", - "roles/" - ], - "output": "path-line-column-message", - "requirements": [ - "ansible-core", - "antsibull-docs" - ] -} diff --git a/tests/sanity/extra/extra-docs.json.license b/tests/sanity/extra/extra-docs.json.license deleted file mode 100644 index edff8c7685..0000000000 --- a/tests/sanity/extra/extra-docs.json.license +++ /dev/null @@ -1,3 +0,0 @@ -GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) -SPDX-License-Identifier: GPL-3.0-or-later -SPDX-FileCopyrightText: Ansible Project diff --git a/tests/sanity/extra/extra-docs.py b/tests/sanity/extra/extra-docs.py deleted file mode 100755 index 251e6d70f5..0000000000 --- a/tests/sanity/extra/extra-docs.py +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env python -# Copyright (c) Ansible Project -# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) -# SPDX-License-Identifier: GPL-3.0-or-later -"""Check extra collection docs with antsibull-docs.""" -from __future__ import (absolute_import, division, print_function) -__metaclass__ = type - -import os -import sys -import subprocess - - -def main(): - """Main entry point.""" - env = os.environ.copy() - suffix = ':{env}'.format(env=env["ANSIBLE_COLLECTIONS_PATH"]) if 'ANSIBLE_COLLECTIONS_PATH' in env else '' - env['ANSIBLE_COLLECTIONS_PATH'] = '{root}{suffix}'.format(root=os.path.dirname(os.path.dirname(os.path.dirname(os.getcwd()))), suffix=suffix) - p = subprocess.run( - ['antsibull-docs', 'lint-collection-docs', '--plugin-docs', '--skip-rstcheck', '.'], - env=env, - check=False, - ) - if p.returncode not in (0, 3): - print('{0}:0:0: unexpected return code {1}'.format(sys.argv[0], p.returncode)) - - -if __name__ == '__main__': - main() diff --git a/tests/sanity/extra/licenses.json b/tests/sanity/extra/licenses.json deleted file mode 100644 index 50e47ca88b..0000000000 --- a/tests/sanity/extra/licenses.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "include_symlinks": false, - "output": "path-message" -} diff --git a/tests/sanity/extra/licenses.json.license b/tests/sanity/extra/licenses.json.license deleted file mode 100644 index edff8c7685..0000000000 --- a/tests/sanity/extra/licenses.json.license +++ /dev/null @@ -1,3 +0,0 @@ -GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) -SPDX-License-Identifier: GPL-3.0-or-later -SPDX-FileCopyrightText: Ansible Project diff --git a/tests/sanity/extra/licenses.py b/tests/sanity/extra/licenses.py deleted file mode 100755 index 6227ee22f2..0000000000 --- a/tests/sanity/extra/licenses.py +++ /dev/null @@ -1,110 +0,0 @@ -#!/usr/bin/env python -# Copyright (c) 2022, Felix Fontein -# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) -# SPDX-License-Identifier: GPL-3.0-or-later -"""Prevent files without a correct license identifier from being added to the source tree.""" -from __future__ import (absolute_import, division, print_function) -__metaclass__ = type - -import os -import glob -import sys - - -def format_license_list(licenses): - if not licenses: - return '(empty)' - return ', '.join(['"%s"' % license for license in licenses]) - - -def find_licenses(filename, relax=False): - spdx_license_identifiers = [] - other_license_identifiers = [] - has_copyright = False - try: - with open(filename, 'r', encoding='utf-8') as f: - for line in f: - line = line.rstrip() - if 'Copyright ' in line: - has_copyright = True - if 'Copyright: ' in line: - print('%s: found copyright line with "Copyright:". Please remove the colon.' % (filename, )) - if 'SPDX-FileCopyrightText: ' in line: - has_copyright = True - idx = line.find('SPDX-License-Identifier: ') - if idx >= 0: - lic_id = line[idx + len('SPDX-License-Identifier: '):] - spdx_license_identifiers.extend(lic_id.split(' OR ')) - if 'GNU General Public License' in line: - if 'v3.0+' in line: - other_license_identifiers.append('GPL-3.0-or-later') - if 'version 3 or later' in line: - other_license_identifiers.append('GPL-3.0-or-later') - if 'Simplified BSD License' in line: - other_license_identifiers.append('BSD-2-Clause') - if 'Apache License 2.0' in line: - other_license_identifiers.append('Apache-2.0') - if 'PSF License' in line or 'Python-2.0' in line: - other_license_identifiers.append('PSF-2.0') - if 'MIT License' in line: - other_license_identifiers.append('MIT') - except Exception as exc: - print('%s: error while processing file: %s' % (filename, exc)) - if len(set(spdx_license_identifiers)) < len(spdx_license_identifiers): - print('%s: found identical SPDX-License-Identifier values' % (filename, )) - if other_license_identifiers and set(other_license_identifiers) != set(spdx_license_identifiers): - print('%s: SPDX-License-Identifier yielded the license list %s, while manual guessing yielded the license list %s' % ( - filename, format_license_list(spdx_license_identifiers), format_license_list(other_license_identifiers))) - if not has_copyright and not relax: - print('%s: found no copyright notice' % (filename, )) - return sorted(spdx_license_identifiers) - - -def main(): - """Main entry point.""" - paths = sys.argv[1:] or sys.stdin.read().splitlines() - - # The following paths are allowed to have no license identifier - no_comments_allowed = [ - 'changelogs/fragments/*.yml', - 'changelogs/fragments/*.yaml', - ] - - # These files are completely ignored - ignore_paths = [ - '.ansible-test-timeout.json', - '.reuse/dep5', - 'LICENSES/*.txt', - 'COPYING', - ] - - no_comments_allowed = [fn for pattern in no_comments_allowed for fn in glob.glob(pattern)] - ignore_paths = [fn for pattern in ignore_paths for fn in glob.glob(pattern)] - - valid_licenses = [license_file[len('LICENSES/'):-len('.txt')] for license_file in glob.glob('LICENSES/*.txt')] - - for path in paths: - if path.startswith('./'): - path = path[2:] - if path in ignore_paths or path.startswith('tests/output/'): - continue - if os.stat(path).st_size == 0: - continue - if not path.endswith('.license') and os.path.exists(path + '.license'): - path = path + '.license' - valid_licenses_for_path = valid_licenses - if path.startswith('plugins/') and not path.startswith(('plugins/modules/', 'plugins/module_utils/', 'plugins/doc_fragments/')): - valid_licenses_for_path = [license for license in valid_licenses if license == 'GPL-3.0-or-later'] - licenses = find_licenses(path, relax=path in no_comments_allowed) - if not licenses: - if path not in no_comments_allowed: - print('%s: must have at least one license' % (path, )) - else: - for license in licenses: - if license not in valid_licenses_for_path: - print('%s: found not allowed license "%s", must be one of %s' % ( - path, license, format_license_list(valid_licenses_for_path))) - - -if __name__ == '__main__': - main() diff --git a/tests/sanity/extra/licenses.py.license b/tests/sanity/extra/licenses.py.license deleted file mode 100644 index 6c4958feba..0000000000 --- a/tests/sanity/extra/licenses.py.license +++ /dev/null @@ -1,3 +0,0 @@ -GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) -SPDX-License-Identifier: GPL-3.0-or-later -SPDX-FileCopyrightText: 2022, Felix Fontein diff --git a/tests/sanity/extra/no-unwanted-files.json b/tests/sanity/extra/no-unwanted-files.json deleted file mode 100644 index c789a7fd39..0000000000 --- a/tests/sanity/extra/no-unwanted-files.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "include_symlinks": true, - "prefixes": [ - "plugins/" - ], - "output": "path-message" -} diff --git a/tests/sanity/extra/no-unwanted-files.json.license b/tests/sanity/extra/no-unwanted-files.json.license deleted file mode 100644 index edff8c7685..0000000000 --- a/tests/sanity/extra/no-unwanted-files.json.license +++ /dev/null @@ -1,3 +0,0 @@ -GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) -SPDX-License-Identifier: GPL-3.0-or-later -SPDX-FileCopyrightText: Ansible Project diff --git a/tests/sanity/extra/no-unwanted-files.py b/tests/sanity/extra/no-unwanted-files.py deleted file mode 100755 index b39df83a18..0000000000 --- a/tests/sanity/extra/no-unwanted-files.py +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env python -# Copyright (c) Ansible Project -# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) -# SPDX-License-Identifier: GPL-3.0-or-later -"""Prevent unwanted files from being added to the source tree.""" -from __future__ import (absolute_import, division, print_function) -__metaclass__ = type - -import os -import os.path -import sys - - -def main(): - """Main entry point.""" - paths = sys.argv[1:] or sys.stdin.read().splitlines() - - allowed_extensions = ( - '.cs', - '.ps1', - '.psm1', - '.py', - ) - - skip_paths = set([ - ]) - - skip_directories = ( - ) - - yaml_directories = ( - 'plugins/test/', - 'plugins/filter/', - ) - - for path in paths: - if path in skip_paths: - continue - - if any(path.startswith(skip_directory) for skip_directory in skip_directories): - continue - - if os.path.islink(path): - print('%s: is a symbolic link' % (path, )) - elif not os.path.isfile(path): - print('%s: is not a regular file' % (path, )) - - ext = os.path.splitext(path)[1] - - if ext in ('.yml', ) and any(path.startswith(yaml_directory) for yaml_directory in yaml_directories): - continue - - if ext not in allowed_extensions: - print('%s: extension must be one of: %s' % (path, ', '.join(allowed_extensions))) - - -if __name__ == '__main__': - main() diff --git a/tests/sanity/ignore-2.15.txt b/tests/sanity/ignore-2.15.txt index f042b888e8..6115954d00 100644 --- a/tests/sanity/ignore-2.15.txt +++ b/tests/sanity/ignore-2.15.txt @@ -1,4 +1,5 @@ .azure-pipelines/scripts/publish-codecov.py replace-urlopen +plugins/connection/wsl.py yamllint:unparsable-with-libyaml plugins/inventory/gitlab_runners.py yamllint:unparsable-with-libyaml plugins/inventory/iocage.py yamllint:unparsable-with-libyaml plugins/inventory/linode.py yamllint:unparsable-with-libyaml diff --git a/tests/sanity/ignore-2.16.txt b/tests/sanity/ignore-2.16.txt index 6f3a7f038e..8ac70d76d7 100644 --- a/tests/sanity/ignore-2.16.txt +++ b/tests/sanity/ignore-2.16.txt @@ -1,3 +1,4 @@ +plugins/connection/wsl.py yamllint:unparsable-with-libyaml plugins/inventory/gitlab_runners.py yamllint:unparsable-with-libyaml plugins/inventory/iocage.py yamllint:unparsable-with-libyaml plugins/inventory/linode.py yamllint:unparsable-with-libyaml diff --git a/tests/unit/plugins/connection/test_wsl.py b/tests/unit/plugins/connection/test_wsl.py new file mode 100644 index 0000000000..768f9a8d27 --- /dev/null +++ b/tests/unit/plugins/connection/test_wsl.py @@ -0,0 +1,586 @@ +# -*- coding: utf-8 -*- +# Derived from test_proxmox_pct_remote.py (c) 2024 Nils Stein (@mietzen) +# Copyright (c) 2025 Rui Lopes (@rgl) +# Copyright (c) 2025 Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +import os +import pytest + +from ansible_collections.community.general.plugins.connection.wsl import authenticity_msg, MyAddPolicy +from ansible_collections.community.general.plugins.module_utils._filelock import FileLock, LockTimeout +from ansible.errors import AnsibleError, AnsibleAuthenticationFailure, AnsibleConnectionFailure +from ansible.module_utils.common.text.converters import to_bytes +from ansible.module_utils.compat.paramiko import paramiko +from ansible.playbook.play_context import PlayContext +from ansible.plugins.loader import connection_loader +from io import StringIO +from pathlib import Path +from unittest.mock import patch, MagicMock, mock_open + + +@pytest.fixture +def connection(): + play_context = PlayContext() + in_stream = StringIO() + conn = connection_loader.get('community.general.wsl', play_context, in_stream) + conn.set_option('remote_addr', '192.168.1.100') + conn.set_option('remote_user', 'root') + conn.set_option('password', 'password') + conn.set_option('wsl_distribution', 'test') + return conn + + +def test_connection_options(connection): + """ Test that connection options are properly set """ + assert connection.get_option('remote_addr') == '192.168.1.100' + assert connection.get_option('remote_user') == 'root' + assert connection.get_option('password') == 'password' + assert connection.get_option('wsl_distribution') == 'test' + + +def test_authenticity_msg(): + """ Test authenticity message formatting """ + msg = authenticity_msg('test.host', 'ssh-rsa', 'AA:BB:CC:DD') + assert 'test.host' in msg + assert 'ssh-rsa' in msg + assert 'AA:BB:CC:DD' in msg + + +def test_missing_host_key(connection): + """ Test MyAddPolicy missing_host_key method """ + + client = MagicMock() + key = MagicMock() + key.get_fingerprint.return_value = b'fingerprint' + key.get_name.return_value = 'ssh-rsa' + + policy = MyAddPolicy(connection) + + connection.set_option('host_key_auto_add', True) + policy.missing_host_key(client, 'test.host', key) + assert hasattr(key, '_added_by_ansible_this_time') + + connection.set_option('host_key_auto_add', False) + connection.set_option('host_key_checking', False) + policy.missing_host_key(client, 'test.host', key) + + connection.set_option('host_key_checking', True) + connection.set_option('host_key_auto_add', False) + connection.set_option('use_persistent_connections', False) + + with patch('ansible.utils.display.Display.prompt_until', return_value='yes'): + policy.missing_host_key(client, 'test.host', key) + + with patch('ansible.utils.display.Display.prompt_until', return_value='no'): + with pytest.raises(AnsibleError, match='host connection rejected by user'): + policy.missing_host_key(client, 'test.host', key) + + +def test_set_log_channel(connection): + """ Test setting log channel """ + connection._set_log_channel('test_channel') + assert connection._log_channel == 'test_channel' + + +def test_parse_proxy_command(connection): + """ Test proxy command parsing """ + connection.set_option('proxy_command', 'ssh -W %h:%p proxy.example.com') + connection.set_option('remote_addr', 'target.example.com') + connection.set_option('remote_user', 'testuser') + + result = connection._parse_proxy_command(port=2222) + assert 'sock' in result + assert isinstance(result['sock'], paramiko.ProxyCommand) + + +@patch('paramiko.SSHClient') +def test_connect_with_rsa_sha2_disabled(mock_ssh, connection): + """ Test connection with RSA SHA2 algorithms disabled """ + connection.set_option('use_rsa_sha2_algorithms', False) + mock_client = MagicMock() + mock_ssh.return_value = mock_client + + connection._connect() + + call_kwargs = mock_client.connect.call_args[1] + assert 'disabled_algorithms' in call_kwargs + assert 'pubkeys' in call_kwargs['disabled_algorithms'] + + +@patch('paramiko.SSHClient') +def test_connect_with_bad_host_key(mock_ssh, connection): + """ Test connection with bad host key """ + mock_client = MagicMock() + mock_ssh.return_value = mock_client + mock_client.connect.side_effect = paramiko.ssh_exception.BadHostKeyException( + 'hostname', MagicMock(), MagicMock()) + + with pytest.raises(AnsibleConnectionFailure, match='host key mismatch'): + connection._connect() + + +@patch('paramiko.SSHClient') +def test_connect_with_invalid_host_key(mock_ssh, connection): + """ Test connection with bad host key """ + connection.set_option('host_key_checking', True) + mock_client = MagicMock() + mock_ssh.return_value = mock_client + mock_client.load_system_host_keys.side_effect = paramiko.hostkeys.InvalidHostKey( + "Bad Line!", Exception('Something crashed!')) + + with pytest.raises(AnsibleConnectionFailure, match="Invalid host key: Bad Line!"): + connection._connect() + + +@patch('paramiko.SSHClient') +def test_connect_success(mock_ssh, connection): + """ Test successful SSH connection establishment """ + mock_client = MagicMock() + mock_ssh.return_value = mock_client + + connection._connect() + + assert mock_client.connect.called + assert connection._connected + + +@patch('paramiko.SSHClient') +def test_connect_authentication_failure(mock_ssh, connection): + """ Test SSH connection with authentication failure """ + mock_client = MagicMock() + mock_ssh.return_value = mock_client + mock_client.connect.side_effect = paramiko.ssh_exception.AuthenticationException('Auth failed') + + with pytest.raises(AnsibleAuthenticationFailure): + connection._connect() + + +def test_any_keys_added(connection): + """ Test checking for added host keys """ + connection.ssh = MagicMock() + connection.ssh._host_keys = { + 'host1': { + 'ssh-rsa': MagicMock(_added_by_ansible_this_time=True), + 'ssh-ed25519': MagicMock(_added_by_ansible_this_time=False) + } + } + + assert connection._any_keys_added() is True + + connection.ssh._host_keys = { + 'host1': { + 'ssh-rsa': MagicMock(_added_by_ansible_this_time=False) + } + } + assert connection._any_keys_added() is False + + +@patch('os.path.exists') +@patch('os.stat') +@patch('tempfile.NamedTemporaryFile') +def test_save_ssh_host_keys(mock_tempfile, mock_stat, mock_exists, connection): + """ Test saving SSH host keys """ + mock_exists.return_value = True + mock_stat.return_value = MagicMock(st_mode=0o644, st_uid=1000, st_gid=1000) + mock_tempfile.return_value.__enter__.return_value.name = '/tmp/test_keys' + + connection.ssh = MagicMock() + connection.ssh._host_keys = { + 'host1': { + 'ssh-rsa': MagicMock( + get_base64=lambda: 'KEY1', + _added_by_ansible_this_time=True + ) + } + } + + mock_open_obj = mock_open() + with patch('builtins.open', mock_open_obj): + connection._save_ssh_host_keys('/tmp/test_keys') + + mock_open_obj().write.assert_called_with('host1 ssh-rsa KEY1\n') + + +def test_build_wsl_command(connection): + """ Test wsl command building with different users """ + cmd = connection._build_wsl_command('/bin/sh -c "ls -la"') + assert cmd == 'wsl.exe --distribution test -- /bin/sh -c "ls -la"' + + connection.set_option('wsl_user', 'test-user') + cmd = connection._build_wsl_command('/bin/sh -c "ls -la"') + assert cmd == 'wsl.exe --distribution test --user test-user -- /bin/sh -c "ls -la"' + + connection.set_option('become', True) + connection.set_option('become_user', 'test-become-user') + cmd = connection._build_wsl_command('/bin/sh -c "ls -la"') + assert cmd == 'wsl.exe --distribution test --user test-become-user -- /bin/sh -c "ls -la"' + + +@patch('paramiko.SSHClient') +def test_exec_command_success(mock_ssh, connection): + """ Test successful command execution """ + mock_client = MagicMock() + mock_ssh.return_value = mock_client + mock_channel = MagicMock() + mock_transport = MagicMock() + + mock_client.get_transport.return_value = mock_transport + mock_transport.open_session.return_value = mock_channel + mock_channel.recv_exit_status.return_value = 0 + mock_channel.makefile.return_value = [to_bytes('stdout')] + mock_channel.makefile_stderr.return_value = [to_bytes("")] + + connection._connected = True + connection.ssh = mock_client + + returncode, stdout, stderr = connection.exec_command('ls -la') + + mock_transport.open_session.assert_called_once() + mock_transport.set_keepalive.assert_called_once_with(5) + + +@patch('paramiko.SSHClient') +def test_exec_command_wsl_not_found(mock_ssh, connection): + """ Test command execution when wsl.exe is not found """ + mock_client = MagicMock() + mock_ssh.return_value = mock_client + mock_channel = MagicMock() + mock_transport = MagicMock() + + mock_client.get_transport.return_value = mock_transport + mock_transport.open_session.return_value = mock_channel + mock_channel.recv_exit_status.return_value = 1 + mock_channel.makefile.return_value = [to_bytes("")] + mock_channel.makefile_stderr.return_value = [to_bytes("'wsl.exe' is not recognized")] + + connection._connected = True + connection.ssh = mock_client + + with pytest.raises(AnsibleError, match='wsl.exe not found in path of host'): + connection.exec_command('ls -la') + + +@patch('paramiko.SSHClient') +def test_exec_command_session_open_failure(mock_ssh, connection): + """ Test exec_command when session opening fails """ + mock_client = MagicMock() + mock_transport = MagicMock() + mock_transport.open_session.side_effect = Exception('Failed to open session') + mock_client.get_transport.return_value = mock_transport + + connection._connected = True + connection.ssh = mock_client + + with pytest.raises(AnsibleConnectionFailure, match='Failed to open session'): + connection.exec_command('test command') + + +@patch('paramiko.SSHClient') +def test_exec_command_with_privilege_escalation(mock_ssh, connection): + """ Test exec_command with privilege escalation """ + mock_client = MagicMock() + mock_channel = MagicMock() + mock_transport = MagicMock() + + mock_client.get_transport.return_value = mock_transport + mock_transport.open_session.return_value = mock_channel + connection._connected = True + connection.ssh = mock_client + + connection.become = MagicMock() + connection.become.expect_prompt.return_value = True + connection.become.check_success.return_value = False + connection.become.check_password_prompt.return_value = True + connection.become.get_option.return_value = 'sudo_password' + + mock_channel.recv.return_value = b'[sudo] password:' + mock_channel.recv_exit_status.return_value = 0 + mock_channel.makefile.return_value = [b""] + mock_channel.makefile_stderr.return_value = [b""] + + returncode, stdout, stderr = connection.exec_command('sudo test command') + + mock_channel.sendall.assert_called_once_with(b'sudo_password\n') + + +def test_put_file(connection): + """ Test putting a file to the remote system """ + connection.exec_command = MagicMock() + connection.exec_command.return_value = (0, b"", b"") + + with patch('builtins.open', create=True) as mock_open: + mock_open.return_value.__enter__.return_value.read.return_value = b'test content' + connection.put_file('/local/path', '/remote/path') + + connection.exec_command.assert_called_once_with("/bin/sh -c 'cat > /remote/path'", in_data=b'test content', sudoable=False) + + +@patch('paramiko.SSHClient') +def test_put_file_general_error(mock_ssh, connection): + """ Test put_file with general error """ + mock_client = MagicMock() + mock_ssh.return_value = mock_client + mock_channel = MagicMock() + mock_transport = MagicMock() + + mock_client.get_transport.return_value = mock_transport + mock_transport.open_session.return_value = mock_channel + mock_channel.recv_exit_status.return_value = 1 + mock_channel.makefile.return_value = [to_bytes("")] + mock_channel.makefile_stderr.return_value = [to_bytes('Some error')] + + connection._connected = True + connection.ssh = mock_client + + with pytest.raises(AnsibleError, match='error occurred while putting file from /remote/path to /local/path'): + connection.put_file('/remote/path', '/local/path') + + +@patch('paramiko.SSHClient') +def test_put_file_cat_not_found(mock_ssh, connection): + """ Test command execution when cat is not found """ + mock_client = MagicMock() + mock_ssh.return_value = mock_client + mock_channel = MagicMock() + mock_transport = MagicMock() + + mock_client.get_transport.return_value = mock_transport + mock_transport.open_session.return_value = mock_channel + mock_channel.recv_exit_status.return_value = 1 + mock_channel.makefile.return_value = [to_bytes("")] + mock_channel.makefile_stderr.return_value = [to_bytes('cat: not found')] + + connection._connected = True + connection.ssh = mock_client + + with pytest.raises(AnsibleError, match='cat not found in path of WSL distribution'): + connection.fetch_file('/remote/path', '/local/path') + + +def test_fetch_file(connection): + """ Test fetching a file from the remote system """ + connection.exec_command = MagicMock() + connection.exec_command.return_value = (0, b'test content', b"") + + with patch('builtins.open', create=True) as mock_open: + connection.fetch_file('/remote/path', '/local/path') + + connection.exec_command.assert_called_once_with("/bin/sh -c 'cat /remote/path'", sudoable=False) + mock_open.assert_called_with('/local/path', 'wb') + + +@patch('paramiko.SSHClient') +def test_fetch_file_general_error(mock_ssh, connection): + """ Test fetch_file with general error """ + mock_client = MagicMock() + mock_ssh.return_value = mock_client + mock_channel = MagicMock() + mock_transport = MagicMock() + + mock_client.get_transport.return_value = mock_transport + mock_transport.open_session.return_value = mock_channel + mock_channel.recv_exit_status.return_value = 1 + mock_channel.makefile.return_value = [to_bytes("")] + mock_channel.makefile_stderr.return_value = [to_bytes('Some error')] + + connection._connected = True + connection.ssh = mock_client + + with pytest.raises(AnsibleError, match='error occurred while fetching file from /remote/path to /local/path'): + connection.fetch_file('/remote/path', '/local/path') + + +@patch('paramiko.SSHClient') +def test_fetch_file_cat_not_found(mock_ssh, connection): + """ Test command execution when cat is not found """ + mock_client = MagicMock() + mock_ssh.return_value = mock_client + mock_channel = MagicMock() + mock_transport = MagicMock() + + mock_client.get_transport.return_value = mock_transport + mock_transport.open_session.return_value = mock_channel + mock_channel.recv_exit_status.return_value = 1 + mock_channel.makefile.return_value = [to_bytes("")] + mock_channel.makefile_stderr.return_value = [to_bytes('cat: not found')] + + connection._connected = True + connection.ssh = mock_client + + with pytest.raises(AnsibleError, match='cat not found in path of WSL distribution'): + connection.fetch_file('/remote/path', '/local/path') + + +def test_close(connection): + """ Test connection close """ + mock_ssh = MagicMock() + connection.ssh = mock_ssh + connection._connected = True + + connection.close() + + assert mock_ssh.close.called, 'ssh.close was not called' + assert not connection._connected, 'self._connected is still True' + + +def test_close_with_lock_file(connection): + """ Test close method with lock file creation """ + connection._any_keys_added = MagicMock(return_value=True) + connection._connected = True + connection.keyfile = '/tmp/wsl-known_hosts-test' + connection.set_option('host_key_checking', True) + connection.set_option('lock_file_timeout', 5) + connection.set_option('record_host_keys', True) + connection.ssh = MagicMock() + + lock_file_path = os.path.join(os.path.dirname(connection.keyfile), + f'ansible-{os.path.basename(connection.keyfile)}.lock') + + try: + connection.close() + assert os.path.exists(lock_file_path), 'Lock file was not created' + + lock_stat = os.stat(lock_file_path) + assert lock_stat.st_mode & 0o777 == 0o600, 'Incorrect lock file permissions' + finally: + Path(lock_file_path).unlink(missing_ok=True) + + +@patch('pathlib.Path.unlink') +@patch('os.path.exists') +def test_close_lock_file_time_out_error_handling(mock_exists, mock_unlink, connection): + """ Test close method with lock file timeout error """ + connection._any_keys_added = MagicMock(return_value=True) + connection._connected = True + connection._save_ssh_host_keys = MagicMock() + connection.keyfile = '/tmp/wsl-known_hosts-test' + connection.set_option('host_key_checking', True) + connection.set_option('lock_file_timeout', 5) + connection.set_option('record_host_keys', True) + connection.ssh = MagicMock() + + mock_exists.return_value = False + matcher = f'writing lock file for {connection.keyfile} ran in to the timeout of {connection.get_option("lock_file_timeout")}s' + with pytest.raises(AnsibleError, match=matcher): + with patch('os.getuid', return_value=1000), \ + patch('os.getgid', return_value=1000), \ + patch('os.chmod'), patch('os.chown'), \ + patch('os.rename'), \ + patch.object(FileLock, 'lock_file', side_effect=LockTimeout()): + connection.close() + + +@patch('ansible_collections.community.general.plugins.module_utils._filelock.FileLock.lock_file') +@patch('tempfile.NamedTemporaryFile') +@patch('os.chmod') +@patch('os.chown') +@patch('os.rename') +@patch('os.path.exists') +def test_tempfile_creation_and_move(mock_exists, mock_rename, mock_chown, mock_chmod, mock_tempfile, mock_lock_file, connection): + """ Test tempfile creation and move during close """ + connection._any_keys_added = MagicMock(return_value=True) + connection._connected = True + connection._save_ssh_host_keys = MagicMock() + connection.keyfile = '/tmp/wsl-known_hosts-test' + connection.set_option('host_key_checking', True) + connection.set_option('lock_file_timeout', 5) + connection.set_option('record_host_keys', True) + connection.ssh = MagicMock() + + mock_exists.return_value = False + + mock_lock_file_instance = MagicMock() + mock_lock_file.return_value = mock_lock_file_instance + mock_lock_file_instance.__enter__.return_value = None + + mock_tempfile_instance = MagicMock() + mock_tempfile_instance.name = '/tmp/mock_tempfile' + mock_tempfile.return_value.__enter__.return_value = mock_tempfile_instance + + mode = 0o644 + uid = 1000 + gid = 1000 + key_dir = os.path.dirname(connection.keyfile) + + with patch('os.getuid', return_value=uid), patch('os.getgid', return_value=gid): + connection.close() + + connection._save_ssh_host_keys.assert_called_once_with('/tmp/mock_tempfile') + mock_chmod.assert_called_once_with('/tmp/mock_tempfile', mode) + mock_chown.assert_called_once_with('/tmp/mock_tempfile', uid, gid) + mock_rename.assert_called_once_with('/tmp/mock_tempfile', connection.keyfile) + mock_tempfile.assert_called_once_with(dir=key_dir, delete=False) + + +@patch('pathlib.Path.unlink') +@patch('tempfile.NamedTemporaryFile') +@patch('ansible_collections.community.general.plugins.module_utils._filelock.FileLock.lock_file') +@patch('os.path.exists') +def test_close_tempfile_error_handling(mock_exists, mock_lock_file, mock_tempfile, mock_unlink, connection): + """ Test tempfile creation error """ + connection._any_keys_added = MagicMock(return_value=True) + connection._connected = True + connection._save_ssh_host_keys = MagicMock() + connection.keyfile = '/tmp/wsl-known_hosts-test' + connection.set_option('host_key_checking', True) + connection.set_option('lock_file_timeout', 5) + connection.set_option('record_host_keys', True) + connection.ssh = MagicMock() + + mock_exists.return_value = False + + mock_lock_file_instance = MagicMock() + mock_lock_file.return_value = mock_lock_file_instance + mock_lock_file_instance.__enter__.return_value = None + + mock_tempfile_instance = MagicMock() + mock_tempfile_instance.name = '/tmp/mock_tempfile' + mock_tempfile.return_value.__enter__.return_value = mock_tempfile_instance + + with pytest.raises(AnsibleError, match='error occurred while writing SSH host keys!'): + with patch.object(os, 'chmod', side_effect=Exception()): + connection.close() + mock_unlink.assert_called_with(missing_ok=True) + + +@patch('ansible_collections.community.general.plugins.module_utils._filelock.FileLock.lock_file') +@patch('os.path.exists') +def test_close_with_invalid_host_key(mock_exists, mock_lock_file, connection): + """ Test load_system_host_keys on close with InvalidHostKey error """ + connection._any_keys_added = MagicMock(return_value=True) + connection._connected = True + connection._save_ssh_host_keys = MagicMock() + connection.keyfile = '/tmp/wsl-known_hosts-test' + connection.set_option('host_key_checking', True) + connection.set_option('lock_file_timeout', 5) + connection.set_option('record_host_keys', True) + connection.ssh = MagicMock() + connection.ssh.load_system_host_keys.side_effect = paramiko.hostkeys.InvalidHostKey( + "Bad Line!", Exception('Something crashed!')) + + mock_exists.return_value = False + + mock_lock_file_instance = MagicMock() + mock_lock_file.return_value = mock_lock_file_instance + mock_lock_file_instance.__enter__.return_value = None + + with pytest.raises(AnsibleConnectionFailure, match="Invalid host key: Bad Line!"): + connection.close() + + +def test_reset(connection): + """ Test connection reset """ + connection._connected = True + connection.close = MagicMock() + connection._connect = MagicMock() + + connection.reset() + + connection.close.assert_called_once() + connection._connect.assert_called_once() + + connection._connected = False + connection.reset() + assert connection.close.call_count == 1 diff --git a/tests/unit/plugins/modules/test_nmcli.py b/tests/unit/plugins/modules/test_nmcli.py index 45875cb15b..614c58a842 100644 --- a/tests/unit/plugins/modules/test_nmcli.py +++ b/tests/unit/plugins/modules/test_nmcli.py @@ -4485,8 +4485,10 @@ def test_bond_connection_unchanged(mocked_generic_connection_diff_check, capfd): macvlan=dict(type='dict'), wireguard=dict(type='dict'), vpn=dict(type='dict'), - transport_mode=dict(type='str', choices=['datagram', 'connected']), sriov=dict(type='dict'), + # infiniband specific vars + transport_mode=dict(type='str', choices=['datagram', 'connected']), + infiniband_mac=dict(type='str'), ), mutually_exclusive=[['never_default4', 'gw4'], ['routes4_extended', 'routes4'], diff --git a/tests/utils/shippable/sanity.sh b/tests/utils/shippable/sanity.sh index 5b88a26778..1ee5140ecb 100755 --- a/tests/utils/shippable/sanity.sh +++ b/tests/utils/shippable/sanity.sh @@ -16,11 +16,6 @@ else base_branch="" fi -if [ "${group}" == "extra" ]; then - ../internal_test_tools/tools/run.py --color --bot --junit - exit -fi - case "${group}" in 1) options=(--skip-test pylint --skip-test ansible-doc --skip-test validate-modules) ;; 2) options=( --test ansible-doc --test validate-modules) ;; @@ -28,17 +23,6 @@ case "${group}" in 4) options=(--test pylint --exclude plugins/modules/) ;; esac -# allow collection migration sanity tests for groups 3 and 4 to pass without updating this script during migration -network_path="lib/ansible/modules/network/" - -if [ -d "${network_path}" ]; then - if [ "${group}" -eq 3 ]; then - options+=(--exclude "${network_path}") - elif [ "${group}" -eq 4 ]; then - options+=("${network_path}") - fi -fi - # shellcheck disable=SC2086 ansible-test sanity --color -v --junit ${COVERAGE:+"$COVERAGE"} ${CHANGED:+"$CHANGED"} \ --docker --base-branch "${base_branch}" \ diff --git a/tests/utils/shippable/shippable.sh b/tests/utils/shippable/shippable.sh index 6c46c14b34..4167d7ffc5 100755 --- a/tests/utils/shippable/shippable.sh +++ b/tests/utils/shippable/shippable.sh @@ -67,10 +67,6 @@ fi export ANSIBLE_COLLECTIONS_PATHS="${PWD}/../../../" -if [ "${test}" == "sanity/extra" ]; then - retry pip install junit-xml --disable-pip-version-check -fi - # START: HACK install dependencies # Nothing further should be added to this list. @@ -79,7 +75,7 @@ retry git clone --depth=1 --single-branch https://github.com/ansible-collections # NOTE: we're installing with git to work around Galaxy being a huge PITA (https://github.com/ansible/galaxy/issues/2429) # retry ansible-galaxy -vvv collection install community.internal_test_tools -if [ "${script}" != "sanity" ] && [ "${script}" != "units" ] && [ "${test}" != "sanity/extra" ]; then +if [ "${script}" != "sanity" ] && [ "${script}" != "units" ]; then # To prevent Python dependencies on other collections only install other collections for integration tests retry git clone --depth=1 --single-branch https://github.com/ansible-collections/ansible.posix.git "${ANSIBLE_COLLECTIONS_PATHS}/ansible_collections/ansible/posix" retry git clone --depth=1 --single-branch https://github.com/ansible-collections/community.crypto.git "${ANSIBLE_COLLECTIONS_PATHS}/ansible_collections/community/crypto"