diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-06-05 16:18:41 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-06-05 16:18:41 +0000 |
commit | b643c52cf29ce5bbab738b43290af3556efa1ca9 (patch) | |
tree | 21d5c53d7a9b696627a255777cefdf6f78968824 /ansible_collections/community/general | |
parent | Releasing progress-linux version 9.5.1+dfsg-1~progress7.99u1. (diff) | |
download | ansible-b643c52cf29ce5bbab738b43290af3556efa1ca9.tar.xz ansible-b643c52cf29ce5bbab738b43290af3556efa1ca9.zip |
Merging upstream version 10.0.0+dfsg.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'ansible_collections/community/general')
175 files changed, 3726 insertions, 17125 deletions
diff --git a/ansible_collections/community/general/.azure-pipelines/azure-pipelines.yml b/ansible_collections/community/general/.azure-pipelines/azure-pipelines.yml index be8f011bd..7dc438ad3 100644 --- a/ansible_collections/community/general/.azure-pipelines/azure-pipelines.yml +++ b/ansible_collections/community/general/.azure-pipelines/azure-pipelines.yml @@ -29,14 +29,14 @@ schedules: always: true branches: include: + - stable-9 - stable-8 - - stable-7 - cron: 0 11 * * 0 displayName: Weekly (old stable branches) always: true branches: include: - - stable-6 + - stable-7 variables: - name: checkoutPath @@ -336,7 +336,7 @@ stages: - name: Debian Bookworm test: debian-bookworm/3.11 - name: ArchLinux - test: archlinux/3.11 + test: archlinux/3.12 groups: - 1 - 2 diff --git a/ansible_collections/community/general/.github/BOTMETA.yml b/ansible_collections/community/general/.github/BOTMETA.yml index e21d0c81c..add324935 100644 --- a/ansible_collections/community/general/.github/BOTMETA.yml +++ b/ansible_collections/community/general/.github/BOTMETA.yml @@ -33,6 +33,8 @@ files: maintainers: $team_ansible_core $becomes/pmrun.py: maintainers: $team_ansible_core + $becomes/run0.py: + maintainers: konstruktoid $becomes/sesu.py: maintainers: nekonyuu $becomes/sudosu.py: @@ -89,6 +91,8 @@ files: maintainers: ryancurrah $callbacks/syslog_json.py: maintainers: imjoseangel + $callbacks/timestamp.py: + maintainers: kurokobo $callbacks/unixy.py: labels: unixy maintainers: akatch @@ -117,6 +121,8 @@ files: maintainers: $team_ansible_core $doc_fragments/: labels: docs_fragments + $doc_fragments/django.py: + maintainers: russoz $doc_fragments/hpe3par.py: labels: hpe3par maintainers: farhan7500 gautamphegde @@ -294,8 +300,12 @@ files: labels: module_utils $module_utils/btrfs.py: maintainers: gnfzdz + $module_utils/cmd_runner.py: + maintainers: russoz $module_utils/deps.py: maintainers: russoz + $module_utils/django.py: + maintainers: russoz $module_utils/gconftool2.py: labels: gconftool2 maintainers: russoz @@ -339,6 +349,8 @@ files: $module_utils/pipx.py: labels: pipx maintainers: russoz + $module_utils/python_runner.py: + maintainers: russoz $module_utils/puppet.py: labels: puppet maintainers: russoz @@ -494,6 +506,8 @@ files: ignore: scottanderson42 tastychutney labels: django_manage maintainers: russoz + $modules/django_command.py: + maintainers: russoz $modules/dnf_versionlock.py: maintainers: moreda $modules/dnf_config_manager.py: @@ -532,8 +546,6 @@ files: maintainers: $team_flatpak $modules/flatpak_remote.py: maintainers: $team_flatpak - $modules/flowdock.py: - ignore: mcodd $modules/gandi_livedns.py: maintainers: gthiemonge $modules/gconftool2.py: @@ -1096,46 +1108,6 @@ files: $modules/python_requirements_info.py: ignore: ryansb maintainers: willthames - $modules/rax: - ignore: ryansb sivel - $modules/rax.py: - maintainers: omgjlk sivel - $modules/rax_cbs.py: - maintainers: claco - $modules/rax_cbs_attachments.py: - maintainers: claco - $modules/rax_cdb.py: - maintainers: jails - $modules/rax_cdb_database.py: - maintainers: jails - $modules/rax_cdb_user.py: - maintainers: jails - $modules/rax_clb.py: - maintainers: claco - $modules/rax_clb_nodes.py: - maintainers: neuroid - $modules/rax_clb_ssl.py: - maintainers: smashwilson - $modules/rax_files.py: - maintainers: angstwad - $modules/rax_files_objects.py: - maintainers: angstwad - $modules/rax_identity.py: - maintainers: claco - $modules/rax_mon_alarm.py: - maintainers: smashwilson - $modules/rax_mon_check.py: - maintainers: smashwilson - $modules/rax_mon_entity.py: - maintainers: smashwilson - $modules/rax_mon_notification.py: - maintainers: smashwilson - $modules/rax_mon_notification_plan.py: - maintainers: smashwilson - $modules/rax_network.py: - maintainers: claco omgjlk - $modules/rax_queue.py: - maintainers: claco $modules/read_csv.py: maintainers: dagwieers $modules/redfish_: @@ -1300,8 +1272,6 @@ files: maintainers: farhan7500 gautamphegde $modules/ssh_config.py: maintainers: gaqzi Akasurde - $modules/stackdriver.py: - maintainers: bwhaley $modules/stacki_host.py: labels: stacki_host maintainers: bsanders bbyhuy @@ -1394,8 +1364,6 @@ files: maintainers: $team_wdc $modules/wdc_redfish_info.py: maintainers: $team_wdc - $modules/webfaction_: - maintainers: quentinsf $modules/xattr.py: labels: xattr maintainers: bcoca diff --git a/ansible_collections/community/general/.github/workflows/ansible-test.yml b/ansible_collections/community/general/.github/workflows/ansible-test.yml index ecfc36565..e57213e9f 100644 --- a/ansible_collections/community/general/.github/workflows/ansible-test.yml +++ b/ansible_collections/community/general/.github/workflows/ansible-test.yml @@ -42,6 +42,7 @@ jobs: uses: felixfontein/ansible-test-gh-action@main with: ansible-core-version: stable-${{ matrix.ansible }} + codecov-token: ${{ secrets.CODECOV_TOKEN }} coverage: ${{ github.event_name == 'schedule' && 'always' || 'never' }} pull-request-change-detection: 'true' testing-type: sanity @@ -83,6 +84,7 @@ jobs: uses: felixfontein/ansible-test-gh-action@main with: ansible-core-version: stable-${{ matrix.ansible }} + codecov-token: ${{ secrets.CODECOV_TOKEN }} coverage: ${{ github.event_name == 'schedule' && 'always' || 'never' }} pre-test-cmd: >- mkdir -p ../../ansible @@ -183,6 +185,7 @@ jobs: uses: felixfontein/ansible-test-gh-action@main with: ansible-core-version: stable-${{ matrix.ansible }} + codecov-token: ${{ secrets.CODECOV_TOKEN }} coverage: ${{ github.event_name == 'schedule' && 'always' || 'never' }} docker-image: ${{ matrix.docker }} integration-continue-on-error: 'false' diff --git a/ansible_collections/community/general/.gitignore b/ansible_collections/community/general/.gitignore index b7868a9e4..cf1f74e41 100644 --- a/ansible_collections/community/general/.gitignore +++ b/ansible_collections/community/general/.gitignore @@ -512,3 +512,7 @@ $RECYCLE.BIN/ # Integration tests cloud configs tests/integration/cloud-config-*.ini + + +# VSCode specific extensions +.vscode/settings.json diff --git a/ansible_collections/community/general/CHANGELOG.md b/ansible_collections/community/general/CHANGELOG.md index 8f23931fe..91922fb7a 100644 --- a/ansible_collections/community/general/CHANGELOG.md +++ b/ansible_collections/community/general/CHANGELOG.md @@ -2,234 +2,79 @@ **Topics** -- <a href="#v8-6-0">v8\.6\.0</a> +- <a href="#v9-0-1">v9\.0\.1</a> - <a href="#release-summary">Release Summary</a> - <a href="#minor-changes">Minor Changes</a> - - <a href="#deprecated-features">Deprecated Features</a> - <a href="#bugfixes">Bugfixes</a> - - <a href="#new-modules">New Modules</a> -- <a href="#v8-5-0">v8\.5\.0</a> +- <a href="#v9-0-0">v9\.0\.0</a> - <a href="#release-summary-1">Release Summary</a> - <a href="#minor-changes-1">Minor Changes</a> + - <a href="#breaking-changes--porting-guide">Breaking Changes / Porting Guide</a> + - <a href="#deprecated-features">Deprecated Features</a> + - <a href="#removed-features-previously-deprecated">Removed Features \(previously deprecated\)</a> - <a href="#security-fixes">Security Fixes</a> - <a href="#bugfixes-1">Bugfixes</a> - - <a href="#new-modules-1">New Modules</a> -- <a href="#v8-4-0">v8\.4\.0</a> - - <a href="#release-summary-2">Release Summary</a> - - <a href="#minor-changes-2">Minor Changes</a> - - <a href="#bugfixes-2">Bugfixes</a> - <a href="#new-plugins">New Plugins</a> + - <a href="#become">Become</a> - <a href="#callback">Callback</a> - - <a href="#filter">Filter</a> - - <a href="#new-modules-2">New Modules</a> -- <a href="#v8-3-0">v8\.3\.0</a> - - <a href="#release-summary-3">Release Summary</a> - - <a href="#minor-changes-3">Minor Changes</a> - - <a href="#deprecated-features-1">Deprecated Features</a> - - <a href="#bugfixes-3">Bugfixes</a> - - <a href="#new-modules-3">New Modules</a> -- <a href="#v8-2-0">v8\.2\.0</a> - - <a href="#release-summary-4">Release Summary</a> - - <a href="#minor-changes-4">Minor Changes</a> - - <a href="#bugfixes-4">Bugfixes</a> - - <a href="#new-plugins-1">New Plugins</a> - <a href="#connection">Connection</a> - - <a href="#filter-1">Filter</a> + - <a href="#filter">Filter</a> - <a href="#lookup">Lookup</a> - - <a href="#new-modules-4">New Modules</a> -- <a href="#v8-1-0">v8\.1\.0</a> - - <a href="#release-summary-5">Release Summary</a> - - <a href="#minor-changes-5">Minor Changes</a> - - <a href="#bugfixes-5">Bugfixes</a> - - <a href="#new-plugins-2">New Plugins</a> - - <a href="#lookup-1">Lookup</a> - <a href="#test">Test</a> - - <a href="#new-modules-5">New Modules</a> -- <a href="#v8-0-2">v8\.0\.2</a> - - <a href="#release-summary-6">Release Summary</a> - - <a href="#bugfixes-6">Bugfixes</a> -- <a href="#v8-0-1">v8\.0\.1</a> - - <a href="#release-summary-7">Release Summary</a> - - <a href="#bugfixes-7">Bugfixes</a> -- <a href="#v8-0-0">v8\.0\.0</a> - - <a href="#release-summary-8">Release Summary</a> - - <a href="#minor-changes-6">Minor Changes</a> - - <a href="#breaking-changes--porting-guide">Breaking Changes / Porting Guide</a> - - <a href="#deprecated-features-2">Deprecated Features</a> - - <a href="#removed-features-previously-deprecated">Removed Features \(previously deprecated\)</a> - - <a href="#bugfixes-8">Bugfixes</a> - - <a href="#known-issues">Known Issues</a> - - <a href="#new-plugins-3">New Plugins</a> - - <a href="#lookup-2">Lookup</a> - - <a href="#new-modules-6">New Modules</a> -This changelog describes changes after version 7\.0\.0\. + - <a href="#new-modules">New Modules</a> +This changelog describes changes after version 8\.0\.0\. -<a id="v8-6-0"></a> -## v8\.6\.0 +<a id="v9-0-1"></a> +## v9\.0\.1 <a id="release-summary"></a> ### Release Summary -Regular bugfix and features release\. +Bugfix release for inclusion in Ansible 10\.0\.0rc1\. <a id="minor-changes"></a> ### Minor Changes -* Use offset\-aware <code>datetime\.datetime</code> objects \(with timezone UTC\) instead of offset\-naive UTC timestamps\, which are deprecated in Python 3\.12 \([https\://github\.com/ansible\-collections/community\.general/pull/8222](https\://github\.com/ansible\-collections/community\.general/pull/8222)\)\. -* apt\_rpm \- add new states <code>latest</code> and <code>present\_not\_latest</code>\. The value <code>latest</code> is equivalent to the current behavior of <code>present</code>\, which will upgrade a package if a newer version exists\. <code>present\_not\_latest</code> does what most users would expect <code>present</code> to do\: it does not upgrade if the package is already installed\. The current behavior of <code>present</code> will be deprecated in a later version\, and eventually changed to that of <code>present\_not\_latest</code> \([https\://github\.com/ansible\-collections/community\.general/issues/8217](https\://github\.com/ansible\-collections/community\.general/issues/8217)\, [https\://github\.com/ansible\-collections/community\.general/pull/8247](https\://github\.com/ansible\-collections/community\.general/pull/8247)\)\. -* bitwarden lookup plugin \- add support to filter by organization ID \([https\://github\.com/ansible\-collections/community\.general/pull/8188](https\://github\.com/ansible\-collections/community\.general/pull/8188)\)\. -* filesystem \- add bcachefs support \([https\://github\.com/ansible\-collections/community\.general/pull/8126](https\://github\.com/ansible\-collections/community\.general/pull/8126)\)\. -* ini\_file \- add an optional parameter <code>section\_has\_values</code>\. If the target ini file contains more than one <code>section</code>\, use <code>section\_has\_values</code> to specify which one should be updated \([https\://github\.com/ansible\-collections/community\.general/pull/7505](https\://github\.com/ansible\-collections/community\.general/pull/7505)\)\. -* java\_cert \- add <code>cert\_content</code> argument \([https\://github\.com/ansible\-collections/community\.general/pull/8153](https\://github\.com/ansible\-collections/community\.general/pull/8153)\)\. -* keycloak\_client\, keycloak\_clientscope\, keycloak\_clienttemplate \- added <code>docker\-v2</code> protocol support\, enhancing alignment with Keycloak\'s protocol options \([https\://github\.com/ansible\-collections/community\.general/issues/8215](https\://github\.com/ansible\-collections/community\.general/issues/8215)\, [https\://github\.com/ansible\-collections/community\.general/pull/8216](https\://github\.com/ansible\-collections/community\.general/pull/8216)\)\. -* nmcli \- adds OpenvSwitch support with new <code>type</code> values <code>ovs\-port</code>\, <code>ovs\-interface</code>\, and <code>ovs\-bridge</code>\, and new <code>slave\_type</code> value <code>ovs\-port</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8154](https\://github\.com/ansible\-collections/community\.general/pull/8154)\)\. -* osx\_defaults \- add option <code>check\_types</code> to enable changing the type of existing defaults on the fly \([https\://github\.com/ansible\-collections/community\.general/pull/8173](https\://github\.com/ansible\-collections/community\.general/pull/8173)\)\. -* passwordstore lookup \- add <code>missing\_subkey</code> parameter defining the behavior of the lookup when a passwordstore subkey is missing \([https\://github\.com/ansible\-collections/community\.general/pull/8166](https\://github\.com/ansible\-collections/community\.general/pull/8166)\)\. -* portage \- adds the possibility to explicitely tell portage to write packages to world file \([https\://github\.com/ansible\-collections/community\.general/issues/6226](https\://github\.com/ansible\-collections/community\.general/issues/6226)\, [https\://github\.com/ansible\-collections/community\.general/pull/8236](https\://github\.com/ansible\-collections/community\.general/pull/8236)\)\. -* redfish\_command \- add command <code>ResetToDefaults</code> to reset manager to default state \([https\://github\.com/ansible\-collections/community\.general/issues/8163](https\://github\.com/ansible\-collections/community\.general/issues/8163)\)\. -* redfish\_info \- add boolean return value <code>MultipartHttpPush</code> to <code>GetFirmwareUpdateCapabilities</code> \([https\://github\.com/ansible\-collections/community\.general/issues/8194](https\://github\.com/ansible\-collections/community\.general/issues/8194)\, [https\://github\.com/ansible\-collections/community\.general/pull/8195](https\://github\.com/ansible\-collections/community\.general/pull/8195)\)\. -* ssh\_config \- allow <code>accept\-new</code> as valid value for <code>strict\_host\_key\_checking</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8257](https\://github\.com/ansible\-collections/community\.general/pull/8257)\)\. - -<a id="deprecated-features"></a> -### Deprecated Features - -* hipchat callback plugin \- the hipchat service has been discontinued and the self\-hosted variant has been End of Life since 2020\. The callback plugin is therefore deprecated and will be removed from community\.general 10\.0\.0 if nobody provides compelling reasons to still keep it \([https\://github\.com/ansible\-collections/community\.general/issues/8184](https\://github\.com/ansible\-collections/community\.general/issues/8184)\, [https\://github\.com/ansible\-collections/community\.general/pull/8189](https\://github\.com/ansible\-collections/community\.general/pull/8189)\)\. +* 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)\)\. <a id="bugfixes"></a> ### Bugfixes -* aix\_filesystem \- fix <code>\_validate\_vg</code> not passing VG name to <code>lsvg\_cmd</code> \([https\://github\.com/ansible\-collections/community\.general/issues/8151](https\://github\.com/ansible\-collections/community\.general/issues/8151)\)\. -* apt\_rpm \- when checking whether packages were installed after running <code>apt\-get \-y install \<packages\></code>\, only the last package name was checked \([https\://github\.com/ansible\-collections/community\.general/pull/8263](https\://github\.com/ansible\-collections/community\.general/pull/8263)\)\. -* bitwarden\_secrets\_manager lookup plugin \- implements retry with exponential backoff to avoid lookup errors when Bitwardn\'s API rate limiting is encountered \([https\://github\.com/ansible\-collections/community\.general/issues/8230](https\://github\.com/ansible\-collections/community\.general/issues/8230)\, [https\://github\.com/ansible\-collections/community\.general/pull/8238](https\://github\.com/ansible\-collections/community\.general/pull/8238)\)\. -* from\_ini filter plugin \- disabling interpolation of <code>ConfigParser</code> to allow converting values with a <code>\%</code> sign \([https\://github\.com/ansible\-collections/community\.general/issues/8183](https\://github\.com/ansible\-collections/community\.general/issues/8183)\, [https\://github\.com/ansible\-collections/community\.general/pull/8185](https\://github\.com/ansible\-collections/community\.general/pull/8185)\)\. -* gitlab\_issue\, gitlab\_label\, gitlab\_milestone \- avoid crash during version comparison when the python\-gitlab Python module is not installed \([https\://github\.com/ansible\-collections/community\.general/pull/8158](https\://github\.com/ansible\-collections/community\.general/pull/8158)\)\. -* haproxy \- fix an issue where HAProxy could get stuck in DRAIN mode when the backend was unreachable \([https\://github\.com/ansible\-collections/community\.general/issues/8092](https\://github\.com/ansible\-collections/community\.general/issues/8092)\)\. -* inventory plugins \- add unsafe wrapper to avoid marking strings that do not contain <code>\{</code> or <code>\}</code> as unsafe\, to work around a bug in AWX \(\([https\://github\.com/ansible\-collections/community\.general/issues/8212](https\://github\.com/ansible\-collections/community\.general/issues/8212)\, [https\://github\.com/ansible\-collections/community\.general/pull/8225](https\://github\.com/ansible\-collections/community\.general/pull/8225)\)\. -* ipa \- fix get version regex in IPA module\_utils \([https\://github\.com/ansible\-collections/community\.general/pull/8175](https\://github\.com/ansible\-collections/community\.general/pull/8175)\)\. -* keycloak\_client \- add sorted <code>defaultClientScopes</code> and <code>optionalClientScopes</code> to normalizations \([https\://github\.com/ansible\-collections/community\.general/pull/8223](https\://github\.com/ansible\-collections/community\.general/pull/8223)\)\. -* keycloak\_realm \- add normalizations for <code>enabledEventTypes</code> and <code>supportedLocales</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8224](https\://github\.com/ansible\-collections/community\.general/pull/8224)\)\. -* puppet \- add option <code>environment\_lang</code> to set the environment language encoding\. Defaults to lang <code>C</code>\. It is recommended to set it to <code>C\.UTF\-8</code> or <code>en\_US\.UTF\-8</code> depending on what is available on your system\. \([https\://github\.com/ansible\-collections/community\.general/issues/8000](https\://github\.com/ansible\-collections/community\.general/issues/8000)\) -* riak \- support <code>riak admin</code> sub\-command in newer Riak KV versions beside the legacy <code>riak\-admin</code> main command \([https\://github\.com/ansible\-collections/community\.general/pull/8211](https\://github\.com/ansible\-collections/community\.general/pull/8211)\)\. -* to\_ini filter plugin \- disabling interpolation of <code>ConfigParser</code> to allow converting values with a <code>\%</code> sign \([https\://github\.com/ansible\-collections/community\.general/issues/8183](https\://github\.com/ansible\-collections/community\.general/issues/8183)\, [https\://github\.com/ansible\-collections/community\.general/pull/8185](https\://github\.com/ansible\-collections/community\.general/pull/8185)\)\. -* xml \- make module work with lxml 5\.1\.1\, which removed some internals that the module was relying on \([https\://github\.com/ansible\-collections/community\.general/pull/8169](https\://github\.com/ansible\-collections/community\.general/pull/8169)\)\. - -<a id="new-modules"></a> -### New Modules - -* keycloak\_client\_rolescope \- Allows administration of Keycloak client roles scope to restrict the usage of certain roles to a other specific client applications\. - -<a id="v8-5-0"></a> -## v8\.5\.0 +* cpanm \- use new <code>VarDict</code> 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 module utils \- use new <code>VarDict</code> 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)\)\. +* gconftool2\_info \- use new <code>VarDict</code> 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)\)\. +* 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)\)\. +* hponcfg \- use new <code>VarDict</code> 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)\)\. +* kernel\_blacklist \- use new <code>VarDict</code> 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 <code>saml\.signing\.private\.key</code> attribute in the module\'s diff or state output\. The <code>sanitize\_cr</code> 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)\)\. +* locale\_gen \- use new <code>VarDict</code> 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)\)\. +* mksysb \- use new <code>VarDict</code> 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)\)\. +* pipx\_info \- use new <code>VarDict</code> 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 \- use new <code>VarDict</code> 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 <code>VarDict</code> 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)\)\. + +<a id="v9-0-0"></a> +## v9\.0\.0 <a id="release-summary-1"></a> ### Release Summary -Regular feature and bugfix release with security fixes\. +This is release 9\.0\.0 of <code>community\.general</code>\, released on 2024\-05\-20\. <a id="minor-changes-1"></a> ### Minor Changes -* bitwarden lookup plugin \- allows to fetch all records of a given collection ID\, by allowing to pass an empty value for <code>search\_value</code> when <code>collection\_id</code> is provided \([https\://github\.com/ansible\-collections/community\.general/pull/8013](https\://github\.com/ansible\-collections/community\.general/pull/8013)\)\. -* icinga2 inventory plugin \- adds new parameter <code>group\_by\_hostgroups</code> in order to make grouping by Icinga2 hostgroups optional \([https\://github\.com/ansible\-collections/community\.general/pull/7998](https\://github\.com/ansible\-collections/community\.general/pull/7998)\)\. -* ini\_file \- support optional spaces between section names and their surrounding brackets \([https\://github\.com/ansible\-collections/community\.general/pull/8075](https\://github\.com/ansible\-collections/community\.general/pull/8075)\)\. -* java\_cert \- enable <code>owner</code>\, <code>group</code>\, <code>mode</code>\, and other generic file arguments \([https\://github\.com/ansible\-collections/community\.general/pull/8116](https\://github\.com/ansible\-collections/community\.general/pull/8116)\)\. -* ldap\_attrs \- module now supports diff mode\, showing which attributes are changed within an operation \([https\://github\.com/ansible\-collections/community\.general/pull/8073](https\://github\.com/ansible\-collections/community\.general/pull/8073)\)\. -* lxd\_container \- uses <code>/1\.0/instances</code> API endpoint\, if available\. Falls back to <code>/1\.0/containers</code> or <code>/1\.0/virtual\-machines</code>\. Fixes issue when using Incus or LXD 5\.19 due to migrating to <code>/1\.0/instances</code> endpoint \([https\://github\.com/ansible\-collections/community\.general/pull/7980](https\://github\.com/ansible\-collections/community\.general/pull/7980)\)\. -* nmcli \- allow setting <code>MTU</code> for <code>bond\-slave</code> interface types \([https\://github\.com/ansible\-collections/community\.general/pull/8118](https\://github\.com/ansible\-collections/community\.general/pull/8118)\)\. -* proxmox \- adds <code>startup</code> parameters to configure startup order\, startup delay and shutdown delay \([https\://github\.com/ansible\-collections/community\.general/pull/8038](https\://github\.com/ansible\-collections/community\.general/pull/8038)\)\. -* revbitspss lookup plugin \- removed a redundant unicode prefix\. The prefix was not necessary for Python 3 and has been cleaned up to streamline the code \([https\://github\.com/ansible\-collections/community\.general/pull/8087](https\://github\.com/ansible\-collections/community\.general/pull/8087)\)\. - -<a id="security-fixes"></a> -### Security Fixes - -* cobbler\, gitlab\_runners\, icinga2\, linode\, lxd\, nmap\, online\, opennebula\, proxmox\, scaleway\, stackpath\_compute\, virtualbox\, and xen\_orchestra inventory plugin \- make sure all data received from the remote servers is marked as unsafe\, so remote code execution by obtaining texts that can be evaluated as templates is not possible \([https\://www\.die\-welt\.net/2024/03/remote\-code\-execution\-in\-ansible\-dynamic\-inventory\-plugins/](https\://www\.die\-welt\.net/2024/03/remote\-code\-execution\-in\-ansible\-dynamic\-inventory\-plugins/)\, [https\://github\.com/ansible\-collections/community\.general/pull/8098](https\://github\.com/ansible\-collections/community\.general/pull/8098)\)\. - -<a id="bugfixes-1"></a> -### Bugfixes - -* aix\_filesystem \- fix issue with empty list items in crfs logic and option order \([https\://github\.com/ansible\-collections/community\.general/pull/8052](https\://github\.com/ansible\-collections/community\.general/pull/8052)\)\. -* consul\_token \- fix token creation without <code>accessor\_id</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8091](https\://github\.com/ansible\-collections/community\.general/pull/8091)\)\. -* homebrew \- error returned from brew command was ignored and tried to parse empty JSON\. Fix now checks for an error and raises it to give accurate error message to users \([https\://github\.com/ansible\-collections/community\.general/issues/8047](https\://github\.com/ansible\-collections/community\.general/issues/8047)\)\. -* ipa\_hbacrule \- the module uses a string for <code>ipaenabledflag</code> for new FreeIPA versions while the returned value is a boolean \([https\://github\.com/ansible\-collections/community\.general/pull/7880](https\://github\.com/ansible\-collections/community\.general/pull/7880)\)\. -* ipa\_sudorule \- the module uses a string for <code>ipaenabledflag</code> for new FreeIPA versions while the returned value is a boolean \([https\://github\.com/ansible\-collections/community\.general/pull/7880](https\://github\.com/ansible\-collections/community\.general/pull/7880)\)\. -* iptables\_state \- fix idempotency issues when restoring incomplete iptables dumps \([https\://github\.com/ansible\-collections/community\.general/issues/8029](https\://github\.com/ansible\-collections/community\.general/issues/8029)\)\. -* linode inventory plugin \- add descriptive error message for linode inventory plugin \([https\://github\.com/ansible\-collections/community\.general/pull/8133](https\://github\.com/ansible\-collections/community\.general/pull/8133)\)\. -* pacemaker\_cluster \- actually implement check mode\, which the module claims to support\. This means that until now the module also did changes in check mode \([https\://github\.com/ansible\-collections/community\.general/pull/8081](https\://github\.com/ansible\-collections/community\.general/pull/8081)\)\. -* pam\_limits \- when the file does not exist\, do not create it in check mode \([https\://github\.com/ansible\-collections/community\.general/issues/8050](https\://github\.com/ansible\-collections/community\.general/issues/8050)\, [https\://github\.com/ansible\-collections/community\.general/pull/8057](https\://github\.com/ansible\-collections/community\.general/pull/8057)\)\. -* proxmox\_kvm \- fixed status check getting from node\-specific API endpoint \([https\://github\.com/ansible\-collections/community\.general/issues/7817](https\://github\.com/ansible\-collections/community\.general/issues/7817)\)\. - -<a id="new-modules-1"></a> -### New Modules - -* usb\_facts \- Allows listing information about USB devices - -<a id="v8-4-0"></a> -## v8\.4\.0 - -<a id="release-summary-2"></a> -### Release Summary - -Regular bugfix and feature release\. - -<a id="minor-changes-2"></a> -### Minor Changes - +* PythonRunner module utils \- specialisation of <code>CmdRunner</code> to execute Python scripts \([https\://github\.com/ansible\-collections/community\.general/pull/8289](https\://github\.com/ansible\-collections/community\.general/pull/8289)\)\. +* Use offset\-aware <code>datetime\.datetime</code> objects \(with timezone UTC\) instead of offset\-naive UTC timestamps\, which are deprecated in Python 3\.12 \([https\://github\.com/ansible\-collections/community\.general/pull/8222](https\://github\.com/ansible\-collections/community\.general/pull/8222)\)\. +* aix\_lvol \- refactor module to pass list of arguments to <code>module\.run\_command\(\)</code> instead of relying on interpretation by a shell \([https\://github\.com/ansible\-collections/community\.general/pull/8264](https\://github\.com/ansible\-collections/community\.general/pull/8264)\)\. +* apt\_rpm \- add new states <code>latest</code> and <code>present\_not\_latest</code>\. The value <code>latest</code> is equivalent to the current behavior of <code>present</code>\, which will upgrade a package if a newer version exists\. <code>present\_not\_latest</code> does what most users would expect <code>present</code> to do\: it does not upgrade if the package is already installed\. The current behavior of <code>present</code> will be deprecated in a later version\, and eventually changed to that of <code>present\_not\_latest</code> \([https\://github\.com/ansible\-collections/community\.general/issues/8217](https\://github\.com/ansible\-collections/community\.general/issues/8217)\, [https\://github\.com/ansible\-collections/community\.general/pull/8247](https\://github\.com/ansible\-collections/community\.general/pull/8247)\)\. +* apt\_rpm \- refactor module to pass list of arguments to <code>module\.run\_command\(\)</code> instead of relying on interpretation by a shell \([https\://github\.com/ansible\-collections/community\.general/pull/8264](https\://github\.com/ansible\-collections/community\.general/pull/8264)\)\. * bitwarden lookup plugin \- add <code>bw\_session</code> option\, to pass session key instead of reading from env \([https\://github\.com/ansible\-collections/community\.general/pull/7994](https\://github\.com/ansible\-collections/community\.general/pull/7994)\)\. -* gitlab\_deploy\_key\, gitlab\_group\_members\, gitlab\_group\_variable\, gitlab\_hook\, gitlab\_instance\_variable\, gitlab\_project\_badge\, gitlab\_project\_variable\, gitlab\_user \- improve API pagination and compatibility with different versions of <code>python\-gitlab</code> \([https\://github\.com/ansible\-collections/community\.general/pull/7790](https\://github\.com/ansible\-collections/community\.general/pull/7790)\)\. -* gitlab\_hook \- adds <code>releases\_events</code> parameter for supporting Releases events triggers on GitLab hooks \([https\://github\.com/ansible\-collections/community\.general/pull/7956](https\://github\.com/ansible\-collections/community\.general/pull/7956)\)\. -* icinga2 inventory plugin \- add Jinja2 templating support to <code>url</code>\, <code>user</code>\, and <code>password</code> paramenters \([https\://github\.com/ansible\-collections/community\.general/issues/7074](https\://github\.com/ansible\-collections/community\.general/issues/7074)\, [https\://github\.com/ansible\-collections/community\.general/pull/7996](https\://github\.com/ansible\-collections/community\.general/pull/7996)\)\. -* mssql\_script \- adds transactional \(rollback/commit\) support via optional boolean param <code>transaction</code> \([https\://github\.com/ansible\-collections/community\.general/pull/7976](https\://github\.com/ansible\-collections/community\.general/pull/7976)\)\. -* proxmox\_kvm \- add parameter <code>update\_unsafe</code> to avoid limitations when updating dangerous values \([https\://github\.com/ansible\-collections/community\.general/pull/7843](https\://github\.com/ansible\-collections/community\.general/pull/7843)\)\. -* redfish\_config \- add command <code>SetServiceIdentification</code> to set service identification \([https\://github\.com/ansible\-collections/community\.general/issues/7916](https\://github\.com/ansible\-collections/community\.general/issues/7916)\)\. -* sudoers \- add support for the <code>NOEXEC</code> tag in sudoers rules \([https\://github\.com/ansible\-collections/community\.general/pull/7983](https\://github\.com/ansible\-collections/community\.general/pull/7983)\)\. -* terraform \- fix <code>diff\_mode</code> in state <code>absent</code> and when terraform <code>resource\_changes</code> does not exist \([https\://github\.com/ansible\-collections/community\.general/pull/7963](https\://github\.com/ansible\-collections/community\.general/pull/7963)\)\. - -<a id="bugfixes-2"></a> -### Bugfixes - -* cargo \- fix idempotency issues when using a custom installation path for packages \(using the <code>\-\-path</code> parameter\)\. The initial installation runs fine\, but subsequent runs use the <code>get\_installed\(\)</code> function which did not check the given installation location\, before running <code>cargo install</code>\. This resulted in a false <code>changed</code> state\. Also the removal of packeges using <code>state\: absent</code> failed\, as the installation check did not use the given parameter \([https\://github\.com/ansible\-collections/community\.general/pull/7970](https\://github\.com/ansible\-collections/community\.general/pull/7970)\)\. -* gitlab\_issue \- fix behavior to search GitLab issue\, using <code>search</code> keyword instead of <code>title</code> \([https\://github\.com/ansible\-collections/community\.general/issues/7846](https\://github\.com/ansible\-collections/community\.general/issues/7846)\)\. -* gitlab\_runner \- fix pagination when checking for existing runners \([https\://github\.com/ansible\-collections/community\.general/pull/7790](https\://github\.com/ansible\-collections/community\.general/pull/7790)\)\. -* keycloak\_client \- fixes issue when metadata is provided in desired state when task is in check mode \([https\://github\.com/ansible\-collections/community\.general/issues/1226](https\://github\.com/ansible\-collections/community\.general/issues/1226)\, [https\://github\.com/ansible\-collections/community\.general/pull/7881](https\://github\.com/ansible\-collections/community\.general/pull/7881)\)\. -* modprobe \- listing modules files or modprobe files could trigger a FileNotFoundError if <code>/etc/modprobe\.d</code> or <code>/etc/modules\-load\.d</code> did not exist\. Relevant functions now return empty lists if the directories do not exist to avoid crashing the module \([https\://github\.com/ansible\-collections/community\.general/issues/7717](https\://github\.com/ansible\-collections/community\.general/issues/7717)\)\. -* onepassword lookup plugin \- failed for fields that were in sections and had uppercase letters in the label/ID\. Field lookups are now case insensitive in all cases \([https\://github\.com/ansible\-collections/community\.general/pull/7919](https\://github\.com/ansible\-collections/community\.general/pull/7919)\)\. -* pkgin \- pkgin \(pkgsrc package manager used by SmartOS\) raises erratic exceptions and spurious <code>changed\=true</code> \([https\://github\.com/ansible\-collections/community\.general/pull/7971](https\://github\.com/ansible\-collections/community\.general/pull/7971)\)\. -* redfish\_info \- allow for a GET operation invoked by <code>GetUpdateStatus</code> to allow for an empty response body for cases where a service returns 204 No Content \([https\://github\.com/ansible\-collections/community\.general/issues/8003](https\://github\.com/ansible\-collections/community\.general/issues/8003)\)\. -* redfish\_info \- correct uncaught exception when attempting to retrieve <code>Chassis</code> information \([https\://github\.com/ansible\-collections/community\.general/pull/7952](https\://github\.com/ansible\-collections/community\.general/pull/7952)\)\. - -<a id="new-plugins"></a> -### New Plugins - -<a id="callback"></a> -#### Callback - -* default\_without\_diff \- The default ansible callback without diff output - -<a id="filter"></a> -#### Filter - -* lists\_difference \- Difference of lists with a predictive order -* lists\_intersect \- Intersection of lists with a predictive order -* lists\_symmetric\_difference \- Symmetric Difference of lists with a predictive order -* lists\_union \- Union of lists with a predictive order - -<a id="new-modules-2"></a> -### New Modules - -* gitlab\_group\_access\_token \- Manages GitLab group access tokens -* gitlab\_project\_access\_token \- Manages GitLab project access tokens - -<a id="v8-3-0"></a> -## v8\.3\.0 - -<a id="release-summary-3"></a> -### Release Summary - -Regular bugfix and feature release\. - -<a id="minor-changes-3"></a> -### Minor Changes - +* bitwarden lookup plugin \- add support to filter by organization ID \([https\://github\.com/ansible\-collections/community\.general/pull/8188](https\://github\.com/ansible\-collections/community\.general/pull/8188)\)\. +* bitwarden lookup plugin \- allows to fetch all records of a given collection ID\, by allowing to pass an empty value for <code>search\_value</code> when <code>collection\_id</code> is provided \([https\://github\.com/ansible\-collections/community\.general/pull/8013](https\://github\.com/ansible\-collections/community\.general/pull/8013)\)\. +* bitwarden lookup plugin \- when looking for items using an item ID\, the item is now accessed directly with <code>bw get item</code> instead of searching through all items\. This doubles the lookup speed \([https\://github\.com/ansible\-collections/community\.general/pull/7468](https\://github\.com/ansible\-collections/community\.general/pull/7468)\)\. +* btrfs\_subvolume \- refactor module to pass list of arguments to <code>module\.run\_command\(\)</code> instead of relying on interpretation by a shell \([https\://github\.com/ansible\-collections/community\.general/pull/8264](https\://github\.com/ansible\-collections/community\.general/pull/8264)\)\. +* cmd\_runner module\_utils \- add validation for minimum and maximum length in the value passed to <code>cmd\_runner\_fmt\.as\_list\(\)</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8288](https\://github\.com/ansible\-collections/community\.general/pull/8288)\)\. * consul\_auth\_method\, consul\_binding\_rule\, consul\_policy\, consul\_role\, consul\_session\, consul\_token \- added action group <code>community\.general\.consul</code> \([https\://github\.com/ansible\-collections/community\.general/pull/7897](https\://github\.com/ansible\-collections/community\.general/pull/7897)\)\. * consul\_policy \- added support for diff and check mode \([https\://github\.com/ansible\-collections/community\.general/pull/7878](https\://github\.com/ansible\-collections/community\.general/pull/7878)\)\. * consul\_policy\, consul\_role\, consul\_session \- removed dependency on <code>requests</code> and factored out common parts \([https\://github\.com/ansible\-collections/community\.general/pull/7826](https\://github\.com/ansible\-collections/community\.general/pull/7826)\, [https\://github\.com/ansible\-collections/community\.general/pull/7878](https\://github\.com/ansible\-collections/community\.general/pull/7878)\)\. @@ -237,532 +82,289 @@ Regular bugfix and feature release\. * consul\_role \- <code>service\_identities</code> now expects a <code>service\_name</code> option to match the Consul API\, the old <code>name</code> is still supported as alias \([https\://github\.com/ansible\-collections/community\.general/pull/7878](https\://github\.com/ansible\-collections/community\.general/pull/7878)\)\. * consul\_role \- added support for diff mode \([https\://github\.com/ansible\-collections/community\.general/pull/7878](https\://github\.com/ansible\-collections/community\.general/pull/7878)\)\. * consul\_role \- added support for templated policies \([https\://github\.com/ansible\-collections/community\.general/pull/7878](https\://github\.com/ansible\-collections/community\.general/pull/7878)\)\. -* redfish\_info \- add command <code>GetServiceIdentification</code> to get service identification \([https\://github\.com/ansible\-collections/community\.general/issues/7882](https\://github\.com/ansible\-collections/community\.general/issues/7882)\)\. -* terraform \- add support for <code>diff\_mode</code> for terraform resource\_changes \([https\://github\.com/ansible\-collections/community\.general/pull/7896](https\://github\.com/ansible\-collections/community\.general/pull/7896)\)\. - -<a id="deprecated-features-1"></a> -### Deprecated Features - -* consul\_acl \- the module has been deprecated and will be removed in community\.general 10\.0\.0\. <code>consul\_token</code> and <code>consul\_policy</code> can be used instead \([https\://github\.com/ansible\-collections/community\.general/pull/7901](https\://github\.com/ansible\-collections/community\.general/pull/7901)\)\. - -<a id="bugfixes-3"></a> -### Bugfixes - -* homebrew \- detect already installed formulae and casks using JSON output from <code>brew info</code> \([https\://github\.com/ansible\-collections/community\.general/issues/864](https\://github\.com/ansible\-collections/community\.general/issues/864)\)\. -* incus connection plugin \- treats <code>inventory\_hostname</code> as a variable instead of a literal in remote connections \([https\://github\.com/ansible\-collections/community\.general/issues/7874](https\://github\.com/ansible\-collections/community\.general/issues/7874)\)\. -* ipa\_otptoken \- the module expect <code>ipatokendisabled</code> as string but the <code>ipatokendisabled</code> value is returned as a boolean \([https\://github\.com/ansible\-collections/community\.general/pull/7795](https\://github\.com/ansible\-collections/community\.general/pull/7795)\)\. -* ldap \- previously the order number \(if present\) was expected to follow an equals sign in the DN\. This makes it so the order number string is identified correctly anywhere within the DN \([https\://github\.com/ansible\-collections/community\.general/issues/7646](https\://github\.com/ansible\-collections/community\.general/issues/7646)\)\. -* mssql\_script \- make the module work with Python 2 \([https\://github\.com/ansible\-collections/community\.general/issues/7818](https\://github\.com/ansible\-collections/community\.general/issues/7818)\, [https\://github\.com/ansible\-collections/community\.general/pull/7821](https\://github\.com/ansible\-collections/community\.general/pull/7821)\)\. -* nmcli \- fix <code>connection\.slave\-type</code> wired to <code>bond</code> and not with parameter <code>slave\_type</code> in case of connection type <code>wifi</code> \([https\://github\.com/ansible\-collections/community\.general/issues/7389](https\://github\.com/ansible\-collections/community\.general/issues/7389)\)\. -* proxmox \- fix updating a container config if the setting does not already exist \([https\://github\.com/ansible\-collections/community\.general/pull/7872](https\://github\.com/ansible\-collections/community\.general/pull/7872)\)\. - -<a id="new-modules-3"></a> -### New Modules - -* consul\_acl\_bootstrap \- Bootstrap ACLs in Consul -* consul\_auth\_method \- Manipulate Consul auth methods -* consul\_binding\_rule \- Manipulate Consul binding rules -* consul\_token \- Manipulate Consul tokens -* gitlab\_label \- Creates/updates/deletes GitLab Labels belonging to project or group\. -* gitlab\_milestone \- Creates/updates/deletes GitLab Milestones belonging to project or group - -<a id="v8-2-0"></a> -## v8\.2\.0 - -<a id="release-summary-4"></a> -### Release Summary - -Regular bugfix and feature release\. - -<a id="minor-changes-4"></a> -### Minor Changes - -* ipa\_dnsrecord \- adds ability to manage NS record types \([https\://github\.com/ansible\-collections/community\.general/pull/7737](https\://github\.com/ansible\-collections/community\.general/pull/7737)\)\. -* ipa\_pwpolicy \- refactor module and exchange a sequence <code>if</code> statements with a <code>for</code> loop \([https\://github\.com/ansible\-collections/community\.general/pull/7723](https\://github\.com/ansible\-collections/community\.general/pull/7723)\)\. -* ipa\_pwpolicy \- update module to support <code>maxrepeat</code>\, <code>maxsequence</code>\, <code>dictcheck</code>\, <code>usercheck</code>\, <code>gracelimit</code> parameters in FreeIPA password policies \([https\://github\.com/ansible\-collections/community\.general/pull/7723](https\://github\.com/ansible\-collections/community\.general/pull/7723)\)\. -* keycloak\_realm\_key \- the <code>config\.algorithm</code> option now supports 8 additional key algorithms \([https\://github\.com/ansible\-collections/community\.general/pull/7698](https\://github\.com/ansible\-collections/community\.general/pull/7698)\)\. -* keycloak\_realm\_key \- the <code>config\.certificate</code> option value is no longer defined with <code>no\_log\=True</code> \([https\://github\.com/ansible\-collections/community\.general/pull/7698](https\://github\.com/ansible\-collections/community\.general/pull/7698)\)\. -* keycloak\_realm\_key \- the <code>provider\_id</code> option now supports RSA encryption key usage \(value <code>rsa\-enc</code>\) \([https\://github\.com/ansible\-collections/community\.general/pull/7698](https\://github\.com/ansible\-collections/community\.general/pull/7698)\)\. -* keycloak\_user\_federation \- allow custom user storage providers to be set through <code>provider\_id</code> \([https\://github\.com/ansible\-collections/community\.general/pull/7789](https\://github\.com/ansible\-collections/community\.general/pull/7789)\)\. -* mail \- add <code>Message\-ID</code> header\; which is required by some mail servers \([https\://github\.com/ansible\-collections/community\.general/pull/7740](https\://github\.com/ansible\-collections/community\.general/pull/7740)\)\. -* mail module\, mail callback plugin \- allow to configure the domain name of the Message\-ID header with a new <code>message\_id\_domain</code> option \([https\://github\.com/ansible\-collections/community\.general/pull/7765](https\://github\.com/ansible\-collections/community\.general/pull/7765)\)\. -* ssh\_config \- new feature to set <code>AddKeysToAgent</code> option to <code>yes</code> or <code>no</code> \([https\://github\.com/ansible\-collections/community\.general/pull/7703](https\://github\.com/ansible\-collections/community\.general/pull/7703)\)\. -* ssh\_config \- new feature to set <code>IdentitiesOnly</code> option to <code>yes</code> or <code>no</code> \([https\://github\.com/ansible\-collections/community\.general/pull/7704](https\://github\.com/ansible\-collections/community\.general/pull/7704)\)\. -* xcc\_redfish\_command \- added support for raw POSTs \(<code>command\=PostResource</code> in <code>category\=Raw</code>\) without a specific action info \([https\://github\.com/ansible\-collections/community\.general/pull/7746](https\://github\.com/ansible\-collections/community\.general/pull/7746)\)\. - -<a id="bugfixes-4"></a> -### Bugfixes - -* keycloak\_identity\_provider \- <code>mappers</code> processing was not idempotent if the mappers configuration list had not been sorted by name \(in ascending order\)\. Fix resolves the issue by sorting mappers in the desired state using the same key which is used for obtaining existing state \([https\://github\.com/ansible\-collections/community\.general/pull/7418](https\://github\.com/ansible\-collections/community\.general/pull/7418)\)\. -* keycloak\_identity\_provider \- it was not possible to reconfigure \(add\, remove\) <code>mappers</code> once they were created initially\. Removal was ignored\, adding new ones resulted in dropping the pre\-existing unmodified mappers\. Fix resolves the issue by supplying correct input to the internal update call \([https\://github\.com/ansible\-collections/community\.general/pull/7418](https\://github\.com/ansible\-collections/community\.general/pull/7418)\)\. -* keycloak\_user \- when <code>force</code> is set\, but user does not exist\, do not try to delete it \([https\://github\.com/ansible\-collections/community\.general/pull/7696](https\://github\.com/ansible\-collections/community\.general/pull/7696)\)\. -* proxmox\_kvm \- running <code>state\=template</code> will first check whether VM is already a template \([https\://github\.com/ansible\-collections/community\.general/pull/7792](https\://github\.com/ansible\-collections/community\.general/pull/7792)\)\. -* statusio\_maintenance \- fix error caused by incorrectly formed API data payload\. Was raising \"Failed to create maintenance HTTP Error 400 Bad Request\" caused by bad data type for date/time and deprecated dict keys \([https\://github\.com/ansible\-collections/community\.general/pull/7754](https\://github\.com/ansible\-collections/community\.general/pull/7754)\)\. - -<a id="new-plugins-1"></a> -### New Plugins - -<a id="connection"></a> -#### Connection - -* incus \- Run tasks in Incus instances via the Incus CLI\. - -<a id="filter-1"></a> -#### Filter - -* from\_ini \- Converts INI text input into a dictionary -* to\_ini \- Converts a dictionary to the INI file format - -<a id="lookup"></a> -#### Lookup - -* github\_app\_access\_token \- Obtain short\-lived Github App Access tokens - -<a id="new-modules-4"></a> -### New Modules - -* dnf\_config\_manager \- Enable or disable dnf repositories using config\-manager -* keycloak\_component\_info \- Retrive component info in Keycloak -* keycloak\_realm\_rolemapping \- Allows administration of Keycloak realm role mappings into groups with the Keycloak API -* proxmox\_node\_info \- Retrieve information about one or more Proxmox VE nodes -* proxmox\_storage\_contents\_info \- List content from a Proxmox VE storage - -<a id="v8-1-0"></a> -## v8\.1\.0 - -<a id="release-summary-5"></a> -### Release Summary - -Regular bugfix and feature release\. - -<a id="minor-changes-5"></a> -### Minor Changes - -* bitwarden lookup plugin \- when looking for items using an item ID\, the item is now accessed directly with <code>bw get item</code> instead of searching through all items\. This doubles the lookup speed \([https\://github\.com/ansible\-collections/community\.general/pull/7468](https\://github\.com/ansible\-collections/community\.general/pull/7468)\)\. * elastic callback plugin \- close elastic client to not leak resources \([https\://github\.com/ansible\-collections/community\.general/pull/7517](https\://github\.com/ansible\-collections/community\.general/pull/7517)\)\. +* filesystem \- add bcachefs support \([https\://github\.com/ansible\-collections/community\.general/pull/8126](https\://github\.com/ansible\-collections/community\.general/pull/8126)\)\. +* gandi\_livedns \- adds support for personal access tokens \([https\://github\.com/ansible\-collections/community\.general/issues/7639](https\://github\.com/ansible\-collections/community\.general/issues/7639)\, [https\://github\.com/ansible\-collections/community\.general/pull/8337](https\://github\.com/ansible\-collections/community\.general/pull/8337)\)\. +* gconftool2 \- use <code>ModuleHelper</code> with <code>VarDict</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8226](https\://github\.com/ansible\-collections/community\.general/pull/8226)\)\. * git\_config \- allow multiple git configs for the same name with the new <code>add\_mode</code> option \([https\://github\.com/ansible\-collections/community\.general/pull/7260](https\://github\.com/ansible\-collections/community\.general/pull/7260)\)\. * git\_config \- the <code>after</code> and <code>before</code> fields in the <code>diff</code> of the return value can be a list instead of a string in case more configs with the same key are affected \([https\://github\.com/ansible\-collections/community\.general/pull/7260](https\://github\.com/ansible\-collections/community\.general/pull/7260)\)\. * git\_config \- when a value is unset\, all configs with the same key are unset \([https\://github\.com/ansible\-collections/community\.general/pull/7260](https\://github\.com/ansible\-collections/community\.general/pull/7260)\)\. * gitlab modules \- add <code>ca\_path</code> option \([https\://github\.com/ansible\-collections/community\.general/pull/7472](https\://github\.com/ansible\-collections/community\.general/pull/7472)\)\. * gitlab modules \- remove duplicate <code>gitlab</code> package check \([https\://github\.com/ansible\-collections/community\.general/pull/7486](https\://github\.com/ansible\-collections/community\.general/pull/7486)\)\. +* gitlab\_deploy\_key\, gitlab\_group\_members\, gitlab\_group\_variable\, gitlab\_hook\, gitlab\_instance\_variable\, gitlab\_project\_badge\, gitlab\_project\_variable\, gitlab\_user \- improve API pagination and compatibility with different versions of <code>python\-gitlab</code> \([https\://github\.com/ansible\-collections/community\.general/pull/7790](https\://github\.com/ansible\-collections/community\.general/pull/7790)\)\. +* gitlab\_hook \- adds <code>releases\_events</code> parameter for supporting Releases events triggers on GitLab hooks \([https\://github\.com/ansible\-collections/community\.general/pull/7956](https\://github\.com/ansible\-collections/community\.general/pull/7956)\)\. * gitlab\_runner \- add support for new runner creation workflow \([https\://github\.com/ansible\-collections/community\.general/pull/7199](https\://github\.com/ansible\-collections/community\.general/pull/7199)\)\. +* homebrew \- adds <code>force\_formula</code> parameter to disambiguate a formula from a cask of the same name \([https\://github\.com/ansible\-collections/community\.general/issues/8274](https\://github\.com/ansible\-collections/community\.general/issues/8274)\)\. +* homebrew\, homebrew\_cask \- refactor common argument validation logic into a dedicated <code>homebrew</code> module utils \([https\://github\.com/ansible\-collections/community\.general/issues/8323](https\://github\.com/ansible\-collections/community\.general/issues/8323)\, [https\://github\.com/ansible\-collections/community\.general/pull/8324](https\://github\.com/ansible\-collections/community\.general/pull/8324)\)\. +* icinga2 inventory plugin \- add Jinja2 templating support to <code>url</code>\, <code>user</code>\, and <code>password</code> paramenters \([https\://github\.com/ansible\-collections/community\.general/issues/7074](https\://github\.com/ansible\-collections/community\.general/issues/7074)\, [https\://github\.com/ansible\-collections/community\.general/pull/7996](https\://github\.com/ansible\-collections/community\.general/pull/7996)\)\. +* icinga2 inventory plugin \- adds new parameter <code>group\_by\_hostgroups</code> in order to make grouping by Icinga2 hostgroups optional \([https\://github\.com/ansible\-collections/community\.general/pull/7998](https\://github\.com/ansible\-collections/community\.general/pull/7998)\)\. +* ini\_file \- add an optional parameter <code>section\_has\_values</code>\. If the target ini file contains more than one <code>section</code>\, use <code>section\_has\_values</code> to specify which one should be updated \([https\://github\.com/ansible\-collections/community\.general/pull/7505](https\://github\.com/ansible\-collections/community\.general/pull/7505)\)\. +* ini\_file \- support optional spaces between section names and their surrounding brackets \([https\://github\.com/ansible\-collections/community\.general/pull/8075](https\://github\.com/ansible\-collections/community\.general/pull/8075)\)\. +* installp \- refactor module to pass list of arguments to <code>module\.run\_command\(\)</code> instead of relying on interpretation by a shell \([https\://github\.com/ansible\-collections/community\.general/pull/8264](https\://github\.com/ansible\-collections/community\.general/pull/8264)\)\. * ipa\_config \- adds <code>passkey</code> choice to <code>ipauserauthtype</code> parameter\'s choices \([https\://github\.com/ansible\-collections/community\.general/pull/7588](https\://github\.com/ansible\-collections/community\.general/pull/7588)\)\. +* ipa\_dnsrecord \- adds ability to manage NS record types \([https\://github\.com/ansible\-collections/community\.general/pull/7737](https\://github\.com/ansible\-collections/community\.general/pull/7737)\)\. +* ipa\_pwpolicy \- refactor module and exchange a sequence <code>if</code> statements with a <code>for</code> loop \([https\://github\.com/ansible\-collections/community\.general/pull/7723](https\://github\.com/ansible\-collections/community\.general/pull/7723)\)\. +* ipa\_pwpolicy \- update module to support <code>maxrepeat</code>\, <code>maxsequence</code>\, <code>dictcheck</code>\, <code>usercheck</code>\, <code>gracelimit</code> parameters in FreeIPA password policies \([https\://github\.com/ansible\-collections/community\.general/pull/7723](https\://github\.com/ansible\-collections/community\.general/pull/7723)\)\. * ipa\_sudorule \- adds options to include denied commands or command groups \([https\://github\.com/ansible\-collections/community\.general/pull/7415](https\://github\.com/ansible\-collections/community\.general/pull/7415)\)\. * ipa\_user \- adds <code>idp</code> and <code>passkey</code> choice to <code>ipauserauthtype</code> parameter\'s choices \([https\://github\.com/ansible\-collections/community\.general/pull/7589](https\://github\.com/ansible\-collections/community\.general/pull/7589)\)\. * irc \- add <code>validate\_certs</code> option\, and rename <code>use\_ssl</code> to <code>use\_tls</code>\, while keeping <code>use\_ssl</code> as an alias\. The default value for <code>validate\_certs</code> is <code>false</code> for backwards compatibility\. We recommend to every user of this module to explicitly set <code>use\_tls\=true</code> and <em class="title-reference">validate\_certs\=true\`</em> whenever possible\, especially when communicating to IRC servers over the internet \([https\://github\.com/ansible\-collections/community\.general/pull/7550](https\://github\.com/ansible\-collections/community\.general/pull/7550)\)\. +* java\_cert \- add <code>cert\_content</code> argument \([https\://github\.com/ansible\-collections/community\.general/pull/8153](https\://github\.com/ansible\-collections/community\.general/pull/8153)\)\. +* java\_cert \- enable <code>owner</code>\, <code>group</code>\, <code>mode</code>\, and other generic file arguments \([https\://github\.com/ansible\-collections/community\.general/pull/8116](https\://github\.com/ansible\-collections/community\.general/pull/8116)\)\. +* kernel\_blacklist \- use <code>ModuleHelper</code> with <code>VarDict</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8226](https\://github\.com/ansible\-collections/community\.general/pull/8226)\)\. * keycloak module utils \- expose error message from Keycloak server for HTTP errors in some specific situations \([https\://github\.com/ansible\-collections/community\.general/pull/7645](https\://github\.com/ansible\-collections/community\.general/pull/7645)\)\. +* keycloak\_client\, keycloak\_clientscope\, keycloak\_clienttemplate \- added <code>docker\-v2</code> protocol support\, enhancing alignment with Keycloak\'s protocol options \([https\://github\.com/ansible\-collections/community\.general/issues/8215](https\://github\.com/ansible\-collections/community\.general/issues/8215)\, [https\://github\.com/ansible\-collections/community\.general/pull/8216](https\://github\.com/ansible\-collections/community\.general/pull/8216)\)\. +* keycloak\_realm\_key \- the <code>config\.algorithm</code> option now supports 8 additional key algorithms \([https\://github\.com/ansible\-collections/community\.general/pull/7698](https\://github\.com/ansible\-collections/community\.general/pull/7698)\)\. +* keycloak\_realm\_key \- the <code>config\.certificate</code> option value is no longer defined with <code>no\_log\=True</code> \([https\://github\.com/ansible\-collections/community\.general/pull/7698](https\://github\.com/ansible\-collections/community\.general/pull/7698)\)\. +* keycloak\_realm\_key \- the <code>provider\_id</code> option now supports RSA encryption key usage \(value <code>rsa\-enc</code>\) \([https\://github\.com/ansible\-collections/community\.general/pull/7698](https\://github\.com/ansible\-collections/community\.general/pull/7698)\)\. * keycloak\_user\_federation \- add option for <code>krbPrincipalAttribute</code> \([https\://github\.com/ansible\-collections/community\.general/pull/7538](https\://github\.com/ansible\-collections/community\.general/pull/7538)\)\. +* keycloak\_user\_federation \- allow custom user storage providers to be set through <code>provider\_id</code> \([https\://github\.com/ansible\-collections/community\.general/pull/7789](https\://github\.com/ansible\-collections/community\.general/pull/7789)\)\. +* ldap\_attrs \- module now supports diff mode\, showing which attributes are changed within an operation \([https\://github\.com/ansible\-collections/community\.general/pull/8073](https\://github\.com/ansible\-collections/community\.general/pull/8073)\)\. +* lvg \- refactor module to pass list of arguments to <code>module\.run\_command\(\)</code> instead of relying on interpretation by a shell \([https\://github\.com/ansible\-collections/community\.general/pull/8264](https\://github\.com/ansible\-collections/community\.general/pull/8264)\)\. * lvol \- change <code>pvs</code> argument type to list of strings \([https\://github\.com/ansible\-collections/community\.general/pull/7676](https\://github\.com/ansible\-collections/community\.general/pull/7676)\, [https\://github\.com/ansible\-collections/community\.general/issues/7504](https\://github\.com/ansible\-collections/community\.general/issues/7504)\)\. +* lvol \- refactor module to pass list of arguments to <code>module\.run\_command\(\)</code> instead of relying on interpretation by a shell \([https\://github\.com/ansible\-collections/community\.general/pull/8264](https\://github\.com/ansible\-collections/community\.general/pull/8264)\)\. * lxd connection plugin \- tighten the detection logic for lxd <code>Instance not found</code> errors\, to avoid false detection on unrelated errors such as <code>/usr/bin/python3\: not found</code> \([https\://github\.com/ansible\-collections/community\.general/pull/7521](https\://github\.com/ansible\-collections/community\.general/pull/7521)\)\. +* lxd\_container \- uses <code>/1\.0/instances</code> API endpoint\, if available\. Falls back to <code>/1\.0/containers</code> or <code>/1\.0/virtual\-machines</code>\. Fixes issue when using Incus or LXD 5\.19 due to migrating to <code>/1\.0/instances</code> endpoint \([https\://github\.com/ansible\-collections/community\.general/pull/7980](https\://github\.com/ansible\-collections/community\.general/pull/7980)\)\. +* macports \- refactor module to pass list of arguments to <code>module\.run\_command\(\)</code> instead of relying on interpretation by a shell \([https\://github\.com/ansible\-collections/community\.general/pull/8264](https\://github\.com/ansible\-collections/community\.general/pull/8264)\)\. +* mail \- add <code>Message\-ID</code> header\; which is required by some mail servers \([https\://github\.com/ansible\-collections/community\.general/pull/7740](https\://github\.com/ansible\-collections/community\.general/pull/7740)\)\. +* mail module\, mail callback plugin \- allow to configure the domain name of the Message\-ID header with a new <code>message\_id\_domain</code> option \([https\://github\.com/ansible\-collections/community\.general/pull/7765](https\://github\.com/ansible\-collections/community\.general/pull/7765)\)\. +* mssql\_script \- adds transactional \(rollback/commit\) support via optional boolean param <code>transaction</code> \([https\://github\.com/ansible\-collections/community\.general/pull/7976](https\://github\.com/ansible\-collections/community\.general/pull/7976)\)\. * netcup\_dns \- adds support for record types <code>OPENPGPKEY</code>\, <code>SMIMEA</code>\, and <code>SSHFP</code> \([https\://github\.com/ansible\-collections/community\.general/pull/7489](https\://github\.com/ansible\-collections/community\.general/pull/7489)\)\. * nmcli \- add support for new connection type <code>loopback</code> \([https\://github\.com/ansible\-collections/community\.general/issues/6572](https\://github\.com/ansible\-collections/community\.general/issues/6572)\)\. +* nmcli \- adds OpenvSwitch support with new <code>type</code> values <code>ovs\-port</code>\, <code>ovs\-interface</code>\, and <code>ovs\-bridge</code>\, and new <code>slave\_type</code> value <code>ovs\-port</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8154](https\://github\.com/ansible\-collections/community\.general/pull/8154)\)\. * nmcli \- allow for <code>infiniband</code> slaves of <code>bond</code> interface types \([https\://github\.com/ansible\-collections/community\.general/pull/7569](https\://github\.com/ansible\-collections/community\.general/pull/7569)\)\. * nmcli \- allow for the setting of <code>MTU</code> for <code>infiniband</code> and <code>bond</code> interface types \([https\://github\.com/ansible\-collections/community\.general/pull/7499](https\://github\.com/ansible\-collections/community\.general/pull/7499)\)\. +* nmcli \- allow setting <code>MTU</code> for <code>bond\-slave</code> interface types \([https\://github\.com/ansible\-collections/community\.general/pull/8118](https\://github\.com/ansible\-collections/community\.general/pull/8118)\)\. * onepassword lookup plugin \- support 1Password Connect with the opv2 client by setting the connect\_host and connect\_token parameters \([https\://github\.com/ansible\-collections/community\.general/pull/7116](https\://github\.com/ansible\-collections/community\.general/pull/7116)\)\. * onepassword\_raw lookup plugin \- support 1Password Connect with the opv2 client by setting the connect\_host and connect\_token parameters \([https\://github\.com/ansible\-collections/community\.general/pull/7116](https\://github\.com/ansible\-collections/community\.general/pull/7116)\) +* opentelemetry \- add support for HTTP trace\_exporter and configures the behavior via <code>OTEL\_EXPORTER\_OTLP\_TRACES\_PROTOCOL</code> \([https\://github\.com/ansible\-collections/community\.general/issues/7888](https\://github\.com/ansible\-collections/community\.general/issues/7888)\, [https\://github\.com/ansible\-collections/community\.general/pull/8321](https\://github\.com/ansible\-collections/community\.general/pull/8321)\)\. +* opentelemetry \- add support for exporting spans in a file via <code>ANSIBLE\_OPENTELEMETRY\_STORE\_SPANS\_IN\_FILE</code> \([https\://github\.com/ansible\-collections/community\.general/issues/7888](https\://github\.com/ansible\-collections/community\.general/issues/7888)\, [https\://github\.com/ansible\-collections/community\.general/pull/8363](https\://github\.com/ansible\-collections/community\.general/pull/8363)\)\. +* opkg \- use <code>ModuleHelper</code> with <code>VarDict</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8226](https\://github\.com/ansible\-collections/community\.general/pull/8226)\)\. +* osx\_defaults \- add option <code>check\_types</code> to enable changing the type of existing defaults on the fly \([https\://github\.com/ansible\-collections/community\.general/pull/8173](https\://github\.com/ansible\-collections/community\.general/pull/8173)\)\. +* parted \- refactor module to pass list of arguments to <code>module\.run\_command\(\)</code> instead of relying on interpretation by a shell \([https\://github\.com/ansible\-collections/community\.general/pull/8264](https\://github\.com/ansible\-collections/community\.general/pull/8264)\)\. * passwordstore \- adds <code>timestamp</code> and <code>preserve</code> parameters to modify the stored password format \([https\://github\.com/ansible\-collections/community\.general/pull/7426](https\://github\.com/ansible\-collections/community\.general/pull/7426)\)\. +* passwordstore lookup \- add <code>missing\_subkey</code> parameter defining the behavior of the lookup when a passwordstore subkey is missing \([https\://github\.com/ansible\-collections/community\.general/pull/8166](https\://github\.com/ansible\-collections/community\.general/pull/8166)\)\. +* pipx \- use <code>ModuleHelper</code> with <code>VarDict</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8226](https\://github\.com/ansible\-collections/community\.general/pull/8226)\)\. +* pkg5 \- add support for non\-silent execution \([https\://github\.com/ansible\-collections/community\.general/issues/8379](https\://github\.com/ansible\-collections/community\.general/issues/8379)\, [https\://github\.com/ansible\-collections/community\.general/pull/8382](https\://github\.com/ansible\-collections/community\.general/pull/8382)\)\. +* pkgin \- refactor module to pass list of arguments to <code>module\.run\_command\(\)</code> instead of relying on interpretation by a shell \([https\://github\.com/ansible\-collections/community\.general/pull/8264](https\://github\.com/ansible\-collections/community\.general/pull/8264)\)\. +* portage \- adds the possibility to explicitely tell portage to write packages to world file \([https\://github\.com/ansible\-collections/community\.general/issues/6226](https\://github\.com/ansible\-collections/community\.general/issues/6226)\, [https\://github\.com/ansible\-collections/community\.general/pull/8236](https\://github\.com/ansible\-collections/community\.general/pull/8236)\)\. +* portinstall \- refactor module to pass list of arguments to <code>module\.run\_command\(\)</code> instead of relying on interpretation by a shell \([https\://github\.com/ansible\-collections/community\.general/pull/8264](https\://github\.com/ansible\-collections/community\.general/pull/8264)\)\. +* proxmox \- adds <code>startup</code> parameters to configure startup order\, startup delay and shutdown delay \([https\://github\.com/ansible\-collections/community\.general/pull/8038](https\://github\.com/ansible\-collections/community\.general/pull/8038)\)\. * proxmox \- adds <code>template</code> value to the <code>state</code> parameter\, allowing conversion of container to a template \([https\://github\.com/ansible\-collections/community\.general/pull/7143](https\://github\.com/ansible\-collections/community\.general/pull/7143)\)\. * proxmox \- adds <code>update</code> parameter\, allowing update of an already existing containers configuration \([https\://github\.com/ansible\-collections/community\.general/pull/7540](https\://github\.com/ansible\-collections/community\.general/pull/7540)\)\. * proxmox inventory plugin \- adds an option to exclude nodes from the dynamic inventory generation\. The new setting is optional\, not using this option will behave as usual \([https\://github\.com/ansible\-collections/community\.general/issues/6714](https\://github\.com/ansible\-collections/community\.general/issues/6714)\, [https\://github\.com/ansible\-collections/community\.general/pull/7461](https\://github\.com/ansible\-collections/community\.general/pull/7461)\)\. +* proxmox\* modules \- there is now a <code>community\.general\.proxmox</code> module defaults group that can be used to set default options for all Proxmox modules \([https\://github\.com/ansible\-collections/community\.general/pull/8334](https\://github\.com/ansible\-collections/community\.general/pull/8334)\)\. * proxmox\_disk \- add ability to manipulate CD\-ROM drive \([https\://github\.com/ansible\-collections/community\.general/pull/7495](https\://github\.com/ansible\-collections/community\.general/pull/7495)\)\. +* proxmox\_kvm \- add parameter <code>update\_unsafe</code> to avoid limitations when updating dangerous values \([https\://github\.com/ansible\-collections/community\.general/pull/7843](https\://github\.com/ansible\-collections/community\.general/pull/7843)\)\. * proxmox\_kvm \- adds <code>template</code> value to the <code>state</code> parameter\, allowing conversion of a VM to a template \([https\://github\.com/ansible\-collections/community\.general/pull/7143](https\://github\.com/ansible\-collections/community\.general/pull/7143)\)\. +* proxmox\_kvm \- adds\`\`usb\`\` parameter for setting USB devices on proxmox KVM VMs \([https\://github\.com/ansible\-collections/community\.general/pull/8199](https\://github\.com/ansible\-collections/community\.general/pull/8199)\)\. * proxmox\_kvm \- support the <code>hookscript</code> parameter \([https\://github\.com/ansible\-collections/community\.general/issues/7600](https\://github\.com/ansible\-collections/community\.general/issues/7600)\)\. * proxmox\_ostype \- it is now possible to specify the <code>ostype</code> when creating an LXC container \([https\://github\.com/ansible\-collections/community\.general/pull/7462](https\://github\.com/ansible\-collections/community\.general/pull/7462)\)\. * proxmox\_vm\_info \- add ability to retrieve configuration info \([https\://github\.com/ansible\-collections/community\.general/pull/7485](https\://github\.com/ansible\-collections/community\.general/pull/7485)\)\. +* puppet \- new feature to set <code>\-\-waitforlock</code> option \([https\://github\.com/ansible\-collections/community\.general/pull/8282](https\://github\.com/ansible\-collections/community\.general/pull/8282)\)\. +* redfish\_command \- add command <code>ResetToDefaults</code> to reset manager to default state \([https\://github\.com/ansible\-collections/community\.general/issues/8163](https\://github\.com/ansible\-collections/community\.general/issues/8163)\)\. +* redfish\_config \- add command <code>SetServiceIdentification</code> to set service identification \([https\://github\.com/ansible\-collections/community\.general/issues/7916](https\://github\.com/ansible\-collections/community\.general/issues/7916)\)\. +* redfish\_info \- add boolean return value <code>MultipartHttpPush</code> to <code>GetFirmwareUpdateCapabilities</code> \([https\://github\.com/ansible\-collections/community\.general/issues/8194](https\://github\.com/ansible\-collections/community\.general/issues/8194)\, [https\://github\.com/ansible\-collections/community\.general/pull/8195](https\://github\.com/ansible\-collections/community\.general/pull/8195)\)\. +* redfish\_info \- add command <code>GetServiceIdentification</code> to get service identification \([https\://github\.com/ansible\-collections/community\.general/issues/7882](https\://github\.com/ansible\-collections/community\.general/issues/7882)\)\. * redfish\_info \- adding the <code>BootProgress</code> property when getting <code>Systems</code> info \([https\://github\.com/ansible\-collections/community\.general/pull/7626](https\://github\.com/ansible\-collections/community\.general/pull/7626)\)\. +* revbitspss lookup plugin \- removed a redundant unicode prefix\. The prefix was not necessary for Python 3 and has been cleaned up to streamline the code \([https\://github\.com/ansible\-collections/community\.general/pull/8087](https\://github\.com/ansible\-collections/community\.general/pull/8087)\)\. +* rundeck module utils \- allow to pass <code>Content\-Type</code> to API requests \([https\://github\.com/ansible\-collections/community\.general/pull/7684](https\://github\.com/ansible\-collections/community\.general/pull/7684)\)\. +* slackpkg \- refactor module to pass list of arguments to <code>module\.run\_command\(\)</code> instead of relying on interpretation by a shell \([https\://github\.com/ansible\-collections/community\.general/pull/8264](https\://github\.com/ansible\-collections/community\.general/pull/8264)\)\. * ssh\_config \- adds <code>controlmaster</code>\, <code>controlpath</code> and <code>controlpersist</code> parameters \([https\://github\.com/ansible\-collections/community\.general/pull/7456](https\://github\.com/ansible\-collections/community\.general/pull/7456)\)\. +* ssh\_config \- allow <code>accept\-new</code> as valid value for <code>strict\_host\_key\_checking</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8257](https\://github\.com/ansible\-collections/community\.general/pull/8257)\)\. +* ssh\_config \- new feature to set <code>AddKeysToAgent</code> option to <code>yes</code> or <code>no</code> \([https\://github\.com/ansible\-collections/community\.general/pull/7703](https\://github\.com/ansible\-collections/community\.general/pull/7703)\)\. +* ssh\_config \- new feature to set <code>IdentitiesOnly</code> option to <code>yes</code> or <code>no</code> \([https\://github\.com/ansible\-collections/community\.general/pull/7704](https\://github\.com/ansible\-collections/community\.general/pull/7704)\)\. +* sudoers \- add support for the <code>NOEXEC</code> tag in sudoers rules \([https\://github\.com/ansible\-collections/community\.general/pull/7983](https\://github\.com/ansible\-collections/community\.general/pull/7983)\)\. +* svr4pkg \- refactor module to pass list of arguments to <code>module\.run\_command\(\)</code> instead of relying on interpretation by a shell \([https\://github\.com/ansible\-collections/community\.general/pull/8264](https\://github\.com/ansible\-collections/community\.general/pull/8264)\)\. +* swdepot \- refactor module to pass list of arguments to <code>module\.run\_command\(\)</code> instead of relying on interpretation by a shell \([https\://github\.com/ansible\-collections/community\.general/pull/8264](https\://github\.com/ansible\-collections/community\.general/pull/8264)\)\. +* terraform \- add support for <code>diff\_mode</code> for terraform resource\_changes \([https\://github\.com/ansible\-collections/community\.general/pull/7896](https\://github\.com/ansible\-collections/community\.general/pull/7896)\)\. +* terraform \- fix <code>diff\_mode</code> in state <code>absent</code> and when terraform <code>resource\_changes</code> does not exist \([https\://github\.com/ansible\-collections/community\.general/pull/7963](https\://github\.com/ansible\-collections/community\.general/pull/7963)\)\. +* xcc\_redfish\_command \- added support for raw POSTs \(<code>command\=PostResource</code> in <code>category\=Raw</code>\) without a specific action info \([https\://github\.com/ansible\-collections/community\.general/pull/7746](https\://github\.com/ansible\-collections/community\.general/pull/7746)\)\. +* xfconf \- use <code>ModuleHelper</code> with <code>VarDict</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8226](https\://github\.com/ansible\-collections/community\.general/pull/8226)\)\. +* xfconf\_info \- use <code>ModuleHelper</code> with <code>VarDict</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8226](https\://github\.com/ansible\-collections/community\.general/pull/8226)\)\. + +<a id="breaking-changes--porting-guide"></a> +### Breaking Changes / Porting Guide + +* cpanm \- the default of the <code>mode</code> option changed from <code>compatibility</code> to <code>new</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8198](https\://github\.com/ansible\-collections/community\.general/pull/8198)\)\. +* django\_manage \- the module now requires Django \>\= 4\.1 \([https\://github\.com/ansible\-collections/community\.general/pull/8198](https\://github\.com/ansible\-collections/community\.general/pull/8198)\)\. +* django\_manage \- the module will now fail if <code>virtualenv</code> is specified but no virtual environment exists at that location \([https\://github\.com/ansible\-collections/community\.general/pull/8198](https\://github\.com/ansible\-collections/community\.general/pull/8198)\)\. +* redfish\_command\, redfish\_config\, redfish\_info \- change the default for <code>timeout</code> from 10 to 60 \([https\://github\.com/ansible\-collections/community\.general/pull/8198](https\://github\.com/ansible\-collections/community\.general/pull/8198)\)\. + +<a id="deprecated-features"></a> +### Deprecated Features + +* MH DependencyCtxMgr module\_utils \- deprecate <code>module\_utils\.mh\.mixin\.deps\.DependencyCtxMgr</code> in favour of <code>module\_utils\.deps</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8280](https\://github\.com/ansible\-collections/community\.general/pull/8280)\)\. +* ModuleHelper module\_utils \- deprecate <code>plugins\.module\_utils\.module\_helper\.AnsibleModule</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8280](https\://github\.com/ansible\-collections/community\.general/pull/8280)\)\. +* ModuleHelper module\_utils \- deprecate <code>plugins\.module\_utils\.module\_helper\.DependencyCtxMgr</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8280](https\://github\.com/ansible\-collections/community\.general/pull/8280)\)\. +* ModuleHelper module\_utils \- deprecate <code>plugins\.module\_utils\.module\_helper\.StateMixin</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8280](https\://github\.com/ansible\-collections/community\.general/pull/8280)\)\. +* ModuleHelper module\_utils \- deprecate <code>plugins\.module\_utils\.module\_helper\.VarDict\,</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8280](https\://github\.com/ansible\-collections/community\.general/pull/8280)\)\. +* ModuleHelper module\_utils \- deprecate <code>plugins\.module\_utils\.module\_helper\.VarMeta</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8280](https\://github\.com/ansible\-collections/community\.general/pull/8280)\)\. +* ModuleHelper module\_utils \- deprecate <code>plugins\.module\_utils\.module\_helper\.VarsMixin</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8280](https\://github\.com/ansible\-collections/community\.general/pull/8280)\)\. +* ModuleHelper module\_utils \- deprecate use of <code>VarsMixin</code> in favor of using the <code>VardDict</code> module\_utils \([https\://github\.com/ansible\-collections/community\.general/pull/8226](https\://github\.com/ansible\-collections/community\.general/pull/8226)\)\. +* ModuleHelper vars module\_utils \- bump deprecation of <code>VarMeta</code>\, <code>VarDict</code> and <code>VarsMixin</code> to version 11\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/8226](https\://github\.com/ansible\-collections/community\.general/pull/8226)\)\. +* apt\_rpm \- the behavior of <code>state\=present</code> and <code>state\=installed</code> is deprecated and will change in community\.general 11\.0\.0\. Right now the module will upgrade a package to the latest version if one of these two states is used\. You should explicitly use <code>state\=latest</code> if you want this behavior\, and switch to <code>state\=present\_not\_latest</code> if you do not want to upgrade the package if it is already installed\. In community\.general 11\.0\.0 the behavior of <code>state\=present</code> and <code>state\=installed</code> will change to that of <code>state\=present\_not\_latest</code> \([https\://github\.com/ansible\-collections/community\.general/issues/8217](https\://github\.com/ansible\-collections/community\.general/issues/8217)\, [https\://github\.com/ansible\-collections/community\.general/pull/8285](https\://github\.com/ansible\-collections/community\.general/pull/8285)\)\. +* consul\_acl \- the module has been deprecated and will be removed in community\.general 10\.0\.0\. <code>consul\_token</code> and <code>consul\_policy</code> can be used instead \([https\://github\.com/ansible\-collections/community\.general/pull/7901](https\://github\.com/ansible\-collections/community\.general/pull/7901)\)\. +* django\_manage \- the <code>ack\_venv\_creation\_deprecation</code> option has no more effect and will be removed from community\.general 11\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/8198](https\://github\.com/ansible\-collections/community\.general/pull/8198)\)\. +* gitlab modules \- the basic auth method on GitLab API have been deprecated and will be removed in community\.general 10\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/8383](https\://github\.com/ansible\-collections/community\.general/pull/8383)\)\. +* hipchat callback plugin \- the hipchat service has been discontinued and the self\-hosted variant has been End of Life since 2020\. The callback plugin is therefore deprecated and will be removed from community\.general 10\.0\.0 if nobody provides compelling reasons to still keep it \([https\://github\.com/ansible\-collections/community\.general/issues/8184](https\://github\.com/ansible\-collections/community\.general/issues/8184)\, [https\://github\.com/ansible\-collections/community\.general/pull/8189](https\://github\.com/ansible\-collections/community\.general/pull/8189)\)\. +* irc \- the defaults <code>false</code> for <code>use\_tls</code> and <code>validate\_certs</code> have been deprecated and will change to <code>true</code> in community\.general 10\.0\.0 to improve security\. You can already improve security now by explicitly setting them to <code>true</code>\. Specifying values now disables the deprecation warning \([https\://github\.com/ansible\-collections/community\.general/pull/7578](https\://github\.com/ansible\-collections/community\.general/pull/7578)\)\. + +<a id="removed-features-previously-deprecated"></a> +### Removed Features \(previously deprecated\) -<a id="bugfixes-5"></a> +* The deprecated redirects for internal module names have been removed\. These internal redirects were extra\-long FQCNs like <code>community\.general\.packaging\.os\.apt\_rpm</code> that redirect to the short FQCN <code>community\.general\.apt\_rpm</code>\. They were originally needed to implement flatmapping\; as various tooling started to recommend users to use the long names flatmapping was removed from the collection and redirects were added for users who already followed these incorrect recommendations \([https\://github\.com/ansible\-collections/community\.general/pull/7835](https\://github\.com/ansible\-collections/community\.general/pull/7835)\)\. +* ansible\_galaxy\_install \- the <code>ack\_ansible29</code> and <code>ack\_min\_ansiblecore211</code> options have been removed\. They no longer had any effect \([https\://github\.com/ansible\-collections/community\.general/pull/8198](https\://github\.com/ansible\-collections/community\.general/pull/8198)\)\. +* cloudflare\_dns \- remove support for SPF records\. These are no longer supported by CloudFlare \([https\://github\.com/ansible\-collections/community\.general/pull/7782](https\://github\.com/ansible\-collections/community\.general/pull/7782)\)\. +* django\_manage \- support for the <code>command</code> values <code>cleanup</code>\, <code>syncdb</code>\, and <code>validate</code> were removed\. Use <code>clearsessions</code>\, <code>migrate</code>\, and <code>check</code> instead\, respectively \([https\://github\.com/ansible\-collections/community\.general/pull/8198](https\://github\.com/ansible\-collections/community\.general/pull/8198)\)\. +* flowdock \- this module relied on HTTPS APIs that do not exist anymore and was thus removed \([https\://github\.com/ansible\-collections/community\.general/pull/8198](https\://github\.com/ansible\-collections/community\.general/pull/8198)\)\. +* mh\.mixins\.deps module utils \- the <code>DependencyMixin</code> has been removed\. Use the <code>deps</code> module utils instead \([https\://github\.com/ansible\-collections/community\.general/pull/8198](https\://github\.com/ansible\-collections/community\.general/pull/8198)\)\. +* proxmox \- the <code>proxmox\_default\_behavior</code> option has been removed \([https\://github\.com/ansible\-collections/community\.general/pull/8198](https\://github\.com/ansible\-collections/community\.general/pull/8198)\)\. +* rax\* modules\, rax module utils\, rax docs fragment \- the Rackspace modules relied on the deprecated package <code>pyrax</code> and were thus removed \([https\://github\.com/ansible\-collections/community\.general/pull/8198](https\://github\.com/ansible\-collections/community\.general/pull/8198)\)\. +* redhat module utils \- the classes <code>Rhsm</code>\, <code>RhsmPool</code>\, and <code>RhsmPools</code> have been removed \([https\://github\.com/ansible\-collections/community\.general/pull/8198](https\://github\.com/ansible\-collections/community\.general/pull/8198)\)\. +* redhat\_subscription \- the alias <code>autosubscribe</code> of the <code>auto\_attach</code> option was removed \([https\://github\.com/ansible\-collections/community\.general/pull/8198](https\://github\.com/ansible\-collections/community\.general/pull/8198)\)\. +* stackdriver \- this module relied on HTTPS APIs that do not exist anymore and was thus removed \([https\://github\.com/ansible\-collections/community\.general/pull/8198](https\://github\.com/ansible\-collections/community\.general/pull/8198)\)\. +* webfaction\_\* modules \- these modules relied on HTTPS APIs that do not exist anymore and were thus removed \([https\://github\.com/ansible\-collections/community\.general/pull/8198](https\://github\.com/ansible\-collections/community\.general/pull/8198)\)\. + +<a id="security-fixes"></a> +### Security Fixes + +* cobbler\, gitlab\_runners\, icinga2\, linode\, lxd\, nmap\, online\, opennebula\, proxmox\, scaleway\, stackpath\_compute\, virtualbox\, and xen\_orchestra inventory plugin \- make sure all data received from the remote servers is marked as unsafe\, so remote code execution by obtaining texts that can be evaluated as templates is not possible \([https\://www\.die\-welt\.net/2024/03/remote\-code\-execution\-in\-ansible\-dynamic\-inventory\-plugins/](https\://www\.die\-welt\.net/2024/03/remote\-code\-execution\-in\-ansible\-dynamic\-inventory\-plugins/)\, [https\://github\.com/ansible\-collections/community\.general/pull/8098](https\://github\.com/ansible\-collections/community\.general/pull/8098)\)\. +* keycloak\_identity\_provider \- the client secret was not correctly sanitized by the module\. The return values <code>proposed</code>\, <code>existing</code>\, and <code>end\_state</code>\, as well as the diff\, did contain the client secret unmasked \([https\://github\.com/ansible\-collections/community\.general/pull/8355](https\://github\.com/ansible\-collections/community\.general/pull/8355)\)\. + +<a id="bugfixes-1"></a> ### Bugfixes +* aix\_filesystem \- fix <code>\_validate\_vg</code> not passing VG name to <code>lsvg\_cmd</code> \([https\://github\.com/ansible\-collections/community\.general/issues/8151](https\://github\.com/ansible\-collections/community\.general/issues/8151)\)\. +* aix\_filesystem \- fix issue with empty list items in crfs logic and option order \([https\://github\.com/ansible\-collections/community\.general/pull/8052](https\://github\.com/ansible\-collections/community\.general/pull/8052)\)\. * apt\-rpm \- the module did not upgrade packages if a newer version exists\. Now the package will be reinstalled if the candidate is newer than the installed version \([https\://github\.com/ansible\-collections/community\.general/issues/7414](https\://github\.com/ansible\-collections/community\.general/issues/7414)\)\. +* apt\_rpm \- when checking whether packages were installed after running <code>apt\-get \-y install \<packages\></code>\, only the last package name was checked \([https\://github\.com/ansible\-collections/community\.general/pull/8263](https\://github\.com/ansible\-collections/community\.general/pull/8263)\)\. +* bitwarden\_secrets\_manager lookup plugin \- implements retry with exponential backoff to avoid lookup errors when Bitwardn\'s API rate limiting is encountered \([https\://github\.com/ansible\-collections/community\.general/issues/8230](https\://github\.com/ansible\-collections/community\.general/issues/8230)\, [https\://github\.com/ansible\-collections/community\.general/pull/8238](https\://github\.com/ansible\-collections/community\.general/pull/8238)\)\. +* cargo \- fix idempotency issues when using a custom installation path for packages \(using the <code>\-\-path</code> parameter\)\. The initial installation runs fine\, but subsequent runs use the <code>get\_installed\(\)</code> function which did not check the given installation location\, before running <code>cargo install</code>\. This resulted in a false <code>changed</code> state\. Also the removal of packeges using <code>state\: absent</code> failed\, as the installation check did not use the given parameter \([https\://github\.com/ansible\-collections/community\.general/pull/7970](https\://github\.com/ansible\-collections/community\.general/pull/7970)\)\. * cloudflare\_dns \- fix Cloudflare lookup of SHFP records \([https\://github\.com/ansible\-collections/community\.general/issues/7652](https\://github\.com/ansible\-collections/community\.general/issues/7652)\)\. +* consul\_token \- fix token creation without <code>accessor\_id</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8091](https\://github\.com/ansible\-collections/community\.general/pull/8091)\)\. +* from\_ini filter plugin \- disabling interpolation of <code>ConfigParser</code> to allow converting values with a <code>\%</code> sign \([https\://github\.com/ansible\-collections/community\.general/issues/8183](https\://github\.com/ansible\-collections/community\.general/issues/8183)\, [https\://github\.com/ansible\-collections/community\.general/pull/8185](https\://github\.com/ansible\-collections/community\.general/pull/8185)\)\. +* gitlab\_group\_members \- fix gitlab constants call in <code>gitlab\_group\_members</code> module \([https\://github\.com/ansible\-collections/community\.general/issues/7467](https\://github\.com/ansible\-collections/community\.general/issues/7467)\)\. +* gitlab\_issue \- fix behavior to search GitLab issue\, using <code>search</code> keyword instead of <code>title</code> \([https\://github\.com/ansible\-collections/community\.general/issues/7846](https\://github\.com/ansible\-collections/community\.general/issues/7846)\)\. +* gitlab\_issue\, gitlab\_label\, gitlab\_milestone \- avoid crash during version comparison when the python\-gitlab Python module is not installed \([https\://github\.com/ansible\-collections/community\.general/pull/8158](https\://github\.com/ansible\-collections/community\.general/pull/8158)\)\. +* gitlab\_project\_members \- fix gitlab constants call in <code>gitlab\_project\_members</code> module \([https\://github\.com/ansible\-collections/community\.general/issues/7467](https\://github\.com/ansible\-collections/community\.general/issues/7467)\)\. +* gitlab\_protected\_branches \- fix gitlab constants call in <code>gitlab\_protected\_branches</code> module \([https\://github\.com/ansible\-collections/community\.general/issues/7467](https\://github\.com/ansible\-collections/community\.general/issues/7467)\)\. +* gitlab\_runner \- fix pagination when checking for existing runners \([https\://github\.com/ansible\-collections/community\.general/pull/7790](https\://github\.com/ansible\-collections/community\.general/pull/7790)\)\. +* gitlab\_user \- fix gitlab constants call in <code>gitlab\_user</code> module \([https\://github\.com/ansible\-collections/community\.general/issues/7467](https\://github\.com/ansible\-collections/community\.general/issues/7467)\)\. +* haproxy \- fix an issue where HAProxy could get stuck in DRAIN mode when the backend was unreachable \([https\://github\.com/ansible\-collections/community\.general/issues/8092](https\://github\.com/ansible\-collections/community\.general/issues/8092)\)\. +* homebrew \- detect already installed formulae and casks using JSON output from <code>brew info</code> \([https\://github\.com/ansible\-collections/community\.general/issues/864](https\://github\.com/ansible\-collections/community\.general/issues/864)\)\. +* homebrew \- error returned from brew command was ignored and tried to parse empty JSON\. Fix now checks for an error and raises it to give accurate error message to users \([https\://github\.com/ansible\-collections/community\.general/issues/8047](https\://github\.com/ansible\-collections/community\.general/issues/8047)\)\. +* incus connection plugin \- treats <code>inventory\_hostname</code> as a variable instead of a literal in remote connections \([https\://github\.com/ansible\-collections/community\.general/issues/7874](https\://github\.com/ansible\-collections/community\.general/issues/7874)\)\. * interface\_files \- also consider <code>address\_family</code> when changing <code>option\=method</code> \([https\://github\.com/ansible\-collections/community\.general/issues/7610](https\://github\.com/ansible\-collections/community\.general/issues/7610)\, [https\://github\.com/ansible\-collections/community\.general/pull/7612](https\://github\.com/ansible\-collections/community\.general/pull/7612)\)\. +* inventory plugins \- add unsafe wrapper to avoid marking strings that do not contain <code>\{</code> or <code>\}</code> as unsafe\, to work around a bug in AWX \(\([https\://github\.com/ansible\-collections/community\.general/issues/8212](https\://github\.com/ansible\-collections/community\.general/issues/8212)\, [https\://github\.com/ansible\-collections/community\.general/pull/8225](https\://github\.com/ansible\-collections/community\.general/pull/8225)\)\. +* ipa \- fix get version regex in IPA module\_utils \([https\://github\.com/ansible\-collections/community\.general/pull/8175](https\://github\.com/ansible\-collections/community\.general/pull/8175)\)\. +* ipa\_hbacrule \- the module uses a string for <code>ipaenabledflag</code> for new FreeIPA versions while the returned value is a boolean \([https\://github\.com/ansible\-collections/community\.general/pull/7880](https\://github\.com/ansible\-collections/community\.general/pull/7880)\)\. +* ipa\_otptoken \- the module expect <code>ipatokendisabled</code> as string but the <code>ipatokendisabled</code> value is returned as a boolean \([https\://github\.com/ansible\-collections/community\.general/pull/7795](https\://github\.com/ansible\-collections/community\.general/pull/7795)\)\. +* ipa\_sudorule \- the module uses a string for <code>ipaenabledflag</code> for new FreeIPA versions while the returned value is a boolean \([https\://github\.com/ansible\-collections/community\.general/pull/7880](https\://github\.com/ansible\-collections/community\.general/pull/7880)\)\. +* iptables\_state \- fix idempotency issues when restoring incomplete iptables dumps \([https\://github\.com/ansible\-collections/community\.general/issues/8029](https\://github\.com/ansible\-collections/community\.general/issues/8029)\)\. * irc \- replace <code>ssl\.wrap\_socket</code> that was removed from Python 3\.12 with code for creating a proper SSL context \([https\://github\.com/ansible\-collections/community\.general/pull/7542](https\://github\.com/ansible\-collections/community\.general/pull/7542)\)\. * keycloak\_\* \- fix Keycloak API client to quote <code>/</code> properly \([https\://github\.com/ansible\-collections/community\.general/pull/7641](https\://github\.com/ansible\-collections/community\.general/pull/7641)\)\. * keycloak\_authz\_permission \- resource payload variable for scope\-based permission was constructed as a string\, when it needs to be a list\, even for a single item \([https\://github\.com/ansible\-collections/community\.general/issues/7151](https\://github\.com/ansible\-collections/community\.general/issues/7151)\)\. +* keycloak\_client \- add sorted <code>defaultClientScopes</code> and <code>optionalClientScopes</code> to normalizations \([https\://github\.com/ansible\-collections/community\.general/pull/8223](https\://github\.com/ansible\-collections/community\.general/pull/8223)\)\. +* keycloak\_client \- fixes issue when metadata is provided in desired state when task is in check mode \([https\://github\.com/ansible\-collections/community\.general/issues/1226](https\://github\.com/ansible\-collections/community\.general/issues/1226)\, [https\://github\.com/ansible\-collections/community\.general/pull/7881](https\://github\.com/ansible\-collections/community\.general/pull/7881)\)\. +* keycloak\_identity\_provider \- <code>mappers</code> processing was not idempotent if the mappers configuration list had not been sorted by name \(in ascending order\)\. Fix resolves the issue by sorting mappers in the desired state using the same key which is used for obtaining existing state \([https\://github\.com/ansible\-collections/community\.general/pull/7418](https\://github\.com/ansible\-collections/community\.general/pull/7418)\)\. +* keycloak\_identity\_provider \- it was not possible to reconfigure \(add\, remove\) <code>mappers</code> once they were created initially\. Removal was ignored\, adding new ones resulted in dropping the pre\-existing unmodified mappers\. Fix resolves the issue by supplying correct input to the internal update call \([https\://github\.com/ansible\-collections/community\.general/pull/7418](https\://github\.com/ansible\-collections/community\.general/pull/7418)\)\. +* keycloak\_realm \- add normalizations for <code>enabledEventTypes</code> and <code>supportedLocales</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8224](https\://github\.com/ansible\-collections/community\.general/pull/8224)\)\. +* keycloak\_user \- when <code>force</code> is set\, but user does not exist\, do not try to delete it \([https\://github\.com/ansible\-collections/community\.general/pull/7696](https\://github\.com/ansible\-collections/community\.general/pull/7696)\)\. +* keycloak\_user\_federation \- fix diff of empty <code>krbPrincipalAttribute</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8320](https\://github\.com/ansible\-collections/community\.general/pull/8320)\)\. +* ldap \- previously the order number \(if present\) was expected to follow an equals sign in the DN\. This makes it so the order number string is identified correctly anywhere within the DN \([https\://github\.com/ansible\-collections/community\.general/issues/7646](https\://github\.com/ansible\-collections/community\.general/issues/7646)\)\. +* linode inventory plugin \- add descriptive error message for linode inventory plugin \([https\://github\.com/ansible\-collections/community\.general/pull/8133](https\://github\.com/ansible\-collections/community\.general/pull/8133)\)\. * log\_entries callback plugin \- replace <code>ssl\.wrap\_socket</code> that was removed from Python 3\.12 with code for creating a proper SSL context \([https\://github\.com/ansible\-collections/community\.general/pull/7542](https\://github\.com/ansible\-collections/community\.general/pull/7542)\)\. * lvol \- test for output messages in both <code>stdout</code> and <code>stderr</code> \([https\://github\.com/ansible\-collections/community\.general/pull/7601](https\://github\.com/ansible\-collections/community\.general/pull/7601)\, [https\://github\.com/ansible\-collections/community\.general/issues/7182](https\://github\.com/ansible\-collections/community\.general/issues/7182)\)\. +* merge\_variables lookup plugin \- fixing cross host merge\: providing access to foreign hosts variables to the perspective of the host that is performing the merge \([https\://github\.com/ansible\-collections/community\.general/pull/8303](https\://github\.com/ansible\-collections/community\.general/pull/8303)\)\. +* modprobe \- listing modules files or modprobe files could trigger a FileNotFoundError if <code>/etc/modprobe\.d</code> or <code>/etc/modules\-load\.d</code> did not exist\. Relevant functions now return empty lists if the directories do not exist to avoid crashing the module \([https\://github\.com/ansible\-collections/community\.general/issues/7717](https\://github\.com/ansible\-collections/community\.general/issues/7717)\)\. +* mssql\_script \- make the module work with Python 2 \([https\://github\.com/ansible\-collections/community\.general/issues/7818](https\://github\.com/ansible\-collections/community\.general/issues/7818)\, [https\://github\.com/ansible\-collections/community\.general/pull/7821](https\://github\.com/ansible\-collections/community\.general/pull/7821)\)\. +* nmcli \- fix <code>connection\.slave\-type</code> wired to <code>bond</code> and not with parameter <code>slave\_type</code> in case of connection type <code>wifi</code> \([https\://github\.com/ansible\-collections/community\.general/issues/7389](https\://github\.com/ansible\-collections/community\.general/issues/7389)\)\. +* ocapi\_utils\, oci\_utils\, redfish\_utils module utils \- replace <code>type\(\)</code> calls with <code>isinstance\(\)</code> calls \([https\://github\.com/ansible\-collections/community\.general/pull/7501](https\://github\.com/ansible\-collections/community\.general/pull/7501)\)\. +* onepassword lookup plugin \- failed for fields that were in sections and had uppercase letters in the label/ID\. Field lookups are now case insensitive in all cases \([https\://github\.com/ansible\-collections/community\.general/pull/7919](https\://github\.com/ansible\-collections/community\.general/pull/7919)\)\. * onepassword lookup plugin \- field and section titles are now case insensitive when using op CLI version two or later\. This matches the behavior of version one \([https\://github\.com/ansible\-collections/community\.general/pull/7564](https\://github\.com/ansible\-collections/community\.general/pull/7564)\)\. +* opentelemetry callback plugin \- close spans always \([https\://github\.com/ansible\-collections/community\.general/pull/8367](https\://github\.com/ansible\-collections/community\.general/pull/8367)\)\. +* opentelemetry callback plugin \- honour the <code>disable\_logs</code> option to avoid storing task results since they are not used regardless \([https\://github\.com/ansible\-collections/community\.general/pull/8373](https\://github\.com/ansible\-collections/community\.general/pull/8373)\)\. +* pacemaker\_cluster \- actually implement check mode\, which the module claims to support\. This means that until now the module also did changes in check mode \([https\://github\.com/ansible\-collections/community\.general/pull/8081](https\://github\.com/ansible\-collections/community\.general/pull/8081)\)\. +* pam\_limits \- when the file does not exist\, do not create it in check mode \([https\://github\.com/ansible\-collections/community\.general/issues/8050](https\://github\.com/ansible\-collections/community\.general/issues/8050)\, [https\://github\.com/ansible\-collections/community\.general/pull/8057](https\://github\.com/ansible\-collections/community\.general/pull/8057)\)\. +* pipx module utils \- change the CLI argument formatter for the <code>pip\_args</code> parameter \([https\://github\.com/ansible\-collections/community\.general/issues/7497](https\://github\.com/ansible\-collections/community\.general/issues/7497)\, [https\://github\.com/ansible\-collections/community\.general/pull/7506](https\://github\.com/ansible\-collections/community\.general/pull/7506)\)\. +* pkgin \- pkgin \(pkgsrc package manager used by SmartOS\) raises erratic exceptions and spurious <code>changed\=true</code> \([https\://github\.com/ansible\-collections/community\.general/pull/7971](https\://github\.com/ansible\-collections/community\.general/pull/7971)\)\. +* proxmox \- fix updating a container config if the setting does not already exist \([https\://github\.com/ansible\-collections/community\.general/pull/7872](https\://github\.com/ansible\-collections/community\.general/pull/7872)\)\. +* proxmox\_kvm \- fixed status check getting from node\-specific API endpoint \([https\://github\.com/ansible\-collections/community\.general/issues/7817](https\://github\.com/ansible\-collections/community\.general/issues/7817)\)\. +* proxmox\_kvm \- running <code>state\=template</code> will first check whether VM is already a template \([https\://github\.com/ansible\-collections/community\.general/pull/7792](https\://github\.com/ansible\-collections/community\.general/pull/7792)\)\. +* proxmox\_pool\_member \- absent state for type VM did not delete VMs from the pools \([https\://github\.com/ansible\-collections/community\.general/pull/7464](https\://github\.com/ansible\-collections/community\.general/pull/7464)\)\. +* puppet \- add option <code>environment\_lang</code> to set the environment language encoding\. Defaults to lang <code>C</code>\. It is recommended to set it to <code>C\.UTF\-8</code> or <code>en\_US\.UTF\-8</code> depending on what is available on your system\. \([https\://github\.com/ansible\-collections/community\.general/issues/8000](https\://github\.com/ansible\-collections/community\.general/issues/8000)\) +* redfish\_command \- fix usage of message parsing in <code>SimpleUpdate</code> and <code>MultipartHTTPPushUpdate</code> commands to treat the lack of a <code>MessageId</code> as no message \([https\://github\.com/ansible\-collections/community\.general/issues/7465](https\://github\.com/ansible\-collections/community\.general/issues/7465)\, [https\://github\.com/ansible\-collections/community\.general/pull/7471](https\://github\.com/ansible\-collections/community\.general/pull/7471)\)\. +* redfish\_info \- allow for a GET operation invoked by <code>GetUpdateStatus</code> to allow for an empty response body for cases where a service returns 204 No Content \([https\://github\.com/ansible\-collections/community\.general/issues/8003](https\://github\.com/ansible\-collections/community\.general/issues/8003)\)\. +* redfish\_info \- correct uncaught exception when attempting to retrieve <code>Chassis</code> information \([https\://github\.com/ansible\-collections/community\.general/pull/7952](https\://github\.com/ansible\-collections/community\.general/pull/7952)\)\. * redhat\_subscription \- use the D\-Bus registration on RHEL 7 only on 7\.4 and greater\; older versions of RHEL 7 do not have it \([https\://github\.com/ansible\-collections/community\.general/issues/7622](https\://github\.com/ansible\-collections/community\.general/issues/7622)\, [https\://github\.com/ansible\-collections/community\.general/pull/7624](https\://github\.com/ansible\-collections/community\.general/pull/7624)\)\. +* riak \- support <code>riak admin</code> sub\-command in newer Riak KV versions beside the legacy <code>riak\-admin</code> main command \([https\://github\.com/ansible\-collections/community\.general/pull/8211](https\://github\.com/ansible\-collections/community\.general/pull/8211)\)\. +* statusio\_maintenance \- fix error caused by incorrectly formed API data payload\. Was raising \"Failed to create maintenance HTTP Error 400 Bad Request\" caused by bad data type for date/time and deprecated dict keys \([https\://github\.com/ansible\-collections/community\.general/pull/7754](https\://github\.com/ansible\-collections/community\.general/pull/7754)\)\. * terraform \- fix multiline string handling in complex variables \([https\://github\.com/ansible\-collections/community\.general/pull/7535](https\://github\.com/ansible\-collections/community\.general/pull/7535)\)\. +* to\_ini filter plugin \- disabling interpolation of <code>ConfigParser</code> to allow converting values with a <code>\%</code> sign \([https\://github\.com/ansible\-collections/community\.general/issues/8183](https\://github\.com/ansible\-collections/community\.general/issues/8183)\, [https\://github\.com/ansible\-collections/community\.general/pull/8185](https\://github\.com/ansible\-collections/community\.general/pull/8185)\)\. +* xml \- make module work with lxml 5\.1\.1\, which removed some internals that the module was relying on \([https\://github\.com/ansible\-collections/community\.general/pull/8169](https\://github\.com/ansible\-collections/community\.general/pull/8169)\)\. -<a id="new-plugins-2"></a> +<a id="new-plugins"></a> ### New Plugins -<a id="lookup-1"></a> -#### Lookup - -* onepassword\_doc \- Fetch documents stored in 1Password - -<a id="test"></a> -#### Test - -* fqdn\_valid \- Validates fully\-qualified domain names against RFC 1123 - -<a id="new-modules-5"></a> -### New Modules - -* git\_config\_info \- Read git configuration -* gitlab\_issue \- Create\, update\, or delete GitLab issues -* nomad\_token \- Manage Nomad ACL tokens +<a id="become"></a> +#### Become -<a id="v8-0-2"></a> -## v8\.0\.2 +* community\.general\.run0 \- Systemd\'s run0\. -<a id="release-summary-6"></a> -### Release Summary - -Bugfix release for inclusion in Ansible 9\.0\.0rc1\. - -<a id="bugfixes-6"></a> -### Bugfixes - -* ocapi\_utils\, oci\_utils\, redfish\_utils module utils \- replace <code>type\(\)</code> calls with <code>isinstance\(\)</code> calls \([https\://github\.com/ansible\-collections/community\.general/pull/7501](https\://github\.com/ansible\-collections/community\.general/pull/7501)\)\. -* pipx module utils \- change the CLI argument formatter for the <code>pip\_args</code> parameter \([https\://github\.com/ansible\-collections/community\.general/issues/7497](https\://github\.com/ansible\-collections/community\.general/issues/7497)\, [https\://github\.com/ansible\-collections/community\.general/pull/7506](https\://github\.com/ansible\-collections/community\.general/pull/7506)\)\. - -<a id="v8-0-1"></a> -## v8\.0\.1 - -<a id="release-summary-7"></a> -### Release Summary - -Bugfix release for inclusion in Ansible 9\.0\.0b1\. - -<a id="bugfixes-7"></a> -### Bugfixes - -* gitlab\_group\_members \- fix gitlab constants call in <code>gitlab\_group\_members</code> module \([https\://github\.com/ansible\-collections/community\.general/issues/7467](https\://github\.com/ansible\-collections/community\.general/issues/7467)\)\. -* gitlab\_project\_members \- fix gitlab constants call in <code>gitlab\_project\_members</code> module \([https\://github\.com/ansible\-collections/community\.general/issues/7467](https\://github\.com/ansible\-collections/community\.general/issues/7467)\)\. -* gitlab\_protected\_branches \- fix gitlab constants call in <code>gitlab\_protected\_branches</code> module \([https\://github\.com/ansible\-collections/community\.general/issues/7467](https\://github\.com/ansible\-collections/community\.general/issues/7467)\)\. -* gitlab\_user \- fix gitlab constants call in <code>gitlab\_user</code> module \([https\://github\.com/ansible\-collections/community\.general/issues/7467](https\://github\.com/ansible\-collections/community\.general/issues/7467)\)\. -* proxmox\_pool\_member \- absent state for type VM did not delete VMs from the pools \([https\://github\.com/ansible\-collections/community\.general/pull/7464](https\://github\.com/ansible\-collections/community\.general/pull/7464)\)\. -* redfish\_command \- fix usage of message parsing in <code>SimpleUpdate</code> and <code>MultipartHTTPPushUpdate</code> commands to treat the lack of a <code>MessageId</code> as no message \([https\://github\.com/ansible\-collections/community\.general/issues/7465](https\://github\.com/ansible\-collections/community\.general/issues/7465)\, [https\://github\.com/ansible\-collections/community\.general/pull/7471](https\://github\.com/ansible\-collections/community\.general/pull/7471)\)\. - -<a id="v8-0-0"></a> -## v8\.0\.0 - -<a id="release-summary-8"></a> -### Release Summary - -This is release 8\.0\.0 of <code>community\.general</code>\, released on 2023\-11\-01\. - -<a id="minor-changes-6"></a> -### Minor Changes - -* The collection will start using semantic markup \([https\://github\.com/ansible\-collections/community\.general/pull/6539](https\://github\.com/ansible\-collections/community\.general/pull/6539)\)\. -* VarDict module utils \- add method <code>VarDict\.as\_dict\(\)</code> to convert to a plain <code>dict</code> object \([https\://github\.com/ansible\-collections/community\.general/pull/6602](https\://github\.com/ansible\-collections/community\.general/pull/6602)\)\. -* apt\_rpm \- extract package name from local <code>\.rpm</code> path when verifying - installation success\. Allows installing packages from local <code>\.rpm</code> files - \([https\://github\.com/ansible\-collections/community\.general/pull/7396](https\://github\.com/ansible\-collections/community\.general/pull/7396)\)\. -* cargo \- add option <code>executable</code>\, which allows user to specify path to the cargo binary \([https\://github\.com/ansible\-collections/community\.general/pull/7352](https\://github\.com/ansible\-collections/community\.general/pull/7352)\)\. -* cargo \- add option <code>locked</code> which allows user to specify install the locked version of dependency instead of latest compatible version \([https\://github\.com/ansible\-collections/community\.general/pull/6134](https\://github\.com/ansible\-collections/community\.general/pull/6134)\)\. -* chroot connection plugin \- add <code>disable\_root\_check</code> option \([https\://github\.com/ansible\-collections/community\.general/pull/7099](https\://github\.com/ansible\-collections/community\.general/pull/7099)\)\. -* cloudflare\_dns \- add CAA record support \([https\://github\.com/ansible\-collections/community\.general/pull/7399](https\://github\.com/ansible\-collections/community\.general/pull/7399)\)\. -* cobbler inventory plugin \- add <code>exclude\_mgmt\_classes</code> and <code>include\_mgmt\_classes</code> options to exclude or include hosts based on management classes \([https\://github\.com/ansible\-collections/community\.general/pull/7184](https\://github\.com/ansible\-collections/community\.general/pull/7184)\)\. -* cobbler inventory plugin \- add <code>inventory\_hostname</code> option to allow using the system name for the inventory hostname \([https\://github\.com/ansible\-collections/community\.general/pull/6502](https\://github\.com/ansible\-collections/community\.general/pull/6502)\)\. -* cobbler inventory plugin \- add <code>want\_ip\_addresses</code> option to collect all interface DNS name to IP address mapping \([https\://github\.com/ansible\-collections/community\.general/pull/6711](https\://github\.com/ansible\-collections/community\.general/pull/6711)\)\. -* cobbler inventory plugin \- add primary IP addess to <code>cobbler\_ipv4\_address</code> and IPv6 address to <code>cobbler\_ipv6\_address</code> host variable \([https\://github\.com/ansible\-collections/community\.general/pull/6711](https\://github\.com/ansible\-collections/community\.general/pull/6711)\)\. -* cobbler inventory plugin \- add warning for systems with empty profiles \([https\://github\.com/ansible\-collections/community\.general/pull/6502](https\://github\.com/ansible\-collections/community\.general/pull/6502)\)\. -* cobbler inventory plugin \- convert Ansible unicode strings to native Python unicode strings before passing user/password to XMLRPC client \([https\://github\.com/ansible\-collections/community\.general/pull/6923](https\://github\.com/ansible\-collections/community\.general/pull/6923)\)\. -* consul\_session \- drops requirement for the <code>python\-consul</code> library to communicate with the Consul API\, instead relying on the existing <code>requests</code> library requirement \([https\://github\.com/ansible\-collections/community\.general/pull/6755](https\://github\.com/ansible\-collections/community\.general/pull/6755)\)\. -* copr \- respawn module to use the system python interpreter when the <code>dnf</code> python module is not available in <code>ansible\_python\_interpreter</code> \([https\://github\.com/ansible\-collections/community\.general/pull/6522](https\://github\.com/ansible\-collections/community\.general/pull/6522)\)\. -* cpanm \- minor refactor when creating the <code>CmdRunner</code> object \([https\://github\.com/ansible\-collections/community\.general/pull/7231](https\://github\.com/ansible\-collections/community\.general/pull/7231)\)\. -* datadog\_monitor \- adds <code>notification\_preset\_name</code>\, <code>renotify\_occurrences</code> and <code>renotify\_statuses</code> parameters \([https\://github\.com/ansible\-collections/community\.general/issues/6521\,https\://github\.com/ansible\-collections/community\.general/issues/5823](https\://github\.com/ansible\-collections/community\.general/issues/6521\,https\://github\.com/ansible\-collections/community\.general/issues/5823)\)\. -* dig lookup plugin \- add TCP option to enable the use of TCP connection during DNS lookup \([https\://github\.com/ansible\-collections/community\.general/pull/7343](https\://github\.com/ansible\-collections/community\.general/pull/7343)\)\. -* ejabberd\_user \- module now using <code>CmdRunner</code> to execute external command \([https\://github\.com/ansible\-collections/community\.general/pull/7075](https\://github\.com/ansible\-collections/community\.general/pull/7075)\)\. -* filesystem \- add <code>uuid</code> parameter for UUID change feature \([https\://github\.com/ansible\-collections/community\.general/pull/6680](https\://github\.com/ansible\-collections/community\.general/pull/6680)\)\. -* gitlab\_group \- add option <code>force\_delete</code> \(default\: false\) which allows delete group even if projects exists in it \([https\://github\.com/ansible\-collections/community\.general/pull/7364](https\://github\.com/ansible\-collections/community\.general/pull/7364)\)\. -* gitlab\_group\_variable \- add support for <code>raw</code> variables suboption \([https\://github\.com/ansible\-collections/community\.general/pull/7132](https\://github\.com/ansible\-collections/community\.general/pull/7132)\)\. -* gitlab\_project\_variable \- add support for <code>raw</code> variables suboption \([https\://github\.com/ansible\-collections/community\.general/pull/7132](https\://github\.com/ansible\-collections/community\.general/pull/7132)\)\. -* gitlab\_project\_variable \- minor refactor removing unnecessary code statements \([https\://github\.com/ansible\-collections/community\.general/pull/6928](https\://github\.com/ansible\-collections/community\.general/pull/6928)\)\. -* gitlab\_runner \- minor refactor removing unnecessary code statements \([https\://github\.com/ansible\-collections/community\.general/pull/6927](https\://github\.com/ansible\-collections/community\.general/pull/6927)\)\. -* htpasswd \- minor code improvements in the module \([https\://github\.com/ansible\-collections/community\.general/pull/6901](https\://github\.com/ansible\-collections/community\.general/pull/6901)\)\. -* htpasswd \- the parameter <code>crypt\_scheme</code> is being renamed as <code>hash\_scheme</code> and added as an alias to it \([https\://github\.com/ansible\-collections/community\.general/pull/6841](https\://github\.com/ansible\-collections/community\.general/pull/6841)\)\. -* icinga2\_host \- the <code>ip</code> option is no longer required\, since Icinga 2 allows for an empty address attribute \([https\://github\.com/ansible\-collections/community\.general/pull/7452](https\://github\.com/ansible\-collections/community\.general/pull/7452)\)\. -* ini\_file \- add <code>ignore\_spaces</code> option \([https\://github\.com/ansible\-collections/community\.general/pull/7273](https\://github\.com/ansible\-collections/community\.general/pull/7273)\)\. -* ini\_file \- add <code>modify\_inactive\_option</code> option \([https\://github\.com/ansible\-collections/community\.general/pull/7401](https\://github\.com/ansible\-collections/community\.general/pull/7401)\)\. -* ipa\_config \- add module parameters to manage FreeIPA user and group objectclasses \([https\://github\.com/ansible\-collections/community\.general/pull/7019](https\://github\.com/ansible\-collections/community\.general/pull/7019)\)\. -* ipa\_config \- adds <code>idp</code> choice to <code>ipauserauthtype</code> parameter\'s choices \([https\://github\.com/ansible\-collections/community\.general/pull/7051](https\://github\.com/ansible\-collections/community\.general/pull/7051)\)\. -* jenkins\_build \- add new <code>detach</code> option\, which allows the module to exit successfully as long as the build is created \(default functionality is still waiting for the build to end before exiting\) \([https\://github\.com/ansible\-collections/community\.general/pull/7204](https\://github\.com/ansible\-collections/community\.general/pull/7204)\)\. -* jenkins\_build \- add new <code>time\_between\_checks</code> option\, which allows to configure the wait time between requests to the Jenkins server \([https\://github\.com/ansible\-collections/community\.general/pull/7204](https\://github\.com/ansible\-collections/community\.general/pull/7204)\)\. -* keycloak\_authentication \- added provider ID choices\, since Keycloak supports only those two specific ones \([https\://github\.com/ansible\-collections/community\.general/pull/6763](https\://github\.com/ansible\-collections/community\.general/pull/6763)\)\. -* keycloak\_client\_rolemapping \- adds support for subgroups with additional parameter <code>parents</code> \([https\://github\.com/ansible\-collections/community\.general/pull/6687](https\://github\.com/ansible\-collections/community\.general/pull/6687)\)\. -* keycloak\_role \- add composite roles support for realm and client roles \([https\://github\.com/ansible\-collections/community\.general/pull/6469](https\://github\.com/ansible\-collections/community\.general/pull/6469)\)\. -* keyring \- minor refactor removing unnecessary code statements \([https\://github\.com/ansible\-collections/community\.general/pull/6927](https\://github\.com/ansible\-collections/community\.general/pull/6927)\)\. -* ldap\_\* \- add new arguments <code>client\_cert</code> and <code>client\_key</code> to the LDAP modules in order to allow certificate authentication \([https\://github\.com/ansible\-collections/community\.general/pull/6668](https\://github\.com/ansible\-collections/community\.general/pull/6668)\)\. -* ldap\_search \- add a new <code>page\_size</code> option to enable paged searches \([https\://github\.com/ansible\-collections/community\.general/pull/6648](https\://github\.com/ansible\-collections/community\.general/pull/6648)\)\. -* locale\_gen \- module has been refactored to use <code>ModuleHelper</code> and <code>CmdRunner</code> \([https\://github\.com/ansible\-collections/community\.general/pull/6903](https\://github\.com/ansible\-collections/community\.general/pull/6903)\)\. -* locale\_gen \- module now using <code>CmdRunner</code> to execute external commands \([https\://github\.com/ansible\-collections/community\.general/pull/6820](https\://github\.com/ansible\-collections/community\.general/pull/6820)\)\. -* lvg \- add <code>active</code> and <code>inactive</code> values to the <code>state</code> option for active state management feature \([https\://github\.com/ansible\-collections/community\.general/pull/6682](https\://github\.com/ansible\-collections/community\.general/pull/6682)\)\. -* lvg \- add <code>reset\_vg\_uuid</code>\, <code>reset\_pv\_uuid</code> options for UUID reset feature \([https\://github\.com/ansible\-collections/community\.general/pull/6682](https\://github\.com/ansible\-collections/community\.general/pull/6682)\)\. -* lxc connection plugin \- properly handle a change of the <code>remote\_addr</code> option \([https\://github\.com/ansible\-collections/community\.general/pull/7373](https\://github\.com/ansible\-collections/community\.general/pull/7373)\)\. -* lxd connection plugin \- automatically translate <code>remote\_addr</code> from FQDN to \(short\) hostname \([https\://github\.com/ansible\-collections/community\.general/pull/7360](https\://github\.com/ansible\-collections/community\.general/pull/7360)\)\. -* lxd connection plugin \- update error parsing to work with newer messages mentioning instances \([https\://github\.com/ansible\-collections/community\.general/pull/7360](https\://github\.com/ansible\-collections/community\.general/pull/7360)\)\. -* lxd inventory plugin \- add <code>server\_cert</code> option for trust anchor to use for TLS verification of server certificates \([https\://github\.com/ansible\-collections/community\.general/pull/7392](https\://github\.com/ansible\-collections/community\.general/pull/7392)\)\. -* lxd inventory plugin \- add <code>server\_check\_hostname</code> option to disable hostname verification of server certificates \([https\://github\.com/ansible\-collections/community\.general/pull/7392](https\://github\.com/ansible\-collections/community\.general/pull/7392)\)\. -* make \- add new <code>targets</code> parameter allowing multiple targets to be used with <code>make</code> \([https\://github\.com/ansible\-collections/community\.general/pull/6882](https\://github\.com/ansible\-collections/community\.general/pull/6882)\, [https\://github\.com/ansible\-collections/community\.general/issues/4919](https\://github\.com/ansible\-collections/community\.general/issues/4919)\)\. -* make \- allows <code>params</code> to be used without value \([https\://github\.com/ansible\-collections/community\.general/pull/7180](https\://github\.com/ansible\-collections/community\.general/pull/7180)\)\. -* mas \- disable sign\-in check for macOS 12\+ as <code>mas account</code> is non\-functional \([https\://github\.com/ansible\-collections/community\.general/pull/6520](https\://github\.com/ansible\-collections/community\.general/pull/6520)\)\. -* newrelic\_deployment \- add option <code>app\_name\_exact\_match</code>\, which filters results for the exact app\_name provided \([https\://github\.com/ansible\-collections/community\.general/pull/7355](https\://github\.com/ansible\-collections/community\.general/pull/7355)\)\. -* nmap inventory plugin \- now has a <code>use\_arp\_ping</code> option to allow the user to disable the default ARP ping query for a more reliable form \([https\://github\.com/ansible\-collections/community\.general/pull/7119](https\://github\.com/ansible\-collections/community\.general/pull/7119)\)\. -* nmcli \- add support for <code>ipv4\.dns\-options</code> and <code>ipv6\.dns\-options</code> \([https\://github\.com/ansible\-collections/community\.general/pull/6902](https\://github\.com/ansible\-collections/community\.general/pull/6902)\)\. -* nomad\_job\, nomad\_job\_info \- add <code>port</code> parameter \([https\://github\.com/ansible\-collections/community\.general/pull/7412](https\://github\.com/ansible\-collections/community\.general/pull/7412)\)\. -* npm \- minor improvement on parameter validation \([https\://github\.com/ansible\-collections/community\.general/pull/6848](https\://github\.com/ansible\-collections/community\.general/pull/6848)\)\. -* npm \- module now using <code>CmdRunner</code> to execute external commands \([https\://github\.com/ansible\-collections/community\.general/pull/6989](https\://github\.com/ansible\-collections/community\.general/pull/6989)\)\. -* onepassword lookup plugin \- add service account support \([https\://github\.com/ansible\-collections/community\.general/issues/6635](https\://github\.com/ansible\-collections/community\.general/issues/6635)\, [https\://github\.com/ansible\-collections/community\.general/pull/6660](https\://github\.com/ansible\-collections/community\.general/pull/6660)\)\. -* onepassword lookup plugin \- introduce <code>account\_id</code> option which allows specifying which account to use \([https\://github\.com/ansible\-collections/community\.general/pull/7308](https\://github\.com/ansible\-collections/community\.general/pull/7308)\)\. -* onepassword\_raw lookup plugin \- add service account support \([https\://github\.com/ansible\-collections/community\.general/issues/6635](https\://github\.com/ansible\-collections/community\.general/issues/6635)\, [https\://github\.com/ansible\-collections/community\.general/pull/6660](https\://github\.com/ansible\-collections/community\.general/pull/6660)\)\. -* onepassword\_raw lookup plugin \- introduce <code>account\_id</code> option which allows specifying which account to use \([https\://github\.com/ansible\-collections/community\.general/pull/7308](https\://github\.com/ansible\-collections/community\.general/pull/7308)\)\. -* opentelemetry callback plugin \- add span attributes in the span event \([https\://github\.com/ansible\-collections/community\.general/pull/6531](https\://github\.com/ansible\-collections/community\.general/pull/6531)\)\. -* opkg \- add <code>executable</code> parameter allowing to specify the path of the <code>opkg</code> command \([https\://github\.com/ansible\-collections/community\.general/pull/6862](https\://github\.com/ansible\-collections/community\.general/pull/6862)\)\. -* opkg \- remove default value <code>\"\"</code> for parameter <code>force</code> as it causes the same behaviour of not having that parameter \([https\://github\.com/ansible\-collections/community\.general/pull/6513](https\://github\.com/ansible\-collections/community\.general/pull/6513)\)\. -* pagerduty \- adds in option to use v2 API for creating pagerduty incidents \([https\://github\.com/ansible\-collections/community\.general/issues/6151](https\://github\.com/ansible\-collections/community\.general/issues/6151)\) -* parted \- on resize\, use <code>\-\-fix</code> option if available \([https\://github\.com/ansible\-collections/community\.general/pull/7304](https\://github\.com/ansible\-collections/community\.general/pull/7304)\)\. -* pnpm \- set correct version when state is latest or version is not mentioned\. Resolves previous idempotency problem \([https\://github\.com/ansible\-collections/community\.general/pull/7339](https\://github\.com/ansible\-collections/community\.general/pull/7339)\)\. -* pritunl module utils \- ensure <code>validate\_certs</code> parameter is honoured in all methods \([https\://github\.com/ansible\-collections/community\.general/pull/7156](https\://github\.com/ansible\-collections/community\.general/pull/7156)\)\. -* proxmox \- add <code>vmid</code> \(and <code>taskid</code> when possible\) to return values \([https\://github\.com/ansible\-collections/community\.general/pull/7263](https\://github\.com/ansible\-collections/community\.general/pull/7263)\)\. -* proxmox \- support <code>timezone</code> parameter at container creation \([https\://github\.com/ansible\-collections/community\.general/pull/6510](https\://github\.com/ansible\-collections/community\.general/pull/6510)\)\. -* proxmox inventory plugin \- add composite variables support for Proxmox nodes \([https\://github\.com/ansible\-collections/community\.general/issues/6640](https\://github\.com/ansible\-collections/community\.general/issues/6640)\)\. -* proxmox\_kvm \- added support for <code>tpmstate0</code> parameter to configure TPM \(Trusted Platform Module\) disk\. TPM is required for Windows 11 installations \([https\://github\.com/ansible\-collections/community\.general/pull/6533](https\://github\.com/ansible\-collections/community\.general/pull/6533)\)\. -* proxmox\_kvm \- enabled force restart of VM\, bringing the <code>force</code> parameter functionality in line with what is described in the docs \([https\://github\.com/ansible\-collections/community\.general/pull/6914](https\://github\.com/ansible\-collections/community\.general/pull/6914)\)\. -* proxmox\_kvm \- re\-use <code>timeout</code> module param to forcefully shutdown a virtual machine when <code>state</code> is <code>stopped</code> \([https\://github\.com/ansible\-collections/community\.general/issues/6257](https\://github\.com/ansible\-collections/community\.general/issues/6257)\)\. -* proxmox\_snap \- add <code>retention</code> parameter to delete old snapshots \([https\://github\.com/ansible\-collections/community\.general/pull/6576](https\://github\.com/ansible\-collections/community\.general/pull/6576)\)\. -* proxmox\_vm\_info \- <code>node</code> parameter is no longer required\. Information can be obtained for the whole cluster \([https\://github\.com/ansible\-collections/community\.general/pull/6976](https\://github\.com/ansible\-collections/community\.general/pull/6976)\)\. -* proxmox\_vm\_info \- non\-existing provided by name/vmid VM would return empty results instead of failing \([https\://github\.com/ansible\-collections/community\.general/pull/7049](https\://github\.com/ansible\-collections/community\.general/pull/7049)\)\. -* pubnub\_blocks \- minor refactor removing unnecessary code statements \([https\://github\.com/ansible\-collections/community\.general/pull/6928](https\://github\.com/ansible\-collections/community\.general/pull/6928)\)\. -* random\_string \- added new <code>ignore\_similar\_chars</code> and <code>similar\_chars</code> option to ignore certain chars \([https\://github\.com/ansible\-collections/community\.general/pull/7242](https\://github\.com/ansible\-collections/community\.general/pull/7242)\)\. -* redfish\_command \- add <code>MultipartHTTPPushUpdate</code> command \([https\://github\.com/ansible\-collections/community\.general/issues/6471](https\://github\.com/ansible\-collections/community\.general/issues/6471)\, [https\://github\.com/ansible\-collections/community\.general/pull/6612](https\://github\.com/ansible\-collections/community\.general/pull/6612)\)\. -* redfish\_command \- add <code>account\_types</code> and <code>oem\_account\_types</code> as optional inputs to <code>AddUser</code> \([https\://github\.com/ansible\-collections/community\.general/issues/6823](https\://github\.com/ansible\-collections/community\.general/issues/6823)\, [https\://github\.com/ansible\-collections/community\.general/pull/6871](https\://github\.com/ansible\-collections/community\.general/pull/6871)\)\. -* redfish\_command \- add new option <code>update\_oem\_params</code> for the <code>MultipartHTTPPushUpdate</code> command \([https\://github\.com/ansible\-collections/community\.general/issues/7331](https\://github\.com/ansible\-collections/community\.general/issues/7331)\)\. -* redfish\_config \- add <code>CreateVolume</code> command to allow creation of volumes on servers \([https\://github\.com/ansible\-collections/community\.general/pull/6813](https\://github\.com/ansible\-collections/community\.general/pull/6813)\)\. -* redfish\_config \- add <code>DeleteAllVolumes</code> command to allow deletion of all volumes on servers \([https\://github\.com/ansible\-collections/community\.general/pull/6814](https\://github\.com/ansible\-collections/community\.general/pull/6814)\)\. -* redfish\_config \- adding <code>SetSecureBoot</code> command \([https\://github\.com/ansible\-collections/community\.general/pull/7129](https\://github\.com/ansible\-collections/community\.general/pull/7129)\)\. -* redfish\_info \- add <code>AccountTypes</code> and <code>OEMAccountTypes</code> to the output of <code>ListUsers</code> \([https\://github\.com/ansible\-collections/community\.general/issues/6823](https\://github\.com/ansible\-collections/community\.general/issues/6823)\, [https\://github\.com/ansible\-collections/community\.general/pull/6871](https\://github\.com/ansible\-collections/community\.general/pull/6871)\)\. -* redfish\_info \- add support for <code>GetBiosRegistries</code> command \([https\://github\.com/ansible\-collections/community\.general/pull/7144](https\://github\.com/ansible\-collections/community\.general/pull/7144)\)\. -* redfish\_info \- adds <code>LinkStatus</code> to NIC inventory \([https\://github\.com/ansible\-collections/community\.general/pull/7318](https\://github\.com/ansible\-collections/community\.general/pull/7318)\)\. -* redfish\_info \- adds <code>ProcessorArchitecture</code> to CPU inventory \([https\://github\.com/ansible\-collections/community\.general/pull/6864](https\://github\.com/ansible\-collections/community\.general/pull/6864)\)\. -* redfish\_info \- fix for <code>GetVolumeInventory</code>\, Controller name was getting populated incorrectly and duplicates were seen in the volumes retrieved \([https\://github\.com/ansible\-collections/community\.general/pull/6719](https\://github\.com/ansible\-collections/community\.general/pull/6719)\)\. -* redfish\_info \- report <code>Id</code> in the output of <code>GetManagerInventory</code> \([https\://github\.com/ansible\-collections/community\.general/pull/7140](https\://github\.com/ansible\-collections/community\.general/pull/7140)\)\. -* redfish\_utils \- use <code>Controllers</code> key in redfish data to obtain Storage controllers properties \([https\://github\.com/ansible\-collections/community\.general/pull/7081](https\://github\.com/ansible\-collections/community\.general/pull/7081)\)\. -* redfish\_utils module utils \- add support for <code>PowerCycle</code> reset type for <code>redfish\_command</code> responses feature \([https\://github\.com/ansible\-collections/community\.general/issues/7083](https\://github\.com/ansible\-collections/community\.general/issues/7083)\)\. -* redfish\_utils module utils \- add support for following <code>\@odata\.nextLink</code> pagination in <code>software\_inventory</code> responses feature \([https\://github\.com/ansible\-collections/community\.general/pull/7020](https\://github\.com/ansible\-collections/community\.general/pull/7020)\)\. -* redfish\_utils module utils \- support <code>Volumes</code> in response for <code>GetDiskInventory</code> \([https\://github\.com/ansible\-collections/community\.general/pull/6819](https\://github\.com/ansible\-collections/community\.general/pull/6819)\)\. -* redhat\_subscription \- the internal <code>RegistrationBase</code> class was folded - into the other internal <code>Rhsm</code> class\, as the separation had no purpose - anymore - \([https\://github\.com/ansible\-collections/community\.general/pull/6658](https\://github\.com/ansible\-collections/community\.general/pull/6658)\)\. -* redis\_info \- refactor the redis\_info module to use the redis module\_utils enabling to pass TLS parameters to the Redis client \([https\://github\.com/ansible\-collections/community\.general/pull/7267](https\://github\.com/ansible\-collections/community\.general/pull/7267)\)\. -* rhsm\_release \- improve/harden the way <code>subscription\-manager</code> is run\; - no behaviour change is expected - \([https\://github\.com/ansible\-collections/community\.general/pull/6669](https\://github\.com/ansible\-collections/community\.general/pull/6669)\)\. -* rhsm\_repository \- the interaction with <code>subscription\-manager</code> was - refactored by grouping things together\, removing unused bits\, and hardening - the way it is run\; also\, the parsing of <code>subscription\-manager repos \-\-list</code> - was improved and made slightly faster\; no behaviour change is expected - \([https\://github\.com/ansible\-collections/community\.general/pull/6783](https\://github\.com/ansible\-collections/community\.general/pull/6783)\, - [https\://github\.com/ansible\-collections/community\.general/pull/6837](https\://github\.com/ansible\-collections/community\.general/pull/6837)\)\. -* scaleway\_security\_group\_rule \- minor refactor removing unnecessary code statements \([https\://github\.com/ansible\-collections/community\.general/pull/6928](https\://github\.com/ansible\-collections/community\.general/pull/6928)\)\. -* shutdown \- use <code>shutdown \-p \.\.\.</code> with FreeBSD to halt and power off machine \([https\://github\.com/ansible\-collections/community\.general/pull/7102](https\://github\.com/ansible\-collections/community\.general/pull/7102)\)\. -* snap \- add option <code>dangerous</code> to the module\, that will map into the command line argument <code>\-\-dangerous</code>\, allowing unsigned snap files to be installed \([https\://github\.com/ansible\-collections/community\.general/pull/6908](https\://github\.com/ansible\-collections/community\.general/pull/6908)\, [https\://github\.com/ansible\-collections/community\.general/issues/5715](https\://github\.com/ansible\-collections/community\.general/issues/5715)\)\. -* snap \- module is now aware of channel when deciding whether to install or refresh the snap \([https\://github\.com/ansible\-collections/community\.general/pull/6435](https\://github\.com/ansible\-collections/community\.general/pull/6435)\, [https\://github\.com/ansible\-collections/community\.general/issues/1606](https\://github\.com/ansible\-collections/community\.general/issues/1606)\)\. -* sorcery \- add grimoire \(repository\) management support \([https\://github\.com/ansible\-collections/community\.general/pull/7012](https\://github\.com/ansible\-collections/community\.general/pull/7012)\)\. -* sorcery \- minor refactor \([https\://github\.com/ansible\-collections/community\.general/pull/6525](https\://github\.com/ansible\-collections/community\.general/pull/6525)\)\. -* supervisorctl \- allow to stop matching running processes before removing them with <code>stop\_before\_removing\=true</code> \([https\://github\.com/ansible\-collections/community\.general/pull/7284](https\://github\.com/ansible\-collections/community\.general/pull/7284)\)\. -* tss lookup plugin \- allow to fetch secret IDs which are in a folder based on folder ID\. Previously\, we could not fetch secrets based on folder ID but now use <code>fetch\_secret\_ids\_from\_folder</code> option to indicate to fetch secret IDs based on folder ID \([https\://github\.com/ansible\-collections/community\.general/issues/6223](https\://github\.com/ansible\-collections/community\.general/issues/6223)\)\. -* tss lookup plugin \- allow to fetch secret by path\. Previously\, we could not fetch secret by path but now use <code>secret\_path</code> option to indicate to fetch secret by secret path \([https\://github\.com/ansible\-collections/community\.general/pull/6881](https\://github\.com/ansible\-collections/community\.general/pull/6881)\)\. -* unixy callback plugin \- add support for <code>check\_mode\_markers</code> option \([https\://github\.com/ansible\-collections/community\.general/pull/7179](https\://github\.com/ansible\-collections/community\.general/pull/7179)\)\. -* vardict module utils \- added convenience methods to <code>VarDict</code> \([https\://github\.com/ansible\-collections/community\.general/pull/6647](https\://github\.com/ansible\-collections/community\.general/pull/6647)\)\. -* xenserver\_guest\_info \- minor refactor removing unnecessary code statements \([https\://github\.com/ansible\-collections/community\.general/pull/6928](https\://github\.com/ansible\-collections/community\.general/pull/6928)\)\. -* xenserver\_guest\_powerstate \- minor refactor removing unnecessary code statements \([https\://github\.com/ansible\-collections/community\.general/pull/6928](https\://github\.com/ansible\-collections/community\.general/pull/6928)\)\. -* yum\_versionlock \- add support to pin specific package versions instead of only the package itself \([https\://github\.com/ansible\-collections/community\.general/pull/6861](https\://github\.com/ansible\-collections/community\.general/pull/6861)\, [https\://github\.com/ansible\-collections/community\.general/issues/4470](https\://github\.com/ansible\-collections/community\.general/issues/4470)\)\. +<a id="callback"></a> +#### Callback -<a id="breaking-changes--porting-guide"></a> -### Breaking Changes / Porting Guide +* community\.general\.default\_without\_diff \- The default ansible callback without diff output\. +* community\.general\.timestamp \- Adds simple timestamp for each header\. -* collection\_version lookup plugin \- remove compatibility code for ansible\-base 2\.10 and ansible\-core 2\.11 \([https\://github\.com/ansible\-collections/community\.general/pull/7269](https\://github\.com/ansible\-collections/community\.general/pull/7269)\)\. -* gitlab\_project \- add <code>default\_branch</code> support for project update\. If you used the module so far with <code>default\_branch</code> to update a project\, the value of <code>default\_branch</code> was ignored\. Make sure that you either do not pass a value if you are not sure whether it is the one you want to have to avoid unexpected breaking changes \([https\://github\.com/ansible\-collections/community\.general/pull/7158](https\://github\.com/ansible\-collections/community\.general/pull/7158)\)\. -* selective callback plugin \- remove compatibility code for Ansible 2\.9 and ansible\-core 2\.10 \([https\://github\.com/ansible\-collections/community\.general/pull/7269](https\://github\.com/ansible\-collections/community\.general/pull/7269)\)\. -* vardict module utils \- <code>VarDict</code> will no longer accept variables named <code>\_var</code>\, <code>get\_meta</code>\, and <code>as\_dict</code> \([https\://github\.com/ansible\-collections/community\.general/pull/6647](https\://github\.com/ansible\-collections/community\.general/pull/6647)\)\. -* version module util \- remove fallback for ansible\-core 2\.11\. All modules and plugins that do version collections no longer work with ansible\-core 2\.11 \([https\://github\.com/ansible\-collections/community\.general/pull/7269](https\://github\.com/ansible\-collections/community\.general/pull/7269)\)\. +<a id="connection"></a> +#### Connection -<a id="deprecated-features-2"></a> -### Deprecated Features +* community\.general\.incus \- Run tasks in Incus instances via the Incus CLI\. -* CmdRunner module utils \- deprecate <code>cmd\_runner\_fmt\.as\_default\_type\(\)</code> formatter \([https\://github\.com/ansible\-collections/community\.general/pull/6601](https\://github\.com/ansible\-collections/community\.general/pull/6601)\)\. -* MH VarsMixin module utils \- deprecates <code>VarsMixin</code> and supporting classes in favor of plain <code>vardict</code> module util \([https\://github\.com/ansible\-collections/community\.general/pull/6649](https\://github\.com/ansible\-collections/community\.general/pull/6649)\)\. -* ansible\_galaxy\_install \- the <code>ack\_ansible29</code> and <code>ack\_min\_ansiblecore211</code> options have been deprecated and will be removed in community\.general 9\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/7358](https\://github\.com/ansible\-collections/community\.general/pull/7358)\)\. -* consul \- the <code>ack\_params\_state\_absent</code> option has been deprecated and will be removed in community\.general 10\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/7358](https\://github\.com/ansible\-collections/community\.general/pull/7358)\)\. -* cpanm \- value <code>compatibility</code> is deprecated as default for parameter <code>mode</code> \([https\://github\.com/ansible\-collections/community\.general/pull/6512](https\://github\.com/ansible\-collections/community\.general/pull/6512)\)\. -* ejabberd\_user \- deprecate the parameter <code>logging</code> in favour of producing more detailed information in the module output \([https\://github\.com/ansible\-collections/community\.general/pull/7043](https\://github\.com/ansible\-collections/community\.general/pull/7043)\)\. -* flowdock \- module relies entirely on no longer responsive API endpoints\, and it will be removed in community\.general 9\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/6930](https\://github\.com/ansible\-collections/community\.general/pull/6930)\)\. -* proxmox \- old feature flag <code>proxmox\_default\_behavior</code> will be removed in community\.general 10\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/6836](https\://github\.com/ansible\-collections/community\.general/pull/6836)\)\. -* proxmox\_kvm \- deprecate the option <code>proxmox\_default\_behavior</code> \([https\://github\.com/ansible\-collections/community\.general/pull/7377](https\://github\.com/ansible\-collections/community\.general/pull/7377)\)\. -* redfish\_info\, redfish\_config\, redfish\_command \- the default value <code>10</code> for the <code>timeout</code> option is deprecated and will change to <code>60</code> in community\.general 9\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/7295](https\://github\.com/ansible\-collections/community\.general/pull/7295)\)\. -* redhat module utils \- the <code>module\_utils\.redhat</code> module is deprecated\, as - effectively unused\: the <code>Rhsm</code>\, <code>RhsmPool</code>\, and <code>RhsmPools</code> classes - will be removed in community\.general 9\.0\.0\; the <code>RegistrationBase</code> class - will be removed in community\.general 10\.0\.0 together with the - <code>rhn\_register</code> module\, as it is the only user of this class\; this means - that the whole <code>module\_utils\.redhat</code> module will be dropped in - community\.general 10\.0\.0\, so importing it without even using anything of it - will fail - \([https\://github\.com/ansible\-collections/community\.general/pull/6663](https\://github\.com/ansible\-collections/community\.general/pull/6663)\)\. -* redhat\_subscription \- the <code>autosubscribe</code> alias for the <code>auto\_attach</code> option has been - deprecated for many years\, although only in the documentation\. Officially mark this alias - as deprecated\, and it will be removed in community\.general 9\.0\.0 - \([https\://github\.com/ansible\-collections/community\.general/pull/6646](https\://github\.com/ansible\-collections/community\.general/pull/6646)\)\. -* redhat\_subscription \- the <code>pool</code> option is deprecated in favour of the - more precise and flexible <code>pool\_ids</code> option - \([https\://github\.com/ansible\-collections/community\.general/pull/6650](https\://github\.com/ansible\-collections/community\.general/pull/6650)\)\. -* rhsm\_repository \- <code>state\=present</code> has not been working as expected for many years\, - and it seems it was not noticed so far\; also\, \"presence\" is not really a valid concept - for subscription repositories\, which can only be enabled or disabled\. Hence\, mark the - <code>present</code> and <code>absent</code> values of the <code>state</code> option as deprecated\, slating them - for removal in community\.general 10\.0\.0 - \([https\://github\.com/ansible\-collections/community\.general/pull/6673](https\://github\.com/ansible\-collections/community\.general/pull/6673)\)\. -* stackdriver \- module relies entirely on no longer existent API endpoints\, and it will be removed in community\.general 9\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/6887](https\://github\.com/ansible\-collections/community\.general/pull/6887)\)\. -* webfaction\_app \- module relies entirely on no longer existent API endpoints\, and it will be removed in community\.general 9\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/6909](https\://github\.com/ansible\-collections/community\.general/pull/6909)\)\. -* webfaction\_db \- module relies entirely on no longer existent API endpoints\, and it will be removed in community\.general 9\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/6909](https\://github\.com/ansible\-collections/community\.general/pull/6909)\)\. -* webfaction\_domain \- module relies entirely on no longer existent API endpoints\, and it will be removed in community\.general 9\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/6909](https\://github\.com/ansible\-collections/community\.general/pull/6909)\)\. -* webfaction\_mailbox \- module relies entirely on no longer existent API endpoints\, and it will be removed in community\.general 9\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/6909](https\://github\.com/ansible\-collections/community\.general/pull/6909)\)\. -* webfaction\_site \- module relies entirely on no longer existent API endpoints\, and it will be removed in community\.general 9\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/6909](https\://github\.com/ansible\-collections/community\.general/pull/6909)\)\. +<a id="filter"></a> +#### Filter -<a id="removed-features-previously-deprecated"></a> -### Removed Features \(previously deprecated\) +* community\.general\.from\_ini \- Converts INI text input into a dictionary\. +* community\.general\.lists\_difference \- Difference of lists with a predictive order\. +* community\.general\.lists\_intersect \- Intersection of lists with a predictive order\. +* community\.general\.lists\_symmetric\_difference \- Symmetric Difference of lists with a predictive order\. +* community\.general\.lists\_union \- Union of lists with a predictive order\. +* community\.general\.to\_ini \- Converts a dictionary to the INI file format\. -* The collection no longer supports ansible\-core 2\.11 and ansible\-core 2\.12\. Parts of the collection might still work on these ansible\-core versions\, but others might not \([https\://github\.com/ansible\-collections/community\.general/pull/7269](https\://github\.com/ansible\-collections/community\.general/pull/7269)\)\. -* ansible\_galaxy\_install \- support for Ansible 2\.9 and ansible\-base 2\.10 has been removed \([https\://github\.com/ansible\-collections/community\.general/pull/7358](https\://github\.com/ansible\-collections/community\.general/pull/7358)\)\. -* consul \- when <code>state\=absent</code>\, the options <code>script</code>\, <code>ttl</code>\, <code>tcp</code>\, <code>http</code>\, and <code>interval</code> can no longer be specified \([https\://github\.com/ansible\-collections/community\.general/pull/7358](https\://github\.com/ansible\-collections/community\.general/pull/7358)\)\. -* gconftool2 \- <code>state\=get</code> has been removed\. Use the module <code>community\.general\.gconftool2\_info</code> instead \([https\://github\.com/ansible\-collections/community\.general/pull/7358](https\://github\.com/ansible\-collections/community\.general/pull/7358)\)\. -* gitlab\_runner \- remove the default value for the <code>access\_level</code> option\. To restore the previous behavior\, explicitly set it to <code>ref\_protected</code> \([https\://github\.com/ansible\-collections/community\.general/pull/7358](https\://github\.com/ansible\-collections/community\.general/pull/7358)\)\. -* htpasswd \- removed code for passlib \<1\.6 \([https\://github\.com/ansible\-collections/community\.general/pull/6901](https\://github\.com/ansible\-collections/community\.general/pull/6901)\)\. -* manageiq\_polices \- <code>state\=list</code> has been removed\. Use the module <code>community\.general\.manageiq\_policies\_info</code> instead \([https\://github\.com/ansible\-collections/community\.general/pull/7358](https\://github\.com/ansible\-collections/community\.general/pull/7358)\)\. -* manageiq\_tags \- <code>state\=list</code> has been removed\. Use the module <code>community\.general\.manageiq\_tags\_info</code> instead \([https\://github\.com/ansible\-collections/community\.general/pull/7358](https\://github\.com/ansible\-collections/community\.general/pull/7358)\)\. -* mh\.mixins\.cmd module utils \- the <code>ArgFormat</code> class has been removed \([https\://github\.com/ansible\-collections/community\.general/pull/7358](https\://github\.com/ansible\-collections/community\.general/pull/7358)\)\. -* mh\.mixins\.cmd module utils \- the <code>CmdMixin</code> mixin has been removed\. Use <code>community\.general\.plugins\.module\_utils\.cmd\_runner\.CmdRunner</code> instead \([https\://github\.com/ansible\-collections/community\.general/pull/7358](https\://github\.com/ansible\-collections/community\.general/pull/7358)\)\. -* mh\.mixins\.cmd module utils \- the mh\.mixins\.cmd module utils has been removed after all its contents were removed \([https\://github\.com/ansible\-collections/community\.general/pull/7358](https\://github\.com/ansible\-collections/community\.general/pull/7358)\)\. -* mh\.module\_helper module utils \- the <code>CmdModuleHelper</code> and <code>CmdStateModuleHelper</code> classes have been removed\. Use <code>community\.general\.plugins\.module\_utils\.cmd\_runner\.CmdRunner</code> instead \([https\://github\.com/ansible\-collections/community\.general/pull/7358](https\://github\.com/ansible\-collections/community\.general/pull/7358)\)\. -* proxmox module utils \- removed unused imports \([https\://github\.com/ansible\-collections/community\.general/pull/6873](https\://github\.com/ansible\-collections/community\.general/pull/6873)\)\. -* xfconf \- the deprecated <code>disable\_facts</code> option was removed \([https\://github\.com/ansible\-collections/community\.general/pull/7358](https\://github\.com/ansible\-collections/community\.general/pull/7358)\)\. - -<a id="bugfixes-8"></a> -### Bugfixes +<a id="lookup"></a> +#### Lookup -* CmdRunner module utils \- does not attempt to resolve path if executable is a relative or absolute path \([https\://github\.com/ansible\-collections/community\.general/pull/7200](https\://github\.com/ansible\-collections/community\.general/pull/7200)\)\. -* MH DependencyMixin module utils \- deprecation notice was popping up for modules not using dependencies \([https\://github\.com/ansible\-collections/community\.general/pull/6644](https\://github\.com/ansible\-collections/community\.general/pull/6644)\, [https\://github\.com/ansible\-collections/community\.general/issues/6639](https\://github\.com/ansible\-collections/community\.general/issues/6639)\)\. -* bitwarden lookup plugin \- the plugin made assumptions about the structure of a Bitwarden JSON object which may have been broken by an update in the Bitwarden API\. Remove assumptions\, and allow queries for general fields such as <code>notes</code> \([https\://github\.com/ansible\-collections/community\.general/pull/7061](https\://github\.com/ansible\-collections/community\.general/pull/7061)\)\. -* cmd\_runner module utils \- when a parameter in <code>argument\_spec</code> has no type\, meaning it is implicitly a <code>str</code>\, <code>CmdRunner</code> would fail trying to find the <code>type</code> key in that dictionary \([https\://github\.com/ansible\-collections/community\.general/pull/6968](https\://github\.com/ansible\-collections/community\.general/pull/6968)\)\. -* cobbler inventory plugin \- fix calculation of cobbler\_ipv4/6\_address \([https\://github\.com/ansible\-collections/community\.general/pull/6925](https\://github\.com/ansible\-collections/community\.general/pull/6925)\)\. -* composer \- fix impossible to run <code>working\_dir</code> dependent commands\. The module was throwing an error when trying to run a <code>working\_dir</code> dependent command\, because it tried to get the command help without passing the <code>working\_dir</code> \([https\://github\.com/ansible\-collections/community\.general/issues/3787](https\://github\.com/ansible\-collections/community\.general/issues/3787)\)\. -* csv module utils \- detects and remove unicode BOM markers from incoming CSV content \([https\://github\.com/ansible\-collections/community\.general/pull/6662](https\://github\.com/ansible\-collections/community\.general/pull/6662)\)\. -* datadog\_downtime \- presence of <code>rrule</code> param lead to the Datadog API returning Bad Request due to a missing recurrence type \([https\://github\.com/ansible\-collections/community\.general/pull/6811](https\://github\.com/ansible\-collections/community\.general/pull/6811)\)\. -* ejabberd\_user \- module was failing to detect whether user was already created and/or password was changed \([https\://github\.com/ansible\-collections/community\.general/pull/7033](https\://github\.com/ansible\-collections/community\.general/pull/7033)\)\. -* ejabberd\_user \- provide meaningful error message when the <code>ejabberdctl</code> command is not found \([https\://github\.com/ansible\-collections/community\.general/pull/7028](https\://github\.com/ansible\-collections/community\.general/pull/7028)\, [https\://github\.com/ansible\-collections/community\.general/issues/6949](https\://github\.com/ansible\-collections/community\.general/issues/6949)\)\. -* github\_deploy\_key \- fix pagination behaviour causing a crash when only a single page of deploy keys exist \([https\://github\.com/ansible\-collections/community\.general/pull/7375](https\://github\.com/ansible\-collections/community\.general/pull/7375)\)\. -* gitlab\_group \- the module passed parameters to the API call even when not set\. The module is now filtering out <code>None</code> values to remediate this \([https\://github\.com/ansible\-collections/community\.general/pull/6712](https\://github\.com/ansible\-collections/community\.general/pull/6712)\)\. -* gitlab\_group\_variable \- deleted all variables when used with <code>purge\=true</code> due to missing <code>raw</code> property in KNOWN attributes \([https\://github\.com/ansible\-collections/community\.general/issues/7250](https\://github\.com/ansible\-collections/community\.general/issues/7250)\)\. -* gitlab\_project\_variable \- deleted all variables when used with <code>purge\=true</code> due to missing <code>raw</code> property in KNOWN attributes \([https\://github\.com/ansible\-collections/community\.general/issues/7250](https\://github\.com/ansible\-collections/community\.general/issues/7250)\)\. -* icinga2\_host \- fix a key error when updating an existing host \([https\://github\.com/ansible\-collections/community\.general/pull/6748](https\://github\.com/ansible\-collections/community\.general/pull/6748)\)\. -* ini\_file \- add the <code>follow</code> paramter to follow the symlinks instead of replacing them \([https\://github\.com/ansible\-collections/community\.general/pull/6546](https\://github\.com/ansible\-collections/community\.general/pull/6546)\)\. -* ini\_file \- fix a bug where the inactive options were not used when possible \([https\://github\.com/ansible\-collections/community\.general/pull/6575](https\://github\.com/ansible\-collections/community\.general/pull/6575)\)\. -* ipa\_dnszone \- fix \'idnsallowsyncptr\' key error for reverse zone \([https\://github\.com/ansible\-collections/community\.general/pull/6906](https\://github\.com/ansible\-collections/community\.general/pull/6906)\, [https\://github\.com/ansible\-collections/community\.general/issues/6905](https\://github\.com/ansible\-collections/community\.general/issues/6905)\)\. -* kernel\_blacklist \- simplified the mechanism to update the file\, fixing the error \([https\://github\.com/ansible\-collections/community\.general/pull/7382](https\://github\.com/ansible\-collections/community\.general/pull/7382)\, [https\://github\.com/ansible\-collections/community\.general/issues/7362](https\://github\.com/ansible\-collections/community\.general/issues/7362)\)\. -* keycloak module util \- fix missing <code>http\_agent</code>\, <code>timeout</code>\, and <code>validate\_certs</code> <code>open\_url\(\)</code> parameters \([https\://github\.com/ansible\-collections/community\.general/pull/7067](https\://github\.com/ansible\-collections/community\.general/pull/7067)\)\. -* keycloak module utils \- fix <code>is\_struct\_included</code> handling of lists of lists/dictionaries \([https\://github\.com/ansible\-collections/community\.general/pull/6688](https\://github\.com/ansible\-collections/community\.general/pull/6688)\)\. -* keycloak module utils \- the function <code>get\_user\_by\_username</code> now return the user representation or <code>None</code> as stated in the documentation \([https\://github\.com/ansible\-collections/community\.general/pull/6758](https\://github\.com/ansible\-collections/community\.general/pull/6758)\)\. -* keycloak\_authentication \- fix Keycloak authentication flow \(step or sub\-flow\) indexing during update\, if not specified by the user \([https\://github\.com/ansible\-collections/community\.general/pull/6734](https\://github\.com/ansible\-collections/community\.general/pull/6734)\)\. -* keycloak\_client inventory plugin \- fix missing client secret \([https\://github\.com/ansible\-collections/community\.general/pull/6931](https\://github\.com/ansible\-collections/community\.general/pull/6931)\)\. -* ldap\_search \- fix string normalization and the <code>base64\_attributes</code> option on Python 3 \([https\://github\.com/ansible\-collections/community\.general/issues/5704](https\://github\.com/ansible\-collections/community\.general/issues/5704)\, [https\://github\.com/ansible\-collections/community\.general/pull/7264](https\://github\.com/ansible\-collections/community\.general/pull/7264)\)\. -* locale\_gen \- now works for locales without the underscore character such as <code>C\.UTF\-8</code> \([https\://github\.com/ansible\-collections/community\.general/pull/6774](https\://github\.com/ansible\-collections/community\.general/pull/6774)\, [https\://github\.com/ansible\-collections/community\.general/issues/5142](https\://github\.com/ansible\-collections/community\.general/issues/5142)\, [https\://github\.com/ansible\-collections/community\.general/issues/4305](https\://github\.com/ansible\-collections/community\.general/issues/4305)\)\. -* lvol \- add support for percentage of origin size specification when creating snapshot volumes \([https\://github\.com/ansible\-collections/community\.general/issues/1630](https\://github\.com/ansible\-collections/community\.general/issues/1630)\, [https\://github\.com/ansible\-collections/community\.general/pull/7053](https\://github\.com/ansible\-collections/community\.general/pull/7053)\)\. -* lxc connection plugin \- now handles <code>remote\_addr</code> defaulting to <code>inventory\_hostname</code> correctly \([https\://github\.com/ansible\-collections/community\.general/pull/7104](https\://github\.com/ansible\-collections/community\.general/pull/7104)\)\. -* lxc connection plugin \- properly evaluate options \([https\://github\.com/ansible\-collections/community\.general/pull/7369](https\://github\.com/ansible\-collections/community\.general/pull/7369)\)\. -* machinectl become plugin \- mark plugin as <code>require\_tty</code> to automatically disable pipelining\, with which this plugin is not compatible \([https\://github\.com/ansible\-collections/community\.general/issues/6932](https\://github\.com/ansible\-collections/community\.general/issues/6932)\, [https\://github\.com/ansible\-collections/community\.general/pull/6935](https\://github\.com/ansible\-collections/community\.general/pull/6935)\)\. -* mail \- skip headers containing equals characters due to missing <code>maxsplit</code> on header key/value parsing \([https\://github\.com/ansible\-collections/community\.general/pull/7303](https\://github\.com/ansible\-collections/community\.general/pull/7303)\)\. -* memset module utils \- make compatible with ansible\-core 2\.17 \([https\://github\.com/ansible\-collections/community\.general/pull/7379](https\://github\.com/ansible\-collections/community\.general/pull/7379)\)\. -* nmap inventory plugin \- fix <code>get\_option</code> calls \([https\://github\.com/ansible\-collections/community\.general/pull/7323](https\://github\.com/ansible\-collections/community\.general/pull/7323)\)\. -* nmap inventory plugin \- now uses <code>get\_option</code> in all cases to get its configuration information \([https\://github\.com/ansible\-collections/community\.general/pull/7119](https\://github\.com/ansible\-collections/community\.general/pull/7119)\)\. -* nmcli \- fix bond option <code>xmit\_hash\_policy</code> \([https\://github\.com/ansible\-collections/community\.general/pull/6527](https\://github\.com/ansible\-collections/community\.general/pull/6527)\)\. -* nmcli \- fix support for empty list \(in compare and scrape\) \([https\://github\.com/ansible\-collections/community\.general/pull/6769](https\://github\.com/ansible\-collections/community\.general/pull/6769)\)\. -* nsupdate \- fix a possible <code>list index out of range</code> exception \([https\://github\.com/ansible\-collections/community\.general/issues/836](https\://github\.com/ansible\-collections/community\.general/issues/836)\)\. -* oci\_utils module util \- fix inappropriate logical comparison expressions and makes them simpler\. The previous checks had logical short circuits \([https\://github\.com/ansible\-collections/community\.general/pull/7125](https\://github\.com/ansible\-collections/community\.general/pull/7125)\)\. -* oci\_utils module utils \- avoid direct type comparisons \([https\://github\.com/ansible\-collections/community\.general/pull/7085](https\://github\.com/ansible\-collections/community\.general/pull/7085)\)\. -* onepassword \- fix KeyError exception when trying to access value of a field that is not filled out in OnePassword item \([https\://github\.com/ansible\-collections/community\.general/pull/7241](https\://github\.com/ansible\-collections/community\.general/pull/7241)\)\. -* openbsd\_pkg \- the pkg\_info\(1\) behavior has changed in OpenBSD \>7\.3\. The error message <code>Can\'t find</code> should not lead to an error case \([https\://github\.com/ansible\-collections/community\.general/pull/6785](https\://github\.com/ansible\-collections/community\.general/pull/6785)\)\. -* pacman \- module recognizes the output of <code>yay</code> running as <code>root</code> \([https\://github\.com/ansible\-collections/community\.general/pull/6713](https\://github\.com/ansible\-collections/community\.general/pull/6713)\)\. -* portage \- fix <code>changed\_use</code> and <code>newuse</code> not triggering rebuilds \([https\://github\.com/ansible\-collections/community\.general/issues/6008](https\://github\.com/ansible\-collections/community\.general/issues/6008)\, [https\://github\.com/ansible\-collections/community\.general/pull/6548](https\://github\.com/ansible\-collections/community\.general/pull/6548)\)\. -* pritunl module utils \- fix incorrect URL parameter for orgnization add method \([https\://github\.com/ansible\-collections/community\.general/pull/7161](https\://github\.com/ansible\-collections/community\.general/pull/7161)\)\. -* proxmox \- fix error when a configuration had no <code>template</code> field \([https\://github\.com/ansible\-collections/community\.general/pull/6838](https\://github\.com/ansible\-collections/community\.general/pull/6838)\, [https\://github\.com/ansible\-collections/community\.general/issues/5372](https\://github\.com/ansible\-collections/community\.general/issues/5372)\)\. -* proxmox module utils \- add logic to detect whether an old Promoxer complains about the <code>token\_name</code> and <code>token\_value</code> parameters and provide a better error message when that happens \([https\://github\.com/ansible\-collections/community\.general/pull/6839](https\://github\.com/ansible\-collections/community\.general/pull/6839)\, [https\://github\.com/ansible\-collections/community\.general/issues/5371](https\://github\.com/ansible\-collections/community\.general/issues/5371)\)\. -* proxmox module utils \- fix proxmoxer library version check \([https\://github\.com/ansible\-collections/community\.general/issues/6974](https\://github\.com/ansible\-collections/community\.general/issues/6974)\, [https\://github\.com/ansible\-collections/community\.general/issues/6975](https\://github\.com/ansible\-collections/community\.general/issues/6975)\, [https\://github\.com/ansible\-collections/community\.general/pull/6980](https\://github\.com/ansible\-collections/community\.general/pull/6980)\)\. -* proxmox\_disk \- fix unable to create <code>cdrom</code> media due to <code>size</code> always being appended \([https\://github\.com/ansible\-collections/community\.general/pull/6770](https\://github\.com/ansible\-collections/community\.general/pull/6770)\)\. -* proxmox\_kvm \- <code>absent</code> state with <code>force</code> specified failed to stop the VM due to the <code>timeout</code> value not being passed to <code>stop\_vm</code> \([https\://github\.com/ansible\-collections/community\.general/pull/6827](https\://github\.com/ansible\-collections/community\.general/pull/6827)\)\. -* proxmox\_kvm \- <code>restarted</code> state did not actually restart a VM in some VM configurations\. The state now uses the Proxmox reboot endpoint instead of calling the <code>stop\_vm</code> and <code>start\_vm</code> functions \([https\://github\.com/ansible\-collections/community\.general/pull/6773](https\://github\.com/ansible\-collections/community\.general/pull/6773)\)\. -* proxmox\_kvm \- allow creation of VM with existing name but new vmid \([https\://github\.com/ansible\-collections/community\.general/issues/6155](https\://github\.com/ansible\-collections/community\.general/issues/6155)\, [https\://github\.com/ansible\-collections/community\.general/pull/6709](https\://github\.com/ansible\-collections/community\.general/pull/6709)\)\. -* proxmox\_kvm \- when <code>name</code> option is provided without <code>vmid</code> and VM with that name already exists then no new VM will be created \([https\://github\.com/ansible\-collections/community\.general/issues/6911](https\://github\.com/ansible\-collections/community\.general/issues/6911)\, [https\://github\.com/ansible\-collections/community\.general/pull/6981](https\://github\.com/ansible\-collections/community\.general/pull/6981)\)\. -* proxmox\_tasks\_info \- remove <code>api\_user</code> \+ <code>api\_password</code> constraint from <code>required\_together</code> as it causes to require <code>api\_password</code> even when API token param is used \([https\://github\.com/ansible\-collections/community\.general/issues/6201](https\://github\.com/ansible\-collections/community\.general/issues/6201)\)\. -* proxmox\_template \- require <code>requests\_toolbelt</code> module to fix issue with uploading large templates \([https\://github\.com/ansible\-collections/community\.general/issues/5579](https\://github\.com/ansible\-collections/community\.general/issues/5579)\, [https\://github\.com/ansible\-collections/community\.general/pull/6757](https\://github\.com/ansible\-collections/community\.general/pull/6757)\)\. -* proxmox\_user\_info \- avoid direct type comparisons \([https\://github\.com/ansible\-collections/community\.general/pull/7085](https\://github\.com/ansible\-collections/community\.general/pull/7085)\)\. -* redfish\_info \- fix <code>ListUsers</code> to not show empty account slots \([https\://github\.com/ansible\-collections/community\.general/issues/6771](https\://github\.com/ansible\-collections/community\.general/issues/6771)\, [https\://github\.com/ansible\-collections/community\.general/pull/6772](https\://github\.com/ansible\-collections/community\.general/pull/6772)\)\. -* redhat\_subscription \- use the right D\-Bus options for the consumer type when - registering a RHEL system older than 9 or a RHEL 9 system older than 9\.2 - and using <code>consumer\_type</code> - \([https\://github\.com/ansible\-collections/community\.general/pull/7378](https\://github\.com/ansible\-collections/community\.general/pull/7378)\)\. -* refish\_utils module utils \- changing variable names to avoid issues occuring when fetching Volumes data \([https\://github\.com/ansible\-collections/community\.general/pull/6883](https\://github\.com/ansible\-collections/community\.general/pull/6883)\)\. -* rhsm\_repository \- when using the <code>purge</code> option\, the <code>repositories</code> - dictionary element in the returned JSON is now properly updated according - to the pruning operation - \([https\://github\.com/ansible\-collections/community\.general/pull/6676](https\://github\.com/ansible\-collections/community\.general/pull/6676)\)\. -* rundeck \- fix <code>TypeError</code> on 404 API response \([https\://github\.com/ansible\-collections/community\.general/pull/6983](https\://github\.com/ansible\-collections/community\.general/pull/6983)\)\. -* selective callback plugin \- fix length of task name lines in output always being 3 characters longer than desired \([https\://github\.com/ansible\-collections/community\.general/pull/7374](https\://github\.com/ansible\-collections/community\.general/pull/7374)\)\. -* snap \- an exception was being raised when snap list was empty \([https\://github\.com/ansible\-collections/community\.general/pull/7124](https\://github\.com/ansible\-collections/community\.general/pull/7124)\, [https\://github\.com/ansible\-collections/community\.general/issues/7120](https\://github\.com/ansible\-collections/community\.general/issues/7120)\)\. -* snap \- assume default track <code>latest</code> in parameter <code>channel</code> when not specified \([https\://github\.com/ansible\-collections/community\.general/pull/6835](https\://github\.com/ansible\-collections/community\.general/pull/6835)\, [https\://github\.com/ansible\-collections/community\.general/issues/6821](https\://github\.com/ansible\-collections/community\.general/issues/6821)\)\. -* snap \- change the change detection mechanism from \"parsing installation\" to \"comparing end state with initial state\" \([https\://github\.com/ansible\-collections/community\.general/pull/7340](https\://github\.com/ansible\-collections/community\.general/pull/7340)\, [https\://github\.com/ansible\-collections/community\.general/issues/7265](https\://github\.com/ansible\-collections/community\.general/issues/7265)\)\. -* snap \- fix crash when multiple snaps are specified and one has <code>\-\-\-</code> in its description \([https\://github\.com/ansible\-collections/community\.general/pull/7046](https\://github\.com/ansible\-collections/community\.general/pull/7046)\)\. -* snap \- fix the processing of the commands\' output\, stripping spaces and newlines from it \([https\://github\.com/ansible\-collections/community\.general/pull/6826](https\://github\.com/ansible\-collections/community\.general/pull/6826)\, [https\://github\.com/ansible\-collections/community\.general/issues/6803](https\://github\.com/ansible\-collections/community\.general/issues/6803)\)\. -* sorcery \- fix interruption of the multi\-stage process \([https\://github\.com/ansible\-collections/community\.general/pull/7012](https\://github\.com/ansible\-collections/community\.general/pull/7012)\)\. -* sorcery \- fix queue generation before the whole system rebuild \([https\://github\.com/ansible\-collections/community\.general/pull/7012](https\://github\.com/ansible\-collections/community\.general/pull/7012)\)\. -* sorcery \- latest state no longer triggers update\_cache \([https\://github\.com/ansible\-collections/community\.general/pull/7012](https\://github\.com/ansible\-collections/community\.general/pull/7012)\)\. -* terraform \- prevents <code>\-backend\-config</code> option double encapsulating with <code>shlex\_quote</code> function\. \([https\://github\.com/ansible\-collections/community\.general/pull/7301](https\://github\.com/ansible\-collections/community\.general/pull/7301)\)\. -* tss lookup plugin \- fix multiple issues when using <code>fetch\_attachments\=true</code> \([https\://github\.com/ansible\-collections/community\.general/pull/6720](https\://github\.com/ansible\-collections/community\.general/pull/6720)\)\. -* zypper \- added handling of zypper exitcode 102\. Changed state is set correctly now and rc 102 is still preserved to be evaluated by the playbook \([https\://github\.com/ansible\-collections/community\.general/pull/6534](https\://github\.com/ansible\-collections/community\.general/pull/6534)\)\. - -<a id="known-issues"></a> -### Known Issues - -* Ansible markup will show up in raw form on ansible\-doc text output for ansible\-core before 2\.15\. If you have trouble deciphering the documentation markup\, please upgrade to ansible\-core 2\.15 \(or newer\)\, or read the HTML documentation on [https\://docs\.ansible\.com/ansible/devel/collections/community/general/](https\://docs\.ansible\.com/ansible/devel/collections/community/general/) \([https\://github\.com/ansible\-collections/community\.general/pull/6539](https\://github\.com/ansible\-collections/community\.general/pull/6539)\)\. - -<a id="new-plugins-3"></a> -### New Plugins +* community\.general\.github\_app\_access\_token \- Obtain short\-lived Github App Access tokens\. +* community\.general\.onepassword\_doc \- Fetch documents stored in 1Password\. -<a id="lookup-2"></a> -#### Lookup +<a id="test"></a> +#### Test -* bitwarden\_secrets\_manager \- Retrieve secrets from Bitwarden Secrets Manager +* community\.general\.fqdn\_valid \- Validates fully\-qualified domain names against RFC 1123\. -<a id="new-modules-6"></a> +<a id="new-modules"></a> ### New Modules -* consul\_policy \- Manipulate Consul policies -* consul\_role \- Manipulate Consul roles -* facter\_facts \- Runs the discovery program C\(facter\) on the remote system and return Ansible facts -* gio\_mime \- Set default handler for MIME type\, for applications using Gnome GIO -* gitlab\_instance\_variable \- Creates\, updates\, or deletes GitLab instance variables -* gitlab\_merge\_request \- Create\, update\, or delete GitLab merge requests -* jenkins\_build\_info \- Get information about Jenkins builds -* keycloak\_authentication\_required\_actions \- Allows administration of Keycloak authentication required actions -* keycloak\_authz\_custom\_policy \- Allows administration of Keycloak client custom Javascript policies via Keycloak API -* keycloak\_authz\_permission \- Allows administration of Keycloak client authorization permissions via Keycloak API -* keycloak\_authz\_permission\_info \- Query Keycloak client authorization permissions information -* keycloak\_realm\_key \- Allows administration of Keycloak realm keys via Keycloak API -* keycloak\_user \- Create and configure a user in Keycloak -* lvg\_rename \- Renames LVM volume groups -* pnpm \- Manage node\.js packages with pnpm -* proxmox\_pool \- Pool management for Proxmox VE cluster -* proxmox\_pool\_member \- Add or delete members from Proxmox VE cluster pools -* proxmox\_vm\_info \- Retrieve information about one or more Proxmox VE virtual machines -* simpleinit\_msb \- Manage services on Source Mage GNU/Linux +* community\.general\.consul\_acl\_bootstrap \- Bootstrap ACLs in Consul\. +* community\.general\.consul\_auth\_method \- Manipulate Consul auth methods\. +* community\.general\.consul\_binding\_rule \- Manipulate Consul binding rules\. +* community\.general\.consul\_token \- Manipulate Consul tokens\. +* community\.general\.django\_command \- Run Django admin commands\. +* community\.general\.dnf\_config\_manager \- Enable or disable dnf repositories using config\-manager\. +* community\.general\.git\_config\_info \- Read git configuration\. +* community\.general\.gitlab\_group\_access\_token \- Manages GitLab group access tokens\. +* community\.general\.gitlab\_issue \- Create\, update\, or delete GitLab issues\. +* community\.general\.gitlab\_label \- Creates/updates/deletes GitLab Labels belonging to project or group\. +* community\.general\.gitlab\_milestone \- Creates/updates/deletes GitLab Milestones belonging to project or group\. +* community\.general\.gitlab\_project\_access\_token \- Manages GitLab project access tokens\. +* community\.general\.keycloak\_client\_rolescope \- Allows administration of Keycloak client roles scope to restrict the usage of certain roles to a other specific client applications\. +* community\.general\.keycloak\_component\_info \- Retrive component info in Keycloak\. +* community\.general\.keycloak\_realm\_rolemapping \- Allows administration of Keycloak realm role mappings into groups with the Keycloak API\. +* community\.general\.nomad\_token \- Manage Nomad ACL tokens\. +* community\.general\.proxmox\_node\_info \- Retrieve information about one or more Proxmox VE nodes\. +* community\.general\.proxmox\_storage\_contents\_info \- List content from a Proxmox VE storage\. +* community\.general\.usb\_facts \- Allows listing information about USB devices\. diff --git a/ansible_collections/community/general/CHANGELOG.rst b/ansible_collections/community/general/CHANGELOG.rst index 5a5a0cb7c..384bee747 100644 --- a/ansible_collections/community/general/CHANGELOG.rst +++ b/ansible_collections/community/general/CHANGELOG.rst @@ -4,174 +4,59 @@ Community General Release Notes .. contents:: Topics -This changelog describes changes after version 7.0.0. +This changelog describes changes after version 8.0.0. -v8.6.0 +v9.0.1 ====== Release Summary --------------- -Regular bugfix and features release. +Bugfix release for inclusion in Ansible 10.0.0rc1. Minor Changes ------------- -- Use offset-aware ``datetime.datetime`` objects (with timezone UTC) instead of offset-naive UTC timestamps, which are deprecated in Python 3.12 (https://github.com/ansible-collections/community.general/pull/8222). -- apt_rpm - add new states ``latest`` and ``present_not_latest``. The value ``latest`` is equivalent to the current behavior of ``present``, which will upgrade a package if a newer version exists. ``present_not_latest`` does what most users would expect ``present`` to do: it does not upgrade if the package is already installed. The current behavior of ``present`` will be deprecated in a later version, and eventually changed to that of ``present_not_latest`` (https://github.com/ansible-collections/community.general/issues/8217, https://github.com/ansible-collections/community.general/pull/8247). -- bitwarden lookup plugin - add support to filter by organization ID (https://github.com/ansible-collections/community.general/pull/8188). -- filesystem - add bcachefs support (https://github.com/ansible-collections/community.general/pull/8126). -- ini_file - add an optional parameter ``section_has_values``. If the target ini file contains more than one ``section``, use ``section_has_values`` to specify which one should be updated (https://github.com/ansible-collections/community.general/pull/7505). -- java_cert - add ``cert_content`` argument (https://github.com/ansible-collections/community.general/pull/8153). -- keycloak_client, keycloak_clientscope, keycloak_clienttemplate - added ``docker-v2`` protocol support, enhancing alignment with Keycloak's protocol options (https://github.com/ansible-collections/community.general/issues/8215, https://github.com/ansible-collections/community.general/pull/8216). -- nmcli - adds OpenvSwitch support with new ``type`` values ``ovs-port``, ``ovs-interface``, and ``ovs-bridge``, and new ``slave_type`` value ``ovs-port`` (https://github.com/ansible-collections/community.general/pull/8154). -- osx_defaults - add option ``check_types`` to enable changing the type of existing defaults on the fly (https://github.com/ansible-collections/community.general/pull/8173). -- passwordstore lookup - add ``missing_subkey`` parameter defining the behavior of the lookup when a passwordstore subkey is missing (https://github.com/ansible-collections/community.general/pull/8166). -- portage - adds the possibility to explicitely tell portage to write packages to world file (https://github.com/ansible-collections/community.general/issues/6226, https://github.com/ansible-collections/community.general/pull/8236). -- redfish_command - add command ``ResetToDefaults`` to reset manager to default state (https://github.com/ansible-collections/community.general/issues/8163). -- redfish_info - add boolean return value ``MultipartHttpPush`` to ``GetFirmwareUpdateCapabilities`` (https://github.com/ansible-collections/community.general/issues/8194, https://github.com/ansible-collections/community.general/pull/8195). -- ssh_config - allow ``accept-new`` as valid value for ``strict_host_key_checking`` (https://github.com/ansible-collections/community.general/pull/8257). - -Deprecated Features -------------------- - -- hipchat callback plugin - the hipchat service has been discontinued and the self-hosted variant has been End of Life since 2020. The callback plugin is therefore deprecated and will be removed from community.general 10.0.0 if nobody provides compelling reasons to still keep it (https://github.com/ansible-collections/community.general/issues/8184, https://github.com/ansible-collections/community.general/pull/8189). - -Bugfixes --------- - -- aix_filesystem - fix ``_validate_vg`` not passing VG name to ``lsvg_cmd`` (https://github.com/ansible-collections/community.general/issues/8151). -- apt_rpm - when checking whether packages were installed after running ``apt-get -y install <packages>``, only the last package name was checked (https://github.com/ansible-collections/community.general/pull/8263). -- bitwarden_secrets_manager lookup plugin - implements retry with exponential backoff to avoid lookup errors when Bitwardn's API rate limiting is encountered (https://github.com/ansible-collections/community.general/issues/8230, https://github.com/ansible-collections/community.general/pull/8238). -- from_ini filter plugin - disabling interpolation of ``ConfigParser`` to allow converting values with a ``%`` sign (https://github.com/ansible-collections/community.general/issues/8183, https://github.com/ansible-collections/community.general/pull/8185). -- gitlab_issue, gitlab_label, gitlab_milestone - avoid crash during version comparison when the python-gitlab Python module is not installed (https://github.com/ansible-collections/community.general/pull/8158). -- haproxy - fix an issue where HAProxy could get stuck in DRAIN mode when the backend was unreachable (https://github.com/ansible-collections/community.general/issues/8092). -- inventory plugins - add unsafe wrapper to avoid marking strings that do not contain ``{`` or ``}`` as unsafe, to work around a bug in AWX ((https://github.com/ansible-collections/community.general/issues/8212, https://github.com/ansible-collections/community.general/pull/8225). -- ipa - fix get version regex in IPA module_utils (https://github.com/ansible-collections/community.general/pull/8175). -- keycloak_client - add sorted ``defaultClientScopes`` and ``optionalClientScopes`` to normalizations (https://github.com/ansible-collections/community.general/pull/8223). -- keycloak_realm - add normalizations for ``enabledEventTypes`` and ``supportedLocales`` (https://github.com/ansible-collections/community.general/pull/8224). -- puppet - add option ``environment_lang`` to set the environment language encoding. Defaults to lang ``C``. It is recommended to set it to ``C.UTF-8`` or ``en_US.UTF-8`` depending on what is available on your system. (https://github.com/ansible-collections/community.general/issues/8000) -- riak - support ``riak admin`` sub-command in newer Riak KV versions beside the legacy ``riak-admin`` main command (https://github.com/ansible-collections/community.general/pull/8211). -- to_ini filter plugin - disabling interpolation of ``ConfigParser`` to allow converting values with a ``%`` sign (https://github.com/ansible-collections/community.general/issues/8183, https://github.com/ansible-collections/community.general/pull/8185). -- xml - make module work with lxml 5.1.1, which removed some internals that the module was relying on (https://github.com/ansible-collections/community.general/pull/8169). - -New Modules ------------ - -- keycloak_client_rolescope - Allows administration of Keycloak client roles scope to restrict the usage of certain roles to a other specific client applications. - -v8.5.0 -====== - -Release Summary ---------------- - -Regular feature and bugfix release with security fixes. - -Minor Changes -------------- - -- bitwarden lookup plugin - allows to fetch all records of a given collection ID, by allowing to pass an empty value for ``search_value`` when ``collection_id`` is provided (https://github.com/ansible-collections/community.general/pull/8013). -- icinga2 inventory plugin - adds new parameter ``group_by_hostgroups`` in order to make grouping by Icinga2 hostgroups optional (https://github.com/ansible-collections/community.general/pull/7998). -- ini_file - support optional spaces between section names and their surrounding brackets (https://github.com/ansible-collections/community.general/pull/8075). -- java_cert - enable ``owner``, ``group``, ``mode``, and other generic file arguments (https://github.com/ansible-collections/community.general/pull/8116). -- ldap_attrs - module now supports diff mode, showing which attributes are changed within an operation (https://github.com/ansible-collections/community.general/pull/8073). -- lxd_container - uses ``/1.0/instances`` API endpoint, if available. Falls back to ``/1.0/containers`` or ``/1.0/virtual-machines``. Fixes issue when using Incus or LXD 5.19 due to migrating to ``/1.0/instances`` endpoint (https://github.com/ansible-collections/community.general/pull/7980). -- nmcli - allow setting ``MTU`` for ``bond-slave`` interface types (https://github.com/ansible-collections/community.general/pull/8118). -- proxmox - adds ``startup`` parameters to configure startup order, startup delay and shutdown delay (https://github.com/ansible-collections/community.general/pull/8038). -- revbitspss lookup plugin - removed a redundant unicode prefix. The prefix was not necessary for Python 3 and has been cleaned up to streamline the code (https://github.com/ansible-collections/community.general/pull/8087). - -Security Fixes --------------- - -- cobbler, gitlab_runners, icinga2, linode, lxd, nmap, online, opennebula, proxmox, scaleway, stackpath_compute, virtualbox, and xen_orchestra inventory plugin - make sure all data received from the remote servers is marked as unsafe, so remote code execution by obtaining texts that can be evaluated as templates is not possible (https://www.die-welt.net/2024/03/remote-code-execution-in-ansible-dynamic-inventory-plugins/, https://github.com/ansible-collections/community.general/pull/8098). +- ansible_galaxy_install - minor refactor in the module (https://github.com/ansible-collections/community.general/pull/8413). Bugfixes -------- -- aix_filesystem - fix issue with empty list items in crfs logic and option order (https://github.com/ansible-collections/community.general/pull/8052). -- consul_token - fix token creation without ``accessor_id`` (https://github.com/ansible-collections/community.general/pull/8091). -- homebrew - error returned from brew command was ignored and tried to parse empty JSON. Fix now checks for an error and raises it to give accurate error message to users (https://github.com/ansible-collections/community.general/issues/8047). -- ipa_hbacrule - the module uses a string for ``ipaenabledflag`` for new FreeIPA versions while the returned value is a boolean (https://github.com/ansible-collections/community.general/pull/7880). -- ipa_sudorule - the module uses a string for ``ipaenabledflag`` for new FreeIPA versions while the returned value is a boolean (https://github.com/ansible-collections/community.general/pull/7880). -- iptables_state - fix idempotency issues when restoring incomplete iptables dumps (https://github.com/ansible-collections/community.general/issues/8029). -- linode inventory plugin - add descriptive error message for linode inventory plugin (https://github.com/ansible-collections/community.general/pull/8133). -- pacemaker_cluster - actually implement check mode, which the module claims to support. This means that until now the module also did changes in check mode (https://github.com/ansible-collections/community.general/pull/8081). -- pam_limits - when the file does not exist, do not create it in check mode (https://github.com/ansible-collections/community.general/issues/8050, https://github.com/ansible-collections/community.general/pull/8057). -- proxmox_kvm - fixed status check getting from node-specific API endpoint (https://github.com/ansible-collections/community.general/issues/7817). - -New Modules ------------ - -- usb_facts - Allows listing information about USB devices - -v8.4.0 +- 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). +- 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). +- 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). +- 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). +- 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). +- 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). +- 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). +- 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). +- 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). +- 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). + +v9.0.0 ====== Release Summary --------------- -Regular bugfix and feature release. +This is release 9.0.0 of ``community.general``, released on 2024-05-20. Minor Changes ------------- +- PythonRunner module utils - specialisation of ``CmdRunner`` to execute Python scripts (https://github.com/ansible-collections/community.general/pull/8289). +- Use offset-aware ``datetime.datetime`` objects (with timezone UTC) instead of offset-naive UTC timestamps, which are deprecated in Python 3.12 (https://github.com/ansible-collections/community.general/pull/8222). +- aix_lvol - refactor module to pass list of arguments to ``module.run_command()`` instead of relying on interpretation by a shell (https://github.com/ansible-collections/community.general/pull/8264). +- apt_rpm - add new states ``latest`` and ``present_not_latest``. The value ``latest`` is equivalent to the current behavior of ``present``, which will upgrade a package if a newer version exists. ``present_not_latest`` does what most users would expect ``present`` to do: it does not upgrade if the package is already installed. The current behavior of ``present`` will be deprecated in a later version, and eventually changed to that of ``present_not_latest`` (https://github.com/ansible-collections/community.general/issues/8217, https://github.com/ansible-collections/community.general/pull/8247). +- apt_rpm - refactor module to pass list of arguments to ``module.run_command()`` instead of relying on interpretation by a shell (https://github.com/ansible-collections/community.general/pull/8264). - bitwarden lookup plugin - add ``bw_session`` option, to pass session key instead of reading from env (https://github.com/ansible-collections/community.general/pull/7994). -- gitlab_deploy_key, gitlab_group_members, gitlab_group_variable, gitlab_hook, gitlab_instance_variable, gitlab_project_badge, gitlab_project_variable, gitlab_user - improve API pagination and compatibility with different versions of ``python-gitlab`` (https://github.com/ansible-collections/community.general/pull/7790). -- gitlab_hook - adds ``releases_events`` parameter for supporting Releases events triggers on GitLab hooks (https://github.com/ansible-collections/community.general/pull/7956). -- icinga2 inventory plugin - add Jinja2 templating support to ``url``, ``user``, and ``password`` paramenters (https://github.com/ansible-collections/community.general/issues/7074, https://github.com/ansible-collections/community.general/pull/7996). -- mssql_script - adds transactional (rollback/commit) support via optional boolean param ``transaction`` (https://github.com/ansible-collections/community.general/pull/7976). -- proxmox_kvm - add parameter ``update_unsafe`` to avoid limitations when updating dangerous values (https://github.com/ansible-collections/community.general/pull/7843). -- redfish_config - add command ``SetServiceIdentification`` to set service identification (https://github.com/ansible-collections/community.general/issues/7916). -- sudoers - add support for the ``NOEXEC`` tag in sudoers rules (https://github.com/ansible-collections/community.general/pull/7983). -- terraform - fix ``diff_mode`` in state ``absent`` and when terraform ``resource_changes`` does not exist (https://github.com/ansible-collections/community.general/pull/7963). - -Bugfixes --------- - -- cargo - fix idempotency issues when using a custom installation path for packages (using the ``--path`` parameter). The initial installation runs fine, but subsequent runs use the ``get_installed()`` function which did not check the given installation location, before running ``cargo install``. This resulted in a false ``changed`` state. Also the removal of packeges using ``state: absent`` failed, as the installation check did not use the given parameter (https://github.com/ansible-collections/community.general/pull/7970). -- gitlab_issue - fix behavior to search GitLab issue, using ``search`` keyword instead of ``title`` (https://github.com/ansible-collections/community.general/issues/7846). -- gitlab_runner - fix pagination when checking for existing runners (https://github.com/ansible-collections/community.general/pull/7790). -- keycloak_client - fixes issue when metadata is provided in desired state when task is in check mode (https://github.com/ansible-collections/community.general/issues/1226, https://github.com/ansible-collections/community.general/pull/7881). -- modprobe - listing modules files or modprobe files could trigger a FileNotFoundError if ``/etc/modprobe.d`` or ``/etc/modules-load.d`` did not exist. Relevant functions now return empty lists if the directories do not exist to avoid crashing the module (https://github.com/ansible-collections/community.general/issues/7717). -- onepassword lookup plugin - failed for fields that were in sections and had uppercase letters in the label/ID. Field lookups are now case insensitive in all cases (https://github.com/ansible-collections/community.general/pull/7919). -- pkgin - pkgin (pkgsrc package manager used by SmartOS) raises erratic exceptions and spurious ``changed=true`` (https://github.com/ansible-collections/community.general/pull/7971). -- redfish_info - allow for a GET operation invoked by ``GetUpdateStatus`` to allow for an empty response body for cases where a service returns 204 No Content (https://github.com/ansible-collections/community.general/issues/8003). -- redfish_info - correct uncaught exception when attempting to retrieve ``Chassis`` information (https://github.com/ansible-collections/community.general/pull/7952). - -New Plugins ------------ - -Callback -~~~~~~~~ - -- default_without_diff - The default ansible callback without diff output - -Filter -~~~~~~ - -- lists_difference - Difference of lists with a predictive order -- lists_intersect - Intersection of lists with a predictive order -- lists_symmetric_difference - Symmetric Difference of lists with a predictive order -- lists_union - Union of lists with a predictive order - -New Modules ------------ - -- gitlab_group_access_token - Manages GitLab group access tokens -- gitlab_project_access_token - Manages GitLab project access tokens - -v8.3.0 -====== - -Release Summary ---------------- - -Regular bugfix and feature release. - -Minor Changes -------------- - +- bitwarden lookup plugin - add support to filter by organization ID (https://github.com/ansible-collections/community.general/pull/8188). +- bitwarden lookup plugin - allows to fetch all records of a given collection ID, by allowing to pass an empty value for ``search_value`` when ``collection_id`` is provided (https://github.com/ansible-collections/community.general/pull/8013). +- bitwarden lookup plugin - when looking for items using an item ID, the item is now accessed directly with ``bw get item`` instead of searching through all items. This doubles the lookup speed (https://github.com/ansible-collections/community.general/pull/7468). +- btrfs_subvolume - refactor module to pass list of arguments to ``module.run_command()`` instead of relying on interpretation by a shell (https://github.com/ansible-collections/community.general/pull/8264). +- cmd_runner module_utils - add validation for minimum and maximum length in the value passed to ``cmd_runner_fmt.as_list()`` (https://github.com/ansible-collections/community.general/pull/8288). - consul_auth_method, consul_binding_rule, consul_policy, consul_role, consul_session, consul_token - added action group ``community.general.consul`` (https://github.com/ansible-collections/community.general/pull/7897). - consul_policy - added support for diff and check mode (https://github.com/ansible-collections/community.general/pull/7878). - consul_policy, consul_role, consul_session - removed dependency on ``requests`` and factored out common parts (https://github.com/ansible-collections/community.general/pull/7826, https://github.com/ansible-collections/community.general/pull/7878). @@ -179,532 +64,289 @@ Minor Changes - consul_role - ``service_identities`` now expects a ``service_name`` option to match the Consul API, the old ``name`` is still supported as alias (https://github.com/ansible-collections/community.general/pull/7878). - consul_role - added support for diff mode (https://github.com/ansible-collections/community.general/pull/7878). - consul_role - added support for templated policies (https://github.com/ansible-collections/community.general/pull/7878). -- redfish_info - add command ``GetServiceIdentification`` to get service identification (https://github.com/ansible-collections/community.general/issues/7882). -- terraform - add support for ``diff_mode`` for terraform resource_changes (https://github.com/ansible-collections/community.general/pull/7896). - -Deprecated Features -------------------- - -- consul_acl - the module has been deprecated and will be removed in community.general 10.0.0. ``consul_token`` and ``consul_policy`` can be used instead (https://github.com/ansible-collections/community.general/pull/7901). - -Bugfixes --------- - -- homebrew - detect already installed formulae and casks using JSON output from ``brew info`` (https://github.com/ansible-collections/community.general/issues/864). -- incus connection plugin - treats ``inventory_hostname`` as a variable instead of a literal in remote connections (https://github.com/ansible-collections/community.general/issues/7874). -- ipa_otptoken - the module expect ``ipatokendisabled`` as string but the ``ipatokendisabled`` value is returned as a boolean (https://github.com/ansible-collections/community.general/pull/7795). -- ldap - previously the order number (if present) was expected to follow an equals sign in the DN. This makes it so the order number string is identified correctly anywhere within the DN (https://github.com/ansible-collections/community.general/issues/7646). -- mssql_script - make the module work with Python 2 (https://github.com/ansible-collections/community.general/issues/7818, https://github.com/ansible-collections/community.general/pull/7821). -- nmcli - fix ``connection.slave-type`` wired to ``bond`` and not with parameter ``slave_type`` in case of connection type ``wifi`` (https://github.com/ansible-collections/community.general/issues/7389). -- proxmox - fix updating a container config if the setting does not already exist (https://github.com/ansible-collections/community.general/pull/7872). - -New Modules ------------ - -- consul_acl_bootstrap - Bootstrap ACLs in Consul -- consul_auth_method - Manipulate Consul auth methods -- consul_binding_rule - Manipulate Consul binding rules -- consul_token - Manipulate Consul tokens -- gitlab_label - Creates/updates/deletes GitLab Labels belonging to project or group. -- gitlab_milestone - Creates/updates/deletes GitLab Milestones belonging to project or group - -v8.2.0 -====== - -Release Summary ---------------- - -Regular bugfix and feature release. - -Minor Changes -------------- - -- ipa_dnsrecord - adds ability to manage NS record types (https://github.com/ansible-collections/community.general/pull/7737). -- ipa_pwpolicy - refactor module and exchange a sequence ``if`` statements with a ``for`` loop (https://github.com/ansible-collections/community.general/pull/7723). -- ipa_pwpolicy - update module to support ``maxrepeat``, ``maxsequence``, ``dictcheck``, ``usercheck``, ``gracelimit`` parameters in FreeIPA password policies (https://github.com/ansible-collections/community.general/pull/7723). -- keycloak_realm_key - the ``config.algorithm`` option now supports 8 additional key algorithms (https://github.com/ansible-collections/community.general/pull/7698). -- keycloak_realm_key - the ``config.certificate`` option value is no longer defined with ``no_log=True`` (https://github.com/ansible-collections/community.general/pull/7698). -- keycloak_realm_key - the ``provider_id`` option now supports RSA encryption key usage (value ``rsa-enc``) (https://github.com/ansible-collections/community.general/pull/7698). -- keycloak_user_federation - allow custom user storage providers to be set through ``provider_id`` (https://github.com/ansible-collections/community.general/pull/7789). -- mail - add ``Message-ID`` header; which is required by some mail servers (https://github.com/ansible-collections/community.general/pull/7740). -- mail module, mail callback plugin - allow to configure the domain name of the Message-ID header with a new ``message_id_domain`` option (https://github.com/ansible-collections/community.general/pull/7765). -- ssh_config - new feature to set ``AddKeysToAgent`` option to ``yes`` or ``no`` (https://github.com/ansible-collections/community.general/pull/7703). -- ssh_config - new feature to set ``IdentitiesOnly`` option to ``yes`` or ``no`` (https://github.com/ansible-collections/community.general/pull/7704). -- xcc_redfish_command - added support for raw POSTs (``command=PostResource`` in ``category=Raw``) without a specific action info (https://github.com/ansible-collections/community.general/pull/7746). - -Bugfixes --------- - -- keycloak_identity_provider - ``mappers`` processing was not idempotent if the mappers configuration list had not been sorted by name (in ascending order). Fix resolves the issue by sorting mappers in the desired state using the same key which is used for obtaining existing state (https://github.com/ansible-collections/community.general/pull/7418). -- keycloak_identity_provider - it was not possible to reconfigure (add, remove) ``mappers`` once they were created initially. Removal was ignored, adding new ones resulted in dropping the pre-existing unmodified mappers. Fix resolves the issue by supplying correct input to the internal update call (https://github.com/ansible-collections/community.general/pull/7418). -- keycloak_user - when ``force`` is set, but user does not exist, do not try to delete it (https://github.com/ansible-collections/community.general/pull/7696). -- proxmox_kvm - running ``state=template`` will first check whether VM is already a template (https://github.com/ansible-collections/community.general/pull/7792). -- statusio_maintenance - fix error caused by incorrectly formed API data payload. Was raising "Failed to create maintenance HTTP Error 400 Bad Request" caused by bad data type for date/time and deprecated dict keys (https://github.com/ansible-collections/community.general/pull/7754). - -New Plugins ------------ - -Connection -~~~~~~~~~~ - -- incus - Run tasks in Incus instances via the Incus CLI. - -Filter -~~~~~~ - -- from_ini - Converts INI text input into a dictionary -- to_ini - Converts a dictionary to the INI file format - -Lookup -~~~~~~ - -- github_app_access_token - Obtain short-lived Github App Access tokens - -New Modules ------------ - -- dnf_config_manager - Enable or disable dnf repositories using config-manager -- keycloak_component_info - Retrive component info in Keycloak -- keycloak_realm_rolemapping - Allows administration of Keycloak realm role mappings into groups with the Keycloak API -- proxmox_node_info - Retrieve information about one or more Proxmox VE nodes -- proxmox_storage_contents_info - List content from a Proxmox VE storage - -v8.1.0 -====== - -Release Summary ---------------- - -Regular bugfix and feature release. - -Minor Changes -------------- - -- bitwarden lookup plugin - when looking for items using an item ID, the item is now accessed directly with ``bw get item`` instead of searching through all items. This doubles the lookup speed (https://github.com/ansible-collections/community.general/pull/7468). - elastic callback plugin - close elastic client to not leak resources (https://github.com/ansible-collections/community.general/pull/7517). +- filesystem - add bcachefs support (https://github.com/ansible-collections/community.general/pull/8126). +- gandi_livedns - adds support for personal access tokens (https://github.com/ansible-collections/community.general/issues/7639, https://github.com/ansible-collections/community.general/pull/8337). +- gconftool2 - use ``ModuleHelper`` with ``VarDict`` (https://github.com/ansible-collections/community.general/pull/8226). - git_config - allow multiple git configs for the same name with the new ``add_mode`` option (https://github.com/ansible-collections/community.general/pull/7260). - git_config - the ``after`` and ``before`` fields in the ``diff`` of the return value can be a list instead of a string in case more configs with the same key are affected (https://github.com/ansible-collections/community.general/pull/7260). - git_config - when a value is unset, all configs with the same key are unset (https://github.com/ansible-collections/community.general/pull/7260). - gitlab modules - add ``ca_path`` option (https://github.com/ansible-collections/community.general/pull/7472). - gitlab modules - remove duplicate ``gitlab`` package check (https://github.com/ansible-collections/community.general/pull/7486). +- gitlab_deploy_key, gitlab_group_members, gitlab_group_variable, gitlab_hook, gitlab_instance_variable, gitlab_project_badge, gitlab_project_variable, gitlab_user - improve API pagination and compatibility with different versions of ``python-gitlab`` (https://github.com/ansible-collections/community.general/pull/7790). +- gitlab_hook - adds ``releases_events`` parameter for supporting Releases events triggers on GitLab hooks (https://github.com/ansible-collections/community.general/pull/7956). - gitlab_runner - add support for new runner creation workflow (https://github.com/ansible-collections/community.general/pull/7199). +- homebrew - adds ``force_formula`` parameter to disambiguate a formula from a cask of the same name (https://github.com/ansible-collections/community.general/issues/8274). +- homebrew, homebrew_cask - refactor common argument validation logic into a dedicated ``homebrew`` module utils (https://github.com/ansible-collections/community.general/issues/8323, https://github.com/ansible-collections/community.general/pull/8324). +- icinga2 inventory plugin - add Jinja2 templating support to ``url``, ``user``, and ``password`` paramenters (https://github.com/ansible-collections/community.general/issues/7074, https://github.com/ansible-collections/community.general/pull/7996). +- icinga2 inventory plugin - adds new parameter ``group_by_hostgroups`` in order to make grouping by Icinga2 hostgroups optional (https://github.com/ansible-collections/community.general/pull/7998). +- ini_file - add an optional parameter ``section_has_values``. If the target ini file contains more than one ``section``, use ``section_has_values`` to specify which one should be updated (https://github.com/ansible-collections/community.general/pull/7505). +- ini_file - support optional spaces between section names and their surrounding brackets (https://github.com/ansible-collections/community.general/pull/8075). +- installp - refactor module to pass list of arguments to ``module.run_command()`` instead of relying on interpretation by a shell (https://github.com/ansible-collections/community.general/pull/8264). - ipa_config - adds ``passkey`` choice to ``ipauserauthtype`` parameter's choices (https://github.com/ansible-collections/community.general/pull/7588). +- ipa_dnsrecord - adds ability to manage NS record types (https://github.com/ansible-collections/community.general/pull/7737). +- ipa_pwpolicy - refactor module and exchange a sequence ``if`` statements with a ``for`` loop (https://github.com/ansible-collections/community.general/pull/7723). +- ipa_pwpolicy - update module to support ``maxrepeat``, ``maxsequence``, ``dictcheck``, ``usercheck``, ``gracelimit`` parameters in FreeIPA password policies (https://github.com/ansible-collections/community.general/pull/7723). - ipa_sudorule - adds options to include denied commands or command groups (https://github.com/ansible-collections/community.general/pull/7415). - ipa_user - adds ``idp`` and ``passkey`` choice to ``ipauserauthtype`` parameter's choices (https://github.com/ansible-collections/community.general/pull/7589). - irc - add ``validate_certs`` option, and rename ``use_ssl`` to ``use_tls``, while keeping ``use_ssl`` as an alias. The default value for ``validate_certs`` is ``false`` for backwards compatibility. We recommend to every user of this module to explicitly set ``use_tls=true`` and `validate_certs=true`` whenever possible, especially when communicating to IRC servers over the internet (https://github.com/ansible-collections/community.general/pull/7550). +- java_cert - add ``cert_content`` argument (https://github.com/ansible-collections/community.general/pull/8153). +- java_cert - enable ``owner``, ``group``, ``mode``, and other generic file arguments (https://github.com/ansible-collections/community.general/pull/8116). +- kernel_blacklist - use ``ModuleHelper`` with ``VarDict`` (https://github.com/ansible-collections/community.general/pull/8226). - keycloak module utils - expose error message from Keycloak server for HTTP errors in some specific situations (https://github.com/ansible-collections/community.general/pull/7645). +- keycloak_client, keycloak_clientscope, keycloak_clienttemplate - added ``docker-v2`` protocol support, enhancing alignment with Keycloak's protocol options (https://github.com/ansible-collections/community.general/issues/8215, https://github.com/ansible-collections/community.general/pull/8216). +- keycloak_realm_key - the ``config.algorithm`` option now supports 8 additional key algorithms (https://github.com/ansible-collections/community.general/pull/7698). +- keycloak_realm_key - the ``config.certificate`` option value is no longer defined with ``no_log=True`` (https://github.com/ansible-collections/community.general/pull/7698). +- keycloak_realm_key - the ``provider_id`` option now supports RSA encryption key usage (value ``rsa-enc``) (https://github.com/ansible-collections/community.general/pull/7698). - keycloak_user_federation - add option for ``krbPrincipalAttribute`` (https://github.com/ansible-collections/community.general/pull/7538). +- keycloak_user_federation - allow custom user storage providers to be set through ``provider_id`` (https://github.com/ansible-collections/community.general/pull/7789). +- ldap_attrs - module now supports diff mode, showing which attributes are changed within an operation (https://github.com/ansible-collections/community.general/pull/8073). +- lvg - refactor module to pass list of arguments to ``module.run_command()`` instead of relying on interpretation by a shell (https://github.com/ansible-collections/community.general/pull/8264). - lvol - change ``pvs`` argument type to list of strings (https://github.com/ansible-collections/community.general/pull/7676, https://github.com/ansible-collections/community.general/issues/7504). +- lvol - refactor module to pass list of arguments to ``module.run_command()`` instead of relying on interpretation by a shell (https://github.com/ansible-collections/community.general/pull/8264). - lxd connection plugin - tighten the detection logic for lxd ``Instance not found`` errors, to avoid false detection on unrelated errors such as ``/usr/bin/python3: not found`` (https://github.com/ansible-collections/community.general/pull/7521). +- lxd_container - uses ``/1.0/instances`` API endpoint, if available. Falls back to ``/1.0/containers`` or ``/1.0/virtual-machines``. Fixes issue when using Incus or LXD 5.19 due to migrating to ``/1.0/instances`` endpoint (https://github.com/ansible-collections/community.general/pull/7980). +- macports - refactor module to pass list of arguments to ``module.run_command()`` instead of relying on interpretation by a shell (https://github.com/ansible-collections/community.general/pull/8264). +- mail - add ``Message-ID`` header; which is required by some mail servers (https://github.com/ansible-collections/community.general/pull/7740). +- mail module, mail callback plugin - allow to configure the domain name of the Message-ID header with a new ``message_id_domain`` option (https://github.com/ansible-collections/community.general/pull/7765). +- mssql_script - adds transactional (rollback/commit) support via optional boolean param ``transaction`` (https://github.com/ansible-collections/community.general/pull/7976). - netcup_dns - adds support for record types ``OPENPGPKEY``, ``SMIMEA``, and ``SSHFP`` (https://github.com/ansible-collections/community.general/pull/7489). - nmcli - add support for new connection type ``loopback`` (https://github.com/ansible-collections/community.general/issues/6572). +- nmcli - adds OpenvSwitch support with new ``type`` values ``ovs-port``, ``ovs-interface``, and ``ovs-bridge``, and new ``slave_type`` value ``ovs-port`` (https://github.com/ansible-collections/community.general/pull/8154). - nmcli - allow for ``infiniband`` slaves of ``bond`` interface types (https://github.com/ansible-collections/community.general/pull/7569). - nmcli - allow for the setting of ``MTU`` for ``infiniband`` and ``bond`` interface types (https://github.com/ansible-collections/community.general/pull/7499). +- nmcli - allow setting ``MTU`` for ``bond-slave`` interface types (https://github.com/ansible-collections/community.general/pull/8118). - onepassword lookup plugin - support 1Password Connect with the opv2 client by setting the connect_host and connect_token parameters (https://github.com/ansible-collections/community.general/pull/7116). - onepassword_raw lookup plugin - support 1Password Connect with the opv2 client by setting the connect_host and connect_token parameters (https://github.com/ansible-collections/community.general/pull/7116) +- opentelemetry - add support for HTTP trace_exporter and configures the behavior via ``OTEL_EXPORTER_OTLP_TRACES_PROTOCOL`` (https://github.com/ansible-collections/community.general/issues/7888, https://github.com/ansible-collections/community.general/pull/8321). +- opentelemetry - add support for exporting spans in a file via ``ANSIBLE_OPENTELEMETRY_STORE_SPANS_IN_FILE`` (https://github.com/ansible-collections/community.general/issues/7888, https://github.com/ansible-collections/community.general/pull/8363). +- opkg - use ``ModuleHelper`` with ``VarDict`` (https://github.com/ansible-collections/community.general/pull/8226). +- osx_defaults - add option ``check_types`` to enable changing the type of existing defaults on the fly (https://github.com/ansible-collections/community.general/pull/8173). +- parted - refactor module to pass list of arguments to ``module.run_command()`` instead of relying on interpretation by a shell (https://github.com/ansible-collections/community.general/pull/8264). - passwordstore - adds ``timestamp`` and ``preserve`` parameters to modify the stored password format (https://github.com/ansible-collections/community.general/pull/7426). +- passwordstore lookup - add ``missing_subkey`` parameter defining the behavior of the lookup when a passwordstore subkey is missing (https://github.com/ansible-collections/community.general/pull/8166). +- pipx - use ``ModuleHelper`` with ``VarDict`` (https://github.com/ansible-collections/community.general/pull/8226). +- pkg5 - add support for non-silent execution (https://github.com/ansible-collections/community.general/issues/8379, https://github.com/ansible-collections/community.general/pull/8382). +- pkgin - refactor module to pass list of arguments to ``module.run_command()`` instead of relying on interpretation by a shell (https://github.com/ansible-collections/community.general/pull/8264). +- portage - adds the possibility to explicitely tell portage to write packages to world file (https://github.com/ansible-collections/community.general/issues/6226, https://github.com/ansible-collections/community.general/pull/8236). +- portinstall - refactor module to pass list of arguments to ``module.run_command()`` instead of relying on interpretation by a shell (https://github.com/ansible-collections/community.general/pull/8264). +- proxmox - adds ``startup`` parameters to configure startup order, startup delay and shutdown delay (https://github.com/ansible-collections/community.general/pull/8038). - proxmox - adds ``template`` value to the ``state`` parameter, allowing conversion of container to a template (https://github.com/ansible-collections/community.general/pull/7143). - proxmox - adds ``update`` parameter, allowing update of an already existing containers configuration (https://github.com/ansible-collections/community.general/pull/7540). - proxmox inventory plugin - adds an option to exclude nodes from the dynamic inventory generation. The new setting is optional, not using this option will behave as usual (https://github.com/ansible-collections/community.general/issues/6714, https://github.com/ansible-collections/community.general/pull/7461). +- proxmox* modules - there is now a ``community.general.proxmox`` module defaults group that can be used to set default options for all Proxmox modules (https://github.com/ansible-collections/community.general/pull/8334). - proxmox_disk - add ability to manipulate CD-ROM drive (https://github.com/ansible-collections/community.general/pull/7495). +- proxmox_kvm - add parameter ``update_unsafe`` to avoid limitations when updating dangerous values (https://github.com/ansible-collections/community.general/pull/7843). - proxmox_kvm - adds ``template`` value to the ``state`` parameter, allowing conversion of a VM to a template (https://github.com/ansible-collections/community.general/pull/7143). +- proxmox_kvm - adds``usb`` parameter for setting USB devices on proxmox KVM VMs (https://github.com/ansible-collections/community.general/pull/8199). - proxmox_kvm - support the ``hookscript`` parameter (https://github.com/ansible-collections/community.general/issues/7600). - proxmox_ostype - it is now possible to specify the ``ostype`` when creating an LXC container (https://github.com/ansible-collections/community.general/pull/7462). - proxmox_vm_info - add ability to retrieve configuration info (https://github.com/ansible-collections/community.general/pull/7485). +- puppet - new feature to set ``--waitforlock`` option (https://github.com/ansible-collections/community.general/pull/8282). +- redfish_command - add command ``ResetToDefaults`` to reset manager to default state (https://github.com/ansible-collections/community.general/issues/8163). +- redfish_config - add command ``SetServiceIdentification`` to set service identification (https://github.com/ansible-collections/community.general/issues/7916). +- redfish_info - add boolean return value ``MultipartHttpPush`` to ``GetFirmwareUpdateCapabilities`` (https://github.com/ansible-collections/community.general/issues/8194, https://github.com/ansible-collections/community.general/pull/8195). +- redfish_info - add command ``GetServiceIdentification`` to get service identification (https://github.com/ansible-collections/community.general/issues/7882). - redfish_info - adding the ``BootProgress`` property when getting ``Systems`` info (https://github.com/ansible-collections/community.general/pull/7626). +- revbitspss lookup plugin - removed a redundant unicode prefix. The prefix was not necessary for Python 3 and has been cleaned up to streamline the code (https://github.com/ansible-collections/community.general/pull/8087). +- rundeck module utils - allow to pass ``Content-Type`` to API requests (https://github.com/ansible-collections/community.general/pull/7684). +- slackpkg - refactor module to pass list of arguments to ``module.run_command()`` instead of relying on interpretation by a shell (https://github.com/ansible-collections/community.general/pull/8264). - ssh_config - adds ``controlmaster``, ``controlpath`` and ``controlpersist`` parameters (https://github.com/ansible-collections/community.general/pull/7456). +- ssh_config - allow ``accept-new`` as valid value for ``strict_host_key_checking`` (https://github.com/ansible-collections/community.general/pull/8257). +- ssh_config - new feature to set ``AddKeysToAgent`` option to ``yes`` or ``no`` (https://github.com/ansible-collections/community.general/pull/7703). +- ssh_config - new feature to set ``IdentitiesOnly`` option to ``yes`` or ``no`` (https://github.com/ansible-collections/community.general/pull/7704). +- sudoers - add support for the ``NOEXEC`` tag in sudoers rules (https://github.com/ansible-collections/community.general/pull/7983). +- svr4pkg - refactor module to pass list of arguments to ``module.run_command()`` instead of relying on interpretation by a shell (https://github.com/ansible-collections/community.general/pull/8264). +- swdepot - refactor module to pass list of arguments to ``module.run_command()`` instead of relying on interpretation by a shell (https://github.com/ansible-collections/community.general/pull/8264). +- terraform - add support for ``diff_mode`` for terraform resource_changes (https://github.com/ansible-collections/community.general/pull/7896). +- terraform - fix ``diff_mode`` in state ``absent`` and when terraform ``resource_changes`` does not exist (https://github.com/ansible-collections/community.general/pull/7963). +- xcc_redfish_command - added support for raw POSTs (``command=PostResource`` in ``category=Raw``) without a specific action info (https://github.com/ansible-collections/community.general/pull/7746). +- xfconf - use ``ModuleHelper`` with ``VarDict`` (https://github.com/ansible-collections/community.general/pull/8226). +- xfconf_info - use ``ModuleHelper`` with ``VarDict`` (https://github.com/ansible-collections/community.general/pull/8226). + +Breaking Changes / Porting Guide +-------------------------------- + +- cpanm - the default of the ``mode`` option changed from ``compatibility`` to ``new`` (https://github.com/ansible-collections/community.general/pull/8198). +- django_manage - the module now requires Django >= 4.1 (https://github.com/ansible-collections/community.general/pull/8198). +- django_manage - the module will now fail if ``virtualenv`` is specified but no virtual environment exists at that location (https://github.com/ansible-collections/community.general/pull/8198). +- redfish_command, redfish_config, redfish_info - change the default for ``timeout`` from 10 to 60 (https://github.com/ansible-collections/community.general/pull/8198). + +Deprecated Features +------------------- + +- MH DependencyCtxMgr module_utils - deprecate ``module_utils.mh.mixin.deps.DependencyCtxMgr`` in favour of ``module_utils.deps`` (https://github.com/ansible-collections/community.general/pull/8280). +- ModuleHelper module_utils - deprecate ``plugins.module_utils.module_helper.AnsibleModule`` (https://github.com/ansible-collections/community.general/pull/8280). +- ModuleHelper module_utils - deprecate ``plugins.module_utils.module_helper.DependencyCtxMgr`` (https://github.com/ansible-collections/community.general/pull/8280). +- ModuleHelper module_utils - deprecate ``plugins.module_utils.module_helper.StateMixin`` (https://github.com/ansible-collections/community.general/pull/8280). +- ModuleHelper module_utils - deprecate ``plugins.module_utils.module_helper.VarDict,`` (https://github.com/ansible-collections/community.general/pull/8280). +- ModuleHelper module_utils - deprecate ``plugins.module_utils.module_helper.VarMeta`` (https://github.com/ansible-collections/community.general/pull/8280). +- ModuleHelper module_utils - deprecate ``plugins.module_utils.module_helper.VarsMixin`` (https://github.com/ansible-collections/community.general/pull/8280). +- ModuleHelper module_utils - deprecate use of ``VarsMixin`` in favor of using the ``VardDict`` module_utils (https://github.com/ansible-collections/community.general/pull/8226). +- ModuleHelper vars module_utils - bump deprecation of ``VarMeta``, ``VarDict`` and ``VarsMixin`` to version 11.0.0 (https://github.com/ansible-collections/community.general/pull/8226). +- apt_rpm - the behavior of ``state=present`` and ``state=installed`` is deprecated and will change in community.general 11.0.0. Right now the module will upgrade a package to the latest version if one of these two states is used. You should explicitly use ``state=latest`` if you want this behavior, and switch to ``state=present_not_latest`` if you do not want to upgrade the package if it is already installed. In community.general 11.0.0 the behavior of ``state=present`` and ``state=installed`` will change to that of ``state=present_not_latest`` (https://github.com/ansible-collections/community.general/issues/8217, https://github.com/ansible-collections/community.general/pull/8285). +- consul_acl - the module has been deprecated and will be removed in community.general 10.0.0. ``consul_token`` and ``consul_policy`` can be used instead (https://github.com/ansible-collections/community.general/pull/7901). +- django_manage - the ``ack_venv_creation_deprecation`` option has no more effect and will be removed from community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/8198). +- gitlab modules - the basic auth method on GitLab API have been deprecated and will be removed in community.general 10.0.0 (https://github.com/ansible-collections/community.general/pull/8383). +- hipchat callback plugin - the hipchat service has been discontinued and the self-hosted variant has been End of Life since 2020. The callback plugin is therefore deprecated and will be removed from community.general 10.0.0 if nobody provides compelling reasons to still keep it (https://github.com/ansible-collections/community.general/issues/8184, https://github.com/ansible-collections/community.general/pull/8189). +- irc - the defaults ``false`` for ``use_tls`` and ``validate_certs`` have been deprecated and will change to ``true`` in community.general 10.0.0 to improve security. You can already improve security now by explicitly setting them to ``true``. Specifying values now disables the deprecation warning (https://github.com/ansible-collections/community.general/pull/7578). + +Removed Features (previously deprecated) +---------------------------------------- + +- The deprecated redirects for internal module names have been removed. These internal redirects were extra-long FQCNs like ``community.general.packaging.os.apt_rpm`` that redirect to the short FQCN ``community.general.apt_rpm``. They were originally needed to implement flatmapping; as various tooling started to recommend users to use the long names flatmapping was removed from the collection and redirects were added for users who already followed these incorrect recommendations (https://github.com/ansible-collections/community.general/pull/7835). +- ansible_galaxy_install - the ``ack_ansible29`` and ``ack_min_ansiblecore211`` options have been removed. They no longer had any effect (https://github.com/ansible-collections/community.general/pull/8198). +- cloudflare_dns - remove support for SPF records. These are no longer supported by CloudFlare (https://github.com/ansible-collections/community.general/pull/7782). +- django_manage - support for the ``command`` values ``cleanup``, ``syncdb``, and ``validate`` were removed. Use ``clearsessions``, ``migrate``, and ``check`` instead, respectively (https://github.com/ansible-collections/community.general/pull/8198). +- flowdock - this module relied on HTTPS APIs that do not exist anymore and was thus removed (https://github.com/ansible-collections/community.general/pull/8198). +- mh.mixins.deps module utils - the ``DependencyMixin`` has been removed. Use the ``deps`` module utils instead (https://github.com/ansible-collections/community.general/pull/8198). +- proxmox - the ``proxmox_default_behavior`` option has been removed (https://github.com/ansible-collections/community.general/pull/8198). +- rax* modules, rax module utils, rax docs fragment - the Rackspace modules relied on the deprecated package ``pyrax`` and were thus removed (https://github.com/ansible-collections/community.general/pull/8198). +- redhat module utils - the classes ``Rhsm``, ``RhsmPool``, and ``RhsmPools`` have been removed (https://github.com/ansible-collections/community.general/pull/8198). +- redhat_subscription - the alias ``autosubscribe`` of the ``auto_attach`` option was removed (https://github.com/ansible-collections/community.general/pull/8198). +- stackdriver - this module relied on HTTPS APIs that do not exist anymore and was thus removed (https://github.com/ansible-collections/community.general/pull/8198). +- webfaction_* modules - these modules relied on HTTPS APIs that do not exist anymore and were thus removed (https://github.com/ansible-collections/community.general/pull/8198). + +Security Fixes +-------------- + +- cobbler, gitlab_runners, icinga2, linode, lxd, nmap, online, opennebula, proxmox, scaleway, stackpath_compute, virtualbox, and xen_orchestra inventory plugin - make sure all data received from the remote servers is marked as unsafe, so remote code execution by obtaining texts that can be evaluated as templates is not possible (https://www.die-welt.net/2024/03/remote-code-execution-in-ansible-dynamic-inventory-plugins/, https://github.com/ansible-collections/community.general/pull/8098). +- keycloak_identity_provider - the client secret was not correctly sanitized by the module. The return values ``proposed``, ``existing``, and ``end_state``, as well as the diff, did contain the client secret unmasked (https://github.com/ansible-collections/community.general/pull/8355). Bugfixes -------- +- aix_filesystem - fix ``_validate_vg`` not passing VG name to ``lsvg_cmd`` (https://github.com/ansible-collections/community.general/issues/8151). +- aix_filesystem - fix issue with empty list items in crfs logic and option order (https://github.com/ansible-collections/community.general/pull/8052). - apt-rpm - the module did not upgrade packages if a newer version exists. Now the package will be reinstalled if the candidate is newer than the installed version (https://github.com/ansible-collections/community.general/issues/7414). +- apt_rpm - when checking whether packages were installed after running ``apt-get -y install <packages>``, only the last package name was checked (https://github.com/ansible-collections/community.general/pull/8263). +- bitwarden_secrets_manager lookup plugin - implements retry with exponential backoff to avoid lookup errors when Bitwardn's API rate limiting is encountered (https://github.com/ansible-collections/community.general/issues/8230, https://github.com/ansible-collections/community.general/pull/8238). +- cargo - fix idempotency issues when using a custom installation path for packages (using the ``--path`` parameter). The initial installation runs fine, but subsequent runs use the ``get_installed()`` function which did not check the given installation location, before running ``cargo install``. This resulted in a false ``changed`` state. Also the removal of packeges using ``state: absent`` failed, as the installation check did not use the given parameter (https://github.com/ansible-collections/community.general/pull/7970). - cloudflare_dns - fix Cloudflare lookup of SHFP records (https://github.com/ansible-collections/community.general/issues/7652). +- consul_token - fix token creation without ``accessor_id`` (https://github.com/ansible-collections/community.general/pull/8091). +- from_ini filter plugin - disabling interpolation of ``ConfigParser`` to allow converting values with a ``%`` sign (https://github.com/ansible-collections/community.general/issues/8183, https://github.com/ansible-collections/community.general/pull/8185). +- gitlab_group_members - fix gitlab constants call in ``gitlab_group_members`` module (https://github.com/ansible-collections/community.general/issues/7467). +- gitlab_issue - fix behavior to search GitLab issue, using ``search`` keyword instead of ``title`` (https://github.com/ansible-collections/community.general/issues/7846). +- gitlab_issue, gitlab_label, gitlab_milestone - avoid crash during version comparison when the python-gitlab Python module is not installed (https://github.com/ansible-collections/community.general/pull/8158). +- gitlab_project_members - fix gitlab constants call in ``gitlab_project_members`` module (https://github.com/ansible-collections/community.general/issues/7467). +- gitlab_protected_branches - fix gitlab constants call in ``gitlab_protected_branches`` module (https://github.com/ansible-collections/community.general/issues/7467). +- gitlab_runner - fix pagination when checking for existing runners (https://github.com/ansible-collections/community.general/pull/7790). +- gitlab_user - fix gitlab constants call in ``gitlab_user`` module (https://github.com/ansible-collections/community.general/issues/7467). +- haproxy - fix an issue where HAProxy could get stuck in DRAIN mode when the backend was unreachable (https://github.com/ansible-collections/community.general/issues/8092). +- homebrew - detect already installed formulae and casks using JSON output from ``brew info`` (https://github.com/ansible-collections/community.general/issues/864). +- homebrew - error returned from brew command was ignored and tried to parse empty JSON. Fix now checks for an error and raises it to give accurate error message to users (https://github.com/ansible-collections/community.general/issues/8047). +- incus connection plugin - treats ``inventory_hostname`` as a variable instead of a literal in remote connections (https://github.com/ansible-collections/community.general/issues/7874). - interface_files - also consider ``address_family`` when changing ``option=method`` (https://github.com/ansible-collections/community.general/issues/7610, https://github.com/ansible-collections/community.general/pull/7612). +- inventory plugins - add unsafe wrapper to avoid marking strings that do not contain ``{`` or ``}`` as unsafe, to work around a bug in AWX ((https://github.com/ansible-collections/community.general/issues/8212, https://github.com/ansible-collections/community.general/pull/8225). +- ipa - fix get version regex in IPA module_utils (https://github.com/ansible-collections/community.general/pull/8175). +- ipa_hbacrule - the module uses a string for ``ipaenabledflag`` for new FreeIPA versions while the returned value is a boolean (https://github.com/ansible-collections/community.general/pull/7880). +- ipa_otptoken - the module expect ``ipatokendisabled`` as string but the ``ipatokendisabled`` value is returned as a boolean (https://github.com/ansible-collections/community.general/pull/7795). +- ipa_sudorule - the module uses a string for ``ipaenabledflag`` for new FreeIPA versions while the returned value is a boolean (https://github.com/ansible-collections/community.general/pull/7880). +- iptables_state - fix idempotency issues when restoring incomplete iptables dumps (https://github.com/ansible-collections/community.general/issues/8029). - irc - replace ``ssl.wrap_socket`` that was removed from Python 3.12 with code for creating a proper SSL context (https://github.com/ansible-collections/community.general/pull/7542). - keycloak_* - fix Keycloak API client to quote ``/`` properly (https://github.com/ansible-collections/community.general/pull/7641). - keycloak_authz_permission - resource payload variable for scope-based permission was constructed as a string, when it needs to be a list, even for a single item (https://github.com/ansible-collections/community.general/issues/7151). +- keycloak_client - add sorted ``defaultClientScopes`` and ``optionalClientScopes`` to normalizations (https://github.com/ansible-collections/community.general/pull/8223). +- keycloak_client - fixes issue when metadata is provided in desired state when task is in check mode (https://github.com/ansible-collections/community.general/issues/1226, https://github.com/ansible-collections/community.general/pull/7881). +- keycloak_identity_provider - ``mappers`` processing was not idempotent if the mappers configuration list had not been sorted by name (in ascending order). Fix resolves the issue by sorting mappers in the desired state using the same key which is used for obtaining existing state (https://github.com/ansible-collections/community.general/pull/7418). +- keycloak_identity_provider - it was not possible to reconfigure (add, remove) ``mappers`` once they were created initially. Removal was ignored, adding new ones resulted in dropping the pre-existing unmodified mappers. Fix resolves the issue by supplying correct input to the internal update call (https://github.com/ansible-collections/community.general/pull/7418). +- keycloak_realm - add normalizations for ``enabledEventTypes`` and ``supportedLocales`` (https://github.com/ansible-collections/community.general/pull/8224). +- keycloak_user - when ``force`` is set, but user does not exist, do not try to delete it (https://github.com/ansible-collections/community.general/pull/7696). +- keycloak_user_federation - fix diff of empty ``krbPrincipalAttribute`` (https://github.com/ansible-collections/community.general/pull/8320). +- ldap - previously the order number (if present) was expected to follow an equals sign in the DN. This makes it so the order number string is identified correctly anywhere within the DN (https://github.com/ansible-collections/community.general/issues/7646). +- linode inventory plugin - add descriptive error message for linode inventory plugin (https://github.com/ansible-collections/community.general/pull/8133). - log_entries callback plugin - replace ``ssl.wrap_socket`` that was removed from Python 3.12 with code for creating a proper SSL context (https://github.com/ansible-collections/community.general/pull/7542). - lvol - test for output messages in both ``stdout`` and ``stderr`` (https://github.com/ansible-collections/community.general/pull/7601, https://github.com/ansible-collections/community.general/issues/7182). +- merge_variables lookup plugin - fixing cross host merge: providing access to foreign hosts variables to the perspective of the host that is performing the merge (https://github.com/ansible-collections/community.general/pull/8303). +- modprobe - listing modules files or modprobe files could trigger a FileNotFoundError if ``/etc/modprobe.d`` or ``/etc/modules-load.d`` did not exist. Relevant functions now return empty lists if the directories do not exist to avoid crashing the module (https://github.com/ansible-collections/community.general/issues/7717). +- mssql_script - make the module work with Python 2 (https://github.com/ansible-collections/community.general/issues/7818, https://github.com/ansible-collections/community.general/pull/7821). +- nmcli - fix ``connection.slave-type`` wired to ``bond`` and not with parameter ``slave_type`` in case of connection type ``wifi`` (https://github.com/ansible-collections/community.general/issues/7389). +- ocapi_utils, oci_utils, redfish_utils module utils - replace ``type()`` calls with ``isinstance()`` calls (https://github.com/ansible-collections/community.general/pull/7501). +- onepassword lookup plugin - failed for fields that were in sections and had uppercase letters in the label/ID. Field lookups are now case insensitive in all cases (https://github.com/ansible-collections/community.general/pull/7919). - onepassword lookup plugin - field and section titles are now case insensitive when using op CLI version two or later. This matches the behavior of version one (https://github.com/ansible-collections/community.general/pull/7564). +- opentelemetry callback plugin - close spans always (https://github.com/ansible-collections/community.general/pull/8367). +- opentelemetry callback plugin - honour the ``disable_logs`` option to avoid storing task results since they are not used regardless (https://github.com/ansible-collections/community.general/pull/8373). +- pacemaker_cluster - actually implement check mode, which the module claims to support. This means that until now the module also did changes in check mode (https://github.com/ansible-collections/community.general/pull/8081). +- pam_limits - when the file does not exist, do not create it in check mode (https://github.com/ansible-collections/community.general/issues/8050, https://github.com/ansible-collections/community.general/pull/8057). +- pipx module utils - change the CLI argument formatter for the ``pip_args`` parameter (https://github.com/ansible-collections/community.general/issues/7497, https://github.com/ansible-collections/community.general/pull/7506). +- pkgin - pkgin (pkgsrc package manager used by SmartOS) raises erratic exceptions and spurious ``changed=true`` (https://github.com/ansible-collections/community.general/pull/7971). +- proxmox - fix updating a container config if the setting does not already exist (https://github.com/ansible-collections/community.general/pull/7872). +- proxmox_kvm - fixed status check getting from node-specific API endpoint (https://github.com/ansible-collections/community.general/issues/7817). +- proxmox_kvm - running ``state=template`` will first check whether VM is already a template (https://github.com/ansible-collections/community.general/pull/7792). +- proxmox_pool_member - absent state for type VM did not delete VMs from the pools (https://github.com/ansible-collections/community.general/pull/7464). +- puppet - add option ``environment_lang`` to set the environment language encoding. Defaults to lang ``C``. It is recommended to set it to ``C.UTF-8`` or ``en_US.UTF-8`` depending on what is available on your system. (https://github.com/ansible-collections/community.general/issues/8000) +- redfish_command - fix usage of message parsing in ``SimpleUpdate`` and ``MultipartHTTPPushUpdate`` commands to treat the lack of a ``MessageId`` as no message (https://github.com/ansible-collections/community.general/issues/7465, https://github.com/ansible-collections/community.general/pull/7471). +- redfish_info - allow for a GET operation invoked by ``GetUpdateStatus`` to allow for an empty response body for cases where a service returns 204 No Content (https://github.com/ansible-collections/community.general/issues/8003). +- redfish_info - correct uncaught exception when attempting to retrieve ``Chassis`` information (https://github.com/ansible-collections/community.general/pull/7952). - redhat_subscription - use the D-Bus registration on RHEL 7 only on 7.4 and greater; older versions of RHEL 7 do not have it (https://github.com/ansible-collections/community.general/issues/7622, https://github.com/ansible-collections/community.general/pull/7624). +- riak - support ``riak admin`` sub-command in newer Riak KV versions beside the legacy ``riak-admin`` main command (https://github.com/ansible-collections/community.general/pull/8211). +- statusio_maintenance - fix error caused by incorrectly formed API data payload. Was raising "Failed to create maintenance HTTP Error 400 Bad Request" caused by bad data type for date/time and deprecated dict keys (https://github.com/ansible-collections/community.general/pull/7754). - terraform - fix multiline string handling in complex variables (https://github.com/ansible-collections/community.general/pull/7535). +- to_ini filter plugin - disabling interpolation of ``ConfigParser`` to allow converting values with a ``%`` sign (https://github.com/ansible-collections/community.general/issues/8183, https://github.com/ansible-collections/community.general/pull/8185). +- xml - make module work with lxml 5.1.1, which removed some internals that the module was relying on (https://github.com/ansible-collections/community.general/pull/8169). New Plugins ----------- -Lookup +Become ~~~~~~ -- onepassword_doc - Fetch documents stored in 1Password - -Test -~~~~ - -- fqdn_valid - Validates fully-qualified domain names against RFC 1123 - -New Modules ------------ - -- git_config_info - Read git configuration -- gitlab_issue - Create, update, or delete GitLab issues -- nomad_token - Manage Nomad ACL tokens - -v8.0.2 -====== - -Release Summary ---------------- - -Bugfix release for inclusion in Ansible 9.0.0rc1. - -Bugfixes --------- - -- ocapi_utils, oci_utils, redfish_utils module utils - replace ``type()`` calls with ``isinstance()`` calls (https://github.com/ansible-collections/community.general/pull/7501). -- pipx module utils - change the CLI argument formatter for the ``pip_args`` parameter (https://github.com/ansible-collections/community.general/issues/7497, https://github.com/ansible-collections/community.general/pull/7506). +- community.general.run0 - Systemd's run0. -v8.0.1 -====== - -Release Summary ---------------- - -Bugfix release for inclusion in Ansible 9.0.0b1. - -Bugfixes --------- - -- gitlab_group_members - fix gitlab constants call in ``gitlab_group_members`` module (https://github.com/ansible-collections/community.general/issues/7467). -- gitlab_project_members - fix gitlab constants call in ``gitlab_project_members`` module (https://github.com/ansible-collections/community.general/issues/7467). -- gitlab_protected_branches - fix gitlab constants call in ``gitlab_protected_branches`` module (https://github.com/ansible-collections/community.general/issues/7467). -- gitlab_user - fix gitlab constants call in ``gitlab_user`` module (https://github.com/ansible-collections/community.general/issues/7467). -- proxmox_pool_member - absent state for type VM did not delete VMs from the pools (https://github.com/ansible-collections/community.general/pull/7464). -- redfish_command - fix usage of message parsing in ``SimpleUpdate`` and ``MultipartHTTPPushUpdate`` commands to treat the lack of a ``MessageId`` as no message (https://github.com/ansible-collections/community.general/issues/7465, https://github.com/ansible-collections/community.general/pull/7471). - -v8.0.0 -====== - -Release Summary ---------------- - -This is release 8.0.0 of ``community.general``, released on 2023-11-01. - -Minor Changes -------------- - -- The collection will start using semantic markup (https://github.com/ansible-collections/community.general/pull/6539). -- VarDict module utils - add method ``VarDict.as_dict()`` to convert to a plain ``dict`` object (https://github.com/ansible-collections/community.general/pull/6602). -- apt_rpm - extract package name from local ``.rpm`` path when verifying - installation success. Allows installing packages from local ``.rpm`` files - (https://github.com/ansible-collections/community.general/pull/7396). -- cargo - add option ``executable``, which allows user to specify path to the cargo binary (https://github.com/ansible-collections/community.general/pull/7352). -- cargo - add option ``locked`` which allows user to specify install the locked version of dependency instead of latest compatible version (https://github.com/ansible-collections/community.general/pull/6134). -- chroot connection plugin - add ``disable_root_check`` option (https://github.com/ansible-collections/community.general/pull/7099). -- cloudflare_dns - add CAA record support (https://github.com/ansible-collections/community.general/pull/7399). -- cobbler inventory plugin - add ``exclude_mgmt_classes`` and ``include_mgmt_classes`` options to exclude or include hosts based on management classes (https://github.com/ansible-collections/community.general/pull/7184). -- cobbler inventory plugin - add ``inventory_hostname`` option to allow using the system name for the inventory hostname (https://github.com/ansible-collections/community.general/pull/6502). -- cobbler inventory plugin - add ``want_ip_addresses`` option to collect all interface DNS name to IP address mapping (https://github.com/ansible-collections/community.general/pull/6711). -- cobbler inventory plugin - add primary IP addess to ``cobbler_ipv4_address`` and IPv6 address to ``cobbler_ipv6_address`` host variable (https://github.com/ansible-collections/community.general/pull/6711). -- cobbler inventory plugin - add warning for systems with empty profiles (https://github.com/ansible-collections/community.general/pull/6502). -- cobbler inventory plugin - convert Ansible unicode strings to native Python unicode strings before passing user/password to XMLRPC client (https://github.com/ansible-collections/community.general/pull/6923). -- consul_session - drops requirement for the ``python-consul`` library to communicate with the Consul API, instead relying on the existing ``requests`` library requirement (https://github.com/ansible-collections/community.general/pull/6755). -- copr - respawn module to use the system python interpreter when the ``dnf`` python module is not available in ``ansible_python_interpreter`` (https://github.com/ansible-collections/community.general/pull/6522). -- cpanm - minor refactor when creating the ``CmdRunner`` object (https://github.com/ansible-collections/community.general/pull/7231). -- datadog_monitor - adds ``notification_preset_name``, ``renotify_occurrences`` and ``renotify_statuses`` parameters (https://github.com/ansible-collections/community.general/issues/6521,https://github.com/ansible-collections/community.general/issues/5823). -- dig lookup plugin - add TCP option to enable the use of TCP connection during DNS lookup (https://github.com/ansible-collections/community.general/pull/7343). -- ejabberd_user - module now using ``CmdRunner`` to execute external command (https://github.com/ansible-collections/community.general/pull/7075). -- filesystem - add ``uuid`` parameter for UUID change feature (https://github.com/ansible-collections/community.general/pull/6680). -- gitlab_group - add option ``force_delete`` (default: false) which allows delete group even if projects exists in it (https://github.com/ansible-collections/community.general/pull/7364). -- gitlab_group_variable - add support for ``raw`` variables suboption (https://github.com/ansible-collections/community.general/pull/7132). -- gitlab_project_variable - add support for ``raw`` variables suboption (https://github.com/ansible-collections/community.general/pull/7132). -- gitlab_project_variable - minor refactor removing unnecessary code statements (https://github.com/ansible-collections/community.general/pull/6928). -- gitlab_runner - minor refactor removing unnecessary code statements (https://github.com/ansible-collections/community.general/pull/6927). -- htpasswd - minor code improvements in the module (https://github.com/ansible-collections/community.general/pull/6901). -- htpasswd - the parameter ``crypt_scheme`` is being renamed as ``hash_scheme`` and added as an alias to it (https://github.com/ansible-collections/community.general/pull/6841). -- icinga2_host - the ``ip`` option is no longer required, since Icinga 2 allows for an empty address attribute (https://github.com/ansible-collections/community.general/pull/7452). -- ini_file - add ``ignore_spaces`` option (https://github.com/ansible-collections/community.general/pull/7273). -- ini_file - add ``modify_inactive_option`` option (https://github.com/ansible-collections/community.general/pull/7401). -- ipa_config - add module parameters to manage FreeIPA user and group objectclasses (https://github.com/ansible-collections/community.general/pull/7019). -- ipa_config - adds ``idp`` choice to ``ipauserauthtype`` parameter's choices (https://github.com/ansible-collections/community.general/pull/7051). -- jenkins_build - add new ``detach`` option, which allows the module to exit successfully as long as the build is created (default functionality is still waiting for the build to end before exiting) (https://github.com/ansible-collections/community.general/pull/7204). -- jenkins_build - add new ``time_between_checks`` option, which allows to configure the wait time between requests to the Jenkins server (https://github.com/ansible-collections/community.general/pull/7204). -- keycloak_authentication - added provider ID choices, since Keycloak supports only those two specific ones (https://github.com/ansible-collections/community.general/pull/6763). -- keycloak_client_rolemapping - adds support for subgroups with additional parameter ``parents`` (https://github.com/ansible-collections/community.general/pull/6687). -- keycloak_role - add composite roles support for realm and client roles (https://github.com/ansible-collections/community.general/pull/6469). -- keyring - minor refactor removing unnecessary code statements (https://github.com/ansible-collections/community.general/pull/6927). -- ldap_* - add new arguments ``client_cert`` and ``client_key`` to the LDAP modules in order to allow certificate authentication (https://github.com/ansible-collections/community.general/pull/6668). -- ldap_search - add a new ``page_size`` option to enable paged searches (https://github.com/ansible-collections/community.general/pull/6648). -- locale_gen - module has been refactored to use ``ModuleHelper`` and ``CmdRunner`` (https://github.com/ansible-collections/community.general/pull/6903). -- locale_gen - module now using ``CmdRunner`` to execute external commands (https://github.com/ansible-collections/community.general/pull/6820). -- lvg - add ``active`` and ``inactive`` values to the ``state`` option for active state management feature (https://github.com/ansible-collections/community.general/pull/6682). -- lvg - add ``reset_vg_uuid``, ``reset_pv_uuid`` options for UUID reset feature (https://github.com/ansible-collections/community.general/pull/6682). -- lxc connection plugin - properly handle a change of the ``remote_addr`` option (https://github.com/ansible-collections/community.general/pull/7373). -- lxd connection plugin - automatically translate ``remote_addr`` from FQDN to (short) hostname (https://github.com/ansible-collections/community.general/pull/7360). -- lxd connection plugin - update error parsing to work with newer messages mentioning instances (https://github.com/ansible-collections/community.general/pull/7360). -- lxd inventory plugin - add ``server_cert`` option for trust anchor to use for TLS verification of server certificates (https://github.com/ansible-collections/community.general/pull/7392). -- lxd inventory plugin - add ``server_check_hostname`` option to disable hostname verification of server certificates (https://github.com/ansible-collections/community.general/pull/7392). -- make - add new ``targets`` parameter allowing multiple targets to be used with ``make`` (https://github.com/ansible-collections/community.general/pull/6882, https://github.com/ansible-collections/community.general/issues/4919). -- make - allows ``params`` to be used without value (https://github.com/ansible-collections/community.general/pull/7180). -- mas - disable sign-in check for macOS 12+ as ``mas account`` is non-functional (https://github.com/ansible-collections/community.general/pull/6520). -- newrelic_deployment - add option ``app_name_exact_match``, which filters results for the exact app_name provided (https://github.com/ansible-collections/community.general/pull/7355). -- nmap inventory plugin - now has a ``use_arp_ping`` option to allow the user to disable the default ARP ping query for a more reliable form (https://github.com/ansible-collections/community.general/pull/7119). -- nmcli - add support for ``ipv4.dns-options`` and ``ipv6.dns-options`` (https://github.com/ansible-collections/community.general/pull/6902). -- nomad_job, nomad_job_info - add ``port`` parameter (https://github.com/ansible-collections/community.general/pull/7412). -- npm - minor improvement on parameter validation (https://github.com/ansible-collections/community.general/pull/6848). -- npm - module now using ``CmdRunner`` to execute external commands (https://github.com/ansible-collections/community.general/pull/6989). -- onepassword lookup plugin - add service account support (https://github.com/ansible-collections/community.general/issues/6635, https://github.com/ansible-collections/community.general/pull/6660). -- onepassword lookup plugin - introduce ``account_id`` option which allows specifying which account to use (https://github.com/ansible-collections/community.general/pull/7308). -- onepassword_raw lookup plugin - add service account support (https://github.com/ansible-collections/community.general/issues/6635, https://github.com/ansible-collections/community.general/pull/6660). -- onepassword_raw lookup plugin - introduce ``account_id`` option which allows specifying which account to use (https://github.com/ansible-collections/community.general/pull/7308). -- opentelemetry callback plugin - add span attributes in the span event (https://github.com/ansible-collections/community.general/pull/6531). -- opkg - add ``executable`` parameter allowing to specify the path of the ``opkg`` command (https://github.com/ansible-collections/community.general/pull/6862). -- opkg - remove default value ``""`` for parameter ``force`` as it causes the same behaviour of not having that parameter (https://github.com/ansible-collections/community.general/pull/6513). -- pagerduty - adds in option to use v2 API for creating pagerduty incidents (https://github.com/ansible-collections/community.general/issues/6151) -- parted - on resize, use ``--fix`` option if available (https://github.com/ansible-collections/community.general/pull/7304). -- pnpm - set correct version when state is latest or version is not mentioned. Resolves previous idempotency problem (https://github.com/ansible-collections/community.general/pull/7339). -- pritunl module utils - ensure ``validate_certs`` parameter is honoured in all methods (https://github.com/ansible-collections/community.general/pull/7156). -- proxmox - add ``vmid`` (and ``taskid`` when possible) to return values (https://github.com/ansible-collections/community.general/pull/7263). -- proxmox - support ``timezone`` parameter at container creation (https://github.com/ansible-collections/community.general/pull/6510). -- proxmox inventory plugin - add composite variables support for Proxmox nodes (https://github.com/ansible-collections/community.general/issues/6640). -- proxmox_kvm - added support for ``tpmstate0`` parameter to configure TPM (Trusted Platform Module) disk. TPM is required for Windows 11 installations (https://github.com/ansible-collections/community.general/pull/6533). -- proxmox_kvm - enabled force restart of VM, bringing the ``force`` parameter functionality in line with what is described in the docs (https://github.com/ansible-collections/community.general/pull/6914). -- proxmox_kvm - re-use ``timeout`` module param to forcefully shutdown a virtual machine when ``state`` is ``stopped`` (https://github.com/ansible-collections/community.general/issues/6257). -- proxmox_snap - add ``retention`` parameter to delete old snapshots (https://github.com/ansible-collections/community.general/pull/6576). -- proxmox_vm_info - ``node`` parameter is no longer required. Information can be obtained for the whole cluster (https://github.com/ansible-collections/community.general/pull/6976). -- proxmox_vm_info - non-existing provided by name/vmid VM would return empty results instead of failing (https://github.com/ansible-collections/community.general/pull/7049). -- pubnub_blocks - minor refactor removing unnecessary code statements (https://github.com/ansible-collections/community.general/pull/6928). -- random_string - added new ``ignore_similar_chars`` and ``similar_chars`` option to ignore certain chars (https://github.com/ansible-collections/community.general/pull/7242). -- redfish_command - add ``MultipartHTTPPushUpdate`` command (https://github.com/ansible-collections/community.general/issues/6471, https://github.com/ansible-collections/community.general/pull/6612). -- redfish_command - add ``account_types`` and ``oem_account_types`` as optional inputs to ``AddUser`` (https://github.com/ansible-collections/community.general/issues/6823, https://github.com/ansible-collections/community.general/pull/6871). -- redfish_command - add new option ``update_oem_params`` for the ``MultipartHTTPPushUpdate`` command (https://github.com/ansible-collections/community.general/issues/7331). -- redfish_config - add ``CreateVolume`` command to allow creation of volumes on servers (https://github.com/ansible-collections/community.general/pull/6813). -- redfish_config - add ``DeleteAllVolumes`` command to allow deletion of all volumes on servers (https://github.com/ansible-collections/community.general/pull/6814). -- redfish_config - adding ``SetSecureBoot`` command (https://github.com/ansible-collections/community.general/pull/7129). -- redfish_info - add ``AccountTypes`` and ``OEMAccountTypes`` to the output of ``ListUsers`` (https://github.com/ansible-collections/community.general/issues/6823, https://github.com/ansible-collections/community.general/pull/6871). -- redfish_info - add support for ``GetBiosRegistries`` command (https://github.com/ansible-collections/community.general/pull/7144). -- redfish_info - adds ``LinkStatus`` to NIC inventory (https://github.com/ansible-collections/community.general/pull/7318). -- redfish_info - adds ``ProcessorArchitecture`` to CPU inventory (https://github.com/ansible-collections/community.general/pull/6864). -- redfish_info - fix for ``GetVolumeInventory``, Controller name was getting populated incorrectly and duplicates were seen in the volumes retrieved (https://github.com/ansible-collections/community.general/pull/6719). -- redfish_info - report ``Id`` in the output of ``GetManagerInventory`` (https://github.com/ansible-collections/community.general/pull/7140). -- redfish_utils - use ``Controllers`` key in redfish data to obtain Storage controllers properties (https://github.com/ansible-collections/community.general/pull/7081). -- redfish_utils module utils - add support for ``PowerCycle`` reset type for ``redfish_command`` responses feature (https://github.com/ansible-collections/community.general/issues/7083). -- redfish_utils module utils - add support for following ``@odata.nextLink`` pagination in ``software_inventory`` responses feature (https://github.com/ansible-collections/community.general/pull/7020). -- redfish_utils module utils - support ``Volumes`` in response for ``GetDiskInventory`` (https://github.com/ansible-collections/community.general/pull/6819). -- redhat_subscription - the internal ``RegistrationBase`` class was folded - into the other internal ``Rhsm`` class, as the separation had no purpose - anymore - (https://github.com/ansible-collections/community.general/pull/6658). -- redis_info - refactor the redis_info module to use the redis module_utils enabling to pass TLS parameters to the Redis client (https://github.com/ansible-collections/community.general/pull/7267). -- rhsm_release - improve/harden the way ``subscription-manager`` is run; - no behaviour change is expected - (https://github.com/ansible-collections/community.general/pull/6669). -- rhsm_repository - the interaction with ``subscription-manager`` was - refactored by grouping things together, removing unused bits, and hardening - the way it is run; also, the parsing of ``subscription-manager repos --list`` - was improved and made slightly faster; no behaviour change is expected - (https://github.com/ansible-collections/community.general/pull/6783, - https://github.com/ansible-collections/community.general/pull/6837). -- scaleway_security_group_rule - minor refactor removing unnecessary code statements (https://github.com/ansible-collections/community.general/pull/6928). -- shutdown - use ``shutdown -p ...`` with FreeBSD to halt and power off machine (https://github.com/ansible-collections/community.general/pull/7102). -- snap - add option ``dangerous`` to the module, that will map into the command line argument ``--dangerous``, allowing unsigned snap files to be installed (https://github.com/ansible-collections/community.general/pull/6908, https://github.com/ansible-collections/community.general/issues/5715). -- snap - module is now aware of channel when deciding whether to install or refresh the snap (https://github.com/ansible-collections/community.general/pull/6435, https://github.com/ansible-collections/community.general/issues/1606). -- sorcery - add grimoire (repository) management support (https://github.com/ansible-collections/community.general/pull/7012). -- sorcery - minor refactor (https://github.com/ansible-collections/community.general/pull/6525). -- supervisorctl - allow to stop matching running processes before removing them with ``stop_before_removing=true`` (https://github.com/ansible-collections/community.general/pull/7284). -- tss lookup plugin - allow to fetch secret IDs which are in a folder based on folder ID. Previously, we could not fetch secrets based on folder ID but now use ``fetch_secret_ids_from_folder`` option to indicate to fetch secret IDs based on folder ID (https://github.com/ansible-collections/community.general/issues/6223). -- tss lookup plugin - allow to fetch secret by path. Previously, we could not fetch secret by path but now use ``secret_path`` option to indicate to fetch secret by secret path (https://github.com/ansible-collections/community.general/pull/6881). -- unixy callback plugin - add support for ``check_mode_markers`` option (https://github.com/ansible-collections/community.general/pull/7179). -- vardict module utils - added convenience methods to ``VarDict`` (https://github.com/ansible-collections/community.general/pull/6647). -- xenserver_guest_info - minor refactor removing unnecessary code statements (https://github.com/ansible-collections/community.general/pull/6928). -- xenserver_guest_powerstate - minor refactor removing unnecessary code statements (https://github.com/ansible-collections/community.general/pull/6928). -- yum_versionlock - add support to pin specific package versions instead of only the package itself (https://github.com/ansible-collections/community.general/pull/6861, https://github.com/ansible-collections/community.general/issues/4470). - -Breaking Changes / Porting Guide --------------------------------- - -- collection_version lookup plugin - remove compatibility code for ansible-base 2.10 and ansible-core 2.11 (https://github.com/ansible-collections/community.general/pull/7269). -- gitlab_project - add ``default_branch`` support for project update. If you used the module so far with ``default_branch`` to update a project, the value of ``default_branch`` was ignored. Make sure that you either do not pass a value if you are not sure whether it is the one you want to have to avoid unexpected breaking changes (https://github.com/ansible-collections/community.general/pull/7158). -- selective callback plugin - remove compatibility code for Ansible 2.9 and ansible-core 2.10 (https://github.com/ansible-collections/community.general/pull/7269). -- vardict module utils - ``VarDict`` will no longer accept variables named ``_var``, ``get_meta``, and ``as_dict`` (https://github.com/ansible-collections/community.general/pull/6647). -- version module util - remove fallback for ansible-core 2.11. All modules and plugins that do version collections no longer work with ansible-core 2.11 (https://github.com/ansible-collections/community.general/pull/7269). - -Deprecated Features -------------------- - -- CmdRunner module utils - deprecate ``cmd_runner_fmt.as_default_type()`` formatter (https://github.com/ansible-collections/community.general/pull/6601). -- MH VarsMixin module utils - deprecates ``VarsMixin`` and supporting classes in favor of plain ``vardict`` module util (https://github.com/ansible-collections/community.general/pull/6649). -- ansible_galaxy_install - the ``ack_ansible29`` and ``ack_min_ansiblecore211`` options have been deprecated and will be removed in community.general 9.0.0 (https://github.com/ansible-collections/community.general/pull/7358). -- consul - the ``ack_params_state_absent`` option has been deprecated and will be removed in community.general 10.0.0 (https://github.com/ansible-collections/community.general/pull/7358). -- cpanm - value ``compatibility`` is deprecated as default for parameter ``mode`` (https://github.com/ansible-collections/community.general/pull/6512). -- ejabberd_user - deprecate the parameter ``logging`` in favour of producing more detailed information in the module output (https://github.com/ansible-collections/community.general/pull/7043). -- flowdock - module relies entirely on no longer responsive API endpoints, and it will be removed in community.general 9.0.0 (https://github.com/ansible-collections/community.general/pull/6930). -- proxmox - old feature flag ``proxmox_default_behavior`` will be removed in community.general 10.0.0 (https://github.com/ansible-collections/community.general/pull/6836). -- proxmox_kvm - deprecate the option ``proxmox_default_behavior`` (https://github.com/ansible-collections/community.general/pull/7377). -- redfish_info, redfish_config, redfish_command - the default value ``10`` for the ``timeout`` option is deprecated and will change to ``60`` in community.general 9.0.0 (https://github.com/ansible-collections/community.general/pull/7295). -- redhat module utils - the ``module_utils.redhat`` module is deprecated, as - effectively unused: the ``Rhsm``, ``RhsmPool``, and ``RhsmPools`` classes - will be removed in community.general 9.0.0; the ``RegistrationBase`` class - will be removed in community.general 10.0.0 together with the - ``rhn_register`` module, as it is the only user of this class; this means - that the whole ``module_utils.redhat`` module will be dropped in - community.general 10.0.0, so importing it without even using anything of it - will fail - (https://github.com/ansible-collections/community.general/pull/6663). -- redhat_subscription - the ``autosubscribe`` alias for the ``auto_attach`` option has been - deprecated for many years, although only in the documentation. Officially mark this alias - as deprecated, and it will be removed in community.general 9.0.0 - (https://github.com/ansible-collections/community.general/pull/6646). -- redhat_subscription - the ``pool`` option is deprecated in favour of the - more precise and flexible ``pool_ids`` option - (https://github.com/ansible-collections/community.general/pull/6650). -- rhsm_repository - ``state=present`` has not been working as expected for many years, - and it seems it was not noticed so far; also, "presence" is not really a valid concept - for subscription repositories, which can only be enabled or disabled. Hence, mark the - ``present`` and ``absent`` values of the ``state`` option as deprecated, slating them - for removal in community.general 10.0.0 - (https://github.com/ansible-collections/community.general/pull/6673). -- stackdriver - module relies entirely on no longer existent API endpoints, and it will be removed in community.general 9.0.0 (https://github.com/ansible-collections/community.general/pull/6887). -- webfaction_app - module relies entirely on no longer existent API endpoints, and it will be removed in community.general 9.0.0 (https://github.com/ansible-collections/community.general/pull/6909). -- webfaction_db - module relies entirely on no longer existent API endpoints, and it will be removed in community.general 9.0.0 (https://github.com/ansible-collections/community.general/pull/6909). -- webfaction_domain - module relies entirely on no longer existent API endpoints, and it will be removed in community.general 9.0.0 (https://github.com/ansible-collections/community.general/pull/6909). -- webfaction_mailbox - module relies entirely on no longer existent API endpoints, and it will be removed in community.general 9.0.0 (https://github.com/ansible-collections/community.general/pull/6909). -- webfaction_site - module relies entirely on no longer existent API endpoints, and it will be removed in community.general 9.0.0 (https://github.com/ansible-collections/community.general/pull/6909). +Callback +~~~~~~~~ -Removed Features (previously deprecated) ----------------------------------------- +- community.general.default_without_diff - The default ansible callback without diff output. +- community.general.timestamp - Adds simple timestamp for each header. -- The collection no longer supports ansible-core 2.11 and ansible-core 2.12. Parts of the collection might still work on these ansible-core versions, but others might not (https://github.com/ansible-collections/community.general/pull/7269). -- ansible_galaxy_install - support for Ansible 2.9 and ansible-base 2.10 has been removed (https://github.com/ansible-collections/community.general/pull/7358). -- consul - when ``state=absent``, the options ``script``, ``ttl``, ``tcp``, ``http``, and ``interval`` can no longer be specified (https://github.com/ansible-collections/community.general/pull/7358). -- gconftool2 - ``state=get`` has been removed. Use the module ``community.general.gconftool2_info`` instead (https://github.com/ansible-collections/community.general/pull/7358). -- gitlab_runner - remove the default value for the ``access_level`` option. To restore the previous behavior, explicitly set it to ``ref_protected`` (https://github.com/ansible-collections/community.general/pull/7358). -- htpasswd - removed code for passlib <1.6 (https://github.com/ansible-collections/community.general/pull/6901). -- manageiq_polices - ``state=list`` has been removed. Use the module ``community.general.manageiq_policies_info`` instead (https://github.com/ansible-collections/community.general/pull/7358). -- manageiq_tags - ``state=list`` has been removed. Use the module ``community.general.manageiq_tags_info`` instead (https://github.com/ansible-collections/community.general/pull/7358). -- mh.mixins.cmd module utils - the ``ArgFormat`` class has been removed (https://github.com/ansible-collections/community.general/pull/7358). -- mh.mixins.cmd module utils - the ``CmdMixin`` mixin has been removed. Use ``community.general.plugins.module_utils.cmd_runner.CmdRunner`` instead (https://github.com/ansible-collections/community.general/pull/7358). -- mh.mixins.cmd module utils - the mh.mixins.cmd module utils has been removed after all its contents were removed (https://github.com/ansible-collections/community.general/pull/7358). -- mh.module_helper module utils - the ``CmdModuleHelper`` and ``CmdStateModuleHelper`` classes have been removed. Use ``community.general.plugins.module_utils.cmd_runner.CmdRunner`` instead (https://github.com/ansible-collections/community.general/pull/7358). -- proxmox module utils - removed unused imports (https://github.com/ansible-collections/community.general/pull/6873). -- xfconf - the deprecated ``disable_facts`` option was removed (https://github.com/ansible-collections/community.general/pull/7358). +Connection +~~~~~~~~~~ -Bugfixes --------- +- community.general.incus - Run tasks in Incus instances via the Incus CLI. -- CmdRunner module utils - does not attempt to resolve path if executable is a relative or absolute path (https://github.com/ansible-collections/community.general/pull/7200). -- MH DependencyMixin module utils - deprecation notice was popping up for modules not using dependencies (https://github.com/ansible-collections/community.general/pull/6644, https://github.com/ansible-collections/community.general/issues/6639). -- bitwarden lookup plugin - the plugin made assumptions about the structure of a Bitwarden JSON object which may have been broken by an update in the Bitwarden API. Remove assumptions, and allow queries for general fields such as ``notes`` (https://github.com/ansible-collections/community.general/pull/7061). -- cmd_runner module utils - when a parameter in ``argument_spec`` has no type, meaning it is implicitly a ``str``, ``CmdRunner`` would fail trying to find the ``type`` key in that dictionary (https://github.com/ansible-collections/community.general/pull/6968). -- cobbler inventory plugin - fix calculation of cobbler_ipv4/6_address (https://github.com/ansible-collections/community.general/pull/6925). -- composer - fix impossible to run ``working_dir`` dependent commands. The module was throwing an error when trying to run a ``working_dir`` dependent command, because it tried to get the command help without passing the ``working_dir`` (https://github.com/ansible-collections/community.general/issues/3787). -- csv module utils - detects and remove unicode BOM markers from incoming CSV content (https://github.com/ansible-collections/community.general/pull/6662). -- datadog_downtime - presence of ``rrule`` param lead to the Datadog API returning Bad Request due to a missing recurrence type (https://github.com/ansible-collections/community.general/pull/6811). -- ejabberd_user - module was failing to detect whether user was already created and/or password was changed (https://github.com/ansible-collections/community.general/pull/7033). -- ejabberd_user - provide meaningful error message when the ``ejabberdctl`` command is not found (https://github.com/ansible-collections/community.general/pull/7028, https://github.com/ansible-collections/community.general/issues/6949). -- github_deploy_key - fix pagination behaviour causing a crash when only a single page of deploy keys exist (https://github.com/ansible-collections/community.general/pull/7375). -- gitlab_group - the module passed parameters to the API call even when not set. The module is now filtering out ``None`` values to remediate this (https://github.com/ansible-collections/community.general/pull/6712). -- gitlab_group_variable - deleted all variables when used with ``purge=true`` due to missing ``raw`` property in KNOWN attributes (https://github.com/ansible-collections/community.general/issues/7250). -- gitlab_project_variable - deleted all variables when used with ``purge=true`` due to missing ``raw`` property in KNOWN attributes (https://github.com/ansible-collections/community.general/issues/7250). -- icinga2_host - fix a key error when updating an existing host (https://github.com/ansible-collections/community.general/pull/6748). -- ini_file - add the ``follow`` paramter to follow the symlinks instead of replacing them (https://github.com/ansible-collections/community.general/pull/6546). -- ini_file - fix a bug where the inactive options were not used when possible (https://github.com/ansible-collections/community.general/pull/6575). -- ipa_dnszone - fix 'idnsallowsyncptr' key error for reverse zone (https://github.com/ansible-collections/community.general/pull/6906, https://github.com/ansible-collections/community.general/issues/6905). -- kernel_blacklist - simplified the mechanism to update the file, fixing the error (https://github.com/ansible-collections/community.general/pull/7382, https://github.com/ansible-collections/community.general/issues/7362). -- keycloak module util - fix missing ``http_agent``, ``timeout``, and ``validate_certs`` ``open_url()`` parameters (https://github.com/ansible-collections/community.general/pull/7067). -- keycloak module utils - fix ``is_struct_included`` handling of lists of lists/dictionaries (https://github.com/ansible-collections/community.general/pull/6688). -- keycloak module utils - the function ``get_user_by_username`` now return the user representation or ``None`` as stated in the documentation (https://github.com/ansible-collections/community.general/pull/6758). -- keycloak_authentication - fix Keycloak authentication flow (step or sub-flow) indexing during update, if not specified by the user (https://github.com/ansible-collections/community.general/pull/6734). -- keycloak_client inventory plugin - fix missing client secret (https://github.com/ansible-collections/community.general/pull/6931). -- ldap_search - fix string normalization and the ``base64_attributes`` option on Python 3 (https://github.com/ansible-collections/community.general/issues/5704, https://github.com/ansible-collections/community.general/pull/7264). -- locale_gen - now works for locales without the underscore character such as ``C.UTF-8`` (https://github.com/ansible-collections/community.general/pull/6774, https://github.com/ansible-collections/community.general/issues/5142, https://github.com/ansible-collections/community.general/issues/4305). -- lvol - add support for percentage of origin size specification when creating snapshot volumes (https://github.com/ansible-collections/community.general/issues/1630, https://github.com/ansible-collections/community.general/pull/7053). -- lxc connection plugin - now handles ``remote_addr`` defaulting to ``inventory_hostname`` correctly (https://github.com/ansible-collections/community.general/pull/7104). -- lxc connection plugin - properly evaluate options (https://github.com/ansible-collections/community.general/pull/7369). -- machinectl become plugin - mark plugin as ``require_tty`` to automatically disable pipelining, with which this plugin is not compatible (https://github.com/ansible-collections/community.general/issues/6932, https://github.com/ansible-collections/community.general/pull/6935). -- mail - skip headers containing equals characters due to missing ``maxsplit`` on header key/value parsing (https://github.com/ansible-collections/community.general/pull/7303). -- memset module utils - make compatible with ansible-core 2.17 (https://github.com/ansible-collections/community.general/pull/7379). -- nmap inventory plugin - fix ``get_option`` calls (https://github.com/ansible-collections/community.general/pull/7323). -- nmap inventory plugin - now uses ``get_option`` in all cases to get its configuration information (https://github.com/ansible-collections/community.general/pull/7119). -- nmcli - fix bond option ``xmit_hash_policy`` (https://github.com/ansible-collections/community.general/pull/6527). -- nmcli - fix support for empty list (in compare and scrape) (https://github.com/ansible-collections/community.general/pull/6769). -- nsupdate - fix a possible ``list index out of range`` exception (https://github.com/ansible-collections/community.general/issues/836). -- oci_utils module util - fix inappropriate logical comparison expressions and makes them simpler. The previous checks had logical short circuits (https://github.com/ansible-collections/community.general/pull/7125). -- oci_utils module utils - avoid direct type comparisons (https://github.com/ansible-collections/community.general/pull/7085). -- onepassword - fix KeyError exception when trying to access value of a field that is not filled out in OnePassword item (https://github.com/ansible-collections/community.general/pull/7241). -- openbsd_pkg - the pkg_info(1) behavior has changed in OpenBSD >7.3. The error message ``Can't find`` should not lead to an error case (https://github.com/ansible-collections/community.general/pull/6785). -- pacman - module recognizes the output of ``yay`` running as ``root`` (https://github.com/ansible-collections/community.general/pull/6713). -- portage - fix ``changed_use`` and ``newuse`` not triggering rebuilds (https://github.com/ansible-collections/community.general/issues/6008, https://github.com/ansible-collections/community.general/pull/6548). -- pritunl module utils - fix incorrect URL parameter for orgnization add method (https://github.com/ansible-collections/community.general/pull/7161). -- proxmox - fix error when a configuration had no ``template`` field (https://github.com/ansible-collections/community.general/pull/6838, https://github.com/ansible-collections/community.general/issues/5372). -- proxmox module utils - add logic to detect whether an old Promoxer complains about the ``token_name`` and ``token_value`` parameters and provide a better error message when that happens (https://github.com/ansible-collections/community.general/pull/6839, https://github.com/ansible-collections/community.general/issues/5371). -- proxmox module utils - fix proxmoxer library version check (https://github.com/ansible-collections/community.general/issues/6974, https://github.com/ansible-collections/community.general/issues/6975, https://github.com/ansible-collections/community.general/pull/6980). -- proxmox_disk - fix unable to create ``cdrom`` media due to ``size`` always being appended (https://github.com/ansible-collections/community.general/pull/6770). -- proxmox_kvm - ``absent`` state with ``force`` specified failed to stop the VM due to the ``timeout`` value not being passed to ``stop_vm`` (https://github.com/ansible-collections/community.general/pull/6827). -- proxmox_kvm - ``restarted`` state did not actually restart a VM in some VM configurations. The state now uses the Proxmox reboot endpoint instead of calling the ``stop_vm`` and ``start_vm`` functions (https://github.com/ansible-collections/community.general/pull/6773). -- proxmox_kvm - allow creation of VM with existing name but new vmid (https://github.com/ansible-collections/community.general/issues/6155, https://github.com/ansible-collections/community.general/pull/6709). -- proxmox_kvm - when ``name`` option is provided without ``vmid`` and VM with that name already exists then no new VM will be created (https://github.com/ansible-collections/community.general/issues/6911, https://github.com/ansible-collections/community.general/pull/6981). -- proxmox_tasks_info - remove ``api_user`` + ``api_password`` constraint from ``required_together`` as it causes to require ``api_password`` even when API token param is used (https://github.com/ansible-collections/community.general/issues/6201). -- proxmox_template - require ``requests_toolbelt`` module to fix issue with uploading large templates (https://github.com/ansible-collections/community.general/issues/5579, https://github.com/ansible-collections/community.general/pull/6757). -- proxmox_user_info - avoid direct type comparisons (https://github.com/ansible-collections/community.general/pull/7085). -- redfish_info - fix ``ListUsers`` to not show empty account slots (https://github.com/ansible-collections/community.general/issues/6771, https://github.com/ansible-collections/community.general/pull/6772). -- redhat_subscription - use the right D-Bus options for the consumer type when - registering a RHEL system older than 9 or a RHEL 9 system older than 9.2 - and using ``consumer_type`` - (https://github.com/ansible-collections/community.general/pull/7378). -- refish_utils module utils - changing variable names to avoid issues occuring when fetching Volumes data (https://github.com/ansible-collections/community.general/pull/6883). -- rhsm_repository - when using the ``purge`` option, the ``repositories`` - dictionary element in the returned JSON is now properly updated according - to the pruning operation - (https://github.com/ansible-collections/community.general/pull/6676). -- rundeck - fix ``TypeError`` on 404 API response (https://github.com/ansible-collections/community.general/pull/6983). -- selective callback plugin - fix length of task name lines in output always being 3 characters longer than desired (https://github.com/ansible-collections/community.general/pull/7374). -- snap - an exception was being raised when snap list was empty (https://github.com/ansible-collections/community.general/pull/7124, https://github.com/ansible-collections/community.general/issues/7120). -- snap - assume default track ``latest`` in parameter ``channel`` when not specified (https://github.com/ansible-collections/community.general/pull/6835, https://github.com/ansible-collections/community.general/issues/6821). -- snap - change the change detection mechanism from "parsing installation" to "comparing end state with initial state" (https://github.com/ansible-collections/community.general/pull/7340, https://github.com/ansible-collections/community.general/issues/7265). -- snap - fix crash when multiple snaps are specified and one has ``---`` in its description (https://github.com/ansible-collections/community.general/pull/7046). -- snap - fix the processing of the commands' output, stripping spaces and newlines from it (https://github.com/ansible-collections/community.general/pull/6826, https://github.com/ansible-collections/community.general/issues/6803). -- sorcery - fix interruption of the multi-stage process (https://github.com/ansible-collections/community.general/pull/7012). -- sorcery - fix queue generation before the whole system rebuild (https://github.com/ansible-collections/community.general/pull/7012). -- sorcery - latest state no longer triggers update_cache (https://github.com/ansible-collections/community.general/pull/7012). -- terraform - prevents ``-backend-config`` option double encapsulating with ``shlex_quote`` function. (https://github.com/ansible-collections/community.general/pull/7301). -- tss lookup plugin - fix multiple issues when using ``fetch_attachments=true`` (https://github.com/ansible-collections/community.general/pull/6720). -- zypper - added handling of zypper exitcode 102. Changed state is set correctly now and rc 102 is still preserved to be evaluated by the playbook (https://github.com/ansible-collections/community.general/pull/6534). - -Known Issues ------------- - -- Ansible markup will show up in raw form on ansible-doc text output for ansible-core before 2.15. If you have trouble deciphering the documentation markup, please upgrade to ansible-core 2.15 (or newer), or read the HTML documentation on https://docs.ansible.com/ansible/devel/collections/community/general/ (https://github.com/ansible-collections/community.general/pull/6539). +Filter +~~~~~~ -New Plugins ------------ +- community.general.from_ini - Converts INI text input into a dictionary. +- community.general.lists_difference - Difference of lists with a predictive order. +- community.general.lists_intersect - Intersection of lists with a predictive order. +- community.general.lists_symmetric_difference - Symmetric Difference of lists with a predictive order. +- community.general.lists_union - Union of lists with a predictive order. +- community.general.to_ini - Converts a dictionary to the INI file format. Lookup ~~~~~~ -- bitwarden_secrets_manager - Retrieve secrets from Bitwarden Secrets Manager +- community.general.github_app_access_token - Obtain short-lived Github App Access tokens. +- community.general.onepassword_doc - Fetch documents stored in 1Password. + +Test +~~~~ + +- community.general.fqdn_valid - Validates fully-qualified domain names against RFC 1123. New Modules ----------- -- consul_policy - Manipulate Consul policies -- consul_role - Manipulate Consul roles -- facter_facts - Runs the discovery program C(facter) on the remote system and return Ansible facts -- gio_mime - Set default handler for MIME type, for applications using Gnome GIO -- gitlab_instance_variable - Creates, updates, or deletes GitLab instance variables -- gitlab_merge_request - Create, update, or delete GitLab merge requests -- jenkins_build_info - Get information about Jenkins builds -- keycloak_authentication_required_actions - Allows administration of Keycloak authentication required actions -- keycloak_authz_custom_policy - Allows administration of Keycloak client custom Javascript policies via Keycloak API -- keycloak_authz_permission - Allows administration of Keycloak client authorization permissions via Keycloak API -- keycloak_authz_permission_info - Query Keycloak client authorization permissions information -- keycloak_realm_key - Allows administration of Keycloak realm keys via Keycloak API -- keycloak_user - Create and configure a user in Keycloak -- lvg_rename - Renames LVM volume groups -- pnpm - Manage node.js packages with pnpm -- proxmox_pool - Pool management for Proxmox VE cluster -- proxmox_pool_member - Add or delete members from Proxmox VE cluster pools -- proxmox_vm_info - Retrieve information about one or more Proxmox VE virtual machines -- simpleinit_msb - Manage services on Source Mage GNU/Linux +- community.general.consul_acl_bootstrap - Bootstrap ACLs in Consul. +- community.general.consul_auth_method - Manipulate Consul auth methods. +- community.general.consul_binding_rule - Manipulate Consul binding rules. +- community.general.consul_token - Manipulate Consul tokens. +- community.general.django_command - Run Django admin commands. +- community.general.dnf_config_manager - Enable or disable dnf repositories using config-manager. +- community.general.git_config_info - Read git configuration. +- community.general.gitlab_group_access_token - Manages GitLab group access tokens. +- community.general.gitlab_issue - Create, update, or delete GitLab issues. +- community.general.gitlab_label - Creates/updates/deletes GitLab Labels belonging to project or group. +- community.general.gitlab_milestone - Creates/updates/deletes GitLab Milestones belonging to project or group. +- community.general.gitlab_project_access_token - Manages GitLab project access tokens. +- community.general.keycloak_client_rolescope - Allows administration of Keycloak client roles scope to restrict the usage of certain roles to a other specific client applications. +- community.general.keycloak_component_info - Retrive component info in Keycloak. +- community.general.keycloak_realm_rolemapping - Allows administration of Keycloak realm role mappings into groups with the Keycloak API. +- community.general.nomad_token - Manage Nomad ACL tokens. +- community.general.proxmox_node_info - Retrieve information about one or more Proxmox VE nodes. +- community.general.proxmox_storage_contents_info - List content from a Proxmox VE storage. +- community.general.usb_facts - Allows listing information about USB devices. diff --git a/ansible_collections/community/general/CONTRIBUTING.md b/ansible_collections/community/general/CONTRIBUTING.md index 199e90c5b..5363b4dac 100644 --- a/ansible_collections/community/general/CONTRIBUTING.md +++ b/ansible_collections/community/general/CONTRIBUTING.md @@ -31,7 +31,9 @@ Also, consider taking up a valuable, reviewed, but abandoned pull request which * Try committing your changes with an informative but short commit message. * Do not squash your commits and force-push to your branch if not needed. Reviews of your pull request are much easier with individual commits to comprehend the pull request history. All commits of your pull request branch will be squashed into one commit by GitHub upon merge. * Do not add merge commits to your PR. The bot will complain and you will have to rebase ([instructions for rebasing](https://docs.ansible.com/ansible/latest/dev_guide/developing_rebasing.html)) to remove them before your PR can be merged. To avoid that git automatically does merges during pulls, you can configure it to do rebases instead by running `git config pull.rebase true` inside the repository checkout. -* Make sure your PR includes a [changelog fragment](https://docs.ansible.com/ansible/devel/community/development_process.html#creating-changelog-fragments). (You must not include a fragment for new modules or new plugins. Also you shouldn't include one for docs-only changes. If you're not sure, simply don't include one, we'll tell you whether one is needed or not :) ) +* Make sure your PR includes a [changelog fragment](https://docs.ansible.com/ansible/devel/community/collection_development_process.html#creating-a-changelog-fragment). + * You must not include a fragment for new modules or new plugins. Also you shouldn't include one for docs-only changes. (If you're not sure, simply don't include one, we'll tell you whether one is needed or not :) ) + * Please always include a link to the pull request itself, and if the PR is about an issue, also a link to the issue. Also make sure the fragment ends with a period, and begins with a lower-case letter after `-`. (Again, if you don't do this, we'll add suggestions to fix it, so don't worry too much :) ) * Avoid reformatting unrelated parts of the codebase in your PR. These types of changes will likely be requested for reversion, create additional work for reviewers, and may cause approval to be delayed. You can also read [our Quick-start development guide](https://github.com/ansible/community-docs/blob/main/create_pr_quick_start_guide.rst). diff --git a/ansible_collections/community/general/FILES.json b/ansible_collections/community/general/FILES.json index cbe1d8808..87fdd5c9a 100644 --- a/ansible_collections/community/general/FILES.json +++ b/ansible_collections/community/general/FILES.json @@ -109,7 +109,7 @@ "name": ".azure-pipelines/azure-pipelines.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "370fe873607691433d32772c07c53712f66f3745026442838d9d7ca9af953e48", + "chksum_sha256": "48eb26e372a37363159b6a17ba403c830d01c2cb29c106bfa8e9748ad534ff50", "format": 1 }, { @@ -165,7 +165,7 @@ "name": ".github/workflows/ansible-test.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "ef0a066aa753e5667b6b1d4e2887f13add9b692f6373bbac695bcbe43e73e73f", + "chksum_sha256": "80d4eb6531dc8ba6970eb580ad0f0778f91177d100a99ebf29c93b09795338a1", "format": 1 }, { @@ -193,7 +193,7 @@ "name": ".github/BOTMETA.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "5d44cab4aa242ff60409d95adf43c4be0bc3d4eace180b0f04da04bcf2d0e119", + "chksum_sha256": "95b932042b339875673fcbe218094b962576d3900511a041b9b7fb91a858e68c", "format": 1 }, { @@ -312,7 +312,7 @@ "name": "changelogs/changelog.yaml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "cc2e8e92892d291b60d26135122e9017acb600db7f386a6ccd71d77846436776", + "chksum_sha256": "0014fa74832def0e1d47b994b7aee9fbe393a30553ac051acc1f9a2ac886be6a", "format": 1 }, { @@ -326,7 +326,7 @@ "name": "changelogs/config.yaml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e207e9de9d07482a7e441694cf7228b7032639e7c85c56d5d9af454d3bf4e86f", + "chksum_sha256": "f2506c25332d5cf5120aa3ca826b2943747cf9d3d8848b7d1f26065f0ee84661", "format": 1 }, { @@ -802,7 +802,7 @@ "name": "meta/runtime.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "7aed4acf161705fece142c2d79ed08c7a5fdf3239644406203cb494b2e74c7a2", + "chksum_sha256": "bdd7473e27902ea009dac03f604dd957a93413ee0275b561aff956ff26caf391", "format": 1 }, { @@ -865,7 +865,7 @@ "name": "plugins/become/machinectl.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "ec9263bc03779820095278c25e9ecbf9a0b8eaefbc8b3372d2f24750a6dd0169", + "chksum_sha256": "067c3f6db30dc27550874acab3dd46dcd7151d128a6902806d12febb582a9c0a", "format": 1 }, { @@ -890,6 +890,13 @@ "format": 1 }, { + "name": "plugins/become/run0.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "427a697d7ac599466ff675649f806c33a06fe94979dda516e27e3ebdbb454302", + "format": 1 + }, + { "name": "plugins/become/sesu.py", "ftype": "file", "chksum_type": "sha256", @@ -1068,7 +1075,7 @@ "name": "plugins/callback/opentelemetry.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "06ee85c4b296298fc04a5c1fc85408761c5e6c2c2be40fa1302a5148be6aaac4", + "chksum_sha256": "6eb005c02c46afa1b07d7d7861b54496d30ced27113f10b156719b3f151b3014", "format": 1 }, { @@ -1114,6 +1121,13 @@ "format": 1 }, { + "name": "plugins/callback/timestamp.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3c39c34c1071b004138605f290b4cd4da7a34023a6b551dcad2098f9da7deaa5", + "format": 1 + }, + { "name": "plugins/callback/unixy.py", "ftype": "file", "chksum_type": "sha256", @@ -1124,7 +1138,7 @@ "name": "plugins/callback/yaml.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "55f2e5bcd2ef0216231384b40ee1024cc827a71e1d79da82cf42208c5a94fa98", + "chksum_sha256": "1e51212b04fd709f1a7ad42c73757d8a68dd670a6d9bcc001faefc6cc83d7059", "format": 1 }, { @@ -1243,7 +1257,7 @@ "name": "plugins/doc_fragments/consul.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "16c9b8dc132b77db794a3a96cb75b44900671648edf7962e64f49f65b5b263f3", + "chksum_sha256": "04a5d36742f2d94f8e956eff66e36e9a50f915c9a03ae6e24b0a7a1ca8fb873c", "format": 1 }, { @@ -1261,6 +1275,13 @@ "format": 1 }, { + "name": "plugins/doc_fragments/django.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0836d2f746a8b62a1408455fdd54bcbd8f41342eb2f07a681b378b0efef5f3c8", + "format": 1 + }, + { "name": "plugins/doc_fragments/emc.py", "ftype": "file", "chksum_type": "sha256", @@ -1432,7 +1453,7 @@ "name": "plugins/doc_fragments/proxmox.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "37b7c45f450b785105492a38def5db93c9f37b75b00a0c0bc3c0cc6319e8e6bf", + "chksum_sha256": "daa7d15e8a1ffc6e4c539712099537ab9c0f667684d2bcf4ba89e196caf9e460", "format": 1 }, { @@ -1443,13 +1464,6 @@ "format": 1 }, { - "name": "plugins/doc_fragments/rackspace.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "cfca4c2528ec42c0f1c6ae9a67f6f4f76887dbbd44db5f5f1688ee49be5bdbe0", - "format": 1 - }, - { "name": "plugins/doc_fragments/redis.py", "ftype": "file", "chksum_type": "sha256", @@ -1992,7 +2006,7 @@ "name": "plugins/lookup/merge_variables.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "ad758294be13db2a7cf07d9fae8fb187e87f0875360d5c61d909f99d18f707f9", + "chksum_sha256": "51f19a61631b9c6932c81608694e5a0a044f7a9d953bda2c60aa7bbc74630eca", "format": 1 }, { @@ -2132,7 +2146,7 @@ "name": "plugins/module_utils/mh/mixins/deps.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "3aaf0f3bee07c87b4e9108cb474bcb96b715bbad0e77f578987d71ce7fe8dbdf", + "chksum_sha256": "bdf853ce77b23f077e4db35e1db8a9f3698c8daa28f39703704e161ffeba1d8c", "format": 1 }, { @@ -2146,7 +2160,7 @@ "name": "plugins/module_utils/mh/mixins/vars.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "a34c555587e819fa58b076b872b7d7ae05e129818a98b259ead8c4f1a2fbc733", + "chksum_sha256": "7bfa206ebd47e9170e6d445f2f4eb6158b4d671b9df038916a06515d97ca68fb", "format": 1 }, { @@ -2174,7 +2188,7 @@ "name": "plugins/module_utils/mh/module_helper.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "f5070037ffb959097becab8baac019d21ee6fbb305f46f687977500fbcd5fa5f", + "chksum_sha256": "7cfecdcceb7062f7f4fec2037ac3cf1c25e1f102b58b5c14a48c281be46ef4d4", "format": 1 }, { @@ -2328,7 +2342,7 @@ "name": "plugins/module_utils/cmd_runner.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "62306950ca87a1a83c8e7bb6e3072609181175687ac02e4ad30de2481112b5e4", + "chksum_sha256": "9b9f5d0e0ed818b1bdc80e8a6a4a858ba23f92bcaf6d5b224073b4e4a5de1e4c", "format": 1 }, { @@ -2374,10 +2388,17 @@ "format": 1 }, { + "name": "plugins/module_utils/django.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "78e63b0a1b6304d42171f878bcb50bfd1ff96bfead0ba41220c0b43b6ad1f7cb", + "format": 1 + }, + { "name": "plugins/module_utils/gandi_livedns_api.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "77ca8211234201bd301a6728b0e7943ddba5e1c946f8b4c603a1035527fc8ff9", + "chksum_sha256": "dd137070737fc1a2da7e03195defcc4a89f8ddb2bb774b7428ba495154ca880b", "format": 1 }, { @@ -2398,7 +2419,7 @@ "name": "plugins/module_utils/gitlab.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "f0edcbd8ae4a68f9c003e48360e3c4247768a801e34580ed035d04f15d6857a4", + "chksum_sha256": "8fc9d765547b03fd9a9902aea741cb6e093f9e31ef621136da55ea5d5218e5ce", "format": 1 }, { @@ -2409,6 +2430,13 @@ "format": 1 }, { + "name": "plugins/module_utils/homebrew.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "4b44f82f141fcc6094b883a2837acb107ba9bf1712c8bf9ec1058f8da65ac888", + "format": 1 + }, + { "name": "plugins/module_utils/hwc_utils.py", "ftype": "file", "chksum_type": "sha256", @@ -2503,7 +2531,7 @@ "name": "plugins/module_utils/module_helper.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "7eb6f642db5f83ec87a06e04f8d62436a9eec0058cff531cdebf20865c571b09", + "chksum_sha256": "cf731e21c346c5c06726b4610c8c55c5833c92491f8659dab7515b267291a901", "format": 1 }, { @@ -2566,7 +2594,7 @@ "name": "plugins/module_utils/puppet.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "d0c7e2106d6247342b11f2de422240b828a122acd98d9c4ffe5b91899b8893ff", + "chksum_sha256": "6d7a9eff010096b299b458427dc2e20a6c0be50527a1f32b9f7ba621e16134da", "format": 1 }, { @@ -2577,10 +2605,10 @@ "format": 1 }, { - "name": "plugins/module_utils/rax.py", + "name": "plugins/module_utils/python_runner.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "80bd4c38be7acfedc8542a541c753c87753b249419e06eb20c13884e643408b3", + "chksum_sha256": "17e95f6bb431a79a1383d0e29d14cf11a1a4e18ef32af51fb62e62b5831fb4db", "format": 1 }, { @@ -2594,7 +2622,7 @@ "name": "plugins/module_utils/redhat.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "43b96c1bce480ed6f9ed9d2a9aafed370295838ed6e5c235e0b7ca3381baf5aa", + "chksum_sha256": "29dd2363092ce6ae24719c3c1b442012ea9b75fb07b1dcc099b71aff1467cd7f", "format": 1 }, { @@ -2608,7 +2636,7 @@ "name": "plugins/module_utils/rundeck.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0718e463e10a42f9ded1851f689829e05f101ed42888f1abb5c058a90a52fe7e", + "chksum_sha256": "f783c1667e85f96c15841bebca24d26da30fc4e31ba647ba8235da209f7bf27b", "format": 1 }, { @@ -2657,7 +2685,7 @@ "name": "plugins/module_utils/vardict.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "d784bdbf44eb700303730e03a0c0082dcdd52c65c076bbdb5088eb79d556c4a2", + "chksum_sha256": "18eca4737619cdceeca1743bb2b0df8d350484fbec5c45decd5bbd5a1bff005e", "format": 1 }, { @@ -2748,7 +2776,7 @@ "name": "plugins/modules/aix_lvol.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "0e9cb99ceb284742b25feb71e5a105881cf8a31d5601e09dc7666106337b5449", + "chksum_sha256": "bbedcb9530c08fc7f9e7fd2e3344da447c1ed3268e6ad9a0aed8da88372b5f85", "format": 1 }, { @@ -2783,7 +2811,7 @@ "name": "plugins/modules/ansible_galaxy_install.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "b69574b683937c5b7dbc4d541886fb370d8942f0d37c26bfee469456414d8022", + "chksum_sha256": "7d6e02e1a7306d048c97e5e9f2e5553fe8ece50ded61a39f014af2fecd51da2a", "format": 1 }, { @@ -2818,7 +2846,7 @@ "name": "plugins/modules/apt_rpm.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "f0570e79b53c66ebfb69e175ff0edb87f3ea9c10ce4efc791ed0720644459350", + "chksum_sha256": "87b7c57c6799012635a126204e30cb04d843d6ee13a5c73e2e4ae2d4bbb78bc3", "format": 1 }, { @@ -2923,7 +2951,7 @@ "name": "plugins/modules/btrfs_subvolume.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "ef8b5869c7b17e906409346ace86ccba1686bccea5f4f7ae90c7d40744b9fcce", + "chksum_sha256": "e3453e87bb110f6d223d4fc3e1603707d6be96e29436274d09b44b0466a81e5b", "format": 1 }, { @@ -3063,7 +3091,7 @@ "name": "plugins/modules/cloudflare_dns.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "bfe75b2d6815280e55121b0958c219cca514b7d2498ad38b0bafd1ff3581dde1", + "chksum_sha256": "b31a62d880737f33437b2dbbc57286a9603ef9771fcdf1e7ec55ff8f6ede6baf", "format": 1 }, { @@ -3133,28 +3161,28 @@ "name": "plugins/modules/consul_policy.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "9fde6fe3a216b54e45b2946d83bb3d377ad73c094ef0f11ae374b240272b36b2", + "chksum_sha256": "05fcd6bd9085bb781d7f9bdc8a808f1e63f493d018299ce3dcb6a8c7f89ae729", "format": 1 }, { "name": "plugins/modules/consul_role.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "c4f9290e7af434c6f9431da4ebae95a5acf1857fcffe99340737e2748f3ebde2", + "chksum_sha256": "f18b68eab0c232b18fefe5d66164dfa49e4e9c11396616200e23b0774c98c5ae", "format": 1 }, { "name": "plugins/modules/consul_session.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "bf47bd1c93f8b046b6b744eae2972a221f74b4c3ff79c3c9557c243ab1de8ce3", + "chksum_sha256": "81d9abf14083b0a074f1eb49bab6783a58c3b204260a93f4ca374557efc4b6d5", "format": 1 }, { "name": "plugins/modules/consul_token.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "209599b1c6016b6758413d349c547b3483d6adee030c39824e3fbb23753fdf20", + "chksum_sha256": "8572e2337ce15303534844ed997859fc6e26b3b5537ea80fbea280f1bfa17419", "format": 1 }, { @@ -3168,7 +3196,7 @@ "name": "plugins/modules/cpanm.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "876e283af86e02ac15cd33a266827b173a6537807fe0c1f7f6ae7c47f04a2f63", + "chksum_sha256": "6cdbd7b1b70e4313064f5a409c989c8a45eb43c91b8cc4413ef47d08c289238a", "format": 1 }, { @@ -3242,10 +3270,17 @@ "format": 1 }, { + "name": "plugins/modules/django_command.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "2d3a5411d94f19ca456b07b87d15855f5f5a7e4f9689c26281dca8723f079c89", + "format": 1 + }, + { "name": "plugins/modules/django_manage.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "f4bb7005611249c174550fa37b5f889c610b2c9b43a91357a549212983518ed4", + "chksum_sha256": "de348d4b89f74e04e326b92e81679553f8cf4ae497af025cd7f986dca12af459", "format": 1 }, { @@ -3368,31 +3403,24 @@ "format": 1 }, { - "name": "plugins/modules/flowdock.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "10c9409960f0d5596746d6452e62cc8e9061be52746eca51eded7acf4675c299", - "format": 1 - }, - { "name": "plugins/modules/gandi_livedns.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "3f2c3fb34518d6c96b87de85eed6fe35dedd51f7a4296b92c0e900c216a5611d", + "chksum_sha256": "1fce07336b93fd15824223254e8728602ceb0767463fa1048f035d797373f396", "format": 1 }, { "name": "plugins/modules/gconftool2.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "ec975973c83bd7130c8fcf2b4176a9b28017e43448852a8b61464f1278f0dcab", + "chksum_sha256": "962a743f1dd645556dabba645f4471dc0327aa841576f814c1ee7c86a42d713b", "format": 1 }, { "name": "plugins/modules/gconftool2_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "d720513958b1ce71503a8826fdd50e81c19c1fbbc19ac20f9164fe0841dcf212", + "chksum_sha256": "4665218f56e9722f3929c75b21ef668502a2521204e8b2684709838b425b1f6e", "format": 1 }, { @@ -3602,7 +3630,7 @@ "name": "plugins/modules/gitlab_runner.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "53194f5b56d5cf12630f312b1d8af77dd883d1910a50ae91577f5857e2de6f9c", + "chksum_sha256": "c5fd5ab6207b5b061fe8fee6d33db0f676590bae7b31e55bf45902b2cddb117a", "format": 1 }, { @@ -3658,14 +3686,14 @@ "name": "plugins/modules/homebrew.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "daf7098503d9cc6414a32fe5bf895506264c1dcb9bdd008842e111de5b0279d2", + "chksum_sha256": "98ae30cdc14eedb6c381c081a98dbb6ffc6ba2829f37d3315cb7c352c2607b37", "format": 1 }, { "name": "plugins/modules/homebrew_cask.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "6f5750acbb0afa275d2564e270c28f6afe1202e337e50a0ea0403fafc5cbedfe", + "chksum_sha256": "d998aab283569425e1c9da2b2189808b7910da211508b3dda08aed5c7941b33f", "format": 1 }, { @@ -3707,7 +3735,7 @@ "name": "plugins/modules/hponcfg.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "b8e6e150c96dad033824e7157cd1a31e079064f8e712af23815455e6377cfd61", + "chksum_sha256": "9063370c9a8f82e3b9d53519a01277cee764f057932c0fefa5da8ed35860f2bd", "format": 1 }, { @@ -3966,7 +3994,7 @@ "name": "plugins/modules/installp.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "8c8d4f1272851b63589575bb29db5dca18627fab5f04c26e3917a14960ac2224", + "chksum_sha256": "fc3cabbbd25dd3bf4192b82391df7354146b5aadb199b3cf18c07c4a9c3c1613", "format": 1 }, { @@ -4162,7 +4190,7 @@ "name": "plugins/modules/irc.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "baf14942dc3f145739b1c8a666e9eb876d33eabfa552455a450c64e891a5f4fc", + "chksum_sha256": "f92ac90d9bbb3afe6eae306a71f32b618c42e254dabfa58b5f18a62701607f78", "format": 1 }, { @@ -4274,7 +4302,7 @@ "name": "plugins/modules/kernel_blacklist.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "587992974b9adf733a25ee79241b68786b1425efa422ad6d4cd6d75e4c3b3a2a", + "chksum_sha256": "b66b3cf5de6d10848b783e0df64104798ae86bf0ca8a307c86e8d71d02a4c50c", "format": 1 }, { @@ -4323,7 +4351,7 @@ "name": "plugins/modules/keycloak_client.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "9065934124dc12b01077cd9c2caea2640c2f76a5d00541af2a1b1500cbbcba57", + "chksum_sha256": "7870103accbfbd0204f1b7adeee0e20b9a6b8cddad0edda0bd31ec252572f186", "format": 1 }, { @@ -4393,7 +4421,7 @@ "name": "plugins/modules/keycloak_identity_provider.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "fdcb1beb383507dad083dd2ee7ede5f0fc1df884f8ae5548a0740b0cc4fdf5c2", + "chksum_sha256": "05f1030efe66d6f0a18689d63b22295169c31ab9a469b87088ef664706ea91cf", "format": 1 }, { @@ -4442,7 +4470,7 @@ "name": "plugins/modules/keycloak_user_federation.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "1c7c871ab324312ba3730df9a30bd017220a89a09282d465ee6dbc234402181f", + "chksum_sha256": "935a9ded4d3ae8651ff215f28aa0d9e420a1643081b2c7d3e0fa6332b83eae84", "format": 1 }, { @@ -4519,7 +4547,7 @@ "name": "plugins/modules/ldap_search.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "6d79f510a11d341738466cfbf4f59a6bda3d5bd4df45f3692b0653ab37d81946", + "chksum_sha256": "d4389e9402a1d367a1069c81319bbb6864f23cc9a6388922f04365eaeb002ce2", "format": 1 }, { @@ -4561,7 +4589,7 @@ "name": "plugins/modules/locale_gen.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "871d02439c640ec2f3ad62cae96a6093ffbb27d87bf80bb4638bdb2688fb32e6", + "chksum_sha256": "66fcfb84b3417d52cb1fc54cd6fde1bfa3d0ecdc6d4b9664b7a94099585e5976", "format": 1 }, { @@ -4589,7 +4617,7 @@ "name": "plugins/modules/lvg.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "2b6d4d2fcc2a1b942dd81c4527ae89eef09e955f5f7dac84080741e3629c54a0", + "chksum_sha256": "8b55f99113f59765dc7d6a43eda0aca5f22190e4cf0d9685f705c1ea913441e5", "format": 1 }, { @@ -4603,7 +4631,7 @@ "name": "plugins/modules/lvol.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "c1009f4bb6c0c892f867827fd64ac299c644b634ec838d9c52f2a9be0e0ab71d", + "chksum_sha256": "7c931526bbd16c65fe786369e791dfcbe453fdc581acd5da194385e2ec908586", "format": 1 }, { @@ -4631,7 +4659,7 @@ "name": "plugins/modules/lxd_container.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "3421f907d434f83dd6a346507a607c5ad7cc0b727673b74badf5003841974b4d", + "chksum_sha256": "7291ced8278ab06dabee884b06aa37846ec6032bc1d45d00bf7e55e397ac513e", "format": 1 }, { @@ -4652,7 +4680,7 @@ "name": "plugins/modules/macports.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "488f95a9d1944fd4aab3aa6cbd32adb06d3727d01c371c9f5d7de00a47ad8fd2", + "chksum_sha256": "f40102fb67c8a753de76477793cab247c16e462533b35cba5641ffe1bab6c64d", "format": 1 }, { @@ -4813,7 +4841,7 @@ "name": "plugins/modules/mksysb.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "411a53424247600bae0a604ae3fecec02afb97d91283cd389e44310ab8a8d977", + "chksum_sha256": "53c173b29bdd8e2ef4ffc2d446a2330b7b20bb7ff0bce830892a3e778347705b", "format": 1 }, { @@ -5226,7 +5254,7 @@ "name": "plugins/modules/opkg.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "6fafc31bdc0f356419069a1b9f7c4f56d7ea2ba5059eecf3ebda5989b314f8a3", + "chksum_sha256": "b30c69db03c0ee20399e242e050b00f90a2d80ba31ad0d20ced0ea15ce1870a7", "format": 1 }, { @@ -5366,7 +5394,7 @@ "name": "plugins/modules/parted.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "d7a222fa387aae5a78895f665d587f84416ad11f90b049a6d08b4ad8eca1886a", + "chksum_sha256": "fcb7ec22fb13a7c15738a296120581204f2ead2fa63ab1736ef3938d74b932c3", "format": 1 }, { @@ -5401,21 +5429,21 @@ "name": "plugins/modules/pipx.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "4c808a7b43647413be9b220f668517b0a0c263038c5c61e757af52b989942760", + "chksum_sha256": "e569818bfa803569a24e9a97033f369486f3119a84ce09343e59127729aa3c1c", "format": 1 }, { "name": "plugins/modules/pipx_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "85e936162c11a4fd2736b26644903c3533842d31d92c3a6161dc29ef0f36f3ed", + "chksum_sha256": "f92a24ebc20accf94de8b1b5dab13dc4387a71901fcf751dd48a6068bffd28b6", "format": 1 }, { "name": "plugins/modules/pkg5.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "64feebf19704a6c42841471d1b0cf4f398f7410361541c91d274a35d01813d43", + "chksum_sha256": "e6ad2a1d12ddb2f615609d086765f61a1b575ead60739434fc89477e8688ac87", "format": 1 }, { @@ -5429,7 +5457,7 @@ "name": "plugins/modules/pkgin.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "1cf640944de02dc6028c8a0130bff6a3de7ee26a2dc6045b45950514e0bf8812", + "chksum_sha256": "243f01c0ed2ef3648375458f7949874ecb4ab89bd0ad824c84eff543ce5219e3", "format": 1 }, { @@ -5471,7 +5499,7 @@ "name": "plugins/modules/portinstall.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "d0fff5d00287f10a07a7108260e747d3ea02eb79f3f56eba22bb382d9657f5fd", + "chksum_sha256": "542489c4dd465b6322717c244bce1d85819bdfc882176cd388ef5b5defae377f", "format": 1 }, { @@ -5541,112 +5569,112 @@ "name": "plugins/modules/proxmox.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "cbaf13c0a56641888d956a3f66827656027362667c00a5da98cfd9fb9c53709c", + "chksum_sha256": "62c447303cb615080f4286576bc232c4afe5b20076efe92e9c2760d0fac13364", "format": 1 }, { "name": "plugins/modules/proxmox_disk.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "7eaf98c0876bdf7959cf06e68dbe617c86dd61c45dd1614d86ced3a3b00c8a6e", + "chksum_sha256": "fa088e1c9c1b25860531667e2f7cb9b408fe605bc7cb4969d4c741ac6e1f41f7", "format": 1 }, { "name": "plugins/modules/proxmox_domain_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "8c15c31af9b758101cd6598e626cc8245d01998205e24a36037e71ba212fbbb1", + "chksum_sha256": "74f66feaa8dae01d745fe0edc17bffe2d62f28007f93a738bdd6e877c46e3584", "format": 1 }, { "name": "plugins/modules/proxmox_group_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "35430f3908046b38ff12572e85bd305b0d477bbde47066fb522ee8984b3dafe4", + "chksum_sha256": "6a4ce8142e20132aae5b1eccda03bfbb5a059f783a9c8164161173890e4581db", "format": 1 }, { "name": "plugins/modules/proxmox_kvm.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "c148eb6fca047327772da3210a9fe947c4a14fda1405836f0f4c3ffa58da5385", + "chksum_sha256": "030cd0ca64eb1eac59e15bd62ce58239e6466b01391a6abc314feff1c8a32614", "format": 1 }, { "name": "plugins/modules/proxmox_nic.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "52492a58319b75a634c109c5951be0f9fd1bfced0ac6ee97d00b103ab76087ff", + "chksum_sha256": "b65d963ab60b4ed6e0ac0e991c30b6e71fea0847a10e0e53e46e28d93b246f65", "format": 1 }, { "name": "plugins/modules/proxmox_node_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "3f7053d278a05a60894b5cddb8091e09a27f6d6070b1f41282259cabb41960a1", + "chksum_sha256": "55d4166c1f372896d375efed2e0fdbaa415b9a5e410bb1b5db80816a6917ffeb", "format": 1 }, { "name": "plugins/modules/proxmox_pool.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "83e86f259c2483e804efbe2966ead9e2eb38b3e1007ff6420e647eb57c6e4e17", + "chksum_sha256": "199414912145e8ba5020db36acd042f619a3d313642f05bc30407f280d5c731f", "format": 1 }, { "name": "plugins/modules/proxmox_pool_member.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "77fdae49fd415dc3a8f88139a023bb2c2180d5d60f7b493aba9ddd25b3e6fb52", + "chksum_sha256": "d1c49690874a6774181bae82fbe9cbf34bfcdd9e71046db98e1dbccdc719c00e", "format": 1 }, { "name": "plugins/modules/proxmox_snap.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "a79a064dc6522db3c959e678ae66e54e8fe113fa6cca38c379824f429a9230c2", + "chksum_sha256": "a1973a4724bff339c462cea5349ea7b8a5c191577cf2d18bbb6c3c19d022cf60", "format": 1 }, { "name": "plugins/modules/proxmox_storage_contents_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "207afdc6920a8da3a49b025dade19f6da69bccecee48ef4c1e8508c3baa3a509", + "chksum_sha256": "00e2d01f956ca77f3dfc9e5da347406feb15e05d634001972a16fb026263bf5c", "format": 1 }, { "name": "plugins/modules/proxmox_storage_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "d860af5716ba13e1c0260dba4bcfb4e31d33c9c667063860565166d0ea766d72", + "chksum_sha256": "5f98b53b27f0b83b1a4752508981405948da2523892e150051e6fddeec9a09ee", "format": 1 }, { "name": "plugins/modules/proxmox_tasks_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "781bdf531b30904b52fde1a5da54433b2c812b6efed34ead3733149f7b16dfbf", + "chksum_sha256": "5df3ecdf411646f553a391b3e6c7ab0f4049fd13f96214451c6817c90b0daf23", "format": 1 }, { "name": "plugins/modules/proxmox_template.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "9c24e106b6dbcfb6a8d5830b7240c6c39bf6959f56591d8ad21cf4023a3cedd6", + "chksum_sha256": "112bfc675f756efcca0e21ef96d1d6669e5bdfb31b44108d6f916bc6e19fd190", "format": 1 }, { "name": "plugins/modules/proxmox_user_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "085403351a23432173b41649b7bedd8653d48a4f690b427751f4ab09a99195d5", + "chksum_sha256": "ade5222d85a933e7cf8e26d08a5c51285b697aec7a83402f1e69ade3efbd7fc8", "format": 1 }, { "name": "plugins/modules/proxmox_vm_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "4850ad8b78e13bee186bcb49d2e9682723b86ca3fbf4dfba67d4760fc14fdfca", + "chksum_sha256": "9bb1491ad5da16bd483f659726e5d99a29ac784a23f615244165ad4d9bde0120", "format": 1 }, { @@ -5667,7 +5695,7 @@ "name": "plugins/modules/puppet.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "2e8fa36104ad52a85bcbfffadfe873b1dadf91eb5e9f5e1fe843e712ec972708", + "chksum_sha256": "4910c9548d2727ddeb25caf1c90a94a7bc99c98877d3042a00394ab59bf8351c", "format": 1 }, { @@ -5692,188 +5720,6 @@ "format": 1 }, { - "name": "plugins/modules/rax.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "d5d71364c01d578d124b4f7064cb0850562144e68bb8f8a62000132703cf2776", - "format": 1 - }, - { - "name": "plugins/modules/rax_cbs.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "be5f3f94c241633837d888da6abb20f1c54d204f0077147efba813a56f835906", - "format": 1 - }, - { - "name": "plugins/modules/rax_cbs_attachments.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "bb83467fd0fdaf72e0ecdb7ccfe67e73b365edeee122cb339f06718364ea1a50", - "format": 1 - }, - { - "name": "plugins/modules/rax_cdb.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "1a761ea8d19fb0492b758b4408be987712f64078f367ad9fd1e00d434aaa5bc0", - "format": 1 - }, - { - "name": "plugins/modules/rax_cdb_database.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "83ad50782f35ed29183048e2e16655f14fa5178bef73537b5a08c641b4df9e15", - "format": 1 - }, - { - "name": "plugins/modules/rax_cdb_user.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "50013e448f5b9136937d1cb028de27da11b6e4a68621b3c10be61f0614f7fce6", - "format": 1 - }, - { - "name": "plugins/modules/rax_clb.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "da925aea1e07ae825b7bc40cc2e76feba747bfd173c3c6308c4a169b6a2f4230", - "format": 1 - }, - { - "name": "plugins/modules/rax_clb_nodes.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "4a3dd3afe7a509edf5b1caedc8cb047c3b7493d5b3624a64735054df080c715c", - "format": 1 - }, - { - "name": "plugins/modules/rax_clb_ssl.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "3832d09feaac166d5c2d13e974bef481a931398a016f492637036ce7eac1a4e8", - "format": 1 - }, - { - "name": "plugins/modules/rax_dns.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "2538f8f54a408dd0874028a7af529c3405b537341e5b12cf813ad9c3ae3922fd", - "format": 1 - }, - { - "name": "plugins/modules/rax_dns_record.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "36e1fd0124f8aef93f7cff308588a7c3e31f13485ccc06a97a7a29b23e9d2f67", - "format": 1 - }, - { - "name": "plugins/modules/rax_facts.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "ef7335464fa3a7419b240dfe9e686e2ef4492c066638afe2bec23f196deff45b", - "format": 1 - }, - { - "name": "plugins/modules/rax_files.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "ea66624516f6e40f8e5325587ce6adfd5a7eed178d458952078fbc298e92191a", - "format": 1 - }, - { - "name": "plugins/modules/rax_files_objects.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "52860b588511beb773f68c0986529ab633a7480dc93ecb5e72db9d319b9f22e8", - "format": 1 - }, - { - "name": "plugins/modules/rax_identity.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "6056f23c9de97fc542dd9a3d34153cb19bae33aa4b2748122efc19b091151e70", - "format": 1 - }, - { - "name": "plugins/modules/rax_keypair.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "8ddbde316caea7e8d4471de2f0cf977b9a5095731f6904347fe254b97c8cdee8", - "format": 1 - }, - { - "name": "plugins/modules/rax_meta.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "096049737ae955b66423fd4b3d106c744002e83868dbe94ca5eb38f43cde5d78", - "format": 1 - }, - { - "name": "plugins/modules/rax_mon_alarm.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "8faccb337eb09e5dd3d179227a4f21701fa3ffce159ce1398a65e49cc2f949ab", - "format": 1 - }, - { - "name": "plugins/modules/rax_mon_check.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "966510c6e07ecdc533ae86afe9aaa973f11554a0568766c158c5f77e118d7193", - "format": 1 - }, - { - "name": "plugins/modules/rax_mon_entity.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "f64424b7cd32fafcafaeb1b4c04b33462c50131758d0a94feddee8b30e55c908", - "format": 1 - }, - { - "name": "plugins/modules/rax_mon_notification.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "b4d41086547e52926f63bef2cf657e39bfe7a18609721e6ebb43f11fff33e5fa", - "format": 1 - }, - { - "name": "plugins/modules/rax_mon_notification_plan.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "626442facabc3ed149f70be592093e36c3e347ddf49a6c77b61316253a271b5a", - "format": 1 - }, - { - "name": "plugins/modules/rax_network.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "66f617814f7229b709e6cd393a18ff0c5e295b95e16395134b689b543bfe051b", - "format": 1 - }, - { - "name": "plugins/modules/rax_queue.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "5d47ee58bb21549c6cf732396adca95150332637ddccbd647b6ef3a0804b80b3", - "format": 1 - }, - { - "name": "plugins/modules/rax_scaling_group.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "8cb942ee1f1ea3ea1b45f3699ba09f3fb7827c1376fefefc6f6cd03635c42f64", - "format": 1 - }, - { - "name": "plugins/modules/rax_scaling_policy.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "ee634c11356221ce4ee2b1f65b0d3b4b1faf5f7b4df612df10efd0c525053da6", - "format": 1 - }, - { "name": "plugins/modules/read_csv.py", "ftype": "file", "chksum_type": "sha256", @@ -5884,28 +5730,28 @@ "name": "plugins/modules/redfish_command.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "38a449fe1a3ce5e62028e851bece4137f2f919f2ab6869f0fc23dc09dfd735f2", + "chksum_sha256": "3a06abd918e13f440dcd7bd66a1eae9d77a414aa80dc231eba9ddad2c3fc16d7", "format": 1 }, { "name": "plugins/modules/redfish_config.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "dc243175c35ab4ffa2d385a92972533c5e1d8ab24060d991a4f9a0b8e850133b", + "chksum_sha256": "2a0bad42f9e2ab902beadeb55a1ad309c5e0c1c3f714e6d8f4d483b02d962090", "format": 1 }, { "name": "plugins/modules/redfish_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "bf2d8f80cadc119e53e6b2626d515a09799e4931d0bfc6d39c39020b65b8bf46", + "chksum_sha256": "3f14d5645eb692b829ab83dac5e38eac9ea9fc7bae38f87ffd532ad2e8d49de5", "format": 1 }, { "name": "plugins/modules/redhat_subscription.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "f6de85514d4fd75fa4ce6d76ad7889008d67a5625c3d7e20b62ace3e0df76f57", + "chksum_sha256": "c528d69c6db58dffd6888f30234ab7022f88c2936538fe57ca71da779883240b", "format": 1 }, { @@ -6353,7 +6199,7 @@ "name": "plugins/modules/slackpkg.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "bbe9e23ec032f7a25bdb7b0fd8f20811d08b058d1976def4b5011851229f4d88", + "chksum_sha256": "1ca50585df5578e45594cbfedc789b2b5f12063fa34cad44851bb16fc1c7b471", "format": 1 }, { @@ -6367,14 +6213,14 @@ "name": "plugins/modules/snap.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "6d0a8e28420c83431d829397011eab016d1e2dd482632e43cb00967db7bfdb7c", + "chksum_sha256": "139806babe00b6836e0f630fdcfedf37960b9b29d4c8d4865c91d1a77887528c", "format": 1 }, { "name": "plugins/modules/snap_alias.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "b588f7b2969ce34f0071ab4a8c4a58a883eb165c3f4696c3ed91f3a95d287a0d", + "chksum_sha256": "889e1ff4d1da8e29c100d47a3a82be7d27c098b717e7de76332acbbf051c7d6d", "format": 1 }, { @@ -6434,13 +6280,6 @@ "format": 1 }, { - "name": "plugins/modules/stackdriver.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "260859e428425f3c3ac4bb559a3d4c82273e87301894ac350d8cdf2e193200ab", - "format": 1 - }, - { "name": "plugins/modules/stacki_host.py", "ftype": "file", "chksum_type": "sha256", @@ -6486,14 +6325,14 @@ "name": "plugins/modules/svr4pkg.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "8194a64057dee3897d1d5c74d4dc557128183315f34bb102dbb47f9bdc8de1c4", + "chksum_sha256": "56c3ac1ff64c9da6252c4e749385c6782d1fde4d02df152f9315547e06ec6840", "format": 1 }, { "name": "plugins/modules/swdepot.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "548386259af581cf1c3ded8d4ea2ad595e3cedb5c6c7df3533c59d608161712b", + "chksum_sha256": "76bd0f44688dd5c7e1cc9b932b12c1e3c8a402991044e4d8c34ac136df9574c4", "format": 1 }, { @@ -6812,41 +6651,6 @@ "format": 1 }, { - "name": "plugins/modules/webfaction_app.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "6883576548556701abe0dae9e225b8cfd752d0f228fb9357db083b0ebe26b4a4", - "format": 1 - }, - { - "name": "plugins/modules/webfaction_db.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "40b0caf3268e4866ca3adbd73e29f3f340648eaa267dc52467b36b3215ba9bef", - "format": 1 - }, - { - "name": "plugins/modules/webfaction_domain.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "d46377b3af3d19a097ced017bebe348c843bf715397e18ef5f5d27803f0e696a", - "format": 1 - }, - { - "name": "plugins/modules/webfaction_mailbox.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "966032efd5039669f873f8a33d85573ca7536a261ea3b2eb11e7a1c00978365e", - "format": 1 - }, - { - "name": "plugins/modules/webfaction_site.py", - "ftype": "file", - "chksum_type": "sha256", - "chksum_sha256": "1715e8e46b23d2cacda5560e722957ff3440e1f3800461c94c27c13c0582e325", - "format": 1 - }, - { "name": "plugins/modules/xattr.py", "ftype": "file", "chksum_type": "sha256", @@ -6899,14 +6703,14 @@ "name": "plugins/modules/xfconf.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "dfde9c9bb1f06fc648e437411d5036530781b9753e939a04c2aee066883868b5", + "chksum_sha256": "e39ad342c6eb276e06a4f5f96355962d3bf1ee65919306b4a4ebe0cfdcbb8b5c", "format": 1 }, { "name": "plugins/modules/xfconf_info.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "fe226ac61a1a542d0a68fedbfa614b92953e557a35bc33daa85238f8579200fa", + "chksum_sha256": "8298c11a2fa145f8a1774d08178aaf0470f140074bbacd92143dcada1520bfc2", "format": 1 }, { @@ -7771,6 +7575,34 @@ "format": 1 }, { + "name": "tests/integration/targets/callback_timestamp", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/callback_timestamp/tasks", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/callback_timestamp/tasks/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "59fb52bebe9fcf0239c444a3102565e0951c17b66e804b4f00027661545849e7", + "format": 1 + }, + { + "name": "tests/integration/targets/callback_timestamp/aliases", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "d40d8366b202f652a10750cf49c0db353a8e9f87994196e3415bba3fc231acf4", + "format": 1 + }, + { "name": "tests/integration/targets/callback_yaml", "ftype": "dir", "chksum_type": null, @@ -8376,7 +8208,7 @@ "name": "tests/integration/targets/cpanm/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "653dbd5100adc070f54638e9c11add3e9b1164d35754d1309a2057fc4f78e2ee", + "chksum_sha256": "faa6f84aefea52ab8b9e6508716ffa25fedd4f0f3d1440b1d1afc0b5ebfb45b6", "format": 1 }, { @@ -8670,7 +8502,7 @@ "name": "tests/integration/targets/django_manage/tasks/main.yaml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "acf2895219fc5b757396f9d77d4c878c5b36a574043dd9fbb847937d412725ca", + "chksum_sha256": "e438e0c590ab3275c054f5478d058d45d84766d160a34d1c3036d6197b76c345", "format": 1 }, { @@ -8831,7 +8663,7 @@ "name": "tests/integration/targets/ejabberd_user/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "947101155a8d19ee0d8bf4d74cd963d80ec75d6bd6b7fee8241631f2cf044583", + "chksum_sha256": "cf30d0191fdbcdea15cb4fed557820bc300f423103a460cf45a0329d9cc7be4c", "format": 1 }, { @@ -9937,7 +9769,7 @@ "name": "tests/integration/targets/gandi_livedns/tasks/create_record.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "446bc960f355726f7738046f5265c5a7d6414157a548f6f7f4c5d59ae8220830", + "chksum_sha256": "17221c4ffbf3d7d0fca39430b16cf2af45cd4b592c3614bb8de377b5535e9a15", "format": 1 }, { @@ -9965,7 +9797,7 @@ "name": "tests/integration/targets/gandi_livedns/tasks/update_record.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "8a72b53a9dfd67149da89b1f827a0a922fa09fb56835a6b87da00010fc1c40ff", + "chksum_sha256": "a9c91a60c39152d32812fa5009cae494b88f7e6f899c3108d9376363628c4fc0", "format": 1 }, { @@ -11257,6 +11089,20 @@ "format": 1 }, { + "name": "tests/integration/targets/homebrew/handlers", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/integration/targets/homebrew/handlers/main.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "fc600871f7f35c7a11dcd66037c79ea9d6269cfc5d0fc788eb8e481531bdd9b3", + "format": 1 + }, + { "name": "tests/integration/targets/homebrew/tasks", "ftype": "dir", "chksum_type": null, @@ -11267,21 +11113,28 @@ "name": "tests/integration/targets/homebrew/tasks/casks.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "6dea53684420b39d7e51987f3cb6b74e57a7eec45999c4963d9b9208a518b887", + "chksum_sha256": "494edfbdfb54e5b0a6bce7fb9df26d3d782781f778108c3aef8b779070540f36", + "format": 1 + }, + { + "name": "tests/integration/targets/homebrew/tasks/docker.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "0d278d82d50c06804ac32c230d915a94b5f48f4ffd69dda3a349b89a03b12238", "format": 1 }, { "name": "tests/integration/targets/homebrew/tasks/formulae.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "f3b0ace4227b32e8e9a7c3a35da793720787e2617f21621f8836d88f5d356b80", + "chksum_sha256": "10fcd06a88646913b4c26d724d749f414e36852a44c9f01913ecfc45079427db", "format": 1 }, { "name": "tests/integration/targets/homebrew/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "63b4898f3fec452093d5f26f0d0d2ea42365739d61bbb92ef4973c3115d636f9", + "chksum_sha256": "365fe427f14e14e94b5aacdc0d391ab1a42e75839b081862784f053d5fbacb3c", "format": 1 }, { @@ -13556,7 +13409,7 @@ "name": "tests/integration/targets/keycloak_identity_provider/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "32177a1221cd9929bb79d40beed27c7ec9ac6a21f35767e6e467b6b40594d27f", + "chksum_sha256": "1e540794e75ec59a5f755e39525df423fbd1d5fd55eed5d24d553a532bb05017", "format": 1 }, { @@ -14662,7 +14515,7 @@ "name": "tests/integration/targets/lookup_merge_variables/runme.sh", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "7e7ed20f6d74549dffd00a8f003cfab56317142535b49ff647ec90c0ce8c844e", + "chksum_sha256": "d6c4c416f684874bf12d7c11cdec5e2b259a1bbf057a62a9726fde8a46ef2ae1", "format": 1 }, { @@ -14680,6 +14533,20 @@ "format": 1 }, { + "name": "tests/integration/targets/lookup_merge_variables/test_cross_host_merge_inventory.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "3a64a4122077842c8d48942132c3675e4a6070168f996e13f43c04a740948917", + "format": 1 + }, + { + "name": "tests/integration/targets/lookup_merge_variables/test_cross_host_merge_play.yml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "b5de72989e9b21f89f2b7cbbacbfa50df800bfad9c996b81cab5ad0522feed5e", + "format": 1 + }, + { "name": "tests/integration/targets/lookup_merge_variables/test_inventory_all_hosts.yml", "ftype": "file", "chksum_type": "sha256", @@ -15621,7 +15488,7 @@ "name": "tests/integration/targets/module_helper/library/mdepfail.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "6ccb5898901617cf6976b660ed6025f61d0ae4c73b01beddf1f6946b88c5643c", + "chksum_sha256": "70d8bfa27cad12848db324ae66a12de86abceb01bf06f0fe0fa93b884be2ff62", "format": 1 }, { @@ -15642,7 +15509,7 @@ "name": "tests/integration/targets/module_helper/library/mstate.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "feaf0076b48a59004d93f7e9d18b13b919d2a35b3e4d8ede711f9f3ff9c7a510", + "chksum_sha256": "5903e88c5a2a5904402d121c151d0448f4afdb9dfb648f55335a91d5400ffef3", "format": 1 }, { @@ -20255,7 +20122,7 @@ "name": "tests/integration/targets/snap/tasks/main.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "f8e05e7aa1de2b74a9aab47cbdac6f6053fd59d6113d1e968521544a5b9b8285", + "chksum_sha256": "73e25e2cdcd2e177465f1ac043858749ecabb7cc1b3158e985de0f7767ee7155", "format": 1 }, { @@ -20276,7 +20143,7 @@ "name": "tests/integration/targets/snap/tasks/test_channel.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "06b6a509058dca27433debe5f007f8ea36f69a53ba25ca0f1d5d0bf71ab751ab", + "chksum_sha256": "1b44aa52796d0622449e4dacdc2c3385c34a848d200f1ad6372620656ac4a15c", "format": 1 }, { @@ -22432,7 +22299,7 @@ "name": "tests/sanity/ignore-2.13.txt", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "96fb0c5067f95b7ce1398bd26cc039eedf03fd8309844d7e59dec097ec594a2c", + "chksum_sha256": "b44fa4121d447d611e4099c62f163fa83f7983bbd8a271ddefd8e2c05ff61205", "format": 1 }, { @@ -22446,7 +22313,7 @@ "name": "tests/sanity/ignore-2.14.txt", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "f1746096cd6755590272792fff8aa9884bde3a011fc8c71e24d9d43e6e847e4b", + "chksum_sha256": "0b2cdc0de13edb8c6a5a1dc241f58cadc89ca1bd7378217d3c4116140bcd7704", "format": 1 }, { @@ -22460,7 +22327,7 @@ "name": "tests/sanity/ignore-2.15.txt", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "1960b0bd13753051ea1250ed6b1de8eb19b8f9e57901350c044d9cd884dc66a6", + "chksum_sha256": "df47d504ef24f7ccf8e645e2a330c86642201d942eab2df12a52b584f236eb5e", "format": 1 }, { @@ -22474,7 +22341,7 @@ "name": "tests/sanity/ignore-2.16.txt", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "b49ac32679f36df6f32acffd654013de426897c51bb40e2024c1baa9b6044ae1", + "chksum_sha256": "e549ec441d29f3908b8210c52903dc1db711dc5a16928787e4527706013d3a5a", "format": 1 }, { @@ -22488,7 +22355,7 @@ "name": "tests/sanity/ignore-2.17.txt", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "4aa6d180dd919a19b80a38b282923231f636556e4bf343b2cf36527d999b2124", + "chksum_sha256": "1f44f41aa9a1e5198129a18be0aed641e3859e196aaca08c3cff2d8813ff5490", "format": 1 }, { @@ -22502,7 +22369,7 @@ "name": "tests/sanity/ignore-2.18.txt", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "4aa6d180dd919a19b80a38b282923231f636556e4bf343b2cf36527d999b2124", + "chksum_sha256": "1f44f41aa9a1e5198129a18be0aed641e3859e196aaca08c3cff2d8813ff5490", "format": 1 }, { @@ -22660,6 +22527,13 @@ "format": 1 }, { + "name": "tests/unit/plugins/become/test_run0.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "8c8701c9a8050a55b6ce76546768f86e600f52aaafab02acd9d1c34c051feecf", + "format": 1 + }, + { "name": "tests/unit/plugins/become/test_sudosu.py", "ftype": "file", "chksum_type": "sha256", @@ -23048,7 +22922,7 @@ "name": "tests/unit/plugins/lookup/test_merge_variables.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "96beb7ae4b4dc2eed0102f7f08d298ba619d167356771e4d4f2aa00b9507b18c", + "chksum_sha256": "92466922629e3e6beae89f5ca814c538ff85f527897b5c749ff50b1955ea214f", "format": 1 }, { @@ -23363,7 +23237,7 @@ "name": "tests/unit/plugins/module_utils/test_cmd_runner.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "fc1a28545ad32bc5c937219a3188ea421f7b177bf7c412b64c2081f3dffaaf58", + "chksum_sha256": "5e44ed79ba57b534227340b6e97849f84d20811597aaed62aa697d09ab6243f6", "format": 1 }, { @@ -23416,6 +23290,13 @@ "format": 1 }, { + "name": "tests/unit/plugins/module_utils/test_python_runner.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "63da895b9259d9db9650e5d7b1b998dc546a15c083e61becc9527cc145028015", + "format": 1 + }, + { "name": "tests/unit/plugins/module_utils/test_saslprep.py", "ftype": "file", "chksum_type": "sha256", @@ -26513,7 +26394,7 @@ "name": "tests/unit/plugins/modules/helper.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "d92529c5e737c7a3b5aa3d9100502ea7b875f233d86f435c2453f9c77ae012f7", + "chksum_sha256": "304e697c86b572f7ec8711a75eb120dd7f013ceff5405ee987af887bd35895f1", "format": 1 }, { @@ -26632,7 +26513,7 @@ "name": "tests/unit/plugins/modules/test_cpanm.yaml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "9f34f3edb8ae8ba4e017eab4740265089a1986d55066b8e6c70759604cc018b0", + "chksum_sha256": "e602576120a85701ecd7af5845fb5944f7f1b134d3f80b14f8934f835cd3485f", "format": 1 }, { @@ -26657,6 +26538,20 @@ "format": 1 }, { + "name": "tests/unit/plugins/modules/test_django_command.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "1507459a2607edf5c63f2f3d171457e869019bf33e95066c365d9eba0942aa87", + "format": 1 + }, + { + "name": "tests/unit/plugins/modules/test_django_command.yaml", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "c5e03ba9fde5c84f8f11a85870829f5c530a29c2c44fbb551df62263202546eb", + "format": 1 + }, + { "name": "tests/unit/plugins/modules/test_dnf_config_manager.py", "ftype": "file", "chksum_type": "sha256", @@ -26814,7 +26709,7 @@ "name": "tests/unit/plugins/modules/test_homebrew.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e69d96b396482e1418d7159092f4985ed1eb5ecf4370e9ee1efabb0b7e970398", + "chksum_sha256": "fe49d9f40e41b14a956d090b955a7270609439e91118fa1eaee33bbf325d4ec0", "format": 1 }, { @@ -27332,7 +27227,7 @@ "name": "tests/unit/plugins/modules/test_puppet.yaml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "fd0aef324a3206562948e4dc8c7e756a2adaf9f43a7a0447c80f941c3d4ce153", + "chksum_sha256": "bd699d9b1ed9c6e8d0f4e9f7ad57e170e4c4207fdf3eeba04f6359910b4e7e66", "format": 1 }, { @@ -27574,6 +27469,20 @@ "format": 1 }, { + "name": "tests/unit/plugins/plugin_utils", + "ftype": "dir", + "chksum_type": null, + "chksum_sha256": null, + "format": 1 + }, + { + "name": "tests/unit/plugins/plugin_utils/test_unsafe.py", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "9f8bcb10a66f8398da56f6508697a0d199f0f77f6c0484a64fbecb10997bcdfc", + "format": 1 + }, + { "name": "tests/unit/requirements.txt", "ftype": "file", "chksum_type": "sha256", @@ -27738,14 +27647,14 @@ "name": ".gitignore", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "6aef8926f289080d8a3ab9cbf9dddcd411a1e2d2e4ccd2c138aa056805ebfb77", + "chksum_sha256": "b3e3a5980835432f1db97655c0d123de6e06a98065a19b6453cbf778456c0006", "format": 1 }, { "name": "CHANGELOG.md", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "aa9310c1dd52b555a85d449e50a3ba1bc9de9e5a3474c66e156488463be1cc36", + "chksum_sha256": "2fc9c5d7b462624c77da1320ae1acaa13e7e4f765f0fe3393278146104281693", "format": 1 }, { @@ -27759,7 +27668,7 @@ "name": "CHANGELOG.rst", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "7192b128389810ee514466d24b34c430fd3e044eafc1db4c3b092a3a630d9985", + "chksum_sha256": "28d86e5061f86ee8a49776681a2f660ee38c29d057b9c23c6d2ab473c0f218a5", "format": 1 }, { @@ -27773,7 +27682,7 @@ "name": "CONTRIBUTING.md", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "2b729d659927dbf2ef866dc1160a32a704123c9e2be3fe1c1c8d2daa053a83ae", + "chksum_sha256": "a7b150aea1da9c4c36ba4e4f8ce7fc40cab2aad7ad0505c3429540fe94270bf9", "format": 1 }, { @@ -27787,7 +27696,7 @@ "name": "README.md", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "980347a93d90e0b8f8507f59be3be73f0f3026521be645861f2b30880c7ee9fe", + "chksum_sha256": "e773d31d8a52af357cddde045bc0682c1f14432496f72b4bd71b76556af876dc", "format": 1 }, { diff --git a/ansible_collections/community/general/MANIFEST.json b/ansible_collections/community/general/MANIFEST.json index 4d700a4c7..ffbae1e0e 100644 --- a/ansible_collections/community/general/MANIFEST.json +++ b/ansible_collections/community/general/MANIFEST.json @@ -2,7 +2,7 @@ "collection_info": { "namespace": "community", "name": "general", - "version": "8.6.0", + "version": "9.0.1", "authors": [ "Ansible (https://github.com/ansible)" ], @@ -23,7 +23,7 @@ "name": "FILES.json", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "42be361f601f0df607b62621323c3fb70f485cd57cd2d7eecca85d6590836b01", + "chksum_sha256": "be2f78923401a69f1bb6105804257106a4092634b2fa6a02058fea1e14de1bff", "format": 1 }, "format": 1 diff --git a/ansible_collections/community/general/README.md b/ansible_collections/community/general/README.md index 162cc06b0..fb95bf0c7 100644 --- a/ansible_collections/community/general/README.md +++ b/ansible_collections/community/general/README.md @@ -6,9 +6,10 @@ SPDX-License-Identifier: GPL-3.0-or-later # Community General Collection -[![Build Status](https://dev.azure.com/ansible/community.general/_apis/build/status/CI?branchName=stable-8)](https://dev.azure.com/ansible/community.general/_build?definitionId=31) +[![Build Status](https://dev.azure.com/ansible/community.general/_apis/build/status/CI?branchName=stable-9)](https://dev.azure.com/ansible/community.general/_build?definitionId=31) [![EOL CI](https://github.com/ansible-collections/community.general/workflows/EOL%20CI/badge.svg?event=push)](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) This repository contains the `community.general` Ansible Collection. The collection is a part of the Ansible package and includes many modules and plugins supported by Ansible community which are not part of more specialized community collections. @@ -115,7 +116,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-8/CHANGELOG.md). +See the [changelog](https://github.com/ansible-collections/community.general/blob/stable-9/CHANGELOG.md). ## Roadmap @@ -134,8 +135,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/main/COPYING) for the full text. +See [LICENSES/GPL-3.0-or-later.txt](https://github.com/ansible-collections/community.general/blob/stable-9/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/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). +Parts of the collection are licensed under the [BSD 2-Clause license](https://github.com/ansible-collections/community.general/blob/stable-9/LICENSES/BSD-2-Clause.txt), the [MIT license](https://github.com/ansible-collections/community.general/blob/stable-9/LICENSES/MIT.txt), and the [PSF 2.0 license](https://github.com/ansible-collections/community.general/blob/stable-9/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/ansible_collections/community/general/changelogs/changelog.yaml b/ansible_collections/community/general/changelogs/changelog.yaml index b45d41276..6215a89ce 100644 --- a/ansible_collections/community/general/changelogs/changelog.yaml +++ b/ansible_collections/community/general/changelogs/changelog.yaml @@ -1,850 +1,158 @@ -ancestor: 7.0.0 +ancestor: 8.0.0 releases: - 8.0.0: + 9.0.0: changes: breaking_changes: - - collection_version lookup plugin - remove compatibility code for ansible-base - 2.10 and ansible-core 2.11 (https://github.com/ansible-collections/community.general/pull/7269). - - gitlab_project - add ``default_branch`` support for project update. If you - used the module so far with ``default_branch`` to update a project, the value - of ``default_branch`` was ignored. Make sure that you either do not pass a - value if you are not sure whether it is the one you want to have to avoid - unexpected breaking changes (https://github.com/ansible-collections/community.general/pull/7158). - - selective callback plugin - remove compatibility code for Ansible 2.9 and - ansible-core 2.10 (https://github.com/ansible-collections/community.general/pull/7269). - - vardict module utils - ``VarDict`` will no longer accept variables named ``_var``, - ``get_meta``, and ``as_dict`` (https://github.com/ansible-collections/community.general/pull/6647). - - version module util - remove fallback for ansible-core 2.11. All modules and - plugins that do version collections no longer work with ansible-core 2.11 - (https://github.com/ansible-collections/community.general/pull/7269). - bugfixes: - - CmdRunner module utils - does not attempt to resolve path if executable is - a relative or absolute path (https://github.com/ansible-collections/community.general/pull/7200). - - MH DependencyMixin module utils - deprecation notice was popping up for modules - not using dependencies (https://github.com/ansible-collections/community.general/pull/6644, - https://github.com/ansible-collections/community.general/issues/6639). - - bitwarden lookup plugin - the plugin made assumptions about the structure - of a Bitwarden JSON object which may have been broken by an update in the - Bitwarden API. Remove assumptions, and allow queries for general fields such - as ``notes`` (https://github.com/ansible-collections/community.general/pull/7061). - - cmd_runner module utils - when a parameter in ``argument_spec`` has no type, - meaning it is implicitly a ``str``, ``CmdRunner`` would fail trying to find - the ``type`` key in that dictionary (https://github.com/ansible-collections/community.general/pull/6968). - - cobbler inventory plugin - fix calculation of cobbler_ipv4/6_address (https://github.com/ansible-collections/community.general/pull/6925). - - composer - fix impossible to run ``working_dir`` dependent commands. The module - was throwing an error when trying to run a ``working_dir`` dependent command, - because it tried to get the command help without passing the ``working_dir`` - (https://github.com/ansible-collections/community.general/issues/3787). - - csv module utils - detects and remove unicode BOM markers from incoming CSV - content (https://github.com/ansible-collections/community.general/pull/6662). - - datadog_downtime - presence of ``rrule`` param lead to the Datadog API returning - Bad Request due to a missing recurrence type (https://github.com/ansible-collections/community.general/pull/6811). - - ejabberd_user - module was failing to detect whether user was already created - and/or password was changed (https://github.com/ansible-collections/community.general/pull/7033). - - ejabberd_user - provide meaningful error message when the ``ejabberdctl`` - command is not found (https://github.com/ansible-collections/community.general/pull/7028, - https://github.com/ansible-collections/community.general/issues/6949). - - github_deploy_key - fix pagination behaviour causing a crash when only a single - page of deploy keys exist (https://github.com/ansible-collections/community.general/pull/7375). - - gitlab_group - the module passed parameters to the API call even when not - set. The module is now filtering out ``None`` values to remediate this (https://github.com/ansible-collections/community.general/pull/6712). - - gitlab_group_variable - deleted all variables when used with ``purge=true`` - due to missing ``raw`` property in KNOWN attributes (https://github.com/ansible-collections/community.general/issues/7250). - - gitlab_project_variable - deleted all variables when used with ``purge=true`` - due to missing ``raw`` property in KNOWN attributes (https://github.com/ansible-collections/community.general/issues/7250). - - icinga2_host - fix a key error when updating an existing host (https://github.com/ansible-collections/community.general/pull/6748). - - ini_file - add the ``follow`` paramter to follow the symlinks instead of replacing - them (https://github.com/ansible-collections/community.general/pull/6546). - - ini_file - fix a bug where the inactive options were not used when possible - (https://github.com/ansible-collections/community.general/pull/6575). - - ipa_dnszone - fix 'idnsallowsyncptr' key error for reverse zone (https://github.com/ansible-collections/community.general/pull/6906, - https://github.com/ansible-collections/community.general/issues/6905). - - kernel_blacklist - simplified the mechanism to update the file, fixing the - error (https://github.com/ansible-collections/community.general/pull/7382, - https://github.com/ansible-collections/community.general/issues/7362). - - keycloak module util - fix missing ``http_agent``, ``timeout``, and ``validate_certs`` - ``open_url()`` parameters (https://github.com/ansible-collections/community.general/pull/7067). - - keycloak module utils - fix ``is_struct_included`` handling of lists of lists/dictionaries - (https://github.com/ansible-collections/community.general/pull/6688). - - keycloak module utils - the function ``get_user_by_username`` now return the - user representation or ``None`` as stated in the documentation (https://github.com/ansible-collections/community.general/pull/6758). - - keycloak_authentication - fix Keycloak authentication flow (step or sub-flow) - indexing during update, if not specified by the user (https://github.com/ansible-collections/community.general/pull/6734). - - keycloak_client inventory plugin - fix missing client secret (https://github.com/ansible-collections/community.general/pull/6931). - - ldap_search - fix string normalization and the ``base64_attributes`` option - on Python 3 (https://github.com/ansible-collections/community.general/issues/5704, - https://github.com/ansible-collections/community.general/pull/7264). - - locale_gen - now works for locales without the underscore character such as - ``C.UTF-8`` (https://github.com/ansible-collections/community.general/pull/6774, - https://github.com/ansible-collections/community.general/issues/5142, https://github.com/ansible-collections/community.general/issues/4305). - - lvol - add support for percentage of origin size specification when creating - snapshot volumes (https://github.com/ansible-collections/community.general/issues/1630, - https://github.com/ansible-collections/community.general/pull/7053). - - lxc connection plugin - now handles ``remote_addr`` defaulting to ``inventory_hostname`` - correctly (https://github.com/ansible-collections/community.general/pull/7104). - - lxc connection plugin - properly evaluate options (https://github.com/ansible-collections/community.general/pull/7369). - - machinectl become plugin - mark plugin as ``require_tty`` to automatically - disable pipelining, with which this plugin is not compatible (https://github.com/ansible-collections/community.general/issues/6932, - https://github.com/ansible-collections/community.general/pull/6935). - - mail - skip headers containing equals characters due to missing ``maxsplit`` - on header key/value parsing (https://github.com/ansible-collections/community.general/pull/7303). - - memset module utils - make compatible with ansible-core 2.17 (https://github.com/ansible-collections/community.general/pull/7379). - - nmap inventory plugin - fix ``get_option`` calls (https://github.com/ansible-collections/community.general/pull/7323). - - nmap inventory plugin - now uses ``get_option`` in all cases to get its configuration - information (https://github.com/ansible-collections/community.general/pull/7119). - - nmcli - fix bond option ``xmit_hash_policy`` (https://github.com/ansible-collections/community.general/pull/6527). - - nmcli - fix support for empty list (in compare and scrape) (https://github.com/ansible-collections/community.general/pull/6769). - - nsupdate - fix a possible ``list index out of range`` exception (https://github.com/ansible-collections/community.general/issues/836). - - oci_utils module util - fix inappropriate logical comparison expressions and - makes them simpler. The previous checks had logical short circuits (https://github.com/ansible-collections/community.general/pull/7125). - - oci_utils module utils - avoid direct type comparisons (https://github.com/ansible-collections/community.general/pull/7085). - - onepassword - fix KeyError exception when trying to access value of a field - that is not filled out in OnePassword item (https://github.com/ansible-collections/community.general/pull/7241). - - openbsd_pkg - the pkg_info(1) behavior has changed in OpenBSD >7.3. The error - message ``Can't find`` should not lead to an error case (https://github.com/ansible-collections/community.general/pull/6785). - - pacman - module recognizes the output of ``yay`` running as ``root`` (https://github.com/ansible-collections/community.general/pull/6713). - - portage - fix ``changed_use`` and ``newuse`` not triggering rebuilds (https://github.com/ansible-collections/community.general/issues/6008, - https://github.com/ansible-collections/community.general/pull/6548). - - pritunl module utils - fix incorrect URL parameter for orgnization add method - (https://github.com/ansible-collections/community.general/pull/7161). - - proxmox - fix error when a configuration had no ``template`` field (https://github.com/ansible-collections/community.general/pull/6838, - https://github.com/ansible-collections/community.general/issues/5372). - - proxmox module utils - add logic to detect whether an old Promoxer complains - about the ``token_name`` and ``token_value`` parameters and provide a better - error message when that happens (https://github.com/ansible-collections/community.general/pull/6839, - https://github.com/ansible-collections/community.general/issues/5371). - - proxmox module utils - fix proxmoxer library version check (https://github.com/ansible-collections/community.general/issues/6974, - https://github.com/ansible-collections/community.general/issues/6975, https://github.com/ansible-collections/community.general/pull/6980). - - proxmox_disk - fix unable to create ``cdrom`` media due to ``size`` always - being appended (https://github.com/ansible-collections/community.general/pull/6770). - - proxmox_kvm - ``absent`` state with ``force`` specified failed to stop the - VM due to the ``timeout`` value not being passed to ``stop_vm`` (https://github.com/ansible-collections/community.general/pull/6827). - - proxmox_kvm - ``restarted`` state did not actually restart a VM in some VM - configurations. The state now uses the Proxmox reboot endpoint instead of - calling the ``stop_vm`` and ``start_vm`` functions (https://github.com/ansible-collections/community.general/pull/6773). - - proxmox_kvm - allow creation of VM with existing name but new vmid (https://github.com/ansible-collections/community.general/issues/6155, - https://github.com/ansible-collections/community.general/pull/6709). - - proxmox_kvm - when ``name`` option is provided without ``vmid`` and VM with - that name already exists then no new VM will be created (https://github.com/ansible-collections/community.general/issues/6911, - https://github.com/ansible-collections/community.general/pull/6981). - - proxmox_tasks_info - remove ``api_user`` + ``api_password`` constraint from - ``required_together`` as it causes to require ``api_password`` even when API - token param is used (https://github.com/ansible-collections/community.general/issues/6201). - - proxmox_template - require ``requests_toolbelt`` module to fix issue with - uploading large templates (https://github.com/ansible-collections/community.general/issues/5579, - https://github.com/ansible-collections/community.general/pull/6757). - - proxmox_user_info - avoid direct type comparisons (https://github.com/ansible-collections/community.general/pull/7085). - - redfish_info - fix ``ListUsers`` to not show empty account slots (https://github.com/ansible-collections/community.general/issues/6771, - https://github.com/ansible-collections/community.general/pull/6772). - - 'redhat_subscription - use the right D-Bus options for the consumer type when - - registering a RHEL system older than 9 or a RHEL 9 system older than 9.2 - - and using ``consumer_type`` - - (https://github.com/ansible-collections/community.general/pull/7378). - - ' - - refish_utils module utils - changing variable names to avoid issues occuring - when fetching Volumes data (https://github.com/ansible-collections/community.general/pull/6883). - - 'rhsm_repository - when using the ``purge`` option, the ``repositories`` - - dictionary element in the returned JSON is now properly updated according - - to the pruning operation - - (https://github.com/ansible-collections/community.general/pull/6676). - - ' - - rundeck - fix ``TypeError`` on 404 API response (https://github.com/ansible-collections/community.general/pull/6983). - - selective callback plugin - fix length of task name lines in output always - being 3 characters longer than desired (https://github.com/ansible-collections/community.general/pull/7374). - - snap - an exception was being raised when snap list was empty (https://github.com/ansible-collections/community.general/pull/7124, - https://github.com/ansible-collections/community.general/issues/7120). - - snap - assume default track ``latest`` in parameter ``channel`` when not specified - (https://github.com/ansible-collections/community.general/pull/6835, https://github.com/ansible-collections/community.general/issues/6821). - - snap - change the change detection mechanism from "parsing installation" to - "comparing end state with initial state" (https://github.com/ansible-collections/community.general/pull/7340, - https://github.com/ansible-collections/community.general/issues/7265). - - snap - fix crash when multiple snaps are specified and one has ``---`` in - its description (https://github.com/ansible-collections/community.general/pull/7046). - - snap - fix the processing of the commands' output, stripping spaces and newlines - from it (https://github.com/ansible-collections/community.general/pull/6826, - https://github.com/ansible-collections/community.general/issues/6803). - - sorcery - fix interruption of the multi-stage process (https://github.com/ansible-collections/community.general/pull/7012). - - sorcery - fix queue generation before the whole system rebuild (https://github.com/ansible-collections/community.general/pull/7012). - - sorcery - latest state no longer triggers update_cache (https://github.com/ansible-collections/community.general/pull/7012). - - terraform - prevents ``-backend-config`` option double encapsulating with - ``shlex_quote`` function. (https://github.com/ansible-collections/community.general/pull/7301). - - tss lookup plugin - fix multiple issues when using ``fetch_attachments=true`` - (https://github.com/ansible-collections/community.general/pull/6720). - - zypper - added handling of zypper exitcode 102. Changed state is set correctly - now and rc 102 is still preserved to be evaluated by the playbook (https://github.com/ansible-collections/community.general/pull/6534). - deprecated_features: - - CmdRunner module utils - deprecate ``cmd_runner_fmt.as_default_type()`` formatter - (https://github.com/ansible-collections/community.general/pull/6601). - - MH VarsMixin module utils - deprecates ``VarsMixin`` and supporting classes - in favor of plain ``vardict`` module util (https://github.com/ansible-collections/community.general/pull/6649). - - ansible_galaxy_install - the ``ack_ansible29`` and ``ack_min_ansiblecore211`` - options have been deprecated and will be removed in community.general 9.0.0 - (https://github.com/ansible-collections/community.general/pull/7358). - - consul - the ``ack_params_state_absent`` option has been deprecated and will - be removed in community.general 10.0.0 (https://github.com/ansible-collections/community.general/pull/7358). - - cpanm - value ``compatibility`` is deprecated as default for parameter ``mode`` - (https://github.com/ansible-collections/community.general/pull/6512). - - ejabberd_user - deprecate the parameter ``logging`` in favour of producing - more detailed information in the module output (https://github.com/ansible-collections/community.general/pull/7043). - - flowdock - module relies entirely on no longer responsive API endpoints, and - it will be removed in community.general 9.0.0 (https://github.com/ansible-collections/community.general/pull/6930). - - proxmox - old feature flag ``proxmox_default_behavior`` will be removed in - community.general 10.0.0 (https://github.com/ansible-collections/community.general/pull/6836). - - proxmox_kvm - deprecate the option ``proxmox_default_behavior`` (https://github.com/ansible-collections/community.general/pull/7377). - - redfish_info, redfish_config, redfish_command - the default value ``10`` for - the ``timeout`` option is deprecated and will change to ``60`` in community.general - 9.0.0 (https://github.com/ansible-collections/community.general/pull/7295). - - 'redhat module utils - the ``module_utils.redhat`` module is deprecated, as - - effectively unused: the ``Rhsm``, ``RhsmPool``, and ``RhsmPools`` classes - - will be removed in community.general 9.0.0; the ``RegistrationBase`` class - - will be removed in community.general 10.0.0 together with the - - ``rhn_register`` module, as it is the only user of this class; this means - - that the whole ``module_utils.redhat`` module will be dropped in - - community.general 10.0.0, so importing it without even using anything of it - - will fail - - (https://github.com/ansible-collections/community.general/pull/6663). - - ' - - 'redhat_subscription - the ``autosubscribe`` alias for the ``auto_attach`` - option has been - - deprecated for many years, although only in the documentation. Officially - mark this alias - - as deprecated, and it will be removed in community.general 9.0.0 - - (https://github.com/ansible-collections/community.general/pull/6646). - - ' - - 'redhat_subscription - the ``pool`` option is deprecated in favour of the - - more precise and flexible ``pool_ids`` option - - (https://github.com/ansible-collections/community.general/pull/6650). - - ' - - 'rhsm_repository - ``state=present`` has not been working as expected for - many years, - - and it seems it was not noticed so far; also, "presence" is not really a valid - concept - - for subscription repositories, which can only be enabled or disabled. Hence, - mark the - - ``present`` and ``absent`` values of the ``state`` option as deprecated, slating - them - - for removal in community.general 10.0.0 - - (https://github.com/ansible-collections/community.general/pull/6673). - - ' - - stackdriver - module relies entirely on no longer existent API endpoints, - and it will be removed in community.general 9.0.0 (https://github.com/ansible-collections/community.general/pull/6887). - - webfaction_app - module relies entirely on no longer existent API endpoints, - and it will be removed in community.general 9.0.0 (https://github.com/ansible-collections/community.general/pull/6909). - - webfaction_db - module relies entirely on no longer existent API endpoints, - and it will be removed in community.general 9.0.0 (https://github.com/ansible-collections/community.general/pull/6909). - - webfaction_domain - module relies entirely on no longer existent API endpoints, - and it will be removed in community.general 9.0.0 (https://github.com/ansible-collections/community.general/pull/6909). - - webfaction_mailbox - module relies entirely on no longer existent API endpoints, - and it will be removed in community.general 9.0.0 (https://github.com/ansible-collections/community.general/pull/6909). - - webfaction_site - module relies entirely on no longer existent API endpoints, - and it will be removed in community.general 9.0.0 (https://github.com/ansible-collections/community.general/pull/6909). - known_issues: - - Ansible markup will show up in raw form on ansible-doc text output for ansible-core - before 2.15. If you have trouble deciphering the documentation markup, please - upgrade to ansible-core 2.15 (or newer), or read the HTML documentation on - https://docs.ansible.com/ansible/devel/collections/community/general/ (https://github.com/ansible-collections/community.general/pull/6539). - minor_changes: - - The collection will start using semantic markup (https://github.com/ansible-collections/community.general/pull/6539). - - VarDict module utils - add method ``VarDict.as_dict()`` to convert to a plain - ``dict`` object (https://github.com/ansible-collections/community.general/pull/6602). - - 'apt_rpm - extract package name from local ``.rpm`` path when verifying - - installation success. Allows installing packages from local ``.rpm`` files - - (https://github.com/ansible-collections/community.general/pull/7396). - - ' - - cargo - add option ``executable``, which allows user to specify path to the - cargo binary (https://github.com/ansible-collections/community.general/pull/7352). - - cargo - add option ``locked`` which allows user to specify install the locked - version of dependency instead of latest compatible version (https://github.com/ansible-collections/community.general/pull/6134). - - chroot connection plugin - add ``disable_root_check`` option (https://github.com/ansible-collections/community.general/pull/7099). - - cloudflare_dns - add CAA record support (https://github.com/ansible-collections/community.general/pull/7399). - - cobbler inventory plugin - add ``exclude_mgmt_classes`` and ``include_mgmt_classes`` - options to exclude or include hosts based on management classes (https://github.com/ansible-collections/community.general/pull/7184). - - cobbler inventory plugin - add ``inventory_hostname`` option to allow using - the system name for the inventory hostname (https://github.com/ansible-collections/community.general/pull/6502). - - cobbler inventory plugin - add ``want_ip_addresses`` option to collect all - interface DNS name to IP address mapping (https://github.com/ansible-collections/community.general/pull/6711). - - cobbler inventory plugin - add primary IP addess to ``cobbler_ipv4_address`` - and IPv6 address to ``cobbler_ipv6_address`` host variable (https://github.com/ansible-collections/community.general/pull/6711). - - cobbler inventory plugin - add warning for systems with empty profiles (https://github.com/ansible-collections/community.general/pull/6502). - - cobbler inventory plugin - convert Ansible unicode strings to native Python - unicode strings before passing user/password to XMLRPC client (https://github.com/ansible-collections/community.general/pull/6923). - - consul_session - drops requirement for the ``python-consul`` library to communicate - with the Consul API, instead relying on the existing ``requests`` library - requirement (https://github.com/ansible-collections/community.general/pull/6755). - - copr - respawn module to use the system python interpreter when the ``dnf`` - python module is not available in ``ansible_python_interpreter`` (https://github.com/ansible-collections/community.general/pull/6522). - - cpanm - minor refactor when creating the ``CmdRunner`` object (https://github.com/ansible-collections/community.general/pull/7231). - - datadog_monitor - adds ``notification_preset_name``, ``renotify_occurrences`` - and ``renotify_statuses`` parameters (https://github.com/ansible-collections/community.general/issues/6521,https://github.com/ansible-collections/community.general/issues/5823). - - dig lookup plugin - add TCP option to enable the use of TCP connection during - DNS lookup (https://github.com/ansible-collections/community.general/pull/7343). - - ejabberd_user - module now using ``CmdRunner`` to execute external command - (https://github.com/ansible-collections/community.general/pull/7075). - - filesystem - add ``uuid`` parameter for UUID change feature (https://github.com/ansible-collections/community.general/pull/6680). - - 'gitlab_group - add option ``force_delete`` (default: false) which allows - delete group even if projects exists in it (https://github.com/ansible-collections/community.general/pull/7364).' - - gitlab_group_variable - add support for ``raw`` variables suboption (https://github.com/ansible-collections/community.general/pull/7132). - - gitlab_project_variable - add support for ``raw`` variables suboption (https://github.com/ansible-collections/community.general/pull/7132). - - gitlab_project_variable - minor refactor removing unnecessary code statements - (https://github.com/ansible-collections/community.general/pull/6928). - - gitlab_runner - minor refactor removing unnecessary code statements (https://github.com/ansible-collections/community.general/pull/6927). - - htpasswd - minor code improvements in the module (https://github.com/ansible-collections/community.general/pull/6901). - - htpasswd - the parameter ``crypt_scheme`` is being renamed as ``hash_scheme`` - and added as an alias to it (https://github.com/ansible-collections/community.general/pull/6841). - - icinga2_host - the ``ip`` option is no longer required, since Icinga 2 allows - for an empty address attribute (https://github.com/ansible-collections/community.general/pull/7452). - - ini_file - add ``ignore_spaces`` option (https://github.com/ansible-collections/community.general/pull/7273). - - ini_file - add ``modify_inactive_option`` option (https://github.com/ansible-collections/community.general/pull/7401). - - ipa_config - add module parameters to manage FreeIPA user and group objectclasses - (https://github.com/ansible-collections/community.general/pull/7019). - - ipa_config - adds ``idp`` choice to ``ipauserauthtype`` parameter's choices - (https://github.com/ansible-collections/community.general/pull/7051). - - jenkins_build - add new ``detach`` option, which allows the module to exit - successfully as long as the build is created (default functionality is still - waiting for the build to end before exiting) (https://github.com/ansible-collections/community.general/pull/7204). - - jenkins_build - add new ``time_between_checks`` option, which allows to configure - the wait time between requests to the Jenkins server (https://github.com/ansible-collections/community.general/pull/7204). - - keycloak_authentication - added provider ID choices, since Keycloak supports - only those two specific ones (https://github.com/ansible-collections/community.general/pull/6763). - - keycloak_client_rolemapping - adds support for subgroups with additional parameter - ``parents`` (https://github.com/ansible-collections/community.general/pull/6687). - - keycloak_role - add composite roles support for realm and client roles (https://github.com/ansible-collections/community.general/pull/6469). - - keyring - minor refactor removing unnecessary code statements (https://github.com/ansible-collections/community.general/pull/6927). - - ldap_* - add new arguments ``client_cert`` and ``client_key`` to the LDAP - modules in order to allow certificate authentication (https://github.com/ansible-collections/community.general/pull/6668). - - ldap_search - add a new ``page_size`` option to enable paged searches (https://github.com/ansible-collections/community.general/pull/6648). - - locale_gen - module has been refactored to use ``ModuleHelper`` and ``CmdRunner`` - (https://github.com/ansible-collections/community.general/pull/6903). - - locale_gen - module now using ``CmdRunner`` to execute external commands (https://github.com/ansible-collections/community.general/pull/6820). - - lvg - add ``active`` and ``inactive`` values to the ``state`` option for active - state management feature (https://github.com/ansible-collections/community.general/pull/6682). - - lvg - add ``reset_vg_uuid``, ``reset_pv_uuid`` options for UUID reset feature - (https://github.com/ansible-collections/community.general/pull/6682). - - lxc connection plugin - properly handle a change of the ``remote_addr`` option - (https://github.com/ansible-collections/community.general/pull/7373). - - lxd connection plugin - automatically translate ``remote_addr`` from FQDN - to (short) hostname (https://github.com/ansible-collections/community.general/pull/7360). - - lxd connection plugin - update error parsing to work with newer messages mentioning - instances (https://github.com/ansible-collections/community.general/pull/7360). - - lxd inventory plugin - add ``server_cert`` option for trust anchor to use - for TLS verification of server certificates (https://github.com/ansible-collections/community.general/pull/7392). - - lxd inventory plugin - add ``server_check_hostname`` option to disable hostname - verification of server certificates (https://github.com/ansible-collections/community.general/pull/7392). - - make - add new ``targets`` parameter allowing multiple targets to be used - with ``make`` (https://github.com/ansible-collections/community.general/pull/6882, - https://github.com/ansible-collections/community.general/issues/4919). - - make - allows ``params`` to be used without value (https://github.com/ansible-collections/community.general/pull/7180). - - mas - disable sign-in check for macOS 12+ as ``mas account`` is non-functional - (https://github.com/ansible-collections/community.general/pull/6520). - - newrelic_deployment - add option ``app_name_exact_match``, which filters results - for the exact app_name provided (https://github.com/ansible-collections/community.general/pull/7355). - - nmap inventory plugin - now has a ``use_arp_ping`` option to allow the user - to disable the default ARP ping query for a more reliable form (https://github.com/ansible-collections/community.general/pull/7119). - - nmcli - add support for ``ipv4.dns-options`` and ``ipv6.dns-options`` (https://github.com/ansible-collections/community.general/pull/6902). - - nomad_job, nomad_job_info - add ``port`` parameter (https://github.com/ansible-collections/community.general/pull/7412). - - npm - minor improvement on parameter validation (https://github.com/ansible-collections/community.general/pull/6848). - - npm - module now using ``CmdRunner`` to execute external commands (https://github.com/ansible-collections/community.general/pull/6989). - - onepassword lookup plugin - add service account support (https://github.com/ansible-collections/community.general/issues/6635, - https://github.com/ansible-collections/community.general/pull/6660). - - onepassword lookup plugin - introduce ``account_id`` option which allows specifying - which account to use (https://github.com/ansible-collections/community.general/pull/7308). - - onepassword_raw lookup plugin - add service account support (https://github.com/ansible-collections/community.general/issues/6635, - https://github.com/ansible-collections/community.general/pull/6660). - - onepassword_raw lookup plugin - introduce ``account_id`` option which allows - specifying which account to use (https://github.com/ansible-collections/community.general/pull/7308). - - opentelemetry callback plugin - add span attributes in the span event (https://github.com/ansible-collections/community.general/pull/6531). - - opkg - add ``executable`` parameter allowing to specify the path of the ``opkg`` - command (https://github.com/ansible-collections/community.general/pull/6862). - - opkg - remove default value ``""`` for parameter ``force`` as it causes the - same behaviour of not having that parameter (https://github.com/ansible-collections/community.general/pull/6513). - - pagerduty - adds in option to use v2 API for creating pagerduty incidents - (https://github.com/ansible-collections/community.general/issues/6151) - - parted - on resize, use ``--fix`` option if available (https://github.com/ansible-collections/community.general/pull/7304). - - pnpm - set correct version when state is latest or version is not mentioned. - Resolves previous idempotency problem (https://github.com/ansible-collections/community.general/pull/7339). - - pritunl module utils - ensure ``validate_certs`` parameter is honoured in - all methods (https://github.com/ansible-collections/community.general/pull/7156). - - proxmox - add ``vmid`` (and ``taskid`` when possible) to return values (https://github.com/ansible-collections/community.general/pull/7263). - - proxmox - support ``timezone`` parameter at container creation (https://github.com/ansible-collections/community.general/pull/6510). - - proxmox inventory plugin - add composite variables support for Proxmox nodes - (https://github.com/ansible-collections/community.general/issues/6640). - - proxmox_kvm - added support for ``tpmstate0`` parameter to configure TPM (Trusted - Platform Module) disk. TPM is required for Windows 11 installations (https://github.com/ansible-collections/community.general/pull/6533). - - proxmox_kvm - enabled force restart of VM, bringing the ``force`` parameter - functionality in line with what is described in the docs (https://github.com/ansible-collections/community.general/pull/6914). - - proxmox_kvm - re-use ``timeout`` module param to forcefully shutdown a virtual - machine when ``state`` is ``stopped`` (https://github.com/ansible-collections/community.general/issues/6257). - - proxmox_snap - add ``retention`` parameter to delete old snapshots (https://github.com/ansible-collections/community.general/pull/6576). - - proxmox_vm_info - ``node`` parameter is no longer required. Information can - be obtained for the whole cluster (https://github.com/ansible-collections/community.general/pull/6976). - - proxmox_vm_info - non-existing provided by name/vmid VM would return empty - results instead of failing (https://github.com/ansible-collections/community.general/pull/7049). - - pubnub_blocks - minor refactor removing unnecessary code statements (https://github.com/ansible-collections/community.general/pull/6928). - - random_string - added new ``ignore_similar_chars`` and ``similar_chars`` option - to ignore certain chars (https://github.com/ansible-collections/community.general/pull/7242). - - redfish_command - add ``MultipartHTTPPushUpdate`` command (https://github.com/ansible-collections/community.general/issues/6471, - https://github.com/ansible-collections/community.general/pull/6612). - - redfish_command - add ``account_types`` and ``oem_account_types`` as optional - inputs to ``AddUser`` (https://github.com/ansible-collections/community.general/issues/6823, - https://github.com/ansible-collections/community.general/pull/6871). - - redfish_command - add new option ``update_oem_params`` for the ``MultipartHTTPPushUpdate`` - command (https://github.com/ansible-collections/community.general/issues/7331). - - redfish_config - add ``CreateVolume`` command to allow creation of volumes - on servers (https://github.com/ansible-collections/community.general/pull/6813). - - redfish_config - add ``DeleteAllVolumes`` command to allow deletion of all - volumes on servers (https://github.com/ansible-collections/community.general/pull/6814). - - redfish_config - adding ``SetSecureBoot`` command (https://github.com/ansible-collections/community.general/pull/7129). - - redfish_info - add ``AccountTypes`` and ``OEMAccountTypes`` to the output - of ``ListUsers`` (https://github.com/ansible-collections/community.general/issues/6823, - https://github.com/ansible-collections/community.general/pull/6871). - - redfish_info - add support for ``GetBiosRegistries`` command (https://github.com/ansible-collections/community.general/pull/7144). - - redfish_info - adds ``LinkStatus`` to NIC inventory (https://github.com/ansible-collections/community.general/pull/7318). - - redfish_info - adds ``ProcessorArchitecture`` to CPU inventory (https://github.com/ansible-collections/community.general/pull/6864). - - redfish_info - fix for ``GetVolumeInventory``, Controller name was getting - populated incorrectly and duplicates were seen in the volumes retrieved (https://github.com/ansible-collections/community.general/pull/6719). - - redfish_info - report ``Id`` in the output of ``GetManagerInventory`` (https://github.com/ansible-collections/community.general/pull/7140). - - redfish_utils - use ``Controllers`` key in redfish data to obtain Storage - controllers properties (https://github.com/ansible-collections/community.general/pull/7081). - - redfish_utils module utils - add support for ``PowerCycle`` reset type for - ``redfish_command`` responses feature (https://github.com/ansible-collections/community.general/issues/7083). - - redfish_utils module utils - add support for following ``@odata.nextLink`` - pagination in ``software_inventory`` responses feature (https://github.com/ansible-collections/community.general/pull/7020). - - redfish_utils module utils - support ``Volumes`` in response for ``GetDiskInventory`` - (https://github.com/ansible-collections/community.general/pull/6819). - - 'redhat_subscription - the internal ``RegistrationBase`` class was folded - - into the other internal ``Rhsm`` class, as the separation had no purpose - - anymore - - (https://github.com/ansible-collections/community.general/pull/6658). - - ' - - redis_info - refactor the redis_info module to use the redis module_utils - enabling to pass TLS parameters to the Redis client (https://github.com/ansible-collections/community.general/pull/7267). - - 'rhsm_release - improve/harden the way ``subscription-manager`` is run; - - no behaviour change is expected - - (https://github.com/ansible-collections/community.general/pull/6669). - - ' - - 'rhsm_repository - the interaction with ``subscription-manager`` was - - refactored by grouping things together, removing unused bits, and hardening - - the way it is run; also, the parsing of ``subscription-manager repos --list`` - - was improved and made slightly faster; no behaviour change is expected - - (https://github.com/ansible-collections/community.general/pull/6783, - - https://github.com/ansible-collections/community.general/pull/6837). - - ' - - scaleway_security_group_rule - minor refactor removing unnecessary code statements - (https://github.com/ansible-collections/community.general/pull/6928). - - shutdown - use ``shutdown -p ...`` with FreeBSD to halt and power off machine - (https://github.com/ansible-collections/community.general/pull/7102). - - snap - add option ``dangerous`` to the module, that will map into the command - line argument ``--dangerous``, allowing unsigned snap files to be installed - (https://github.com/ansible-collections/community.general/pull/6908, https://github.com/ansible-collections/community.general/issues/5715). - - snap - module is now aware of channel when deciding whether to install or - refresh the snap (https://github.com/ansible-collections/community.general/pull/6435, - https://github.com/ansible-collections/community.general/issues/1606). - - sorcery - add grimoire (repository) management support (https://github.com/ansible-collections/community.general/pull/7012). - - sorcery - minor refactor (https://github.com/ansible-collections/community.general/pull/6525). - - supervisorctl - allow to stop matching running processes before removing them - with ``stop_before_removing=true`` (https://github.com/ansible-collections/community.general/pull/7284). - - tss lookup plugin - allow to fetch secret IDs which are in a folder based - on folder ID. Previously, we could not fetch secrets based on folder ID but - now use ``fetch_secret_ids_from_folder`` option to indicate to fetch secret - IDs based on folder ID (https://github.com/ansible-collections/community.general/issues/6223). - - tss lookup plugin - allow to fetch secret by path. Previously, we could not - fetch secret by path but now use ``secret_path`` option to indicate to fetch - secret by secret path (https://github.com/ansible-collections/community.general/pull/6881). - - unixy callback plugin - add support for ``check_mode_markers`` option (https://github.com/ansible-collections/community.general/pull/7179). - - vardict module utils - added convenience methods to ``VarDict`` (https://github.com/ansible-collections/community.general/pull/6647). - - xenserver_guest_info - minor refactor removing unnecessary code statements - (https://github.com/ansible-collections/community.general/pull/6928). - - xenserver_guest_powerstate - minor refactor removing unnecessary code statements - (https://github.com/ansible-collections/community.general/pull/6928). - - yum_versionlock - add support to pin specific package versions instead of - only the package itself (https://github.com/ansible-collections/community.general/pull/6861, - https://github.com/ansible-collections/community.general/issues/4470). - release_summary: This is release 8.0.0 of ``community.general``, released on - 2023-11-01. - removed_features: - - The collection no longer supports ansible-core 2.11 and ansible-core 2.12. - Parts of the collection might still work on these ansible-core versions, but - others might not (https://github.com/ansible-collections/community.general/pull/7269). - - ansible_galaxy_install - support for Ansible 2.9 and ansible-base 2.10 has - been removed (https://github.com/ansible-collections/community.general/pull/7358). - - consul - when ``state=absent``, the options ``script``, ``ttl``, ``tcp``, - ``http``, and ``interval`` can no longer be specified (https://github.com/ansible-collections/community.general/pull/7358). - - gconftool2 - ``state=get`` has been removed. Use the module ``community.general.gconftool2_info`` - instead (https://github.com/ansible-collections/community.general/pull/7358). - - gitlab_runner - remove the default value for the ``access_level`` option. - To restore the previous behavior, explicitly set it to ``ref_protected`` (https://github.com/ansible-collections/community.general/pull/7358). - - htpasswd - removed code for passlib <1.6 (https://github.com/ansible-collections/community.general/pull/6901). - - manageiq_polices - ``state=list`` has been removed. Use the module ``community.general.manageiq_policies_info`` - instead (https://github.com/ansible-collections/community.general/pull/7358). - - manageiq_tags - ``state=list`` has been removed. Use the module ``community.general.manageiq_tags_info`` - instead (https://github.com/ansible-collections/community.general/pull/7358). - - mh.mixins.cmd module utils - the ``ArgFormat`` class has been removed (https://github.com/ansible-collections/community.general/pull/7358). - - mh.mixins.cmd module utils - the ``CmdMixin`` mixin has been removed. Use - ``community.general.plugins.module_utils.cmd_runner.CmdRunner`` instead (https://github.com/ansible-collections/community.general/pull/7358). - - mh.mixins.cmd module utils - the mh.mixins.cmd module utils has been removed - after all its contents were removed (https://github.com/ansible-collections/community.general/pull/7358). - - mh.module_helper module utils - the ``CmdModuleHelper`` and ``CmdStateModuleHelper`` - classes have been removed. Use ``community.general.plugins.module_utils.cmd_runner.CmdRunner`` - instead (https://github.com/ansible-collections/community.general/pull/7358). - - proxmox module utils - removed unused imports (https://github.com/ansible-collections/community.general/pull/6873). - - xfconf - the deprecated ``disable_facts`` option was removed (https://github.com/ansible-collections/community.general/pull/7358). - fragments: - - 3787-pass-composer-working-dir.yml - - 6134-add-locked-option-for-cargo.yml - - 6223-get-secret-ids-by-folderid.yml - - 6435-snap-channel-aware.yml - - 6469-add-composites-support-for-keycloak-role.yml - - 6471-redfish-add-multipart-http-push-command.yml - - 6502-cobbler-inventory_hostname.yml - - 6510-proxmox-create-support_timezone.yaml - - 6512-cpanm-default-mode.yml - - 6513-opkg-default-force.yml - - 6520-mas-disable-signin.yaml - - 6522-copr-respawn.yaml - - 6523-datadog-monitor-notification-preset-name-and-renotify.yaml - - 6525-sorcery-import.yaml - - 6527-nmcli-bond-fix-xmit_hash_policy.yml - - 6531-opentelemetry-add-event-attributes.yml - - 6533-proxmox_kvm-tpmstate0-support.yaml - - 6534-zypper-exitcode-102-handled.yaml - - 6539-semantic-markup.yml - - 6548-portage-changed_use-newuse.yml - - 6554-proxmox-tasks-info-fix-required-password.yaml - - 6568-fix-get-user-by-username-in-keycloak-module-utils.yml - - 6570-handle-shutdown-timeout.yaml - - 6576-proxmox-snap-allow-to-remove-old-snapshots.yml - - 6601-cmdrunner-deprecate-default-type.yml - - 6602-vardict-as-dict.yml - - 6640-proxmox-composite-variables-support.yml - - 6644-dependencymixin-fix.yml - - 6646-redhat_subscription-deprecate-autosubscribe.yml - - 6647-vardict-methods.yml - - 6648_ldap_search_page_size.yml - - 6649-varsmixin-deprecation.yml - - 6650-redhat_subscription-deprecate-pool.yml - - 6658-redhat_subscription-internal-rhsm-refactor.yml - - 6660-onepassword-lookup-service-account.yaml - - 6662-csv-bom.yml - - 6663-deprecate-module_utils-redhat.yml - - 6668-ldap-client-cert.yml - - 6669-rhsm_release-internal-sub-man-exec.yml - - 6673-rhsm_repository-deprecate-present-absent.yml - - 6676-rhsm_repository-fix-returned-repositories-with-purge.yml - - 6680-filesystem-uuid-change.yml - - 6682-lvg-clonesupport.yml - - 6687-support-subgroups-for-keycloak-client-rolemapping.yml - - 6688-is-struct-included-bug-in-keycloak-py.yml - - 6709-proxmox-create-vm-with-existing-name.yml - - 6711-cobbler-ip-address.yml - - 6712-gitlab_group-filtered-for-none-values.yml - - 6713-yay-become.yml - - 6719-redfish-utils-fix-for-get-volume-inventory.yml - - 6720-tss-fix-fetch-attachments.yml - - 6734-keycloak-auth-management-indexing.yml - - 6748-icinga2_host-datafix.yml - - 6755-refactor-consul-session-to-use-requests-lib-instead-of-consul.yml - - 6757-proxmox-template-fix-upload-error.yml - - 6763-keycloak-auth-provider-choices.yml - - 6769-nmcli-fix-empty-list.yml - - 6770-proxmox_disk_create_cdrom.yml - - 6771-redfish-filter-empty-account-slots.yml - - 6773-proxmox_kvm-restarted-state-bug-fix.yaml - - 6774-locale-gen-fix.yml - - 6783-6837-rhsm_repository-internal-refactor.yml - - 6785-openbsd_pkg_pkg_info_handling.yml - - 6811-datadog-downtime-rrule-type.yaml - - 6813-redfish-config-add-create-volume.yml - - 6814-redfish-config-add-delete-all-volumes.yml - - 6819-redfish-utils-add-links-parameter-for-get_disk_inventory.yml - - 6820-locale-gen-cmdrunner.yml - - 6823-redfish-add-account-type-management.yml - - 6826-snap-out-strip.yml - - 6827-proxmox_kvm-force-delete-bug-fix.yaml - - 6835-snap-missing-track.yml - - 6836-proxmox-deprecate-compatibility.yml - - 6838-proxmox-dict-template.yml - - 6839-promoxer-tokens.yml - - 6841-htpasswd-crypt-scheme.yml - - 6848-npm-required-if.yml - - 6861-yum_versionlock_minor_change_add-pinning-specific-versions.yml - - 6862-opkg-exec.yml - - 6864-redfish-utils-fix-for-processorarchitecture-in-cpu-inventory.yaml - - 6873-proxmox-imports.yml - - 6882-make-multiple-targets.yml - - 6883-redfish-utils-changing-variable-names-in-get-volume-inventory.yml - - 6887-deprecate-stackdrive.yml - - 6901-htpasswd-refactor.yml - - 6902-added-support-in-nmcli-for-ipvx-dns-options.yml - - 6903-locale-gen-refactor.yml - - 6905-ipa_dnszone-key-error-fix.yml - - 6908-snap-dangerous.yml - - 6909-deprecate-webfaction.yml - - 6914-proxmox_kvm-enable-force-restart.yml - - 6923-cobbler-inventory_unicode.yml - - 6925-cobbler-inventory-bugfix.yml - - 6927-pylint-comments.yml - - 6928-noqa-comments.yml - - 6930-deprecate-flowdock.yml - - 6931-keycloak_client-inventory-bugfix.yml - - 6935-machinectl-become.yml - - 6949-ejabberdctl-error.yml - - 6968-cmdrunner-implicit-type.yml - - 6976-proxmox-vm-info-not-require-node.yml - - 6980-proxmox-fix-token-auth.yml - - 6981-proxmox-fix-vm-creation-when-only-name-provided.yml - - 6983-rundeck-fix-typerrror-on-404-api-response.yml - - 6989-npm-cmdrunner.yml - - 7012-sorcery-grimoire-mgmt.yml - - 7019-ipa_config-user-and-group-objectclasses.yml - - 7020-redfish-utils-pagination.yml - - 7033-ejabberd-user-bugs.yml - - 7043-ejabberd-user-deprecate-logging.yml - - 7046-snap-newline-before-separator.yml - - 7049-proxmox-vm-info-empty-results.yml - - 7051-ipa-config-new-choice-idp-to-ipauserauthtype.yml - - 7061-fix-bitwarden-get_field.yml - - 7067-keycloak-api-paramerter-fix.yml - - 7075-ejabberd-user-cmdrunner.yml - - 7081-redfish-utils-fix-for-storagecontrollers-deprecated-key.yaml - - 7085-sanity.yml - - 7099-chroot-disable-root-check-option.yml - - 7102-freebsd-shutdown-p.yml - - 7104_fix_lxc_remoteaddr_default.yml - - 7113-redfish-utils-power-cycle.yml - - 7118-nmap_inv_plugin_no_arp_option.yml - - 7124-snap-empty-list.yml - - 7125-fix-inappropriate-comparison.yml - - 7129-adding_set_secure_boot_command_to_redfish_config.yml - - 7132-gitlab-raw-variables.yml - - 7140-id-getmanagerinv-output.yml - - 7144-add-getbiosregistry-command-to-redfish-info.yml - - 7156-ensure-validate-certs-parameter-is-honoured.yml - - 7158-gitlab-project-default-branch-update.yml - - 7161-fix-incorrect-post-parameter.yml - - 7179-unixy-support-checkmode-markers.yml - - 7180-make_params_without_value.yml - - 7184-cobbler-mgmt-classes.yml - - 7200-cmd-runner-abs-path.yml - - 7219-fix-nsupdate-cname.yaml - - 7231-cpanm-adjustments.yml - - 7241-prevent-key-error-when-value-does-not-exist.yml - - 7242_ignore_similar_chars.yml - - 7251-gitlab-variables-deleteing-all-variables.yml - - 7263-proxmox-return-vmid-and-taskid.yaml - - 7264-ldap_search-strings.yml - - 7267-redis_info.yml - - 7273-ini_file_ignore_spaces.yml - - 7284-supervisorctl-stop-before-remove.yaml - - 7295-adding_deprecation_for_timeout_in_redfish_info_config_command.yml - - 7301-fix-backend-config-string-encapsulation.yml - - 7303-mail-incorrect-header-parsing.yml - - 7304-prevent-parted-warnings.yml - - 7308-onepassword-multi-acc.yml - - 7318-add-linkstatus-attribute-to-nic-inventory.yml - - 7323-nmap.yml - - 7330-redfish-utils-oem-params.yml - - 7339-pnpm-correct-version-when-state-latest.yml - - 7340-snap-fix.yml - - 7343-dig-tcp-option.yml - - 7352-add-executable-option-for-cargo.yml - - 7355-newrelic-deployment-add-exact-name.yml - - 7360-lxd-remote-addr-host.yml - - 7364-add-option-force-gitlab-group.yml - - 7369-fix-lxc-options.yml - - 7373-lxc-remote-addr-change.yml - - 7374-fix-selective-callback-taskname-length.yml - - 7375-fix-github-deploy-key-pagination.yml - - 7377-proxmox-kvm-deprecate-flag.yml - - 7378-redhat_subscription-dbus-consumer-type.yaml - - 7379-url.yml - - 7382-kernel-blacklist-bugfix.yml - - 7392-lxd-inventory-server-cert.yml - - 7396-fix-apt_rpm-local-rpm-installation.yml - - 7399-cloudflare_dns-add-CAA-record-support.yml - - 7401-ini-file-modify-inactive-option.yaml - - 7412-add-port-for-nomad-connection.yaml - - 7452-fix-icinga2_host-requiring-ip-key.yml - - 8.0.0.yml - - ansible-core-2.11-2.12.yml - - get-secret-by-path.yml - - improvements-to-jenkins-build-module.yml - - ini_file-preserve-symlink.yml - - ini_file-use-inactive-options-when-possible.yml - - lvol-pct-of-origin.yml - - removals.yml - - update-v2-pagerduty-alert.yml - modules: - - description: Manipulate Consul policies - name: consul_policy - namespace: '' - - description: Manipulate Consul roles - name: consul_role - namespace: '' - - description: Runs the discovery program C(facter) on the remote system and return - Ansible facts - name: facter_facts - namespace: '' - - description: Set default handler for MIME type, for applications using Gnome - GIO - name: gio_mime - namespace: '' - - description: Creates, updates, or deletes GitLab instance variables - name: gitlab_instance_variable - namespace: '' - - description: Create, update, or delete GitLab merge requests - name: gitlab_merge_request - namespace: '' - - description: Get information about Jenkins builds - name: jenkins_build_info - namespace: '' - - description: Allows administration of Keycloak authentication required actions - name: keycloak_authentication_required_actions - namespace: '' - - description: Allows administration of Keycloak client custom Javascript policies - via Keycloak API - name: keycloak_authz_custom_policy - namespace: '' - - description: Allows administration of Keycloak client authorization permissions - via Keycloak API - name: keycloak_authz_permission - namespace: '' - - description: Query Keycloak client authorization permissions information - name: keycloak_authz_permission_info - namespace: '' - - description: Allows administration of Keycloak realm keys via Keycloak API - name: keycloak_realm_key - namespace: '' - - description: Create and configure a user in Keycloak - name: keycloak_user - namespace: '' - - description: Renames LVM volume groups - name: lvg_rename - namespace: '' - - description: Manage node.js packages with pnpm - name: pnpm - namespace: '' - - description: Pool management for Proxmox VE cluster - name: proxmox_pool - namespace: '' - - description: Add or delete members from Proxmox VE cluster pools - name: proxmox_pool_member - namespace: '' - - description: Retrieve information about one or more Proxmox VE virtual machines - name: proxmox_vm_info - namespace: '' - - description: Manage services on Source Mage GNU/Linux - name: simpleinit_msb - namespace: '' - plugins: - lookup: - - description: Retrieve secrets from Bitwarden Secrets Manager - name: bitwarden_secrets_manager - namespace: null - release_date: '2023-11-01' - 8.0.1: - changes: + - cpanm - the default of the ``mode`` option changed from ``compatibility`` + to ``new`` (https://github.com/ansible-collections/community.general/pull/8198). + - django_manage - the module now requires Django >= 4.1 (https://github.com/ansible-collections/community.general/pull/8198). + - django_manage - the module will now fail if ``virtualenv`` is specified but + no virtual environment exists at that location (https://github.com/ansible-collections/community.general/pull/8198). + - redfish_command, redfish_config, redfish_info - change the default for ``timeout`` + from 10 to 60 (https://github.com/ansible-collections/community.general/pull/8198). bugfixes: + - aix_filesystem - fix ``_validate_vg`` not passing VG name to ``lsvg_cmd`` + (https://github.com/ansible-collections/community.general/issues/8151). + - aix_filesystem - fix issue with empty list items in crfs logic and option + order (https://github.com/ansible-collections/community.general/pull/8052). + - apt-rpm - the module did not upgrade packages if a newer version exists. Now + the package will be reinstalled if the candidate is newer than the installed + version (https://github.com/ansible-collections/community.general/issues/7414). + - apt_rpm - when checking whether packages were installed after running ``apt-get + -y install <packages>``, only the last package name was checked (https://github.com/ansible-collections/community.general/pull/8263). + - bitwarden_secrets_manager lookup plugin - implements retry with exponential + backoff to avoid lookup errors when Bitwardn's API rate limiting is encountered + (https://github.com/ansible-collections/community.general/issues/8230, https://github.com/ansible-collections/community.general/pull/8238). + - 'cargo - fix idempotency issues when using a custom installation path for + packages (using the ``--path`` parameter). The initial installation runs fine, + but subsequent runs use the ``get_installed()`` function which did not check + the given installation location, before running ``cargo install``. This resulted + in a false ``changed`` state. Also the removal of packeges using ``state: + absent`` failed, as the installation check did not use the given parameter + (https://github.com/ansible-collections/community.general/pull/7970).' + - cloudflare_dns - fix Cloudflare lookup of SHFP records (https://github.com/ansible-collections/community.general/issues/7652). + - consul_token - fix token creation without ``accessor_id`` (https://github.com/ansible-collections/community.general/pull/8091). + - from_ini filter plugin - disabling interpolation of ``ConfigParser`` to allow + converting values with a ``%`` sign (https://github.com/ansible-collections/community.general/issues/8183, + https://github.com/ansible-collections/community.general/pull/8185). - gitlab_group_members - fix gitlab constants call in ``gitlab_group_members`` module (https://github.com/ansible-collections/community.general/issues/7467). + - gitlab_issue - fix behavior to search GitLab issue, using ``search`` keyword + instead of ``title`` (https://github.com/ansible-collections/community.general/issues/7846). + - gitlab_issue, gitlab_label, gitlab_milestone - avoid crash during version + comparison when the python-gitlab Python module is not installed (https://github.com/ansible-collections/community.general/pull/8158). - gitlab_project_members - fix gitlab constants call in ``gitlab_project_members`` module (https://github.com/ansible-collections/community.general/issues/7467). - gitlab_protected_branches - fix gitlab constants call in ``gitlab_protected_branches`` module (https://github.com/ansible-collections/community.general/issues/7467). + - gitlab_runner - fix pagination when checking for existing runners (https://github.com/ansible-collections/community.general/pull/7790). - gitlab_user - fix gitlab constants call in ``gitlab_user`` module (https://github.com/ansible-collections/community.general/issues/7467). - - proxmox_pool_member - absent state for type VM did not delete VMs from the - pools (https://github.com/ansible-collections/community.general/pull/7464). - - redfish_command - fix usage of message parsing in ``SimpleUpdate`` and ``MultipartHTTPPushUpdate`` - commands to treat the lack of a ``MessageId`` as no message (https://github.com/ansible-collections/community.general/issues/7465, - https://github.com/ansible-collections/community.general/pull/7471). - release_summary: Bugfix release for inclusion in Ansible 9.0.0b1. - fragments: - - 7464-fix-vm-removal-in-proxmox_pool_member.yml - - 7465-redfish-firmware-update-message-id-hardening.yml - - 7467-fix-gitlab-constants-calls.yml - - 8.0.1.yml - release_date: '2023-11-06' - 8.0.2: - changes: - bugfixes: - - ocapi_utils, oci_utils, redfish_utils module utils - replace ``type()`` calls - with ``isinstance()`` calls (https://github.com/ansible-collections/community.general/pull/7501). - - pipx module utils - change the CLI argument formatter for the ``pip_args`` - parameter (https://github.com/ansible-collections/community.general/issues/7497, - https://github.com/ansible-collections/community.general/pull/7506). - release_summary: Bugfix release for inclusion in Ansible 9.0.0rc1. - fragments: - - 7501-type.yml - - 7506-pipx-pipargs.yml - - 8.0.2.yml - release_date: '2023-11-13' - 8.1.0: - changes: - bugfixes: - - apt-rpm - the module did not upgrade packages if a newer version exists. Now - the package will be reinstalled if the candidate is newer than the installed - version (https://github.com/ansible-collections/community.general/issues/7414). - - cloudflare_dns - fix Cloudflare lookup of SHFP records (https://github.com/ansible-collections/community.general/issues/7652). + - haproxy - fix an issue where HAProxy could get stuck in DRAIN mode when the + backend was unreachable (https://github.com/ansible-collections/community.general/issues/8092). + - homebrew - detect already installed formulae and casks using JSON output from + ``brew info`` (https://github.com/ansible-collections/community.general/issues/864). + - homebrew - error returned from brew command was ignored and tried to parse + empty JSON. Fix now checks for an error and raises it to give accurate error + message to users (https://github.com/ansible-collections/community.general/issues/8047). + - incus connection plugin - treats ``inventory_hostname`` as a variable instead + of a literal in remote connections (https://github.com/ansible-collections/community.general/issues/7874). - interface_files - also consider ``address_family`` when changing ``option=method`` (https://github.com/ansible-collections/community.general/issues/7610, https://github.com/ansible-collections/community.general/pull/7612). + - inventory plugins - add unsafe wrapper to avoid marking strings that do not + contain ``{`` or ``}`` as unsafe, to work around a bug in AWX ((https://github.com/ansible-collections/community.general/issues/8212, + https://github.com/ansible-collections/community.general/pull/8225). + - ipa - fix get version regex in IPA module_utils (https://github.com/ansible-collections/community.general/pull/8175). + - ipa_hbacrule - the module uses a string for ``ipaenabledflag`` for new FreeIPA + versions while the returned value is a boolean (https://github.com/ansible-collections/community.general/pull/7880). + - ipa_otptoken - the module expect ``ipatokendisabled`` as string but the ``ipatokendisabled`` + value is returned as a boolean (https://github.com/ansible-collections/community.general/pull/7795). + - ipa_sudorule - the module uses a string for ``ipaenabledflag`` for new FreeIPA + versions while the returned value is a boolean (https://github.com/ansible-collections/community.general/pull/7880). + - iptables_state - fix idempotency issues when restoring incomplete iptables + dumps (https://github.com/ansible-collections/community.general/issues/8029). - irc - replace ``ssl.wrap_socket`` that was removed from Python 3.12 with code for creating a proper SSL context (https://github.com/ansible-collections/community.general/pull/7542). - keycloak_* - fix Keycloak API client to quote ``/`` properly (https://github.com/ansible-collections/community.general/pull/7641). - keycloak_authz_permission - resource payload variable for scope-based permission was constructed as a string, when it needs to be a list, even for a single item (https://github.com/ansible-collections/community.general/issues/7151). + - keycloak_client - add sorted ``defaultClientScopes`` and ``optionalClientScopes`` + to normalizations (https://github.com/ansible-collections/community.general/pull/8223). + - keycloak_client - fixes issue when metadata is provided in desired state when + task is in check mode (https://github.com/ansible-collections/community.general/issues/1226, + https://github.com/ansible-collections/community.general/pull/7881). + - keycloak_identity_provider - ``mappers`` processing was not idempotent if + the mappers configuration list had not been sorted by name (in ascending order). + Fix resolves the issue by sorting mappers in the desired state using the same + key which is used for obtaining existing state (https://github.com/ansible-collections/community.general/pull/7418). + - keycloak_identity_provider - it was not possible to reconfigure (add, remove) + ``mappers`` once they were created initially. Removal was ignored, adding + new ones resulted in dropping the pre-existing unmodified mappers. Fix resolves + the issue by supplying correct input to the internal update call (https://github.com/ansible-collections/community.general/pull/7418). + - keycloak_realm - add normalizations for ``enabledEventTypes`` and ``supportedLocales`` + (https://github.com/ansible-collections/community.general/pull/8224). + - keycloak_user - when ``force`` is set, but user does not exist, do not try + to delete it (https://github.com/ansible-collections/community.general/pull/7696). + - keycloak_user_federation - fix diff of empty ``krbPrincipalAttribute`` (https://github.com/ansible-collections/community.general/pull/8320). + - ldap - previously the order number (if present) was expected to follow an + equals sign in the DN. This makes it so the order number string is identified + correctly anywhere within the DN (https://github.com/ansible-collections/community.general/issues/7646). + - linode inventory plugin - add descriptive error message for linode inventory + plugin (https://github.com/ansible-collections/community.general/pull/8133). - log_entries callback plugin - replace ``ssl.wrap_socket`` that was removed from Python 3.12 with code for creating a proper SSL context (https://github.com/ansible-collections/community.general/pull/7542). - lvol - test for output messages in both ``stdout`` and ``stderr`` (https://github.com/ansible-collections/community.general/pull/7601, https://github.com/ansible-collections/community.general/issues/7182). + - 'merge_variables lookup plugin - fixing cross host merge: providing access + to foreign hosts variables to the perspective of the host that is performing + the merge (https://github.com/ansible-collections/community.general/pull/8303).' + - modprobe - listing modules files or modprobe files could trigger a FileNotFoundError + if ``/etc/modprobe.d`` or ``/etc/modules-load.d`` did not exist. Relevant + functions now return empty lists if the directories do not exist to avoid + crashing the module (https://github.com/ansible-collections/community.general/issues/7717). + - mssql_script - make the module work with Python 2 (https://github.com/ansible-collections/community.general/issues/7818, + https://github.com/ansible-collections/community.general/pull/7821). + - nmcli - fix ``connection.slave-type`` wired to ``bond`` and not with parameter + ``slave_type`` in case of connection type ``wifi`` (https://github.com/ansible-collections/community.general/issues/7389). + - ocapi_utils, oci_utils, redfish_utils module utils - replace ``type()`` calls + with ``isinstance()`` calls (https://github.com/ansible-collections/community.general/pull/7501). + - onepassword lookup plugin - failed for fields that were in sections and had + uppercase letters in the label/ID. Field lookups are now case insensitive + in all cases (https://github.com/ansible-collections/community.general/pull/7919). - onepassword lookup plugin - field and section titles are now case insensitive when using op CLI version two or later. This matches the behavior of version one (https://github.com/ansible-collections/community.general/pull/7564). + - opentelemetry callback plugin - close spans always (https://github.com/ansible-collections/community.general/pull/8367). + - opentelemetry callback plugin - honour the ``disable_logs`` option to avoid + storing task results since they are not used regardless (https://github.com/ansible-collections/community.general/pull/8373). + - pacemaker_cluster - actually implement check mode, which the module claims + to support. This means that until now the module also did changes in check + mode (https://github.com/ansible-collections/community.general/pull/8081). + - pam_limits - when the file does not exist, do not create it in check mode + (https://github.com/ansible-collections/community.general/issues/8050, https://github.com/ansible-collections/community.general/pull/8057). + - pipx module utils - change the CLI argument formatter for the ``pip_args`` + parameter (https://github.com/ansible-collections/community.general/issues/7497, + https://github.com/ansible-collections/community.general/pull/7506). + - pkgin - pkgin (pkgsrc package manager used by SmartOS) raises erratic exceptions + and spurious ``changed=true`` (https://github.com/ansible-collections/community.general/pull/7971). + - proxmox - fix updating a container config if the setting does not already + exist (https://github.com/ansible-collections/community.general/pull/7872). + - proxmox_kvm - fixed status check getting from node-specific API endpoint (https://github.com/ansible-collections/community.general/issues/7817). + - proxmox_kvm - running ``state=template`` will first check whether VM is already + a template (https://github.com/ansible-collections/community.general/pull/7792). + - proxmox_pool_member - absent state for type VM did not delete VMs from the + pools (https://github.com/ansible-collections/community.general/pull/7464). + - puppet - add option ``environment_lang`` to set the environment language encoding. + Defaults to lang ``C``. It is recommended to set it to ``C.UTF-8`` or ``en_US.UTF-8`` + depending on what is available on your system. (https://github.com/ansible-collections/community.general/issues/8000) + - redfish_command - fix usage of message parsing in ``SimpleUpdate`` and ``MultipartHTTPPushUpdate`` + commands to treat the lack of a ``MessageId`` as no message (https://github.com/ansible-collections/community.general/issues/7465, + https://github.com/ansible-collections/community.general/pull/7471). + - redfish_info - allow for a GET operation invoked by ``GetUpdateStatus`` to + allow for an empty response body for cases where a service returns 204 No + Content (https://github.com/ansible-collections/community.general/issues/8003). + - redfish_info - correct uncaught exception when attempting to retrieve ``Chassis`` + information (https://github.com/ansible-collections/community.general/pull/7952). - 'redhat_subscription - use the D-Bus registration on RHEL 7 only on 7.4 and greater; older versions of RHEL 7 do not have it @@ -854,12 +162,105 @@ releases: https://github.com/ansible-collections/community.general/pull/7624). ' + - riak - support ``riak admin`` sub-command in newer Riak KV versions beside + the legacy ``riak-admin`` main command (https://github.com/ansible-collections/community.general/pull/8211). + - statusio_maintenance - fix error caused by incorrectly formed API data payload. + Was raising "Failed to create maintenance HTTP Error 400 Bad Request" caused + by bad data type for date/time and deprecated dict keys (https://github.com/ansible-collections/community.general/pull/7754). - terraform - fix multiline string handling in complex variables (https://github.com/ansible-collections/community.general/pull/7535). + - to_ini filter plugin - disabling interpolation of ``ConfigParser`` to allow + converting values with a ``%`` sign (https://github.com/ansible-collections/community.general/issues/8183, + https://github.com/ansible-collections/community.general/pull/8185). + - xml - make module work with lxml 5.1.1, which removed some internals that + the module was relying on (https://github.com/ansible-collections/community.general/pull/8169). + deprecated_features: + - MH DependencyCtxMgr module_utils - deprecate ``module_utils.mh.mixin.deps.DependencyCtxMgr`` + in favour of ``module_utils.deps`` (https://github.com/ansible-collections/community.general/pull/8280). + - ModuleHelper module_utils - deprecate ``plugins.module_utils.module_helper.AnsibleModule`` + (https://github.com/ansible-collections/community.general/pull/8280). + - ModuleHelper module_utils - deprecate ``plugins.module_utils.module_helper.DependencyCtxMgr`` + (https://github.com/ansible-collections/community.general/pull/8280). + - ModuleHelper module_utils - deprecate ``plugins.module_utils.module_helper.StateMixin`` + (https://github.com/ansible-collections/community.general/pull/8280). + - ModuleHelper module_utils - deprecate ``plugins.module_utils.module_helper.VarDict,`` + (https://github.com/ansible-collections/community.general/pull/8280). + - ModuleHelper module_utils - deprecate ``plugins.module_utils.module_helper.VarMeta`` + (https://github.com/ansible-collections/community.general/pull/8280). + - ModuleHelper module_utils - deprecate ``plugins.module_utils.module_helper.VarsMixin`` + (https://github.com/ansible-collections/community.general/pull/8280). + - ModuleHelper module_utils - deprecate use of ``VarsMixin`` in favor of using + the ``VardDict`` module_utils (https://github.com/ansible-collections/community.general/pull/8226). + - ModuleHelper vars module_utils - bump deprecation of ``VarMeta``, ``VarDict`` + and ``VarsMixin`` to version 11.0.0 (https://github.com/ansible-collections/community.general/pull/8226). + - apt_rpm - the behavior of ``state=present`` and ``state=installed`` is deprecated + and will change in community.general 11.0.0. Right now the module will upgrade + a package to the latest version if one of these two states is used. You should + explicitly use ``state=latest`` if you want this behavior, and switch to ``state=present_not_latest`` + if you do not want to upgrade the package if it is already installed. In community.general + 11.0.0 the behavior of ``state=present`` and ``state=installed`` will change + to that of ``state=present_not_latest`` (https://github.com/ansible-collections/community.general/issues/8217, + https://github.com/ansible-collections/community.general/pull/8285). + - consul_acl - the module has been deprecated and will be removed in community.general + 10.0.0. ``consul_token`` and ``consul_policy`` can be used instead (https://github.com/ansible-collections/community.general/pull/7901). + - django_manage - the ``ack_venv_creation_deprecation`` option has no more effect + and will be removed from community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/8198). + - gitlab modules - the basic auth method on GitLab API have been deprecated + and will be removed in community.general 10.0.0 (https://github.com/ansible-collections/community.general/pull/8383). + - hipchat callback plugin - the hipchat service has been discontinued and the + self-hosted variant has been End of Life since 2020. The callback plugin is + therefore deprecated and will be removed from community.general 10.0.0 if + nobody provides compelling reasons to still keep it (https://github.com/ansible-collections/community.general/issues/8184, + https://github.com/ansible-collections/community.general/pull/8189). + - irc - the defaults ``false`` for ``use_tls`` and ``validate_certs`` have been + deprecated and will change to ``true`` in community.general 10.0.0 to improve + security. You can already improve security now by explicitly setting them + to ``true``. Specifying values now disables the deprecation warning (https://github.com/ansible-collections/community.general/pull/7578). minor_changes: + - PythonRunner module utils - specialisation of ``CmdRunner`` to execute Python + scripts (https://github.com/ansible-collections/community.general/pull/8289). + - Use offset-aware ``datetime.datetime`` objects (with timezone UTC) instead + of offset-naive UTC timestamps, which are deprecated in Python 3.12 (https://github.com/ansible-collections/community.general/pull/8222). + - aix_lvol - refactor module to pass list of arguments to ``module.run_command()`` + instead of relying on interpretation by a shell (https://github.com/ansible-collections/community.general/pull/8264). + - 'apt_rpm - add new states ``latest`` and ``present_not_latest``. The value + ``latest`` is equivalent to the current behavior of ``present``, which will + upgrade a package if a newer version exists. ``present_not_latest`` does what + most users would expect ``present`` to do: it does not upgrade if the package + is already installed. The current behavior of ``present`` will be deprecated + in a later version, and eventually changed to that of ``present_not_latest`` + (https://github.com/ansible-collections/community.general/issues/8217, https://github.com/ansible-collections/community.general/pull/8247).' + - apt_rpm - refactor module to pass list of arguments to ``module.run_command()`` + instead of relying on interpretation by a shell (https://github.com/ansible-collections/community.general/pull/8264). + - bitwarden lookup plugin - add ``bw_session`` option, to pass session key instead + of reading from env (https://github.com/ansible-collections/community.general/pull/7994). + - bitwarden lookup plugin - add support to filter by organization ID (https://github.com/ansible-collections/community.general/pull/8188). + - bitwarden lookup plugin - allows to fetch all records of a given collection + ID, by allowing to pass an empty value for ``search_value`` when ``collection_id`` + is provided (https://github.com/ansible-collections/community.general/pull/8013). - bitwarden lookup plugin - when looking for items using an item ID, the item is now accessed directly with ``bw get item`` instead of searching through all items. This doubles the lookup speed (https://github.com/ansible-collections/community.general/pull/7468). + - btrfs_subvolume - refactor module to pass list of arguments to ``module.run_command()`` + instead of relying on interpretation by a shell (https://github.com/ansible-collections/community.general/pull/8264). + - cmd_runner module_utils - add validation for minimum and maximum length in + the value passed to ``cmd_runner_fmt.as_list()`` (https://github.com/ansible-collections/community.general/pull/8288). + - consul_auth_method, consul_binding_rule, consul_policy, consul_role, consul_session, + consul_token - added action group ``community.general.consul`` (https://github.com/ansible-collections/community.general/pull/7897). + - consul_policy - added support for diff and check mode (https://github.com/ansible-collections/community.general/pull/7878). + - consul_policy, consul_role, consul_session - removed dependency on ``requests`` + and factored out common parts (https://github.com/ansible-collections/community.general/pull/7826, + https://github.com/ansible-collections/community.general/pull/7878). + - consul_role - ``node_identities`` now expects a ``node_name`` option to match + the Consul API, the old ``name`` is still supported as alias (https://github.com/ansible-collections/community.general/pull/7878). + - consul_role - ``service_identities`` now expects a ``service_name`` option + to match the Consul API, the old ``name`` is still supported as alias (https://github.com/ansible-collections/community.general/pull/7878). + - consul_role - added support for diff mode (https://github.com/ansible-collections/community.general/pull/7878). + - consul_role - added support for templated policies (https://github.com/ansible-collections/community.general/pull/7878). - elastic callback plugin - close elastic client to not leak resources (https://github.com/ansible-collections/community.general/pull/7517). + - filesystem - add bcachefs support (https://github.com/ansible-collections/community.general/pull/8126). + - gandi_livedns - adds support for personal access tokens (https://github.com/ansible-collections/community.general/issues/7639, + https://github.com/ansible-collections/community.general/pull/8337). + - gconftool2 - use ``ModuleHelper`` with ``VarDict`` (https://github.com/ansible-collections/community.general/pull/8226). - git_config - allow multiple git configs for the same name with the new ``add_mode`` option (https://github.com/ansible-collections/community.general/pull/7260). - git_config - the ``after`` and ``before`` fields in the ``diff`` of the return @@ -869,9 +270,37 @@ releases: (https://github.com/ansible-collections/community.general/pull/7260). - gitlab modules - add ``ca_path`` option (https://github.com/ansible-collections/community.general/pull/7472). - gitlab modules - remove duplicate ``gitlab`` package check (https://github.com/ansible-collections/community.general/pull/7486). + - gitlab_deploy_key, gitlab_group_members, gitlab_group_variable, gitlab_hook, + gitlab_instance_variable, gitlab_project_badge, gitlab_project_variable, gitlab_user + - improve API pagination and compatibility with different versions of ``python-gitlab`` + (https://github.com/ansible-collections/community.general/pull/7790). + - gitlab_hook - adds ``releases_events`` parameter for supporting Releases events + triggers on GitLab hooks (https://github.com/ansible-collections/community.general/pull/7956). - gitlab_runner - add support for new runner creation workflow (https://github.com/ansible-collections/community.general/pull/7199). + - homebrew - adds ``force_formula`` parameter to disambiguate a formula from + a cask of the same name (https://github.com/ansible-collections/community.general/issues/8274). + - homebrew, homebrew_cask - refactor common argument validation logic into a + dedicated ``homebrew`` module utils (https://github.com/ansible-collections/community.general/issues/8323, + https://github.com/ansible-collections/community.general/pull/8324). + - icinga2 inventory plugin - add Jinja2 templating support to ``url``, ``user``, + and ``password`` paramenters (https://github.com/ansible-collections/community.general/issues/7074, + https://github.com/ansible-collections/community.general/pull/7996). + - icinga2 inventory plugin - adds new parameter ``group_by_hostgroups`` in order + to make grouping by Icinga2 hostgroups optional (https://github.com/ansible-collections/community.general/pull/7998). + - ini_file - add an optional parameter ``section_has_values``. If the target + ini file contains more than one ``section``, use ``section_has_values`` to + specify which one should be updated (https://github.com/ansible-collections/community.general/pull/7505). + - ini_file - support optional spaces between section names and their surrounding + brackets (https://github.com/ansible-collections/community.general/pull/8075). + - installp - refactor module to pass list of arguments to ``module.run_command()`` + instead of relying on interpretation by a shell (https://github.com/ansible-collections/community.general/pull/8264). - ipa_config - adds ``passkey`` choice to ``ipauserauthtype`` parameter's choices (https://github.com/ansible-collections/community.general/pull/7588). + - ipa_dnsrecord - adds ability to manage NS record types (https://github.com/ansible-collections/community.general/pull/7737). + - ipa_pwpolicy - refactor module and exchange a sequence ``if`` statements with + a ``for`` loop (https://github.com/ansible-collections/community.general/pull/7723). + - ipa_pwpolicy - update module to support ``maxrepeat``, ``maxsequence``, ``dictcheck``, + ``usercheck``, ``gracelimit`` parameters in FreeIPA password policies (https://github.com/ansible-collections/community.general/pull/7723). - ipa_sudorule - adds options to include denied commands or command groups (https://github.com/ansible-collections/community.general/pull/7415). - ipa_user - adds ``idp`` and ``passkey`` choice to ``ipauserauthtype`` parameter's choices (https://github.com/ansible-collections/community.general/pull/7589). @@ -880,26 +309,84 @@ releases: is ``false`` for backwards compatibility. We recommend to every user of this module to explicitly set ``use_tls=true`` and `validate_certs=true`` whenever possible, especially when communicating to IRC servers over the internet (https://github.com/ansible-collections/community.general/pull/7550). + - java_cert - add ``cert_content`` argument (https://github.com/ansible-collections/community.general/pull/8153). + - java_cert - enable ``owner``, ``group``, ``mode``, and other generic file + arguments (https://github.com/ansible-collections/community.general/pull/8116). + - kernel_blacklist - use ``ModuleHelper`` with ``VarDict`` (https://github.com/ansible-collections/community.general/pull/8226). - keycloak module utils - expose error message from Keycloak server for HTTP errors in some specific situations (https://github.com/ansible-collections/community.general/pull/7645). + - keycloak_client, keycloak_clientscope, keycloak_clienttemplate - added ``docker-v2`` + protocol support, enhancing alignment with Keycloak's protocol options (https://github.com/ansible-collections/community.general/issues/8215, + https://github.com/ansible-collections/community.general/pull/8216). + - keycloak_realm_key - the ``config.algorithm`` option now supports 8 additional + key algorithms (https://github.com/ansible-collections/community.general/pull/7698). + - keycloak_realm_key - the ``config.certificate`` option value is no longer + defined with ``no_log=True`` (https://github.com/ansible-collections/community.general/pull/7698). + - keycloak_realm_key - the ``provider_id`` option now supports RSA encryption + key usage (value ``rsa-enc``) (https://github.com/ansible-collections/community.general/pull/7698). - keycloak_user_federation - add option for ``krbPrincipalAttribute`` (https://github.com/ansible-collections/community.general/pull/7538). + - keycloak_user_federation - allow custom user storage providers to be set through + ``provider_id`` (https://github.com/ansible-collections/community.general/pull/7789). + - ldap_attrs - module now supports diff mode, showing which attributes are changed + within an operation (https://github.com/ansible-collections/community.general/pull/8073). + - lvg - refactor module to pass list of arguments to ``module.run_command()`` + instead of relying on interpretation by a shell (https://github.com/ansible-collections/community.general/pull/8264). - lvol - change ``pvs`` argument type to list of strings (https://github.com/ansible-collections/community.general/pull/7676, https://github.com/ansible-collections/community.general/issues/7504). + - lvol - refactor module to pass list of arguments to ``module.run_command()`` + instead of relying on interpretation by a shell (https://github.com/ansible-collections/community.general/pull/8264). - 'lxd connection plugin - tighten the detection logic for lxd ``Instance not found`` errors, to avoid false detection on unrelated errors such as ``/usr/bin/python3: not found`` (https://github.com/ansible-collections/community.general/pull/7521).' + - lxd_container - uses ``/1.0/instances`` API endpoint, if available. Falls + back to ``/1.0/containers`` or ``/1.0/virtual-machines``. Fixes issue when + using Incus or LXD 5.19 due to migrating to ``/1.0/instances`` endpoint (https://github.com/ansible-collections/community.general/pull/7980). + - macports - refactor module to pass list of arguments to ``module.run_command()`` + instead of relying on interpretation by a shell (https://github.com/ansible-collections/community.general/pull/8264). + - mail - add ``Message-ID`` header; which is required by some mail servers (https://github.com/ansible-collections/community.general/pull/7740). + - mail module, mail callback plugin - allow to configure the domain name of + the Message-ID header with a new ``message_id_domain`` option (https://github.com/ansible-collections/community.general/pull/7765). + - mssql_script - adds transactional (rollback/commit) support via optional boolean + param ``transaction`` (https://github.com/ansible-collections/community.general/pull/7976). - netcup_dns - adds support for record types ``OPENPGPKEY``, ``SMIMEA``, and ``SSHFP`` (https://github.com/ansible-collections/community.general/pull/7489). - nmcli - add support for new connection type ``loopback`` (https://github.com/ansible-collections/community.general/issues/6572). + - nmcli - adds OpenvSwitch support with new ``type`` values ``ovs-port``, ``ovs-interface``, + and ``ovs-bridge``, and new ``slave_type`` value ``ovs-port`` (https://github.com/ansible-collections/community.general/pull/8154). - nmcli - allow for ``infiniband`` slaves of ``bond`` interface types (https://github.com/ansible-collections/community.general/pull/7569). - nmcli - allow for the setting of ``MTU`` for ``infiniband`` and ``bond`` interface types (https://github.com/ansible-collections/community.general/pull/7499). + - nmcli - allow setting ``MTU`` for ``bond-slave`` interface types (https://github.com/ansible-collections/community.general/pull/8118). - onepassword lookup plugin - support 1Password Connect with the opv2 client by setting the connect_host and connect_token parameters (https://github.com/ansible-collections/community.general/pull/7116). - onepassword_raw lookup plugin - support 1Password Connect with the opv2 client by setting the connect_host and connect_token parameters (https://github.com/ansible-collections/community.general/pull/7116) + - opentelemetry - add support for HTTP trace_exporter and configures the behavior + via ``OTEL_EXPORTER_OTLP_TRACES_PROTOCOL`` (https://github.com/ansible-collections/community.general/issues/7888, + https://github.com/ansible-collections/community.general/pull/8321). + - opentelemetry - add support for exporting spans in a file via ``ANSIBLE_OPENTELEMETRY_STORE_SPANS_IN_FILE`` + (https://github.com/ansible-collections/community.general/issues/7888, https://github.com/ansible-collections/community.general/pull/8363). + - opkg - use ``ModuleHelper`` with ``VarDict`` (https://github.com/ansible-collections/community.general/pull/8226). + - osx_defaults - add option ``check_types`` to enable changing the type of existing + defaults on the fly (https://github.com/ansible-collections/community.general/pull/8173). + - parted - refactor module to pass list of arguments to ``module.run_command()`` + instead of relying on interpretation by a shell (https://github.com/ansible-collections/community.general/pull/8264). - passwordstore - adds ``timestamp`` and ``preserve`` parameters to modify the stored password format (https://github.com/ansible-collections/community.general/pull/7426). + - passwordstore lookup - add ``missing_subkey`` parameter defining the behavior + of the lookup when a passwordstore subkey is missing (https://github.com/ansible-collections/community.general/pull/8166). + - pipx - use ``ModuleHelper`` with ``VarDict`` (https://github.com/ansible-collections/community.general/pull/8226). + - pkg5 - add support for non-silent execution (https://github.com/ansible-collections/community.general/issues/8379, + https://github.com/ansible-collections/community.general/pull/8382). + - pkgin - refactor module to pass list of arguments to ``module.run_command()`` + instead of relying on interpretation by a shell (https://github.com/ansible-collections/community.general/pull/8264). + - portage - adds the possibility to explicitely tell portage to write packages + to world file (https://github.com/ansible-collections/community.general/issues/6226, + https://github.com/ansible-collections/community.general/pull/8236). + - portinstall - refactor module to pass list of arguments to ``module.run_command()`` + instead of relying on interpretation by a shell (https://github.com/ansible-collections/community.general/pull/8264). + - proxmox - adds ``startup`` parameters to configure startup order, startup + delay and shutdown delay (https://github.com/ansible-collections/community.general/pull/8038). - proxmox - adds ``template`` value to the ``state`` parameter, allowing conversion of container to a template (https://github.com/ansible-collections/community.general/pull/7143). - proxmox - adds ``update`` parameter, allowing update of an already existing @@ -908,18 +395,98 @@ releases: inventory generation. The new setting is optional, not using this option will behave as usual (https://github.com/ansible-collections/community.general/issues/6714, https://github.com/ansible-collections/community.general/pull/7461). + - proxmox* modules - there is now a ``community.general.proxmox`` module defaults + group that can be used to set default options for all Proxmox modules (https://github.com/ansible-collections/community.general/pull/8334). - proxmox_disk - add ability to manipulate CD-ROM drive (https://github.com/ansible-collections/community.general/pull/7495). + - proxmox_kvm - add parameter ``update_unsafe`` to avoid limitations when updating + dangerous values (https://github.com/ansible-collections/community.general/pull/7843). - proxmox_kvm - adds ``template`` value to the ``state`` parameter, allowing conversion of a VM to a template (https://github.com/ansible-collections/community.general/pull/7143). + - proxmox_kvm - adds``usb`` parameter for setting USB devices on proxmox KVM + VMs (https://github.com/ansible-collections/community.general/pull/8199). - proxmox_kvm - support the ``hookscript`` parameter (https://github.com/ansible-collections/community.general/issues/7600). - proxmox_ostype - it is now possible to specify the ``ostype`` when creating an LXC container (https://github.com/ansible-collections/community.general/pull/7462). - proxmox_vm_info - add ability to retrieve configuration info (https://github.com/ansible-collections/community.general/pull/7485). + - puppet - new feature to set ``--waitforlock`` option (https://github.com/ansible-collections/community.general/pull/8282). + - redfish_command - add command ``ResetToDefaults`` to reset manager to default + state (https://github.com/ansible-collections/community.general/issues/8163). + - redfish_config - add command ``SetServiceIdentification`` to set service identification + (https://github.com/ansible-collections/community.general/issues/7916). + - redfish_info - add boolean return value ``MultipartHttpPush`` to ``GetFirmwareUpdateCapabilities`` + (https://github.com/ansible-collections/community.general/issues/8194, https://github.com/ansible-collections/community.general/pull/8195). + - redfish_info - add command ``GetServiceIdentification`` to get service identification + (https://github.com/ansible-collections/community.general/issues/7882). - redfish_info - adding the ``BootProgress`` property when getting ``Systems`` info (https://github.com/ansible-collections/community.general/pull/7626). + - revbitspss lookup plugin - removed a redundant unicode prefix. The prefix + was not necessary for Python 3 and has been cleaned up to streamline the code + (https://github.com/ansible-collections/community.general/pull/8087). + - rundeck module utils - allow to pass ``Content-Type`` to API requests (https://github.com/ansible-collections/community.general/pull/7684). + - slackpkg - refactor module to pass list of arguments to ``module.run_command()`` + instead of relying on interpretation by a shell (https://github.com/ansible-collections/community.general/pull/8264). - ssh_config - adds ``controlmaster``, ``controlpath`` and ``controlpersist`` parameters (https://github.com/ansible-collections/community.general/pull/7456). - release_summary: Regular bugfix and feature release. + - ssh_config - allow ``accept-new`` as valid value for ``strict_host_key_checking`` + (https://github.com/ansible-collections/community.general/pull/8257). + - ssh_config - new feature to set ``AddKeysToAgent`` option to ``yes`` or ``no`` + (https://github.com/ansible-collections/community.general/pull/7703). + - ssh_config - new feature to set ``IdentitiesOnly`` option to ``yes`` or ``no`` + (https://github.com/ansible-collections/community.general/pull/7704). + - sudoers - add support for the ``NOEXEC`` tag in sudoers rules (https://github.com/ansible-collections/community.general/pull/7983). + - svr4pkg - refactor module to pass list of arguments to ``module.run_command()`` + instead of relying on interpretation by a shell (https://github.com/ansible-collections/community.general/pull/8264). + - swdepot - refactor module to pass list of arguments to ``module.run_command()`` + instead of relying on interpretation by a shell (https://github.com/ansible-collections/community.general/pull/8264). + - terraform - add support for ``diff_mode`` for terraform resource_changes (https://github.com/ansible-collections/community.general/pull/7896). + - terraform - fix ``diff_mode`` in state ``absent`` and when terraform ``resource_changes`` + does not exist (https://github.com/ansible-collections/community.general/pull/7963). + - xcc_redfish_command - added support for raw POSTs (``command=PostResource`` + in ``category=Raw``) without a specific action info (https://github.com/ansible-collections/community.general/pull/7746). + - xfconf - use ``ModuleHelper`` with ``VarDict`` (https://github.com/ansible-collections/community.general/pull/8226). + - xfconf_info - use ``ModuleHelper`` with ``VarDict`` (https://github.com/ansible-collections/community.general/pull/8226). + release_summary: This is release 9.0.0 of ``community.general``, released on + 2024-05-20. + removed_features: + - The deprecated redirects for internal module names have been removed. These + internal redirects were extra-long FQCNs like ``community.general.packaging.os.apt_rpm`` + that redirect to the short FQCN ``community.general.apt_rpm``. They were originally + needed to implement flatmapping; as various tooling started to recommend users + to use the long names flatmapping was removed from the collection and redirects + were added for users who already followed these incorrect recommendations + (https://github.com/ansible-collections/community.general/pull/7835). + - ansible_galaxy_install - the ``ack_ansible29`` and ``ack_min_ansiblecore211`` + options have been removed. They no longer had any effect (https://github.com/ansible-collections/community.general/pull/8198). + - cloudflare_dns - remove support for SPF records. These are no longer supported + by CloudFlare (https://github.com/ansible-collections/community.general/pull/7782). + - django_manage - support for the ``command`` values ``cleanup``, ``syncdb``, + and ``validate`` were removed. Use ``clearsessions``, ``migrate``, and ``check`` + instead, respectively (https://github.com/ansible-collections/community.general/pull/8198). + - flowdock - this module relied on HTTPS APIs that do not exist anymore and + was thus removed (https://github.com/ansible-collections/community.general/pull/8198). + - mh.mixins.deps module utils - the ``DependencyMixin`` has been removed. Use + the ``deps`` module utils instead (https://github.com/ansible-collections/community.general/pull/8198). + - proxmox - the ``proxmox_default_behavior`` option has been removed (https://github.com/ansible-collections/community.general/pull/8198). + - rax* modules, rax module utils, rax docs fragment - the Rackspace modules + relied on the deprecated package ``pyrax`` and were thus removed (https://github.com/ansible-collections/community.general/pull/8198). + - redhat module utils - the classes ``Rhsm``, ``RhsmPool``, and ``RhsmPools`` + have been removed (https://github.com/ansible-collections/community.general/pull/8198). + - redhat_subscription - the alias ``autosubscribe`` of the ``auto_attach`` option + was removed (https://github.com/ansible-collections/community.general/pull/8198). + - stackdriver - this module relied on HTTPS APIs that do not exist anymore and + was thus removed (https://github.com/ansible-collections/community.general/pull/8198). + - webfaction_* modules - these modules relied on HTTPS APIs that do not exist + anymore and were thus removed (https://github.com/ansible-collections/community.general/pull/8198). + security_fixes: + - cobbler, gitlab_runners, icinga2, linode, lxd, nmap, online, opennebula, proxmox, + scaleway, stackpath_compute, virtualbox, and xen_orchestra inventory plugin + - make sure all data received from the remote servers is marked as unsafe, + so remote code execution by obtaining texts that can be evaluated as templates + is not possible (https://www.die-welt.net/2024/03/remote-code-execution-in-ansible-dynamic-inventory-plugins/, + https://github.com/ansible-collections/community.general/pull/8098). + - keycloak_identity_provider - the client secret was not correctly sanitized + by the module. The return values ``proposed``, ``existing``, and ``end_state``, + as well as the diff, did contain the client secret unmasked (https://github.com/ansible-collections/community.general/pull/8355). fragments: - 000-redhat_subscription-dbus-on-7.4-plus.yaml - 5588-support-1password-connect.yml @@ -928,25 +495,34 @@ releases: - 7151-fix-keycloak_authz_permission-incorrect-resource-payload.yml - 7199-gitlab-runner-new-creation-workflow.yml - 7242-multi-values-for-same-name-in-git-config.yml + - 7389-nmcli-issue-with-creating-a-wifi-bridge-slave.yml + - 7418-kc_identity_provider-mapper-reconfiguration-fixes.yml - 7426-add-timestamp-and-preserve-options-for-passwordstore.yaml - 7456-add-ssh-control-master.yml - 7461-proxmox-inventory-add-exclude-nodes.yaml - 7462-Add-ostype-parameter-in-LXC-container-clone-of-ProxmoxVE.yaml + - 7464-fix-vm-removal-in-proxmox_pool_member.yml + - 7465-redfish-firmware-update-message-id-hardening.yml + - 7467-fix-gitlab-constants-calls.yml - 7472-gitlab-add-ca-path-option.yml - 7485-proxmox_vm_info-config.yml - 7486-gitlab-refactor-package-check.yml - 7489-netcup-dns-record-types.yml - 7495-proxmox_disk-manipulate-cdrom.yml - 7499-allow-mtu-setting-on-bond-and-infiniband-interfaces.yml + - 7501-type.yml + - 7505-ini_file-section_has.yml + - 7506-pipx-pipargs.yml - 7517-elastic-close-client.yaml - 7535-terraform-fix-multiline-string-handling-in-complex-variables.yml - 7538-add-krbprincipalattribute-option.yml - - 7540-proxmox-update config.yml + - 7540-proxmox-update-config.yml - 7542-irc-logentries-ssl.yml - 7550-irc-use_tls-validate_certs.yml - 7564-onepassword-lookup-case-insensitive.yaml - 7569-infiniband-slave-support.yml - 7577-fix-apt_rpm-module.yml + - 7578-irc-tls.yml - 7588-ipa-config-new-choice-passkey-to-ipauserauthtype.yml - 7589-ipa-config-new-choices-idp-and-passkey-to-ipauserauthtype.yml - 7600-proxmox_kvm-hookscript.yml @@ -955,257 +531,43 @@ releases: - 7626-redfish-info-add-boot-progress-property.yml - 7641-fix-keycloak-api-client-to-quote-properly.yml - 7645-Keycloak-print-error-msg-from-server.yml + - 7646-fix-order-number-detection-in-dn.yml - 7653-fix-cloudflare-lookup.yml - 7676-lvol-pvs-as-list.yml - - 8.1.0.yml - - add-ipa-sudorule-deny-cmd.yml - - bitwarden-lookup-performance.yaml - - lxd-instance-not-found-avoid-false-positives.yml - modules: - - description: Read git configuration - name: git_config_info - namespace: '' - - description: Create, update, or delete GitLab issues - name: gitlab_issue - namespace: '' - - description: Manage Nomad ACL tokens - name: nomad_token - namespace: '' - plugins: - lookup: - - description: Fetch documents stored in 1Password - name: onepassword_doc - namespace: null - test: - - description: Validates fully-qualified domain names against RFC 1123 - name: fqdn_valid - namespace: null - release_date: '2023-12-04' - 8.2.0: - changes: - bugfixes: - - keycloak_identity_provider - ``mappers`` processing was not idempotent if - the mappers configuration list had not been sorted by name (in ascending order). - Fix resolves the issue by sorting mappers in the desired state using the same - key which is used for obtaining existing state (https://github.com/ansible-collections/community.general/pull/7418). - - keycloak_identity_provider - it was not possible to reconfigure (add, remove) - ``mappers`` once they were created initially. Removal was ignored, adding - new ones resulted in dropping the pre-existing unmodified mappers. Fix resolves - the issue by supplying correct input to the internal update call (https://github.com/ansible-collections/community.general/pull/7418). - - keycloak_user - when ``force`` is set, but user does not exist, do not try - to delete it (https://github.com/ansible-collections/community.general/pull/7696). - - proxmox_kvm - running ``state=template`` will first check whether VM is already - a template (https://github.com/ansible-collections/community.general/pull/7792). - - statusio_maintenance - fix error caused by incorrectly formed API data payload. - Was raising "Failed to create maintenance HTTP Error 400 Bad Request" caused - by bad data type for date/time and deprecated dict keys (https://github.com/ansible-collections/community.general/pull/7754). - minor_changes: - - ipa_dnsrecord - adds ability to manage NS record types (https://github.com/ansible-collections/community.general/pull/7737). - - ipa_pwpolicy - refactor module and exchange a sequence ``if`` statements with - a ``for`` loop (https://github.com/ansible-collections/community.general/pull/7723). - - ipa_pwpolicy - update module to support ``maxrepeat``, ``maxsequence``, ``dictcheck``, - ``usercheck``, ``gracelimit`` parameters in FreeIPA password policies (https://github.com/ansible-collections/community.general/pull/7723). - - keycloak_realm_key - the ``config.algorithm`` option now supports 8 additional - key algorithms (https://github.com/ansible-collections/community.general/pull/7698). - - keycloak_realm_key - the ``config.certificate`` option value is no longer - defined with ``no_log=True`` (https://github.com/ansible-collections/community.general/pull/7698). - - keycloak_realm_key - the ``provider_id`` option now supports RSA encryption - key usage (value ``rsa-enc``) (https://github.com/ansible-collections/community.general/pull/7698). - - keycloak_user_federation - allow custom user storage providers to be set through - ``provider_id`` (https://github.com/ansible-collections/community.general/pull/7789). - - mail - add ``Message-ID`` header; which is required by some mail servers (https://github.com/ansible-collections/community.general/pull/7740). - - mail module, mail callback plugin - allow to configure the domain name of - the Message-ID header with a new ``message_id_domain`` option (https://github.com/ansible-collections/community.general/pull/7765). - - ssh_config - new feature to set ``AddKeysToAgent`` option to ``yes`` or ``no`` - (https://github.com/ansible-collections/community.general/pull/7703). - - ssh_config - new feature to set ``IdentitiesOnly`` option to ``yes`` or ``no`` - (https://github.com/ansible-collections/community.general/pull/7704). - - xcc_redfish_command - added support for raw POSTs (``command=PostResource`` - in ``category=Raw``) without a specific action info (https://github.com/ansible-collections/community.general/pull/7746). - release_summary: Regular bugfix and feature release. - fragments: - - 7418-kc_identity_provider-mapper-reconfiguration-fixes.yml + - 7683-added-contenttype-parameter.yml - 7696-avoid-attempt-to-delete-non-existing-user.yml - 7698-improvements-to-keycloak_realm_key.yml - 7703-ssh_config_add_keys_to_agent_option.yml - 7704-ssh_config_identities_only_option.yml + - 7717-prevent-modprobe-error.yml - 7723-ipa-pwpolicy-update-pwpolicy-module.yml - 7737-add-ipa-dnsrecord-ns-type.yml - 7740-add-message-id-header-to-mail-module.yml - 7746-raw_post-without-actions.yml - 7754-fixed-payload-format.yml - 7765-mail-message-id.yml + - 7782-cloudflare_dns-spf.yml - 7789-keycloak-user-federation-custom-provider-type.yml + - 7790-gitlab-runner-api-pagination.yml - 7791-proxmox_kvm-state-template-will-check-status-first.yaml - - 8.2.0.yml - modules: - - description: Enable or disable dnf repositories using config-manager - name: dnf_config_manager - namespace: '' - - description: Retrive component info in Keycloak - name: keycloak_component_info - namespace: '' - - description: Allows administration of Keycloak realm role mappings into groups - with the Keycloak API - name: keycloak_realm_rolemapping - namespace: '' - - description: Retrieve information about one or more Proxmox VE nodes - name: proxmox_node_info - namespace: '' - - description: List content from a Proxmox VE storage - name: proxmox_storage_contents_info - namespace: '' - plugins: - connection: - - description: Run tasks in Incus instances via the Incus CLI. - name: incus - namespace: null - filter: - - description: Converts INI text input into a dictionary - name: from_ini - namespace: null - - description: Converts a dictionary to the INI file format - name: to_ini - namespace: null - lookup: - - description: Obtain short-lived Github App Access tokens - name: github_app_access_token - namespace: null - release_date: '2024-01-01' - 8.3.0: - changes: - bugfixes: - - homebrew - detect already installed formulae and casks using JSON output from - ``brew info`` (https://github.com/ansible-collections/community.general/issues/864). - - incus connection plugin - treats ``inventory_hostname`` as a variable instead - of a literal in remote connections (https://github.com/ansible-collections/community.general/issues/7874). - - ipa_otptoken - the module expect ``ipatokendisabled`` as string but the ``ipatokendisabled`` - value is returned as a boolean (https://github.com/ansible-collections/community.general/pull/7795). - - ldap - previously the order number (if present) was expected to follow an - equals sign in the DN. This makes it so the order number string is identified - correctly anywhere within the DN (https://github.com/ansible-collections/community.general/issues/7646). - - mssql_script - make the module work with Python 2 (https://github.com/ansible-collections/community.general/issues/7818, - https://github.com/ansible-collections/community.general/pull/7821). - - nmcli - fix ``connection.slave-type`` wired to ``bond`` and not with parameter - ``slave_type`` in case of connection type ``wifi`` (https://github.com/ansible-collections/community.general/issues/7389). - - proxmox - fix updating a container config if the setting does not already - exist (https://github.com/ansible-collections/community.general/pull/7872). - deprecated_features: - - consul_acl - the module has been deprecated and will be removed in community.general - 10.0.0. ``consul_token`` and ``consul_policy`` can be used instead (https://github.com/ansible-collections/community.general/pull/7901). - minor_changes: - - consul_auth_method, consul_binding_rule, consul_policy, consul_role, consul_session, - consul_token - added action group ``community.general.consul`` (https://github.com/ansible-collections/community.general/pull/7897). - - consul_policy - added support for diff and check mode (https://github.com/ansible-collections/community.general/pull/7878). - - consul_policy, consul_role, consul_session - removed dependency on ``requests`` - and factored out common parts (https://github.com/ansible-collections/community.general/pull/7826, - https://github.com/ansible-collections/community.general/pull/7878). - - consul_role - ``node_identities`` now expects a ``node_name`` option to match - the Consul API, the old ``name`` is still supported as alias (https://github.com/ansible-collections/community.general/pull/7878). - - consul_role - ``service_identities`` now expects a ``service_name`` option - to match the Consul API, the old ``name`` is still supported as alias (https://github.com/ansible-collections/community.general/pull/7878). - - consul_role - added support for diff mode (https://github.com/ansible-collections/community.general/pull/7878). - - consul_role - added support for templated policies (https://github.com/ansible-collections/community.general/pull/7878). - - redfish_info - add command ``GetServiceIdentification`` to get service identification - (https://github.com/ansible-collections/community.general/issues/7882). - - terraform - add support for ``diff_mode`` for terraform resource_changes (https://github.com/ansible-collections/community.general/pull/7896). - release_summary: Regular bugfix and feature release. - fragments: - - 7389-nmcli-issue-with-creating-a-wifi-bridge-slave.yml - - 7646-fix-order-number-detection-in-dn.yml - 7797-ipa-fix-otp-idempotency.yml - 7821-mssql_script-py2.yml - 7826-consul-modules-refactoring.yaml + - 7843-proxmox_kvm-update_unsafe.yml + - 7847-gitlab-issue-title.yml - 7870-homebrew-cask-installed-detection.yml - 7872-proxmox_fix-update-if-setting-doesnt-exist.yaml - 7874-incus_connection_treats_inventory_hostname_as_literal_in_remotes.yml + - 7880-ipa-fix-sudo-and-hbcalrule-idempotence.yml + - 7881-fix-keycloak-client-ckeckmode.yml - 7882-add-redfish-get-service-identification.yml - 7896-add-terraform-diff-mode.yml - 7897-consul-action-group.yaml - 7901-consul-acl-deprecation.yaml - - 8.3.0.yml - modules: - - description: Bootstrap ACLs in Consul - name: consul_acl_bootstrap - namespace: '' - - description: Manipulate Consul auth methods - name: consul_auth_method - namespace: '' - - description: Manipulate Consul binding rules - name: consul_binding_rule - namespace: '' - - description: Manipulate Consul tokens - name: consul_token - namespace: '' - - description: Creates/updates/deletes GitLab Labels belonging to project or group. - name: gitlab_label - namespace: '' - - description: Creates/updates/deletes GitLab Milestones belonging to project - or group - name: gitlab_milestone - namespace: '' - release_date: '2024-01-29' - 8.4.0: - changes: - bugfixes: - - 'cargo - fix idempotency issues when using a custom installation path for - packages (using the ``--path`` parameter). The initial installation runs fine, - but subsequent runs use the ``get_installed()`` function which did not check - the given installation location, before running ``cargo install``. This resulted - in a false ``changed`` state. Also the removal of packeges using ``state: - absent`` failed, as the installation check did not use the given parameter - (https://github.com/ansible-collections/community.general/pull/7970).' - - gitlab_issue - fix behavior to search GitLab issue, using ``search`` keyword - instead of ``title`` (https://github.com/ansible-collections/community.general/issues/7846). - - gitlab_runner - fix pagination when checking for existing runners (https://github.com/ansible-collections/community.general/pull/7790). - - keycloak_client - fixes issue when metadata is provided in desired state when - task is in check mode (https://github.com/ansible-collections/community.general/issues/1226, - https://github.com/ansible-collections/community.general/pull/7881). - - modprobe - listing modules files or modprobe files could trigger a FileNotFoundError - if ``/etc/modprobe.d`` or ``/etc/modules-load.d`` did not exist. Relevant - functions now return empty lists if the directories do not exist to avoid - crashing the module (https://github.com/ansible-collections/community.general/issues/7717). - - onepassword lookup plugin - failed for fields that were in sections and had - uppercase letters in the label/ID. Field lookups are now case insensitive - in all cases (https://github.com/ansible-collections/community.general/pull/7919). - - pkgin - pkgin (pkgsrc package manager used by SmartOS) raises erratic exceptions - and spurious ``changed=true`` (https://github.com/ansible-collections/community.general/pull/7971). - - redfish_info - allow for a GET operation invoked by ``GetUpdateStatus`` to - allow for an empty response body for cases where a service returns 204 No - Content (https://github.com/ansible-collections/community.general/issues/8003). - - redfish_info - correct uncaught exception when attempting to retrieve ``Chassis`` - information (https://github.com/ansible-collections/community.general/pull/7952). - minor_changes: - - bitwarden lookup plugin - add ``bw_session`` option, to pass session key instead - of reading from env (https://github.com/ansible-collections/community.general/pull/7994). - - gitlab_deploy_key, gitlab_group_members, gitlab_group_variable, gitlab_hook, - gitlab_instance_variable, gitlab_project_badge, gitlab_project_variable, gitlab_user - - improve API pagination and compatibility with different versions of ``python-gitlab`` - (https://github.com/ansible-collections/community.general/pull/7790). - - gitlab_hook - adds ``releases_events`` parameter for supporting Releases events - triggers on GitLab hooks (https://github.com/ansible-collections/community.general/pull/7956). - - icinga2 inventory plugin - add Jinja2 templating support to ``url``, ``user``, - and ``password`` paramenters (https://github.com/ansible-collections/community.general/issues/7074, - https://github.com/ansible-collections/community.general/pull/7996). - - mssql_script - adds transactional (rollback/commit) support via optional boolean - param ``transaction`` (https://github.com/ansible-collections/community.general/pull/7976). - - proxmox_kvm - add parameter ``update_unsafe`` to avoid limitations when updating - dangerous values (https://github.com/ansible-collections/community.general/pull/7843). - - redfish_config - add command ``SetServiceIdentification`` to set service identification - (https://github.com/ansible-collections/community.general/issues/7916). - - sudoers - add support for the ``NOEXEC`` tag in sudoers rules (https://github.com/ansible-collections/community.general/pull/7983). - - terraform - fix ``diff_mode`` in state ``absent`` and when terraform ``resource_changes`` - does not exist (https://github.com/ansible-collections/community.general/pull/7963). - release_summary: Regular bugfix and feature release. - fragments: - - 7717-prevent-modprobe-error.yml - - 7790-gitlab-runner-api-pagination.yml - - 7843-proxmox_kvm-update_unsafe.yml - - 7847-gitlab-issue-title.yml - - 7881-fix-keycloak-client-ckeckmode.yml - 7916-add-redfish-set-service-identification.yml - 7919-onepassword-fieldname-casing.yaml - 7951-fix-redfish_info-exception.yml + - 7953-proxmox_kvm-fix_status_check.yml - 7956-adding-releases_events-option-to-gitlab_hook-module.yaml - 7963-fix-terraform-diff-absent.yml - 7970-fix-cargo-path-idempotency.yaml @@ -1213,92 +575,8 @@ releases: - 7983-sudoers-add-support-noexec.yml - 7994-bitwarden-session-arg.yaml - 7996-add-templating-support-to-icinga2-inventory.yml - - 8.4.0.yml - - 8003-redfish-get-update-status-empty-response.yml - - pkgin.yml - modules: - - description: Manages GitLab group access tokens - name: gitlab_group_access_token - namespace: '' - - description: Manages GitLab project access tokens - name: gitlab_project_access_token - namespace: '' - plugins: - callback: - - description: The default ansible callback without diff output - name: default_without_diff - namespace: null - filter: - - description: Difference of lists with a predictive order - name: lists_difference - namespace: null - - description: Intersection of lists with a predictive order - name: lists_intersect - namespace: null - - description: Symmetric Difference of lists with a predictive order - name: lists_symmetric_difference - namespace: null - - description: Union of lists with a predictive order - name: lists_union - namespace: null - release_date: '2024-02-26' - 8.5.0: - changes: - bugfixes: - - aix_filesystem - fix issue with empty list items in crfs logic and option - order (https://github.com/ansible-collections/community.general/pull/8052). - - consul_token - fix token creation without ``accessor_id`` (https://github.com/ansible-collections/community.general/pull/8091). - - homebrew - error returned from brew command was ignored and tried to parse - empty JSON. Fix now checks for an error and raises it to give accurate error - message to users (https://github.com/ansible-collections/community.general/issues/8047). - - ipa_hbacrule - the module uses a string for ``ipaenabledflag`` for new FreeIPA - versions while the returned value is a boolean (https://github.com/ansible-collections/community.general/pull/7880). - - ipa_sudorule - the module uses a string for ``ipaenabledflag`` for new FreeIPA - versions while the returned value is a boolean (https://github.com/ansible-collections/community.general/pull/7880). - - iptables_state - fix idempotency issues when restoring incomplete iptables - dumps (https://github.com/ansible-collections/community.general/issues/8029). - - linode inventory plugin - add descriptive error message for linode inventory - plugin (https://github.com/ansible-collections/community.general/pull/8133). - - pacemaker_cluster - actually implement check mode, which the module claims - to support. This means that until now the module also did changes in check - mode (https://github.com/ansible-collections/community.general/pull/8081). - - pam_limits - when the file does not exist, do not create it in check mode - (https://github.com/ansible-collections/community.general/issues/8050, https://github.com/ansible-collections/community.general/pull/8057). - - proxmox_kvm - fixed status check getting from node-specific API endpoint (https://github.com/ansible-collections/community.general/issues/7817). - minor_changes: - - bitwarden lookup plugin - allows to fetch all records of a given collection - ID, by allowing to pass an empty value for ``search_value`` when ``collection_id`` - is provided (https://github.com/ansible-collections/community.general/pull/8013). - - icinga2 inventory plugin - adds new parameter ``group_by_hostgroups`` in order - to make grouping by Icinga2 hostgroups optional (https://github.com/ansible-collections/community.general/pull/7998). - - ini_file - support optional spaces between section names and their surrounding - brackets (https://github.com/ansible-collections/community.general/pull/8075). - - java_cert - enable ``owner``, ``group``, ``mode``, and other generic file - arguments (https://github.com/ansible-collections/community.general/pull/8116). - - ldap_attrs - module now supports diff mode, showing which attributes are changed - within an operation (https://github.com/ansible-collections/community.general/pull/8073). - - lxd_container - uses ``/1.0/instances`` API endpoint, if available. Falls - back to ``/1.0/containers`` or ``/1.0/virtual-machines``. Fixes issue when - using Incus or LXD 5.19 due to migrating to ``/1.0/instances`` endpoint (https://github.com/ansible-collections/community.general/pull/7980). - - nmcli - allow setting ``MTU`` for ``bond-slave`` interface types (https://github.com/ansible-collections/community.general/pull/8118). - - proxmox - adds ``startup`` parameters to configure startup order, startup - delay and shutdown delay (https://github.com/ansible-collections/community.general/pull/8038). - - revbitspss lookup plugin - removed a redundant unicode prefix. The prefix - was not necessary for Python 3 and has been cleaned up to streamline the code - (https://github.com/ansible-collections/community.general/pull/8087). - release_summary: Regular feature and bugfix release with security fixes. - security_fixes: - - cobbler, gitlab_runners, icinga2, linode, lxd, nmap, online, opennebula, proxmox, - scaleway, stackpath_compute, virtualbox, and xen_orchestra inventory plugin - - make sure all data received from the remote servers is marked as unsafe, - so remote code execution by obtaining texts that can be evaluated as templates - is not possible (https://www.die-welt.net/2024/03/remote-code-execution-in-ansible-dynamic-inventory-plugins/, - https://github.com/ansible-collections/community.general/pull/8098). - fragments: - - 7880-ipa-fix-sudo-and-hbcalrule-idempotence.yml - - 7953-proxmox_kvm-fix_status_check.yml - 7998-icinga2-inventory-group_by_hostgroups-parameter.yml - - 8.5.0.yml + - 8003-redfish-get-update-status-empty-response.yml - 8013-bitwarden-full-collection-item-list.yaml - 8029-iptables-state-restore-check-mode.yml - 8038-proxmox-startup.yml @@ -1308,99 +586,11 @@ releases: - 8075-optional-space-around-section-names.yaml - 8087-removed-redundant-unicode-prefixes.yml - 8091-consul-token-fixes.yaml + - 8100-haproxy-drain-fails-on-down-backend.yml - 8116-java_cert-enable-owner-group-mode-args.yml - 8118-fix-bond-slave-honoring-mtu.yml - - 8133-add-error-message-for-linode-inventory-plugin.yaml - - aix_filesystem-crfs-issue.yml - - inventory-rce.yml - - lxd-instances-api-endpoint-added.yml - - pacemaker-cluster.yml - modules: - - description: Allows listing information about USB devices - name: usb_facts - namespace: '' - release_date: '2024-03-25' - 8.6.0: - changes: - bugfixes: - - aix_filesystem - fix ``_validate_vg`` not passing VG name to ``lsvg_cmd`` - (https://github.com/ansible-collections/community.general/issues/8151). - - apt_rpm - when checking whether packages were installed after running ``apt-get - -y install <packages>``, only the last package name was checked (https://github.com/ansible-collections/community.general/pull/8263). - - bitwarden_secrets_manager lookup plugin - implements retry with exponential - backoff to avoid lookup errors when Bitwardn's API rate limiting is encountered - (https://github.com/ansible-collections/community.general/issues/8230, https://github.com/ansible-collections/community.general/pull/8238). - - from_ini filter plugin - disabling interpolation of ``ConfigParser`` to allow - converting values with a ``%`` sign (https://github.com/ansible-collections/community.general/issues/8183, - https://github.com/ansible-collections/community.general/pull/8185). - - gitlab_issue, gitlab_label, gitlab_milestone - avoid crash during version - comparison when the python-gitlab Python module is not installed (https://github.com/ansible-collections/community.general/pull/8158). - - haproxy - fix an issue where HAProxy could get stuck in DRAIN mode when the - backend was unreachable (https://github.com/ansible-collections/community.general/issues/8092). - - inventory plugins - add unsafe wrapper to avoid marking strings that do not - contain ``{`` or ``}`` as unsafe, to work around a bug in AWX ((https://github.com/ansible-collections/community.general/issues/8212, - https://github.com/ansible-collections/community.general/pull/8225). - - ipa - fix get version regex in IPA module_utils (https://github.com/ansible-collections/community.general/pull/8175). - - keycloak_client - add sorted ``defaultClientScopes`` and ``optionalClientScopes`` - to normalizations (https://github.com/ansible-collections/community.general/pull/8223). - - keycloak_realm - add normalizations for ``enabledEventTypes`` and ``supportedLocales`` - (https://github.com/ansible-collections/community.general/pull/8224). - - puppet - add option ``environment_lang`` to set the environment language encoding. - Defaults to lang ``C``. It is recommended to set it to ``C.UTF-8`` or ``en_US.UTF-8`` - depending on what is available on your system. (https://github.com/ansible-collections/community.general/issues/8000) - - riak - support ``riak admin`` sub-command in newer Riak KV versions beside - the legacy ``riak-admin`` main command (https://github.com/ansible-collections/community.general/pull/8211). - - to_ini filter plugin - disabling interpolation of ``ConfigParser`` to allow - converting values with a ``%`` sign (https://github.com/ansible-collections/community.general/issues/8183, - https://github.com/ansible-collections/community.general/pull/8185). - - xml - make module work with lxml 5.1.1, which removed some internals that - the module was relying on (https://github.com/ansible-collections/community.general/pull/8169). - deprecated_features: - - hipchat callback plugin - the hipchat service has been discontinued and the - self-hosted variant has been End of Life since 2020. The callback plugin is - therefore deprecated and will be removed from community.general 10.0.0 if - nobody provides compelling reasons to still keep it (https://github.com/ansible-collections/community.general/issues/8184, - https://github.com/ansible-collections/community.general/pull/8189). - minor_changes: - - Use offset-aware ``datetime.datetime`` objects (with timezone UTC) instead - of offset-naive UTC timestamps, which are deprecated in Python 3.12 (https://github.com/ansible-collections/community.general/pull/8222). - - 'apt_rpm - add new states ``latest`` and ``present_not_latest``. The value - ``latest`` is equivalent to the current behavior of ``present``, which will - upgrade a package if a newer version exists. ``present_not_latest`` does what - most users would expect ``present`` to do: it does not upgrade if the package - is already installed. The current behavior of ``present`` will be deprecated - in a later version, and eventually changed to that of ``present_not_latest`` - (https://github.com/ansible-collections/community.general/issues/8217, https://github.com/ansible-collections/community.general/pull/8247).' - - bitwarden lookup plugin - add support to filter by organization ID (https://github.com/ansible-collections/community.general/pull/8188). - - filesystem - add bcachefs support (https://github.com/ansible-collections/community.general/pull/8126). - - ini_file - add an optional parameter ``section_has_values``. If the target - ini file contains more than one ``section``, use ``section_has_values`` to - specify which one should be updated (https://github.com/ansible-collections/community.general/pull/7505). - - java_cert - add ``cert_content`` argument (https://github.com/ansible-collections/community.general/pull/8153). - - keycloak_client, keycloak_clientscope, keycloak_clienttemplate - added ``docker-v2`` - protocol support, enhancing alignment with Keycloak's protocol options (https://github.com/ansible-collections/community.general/issues/8215, - https://github.com/ansible-collections/community.general/pull/8216). - - nmcli - adds OpenvSwitch support with new ``type`` values ``ovs-port``, ``ovs-interface``, - and ``ovs-bridge``, and new ``slave_type`` value ``ovs-port`` (https://github.com/ansible-collections/community.general/pull/8154). - - osx_defaults - add option ``check_types`` to enable changing the type of existing - defaults on the fly (https://github.com/ansible-collections/community.general/pull/8173). - - passwordstore lookup - add ``missing_subkey`` parameter defining the behavior - of the lookup when a passwordstore subkey is missing (https://github.com/ansible-collections/community.general/pull/8166). - - portage - adds the possibility to explicitely tell portage to write packages - to world file (https://github.com/ansible-collections/community.general/issues/6226, - https://github.com/ansible-collections/community.general/pull/8236). - - redfish_command - add command ``ResetToDefaults`` to reset manager to default - state (https://github.com/ansible-collections/community.general/issues/8163). - - redfish_info - add boolean return value ``MultipartHttpPush`` to ``GetFirmwareUpdateCapabilities`` - (https://github.com/ansible-collections/community.general/issues/8194, https://github.com/ansible-collections/community.general/pull/8195). - - ssh_config - allow ``accept-new`` as valid value for ``strict_host_key_checking`` - (https://github.com/ansible-collections/community.general/pull/8257). - release_summary: Regular bugfix and features release. - fragments: - - 7505-ini_file-section_has.yml - - 8.6.0.yml - - 8100-haproxy-drain-fails-on-down-backend.yml - 8126-filesystem-bcachefs-support.yaml + - 8133-add-error-message-for-linode-inventory-plugin.yaml - 8151-fix-lsvg_cmd-failed.yml - 8153-java_cert-add-cert_content-arg.yml - 8154-add-ovs-commands-to-nmcli-module.yml @@ -1413,22 +603,194 @@ releases: - 8183-from_ini_to_ini.yml - 8188-bitwarden-add-organization_id.yml - 8194-redfish-add-multipart-to-capabilities.yml + - 8199-added-usb-support-to-proxmox-module.yml - 8211-riak-admin-sub-command-support.yml - 8215-add-docker-v2-protocol.yml - 8222-datetime.yml - 8223-keycloak_client-additional-normalizations.yaml - 8224-keycloak_realm-add-normalizations.yaml - 8225-unsafe.yml + - 8226-mh-vardict.yml - 8236-portage-select-feature.yml - 8238-bitwarden-secrets-manager-rate-limit-retry-with-backoff.yml - 8247-apt_rpm-latest.yml - 8257-ssh-config-hostkey-support-accept-new.yaml - 8263-apt_rpm-install-check.yml + - 8264-run_command.yml + - 8274-homebrew-force-formula.yml + - 8280-mh-deprecations.yml + - 8281-puppet-waitforlock.yaml + - 8285-apt_rpm-state-deprecate.yml + - 8288-cmdrunner-fmt-list-len-limits.yml + - 8289-python-runner.yml + - 8290-gandi-livedns-personal-access-token.yml + - 8303-fix-rendering-foreign-variables.yaml + - 8320-keycloak_user_federation-fix-diff-krbPrincipalAttribute.yaml + - 8321-fix-opentelemetry-callback.yml + - 8323-refactor-homebrew-logic-module-utils.yml + - 8334-proxmox-action-group.yml + - 8355-keycloak-idp-sanitize.yaml + - 8363-opentelemetry-export-to-a-file.yml + - 8367-fix-close-span-if-no-logs.yaml + - 8373-honour-disable-logs.yaml + - 8379-verbose-mode-pkg5.yml + - 8383-deprecate-gitlab-basic-auth.yml + - 9.0.0.yml + - add-ipa-sudorule-deny-cmd.yml + - aix_filesystem-crfs-issue.yml + - bitwarden-lookup-performance.yaml - hipchat.yml + - internal-redirects.yml + - inventory-rce.yml + - lxd-instance-not-found-avoid-false-positives.yml + - lxd-instances-api-endpoint-added.yml + - pacemaker-cluster.yml + - pkgin.yml - puppet_lang_force.yml + - remove_deprecated.yml modules: + - description: Bootstrap ACLs in Consul. + name: consul_acl_bootstrap + namespace: '' + - description: Manipulate Consul auth methods. + name: consul_auth_method + namespace: '' + - description: Manipulate Consul binding rules. + name: consul_binding_rule + namespace: '' + - description: Manipulate Consul tokens. + name: consul_token + namespace: '' + - description: Run Django admin commands. + name: django_command + namespace: '' + - description: Enable or disable dnf repositories using config-manager. + name: dnf_config_manager + namespace: '' + - description: Read git configuration. + name: git_config_info + namespace: '' + - description: Manages GitLab group access tokens. + name: gitlab_group_access_token + namespace: '' + - description: Create, update, or delete GitLab issues. + name: gitlab_issue + namespace: '' + - description: Creates/updates/deletes GitLab Labels belonging to project or group. + name: gitlab_label + namespace: '' + - description: Creates/updates/deletes GitLab Milestones belonging to project + or group. + name: gitlab_milestone + namespace: '' + - description: Manages GitLab project access tokens. + name: gitlab_project_access_token + namespace: '' - description: Allows administration of Keycloak client roles scope to restrict the usage of certain roles to a other specific client applications. name: keycloak_client_rolescope namespace: '' - release_date: '2024-04-22' + - description: Retrive component info in Keycloak. + name: keycloak_component_info + namespace: '' + - description: Allows administration of Keycloak realm role mappings into groups + with the Keycloak API. + name: keycloak_realm_rolemapping + namespace: '' + - description: Manage Nomad ACL tokens. + name: nomad_token + namespace: '' + - description: Retrieve information about one or more Proxmox VE nodes. + name: proxmox_node_info + namespace: '' + - description: List content from a Proxmox VE storage. + name: proxmox_storage_contents_info + namespace: '' + - description: Allows listing information about USB devices. + name: usb_facts + namespace: '' + plugins: + become: + - description: Systemd's run0. + name: run0 + namespace: null + callback: + - description: The default ansible callback without diff output. + name: default_without_diff + namespace: null + - description: Adds simple timestamp for each header. + name: timestamp + namespace: null + connection: + - description: Run tasks in Incus instances via the Incus CLI. + name: incus + namespace: null + filter: + - description: Converts INI text input into a dictionary. + name: from_ini + namespace: null + - description: Difference of lists with a predictive order. + name: lists_difference + namespace: null + - description: Intersection of lists with a predictive order. + name: lists_intersect + namespace: null + - description: Symmetric Difference of lists with a predictive order. + name: lists_symmetric_difference + namespace: null + - description: Union of lists with a predictive order. + name: lists_union + namespace: null + - description: Converts a dictionary to the INI file format. + name: to_ini + namespace: null + lookup: + - description: Obtain short-lived Github App Access tokens. + name: github_app_access_token + namespace: null + - description: Fetch documents stored in 1Password. + name: onepassword_doc + namespace: null + test: + - description: Validates fully-qualified domain names against RFC 1123. + name: fqdn_valid + namespace: null + release_date: '2024-05-20' + 9.0.1: + changes: + bugfixes: + - 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). + - 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). + - 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). + - 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). + - 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). + - 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). + - 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). + - 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). + - 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). + - 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). + minor_changes: + - ansible_galaxy_install - minor refactor in the module (https://github.com/ansible-collections/community.general/pull/8413). + release_summary: Bugfix release for inclusion in Ansible 10.0.0rc1. + fragments: + - 8403-fix-typeerror-in-keycloak-client.yaml + - 8406-fix-homebrew-cask-warning.yaml + - 8411-locale-gen-vardict.yml + - 8413-galaxy-refactor.yml + - 9.0.1.yml + release_date: '2024-05-27' diff --git a/ansible_collections/community/general/changelogs/config.yaml b/ansible_collections/community/general/changelogs/config.yaml index 23afe36d2..2cef6e26f 100644 --- a/ansible_collections/community/general/changelogs/config.yaml +++ b/ansible_collections/community/general/changelogs/config.yaml @@ -35,3 +35,6 @@ sections: - - known_issues - Known Issues title: Community General +trivial_section_name: trivial +use_fqcn: true +add_plugin_period: true diff --git a/ansible_collections/community/general/meta/runtime.yml b/ansible_collections/community/general/meta/runtime.yml index a9354aab3..edeb53005 100644 --- a/ansible_collections/community/general/meta/runtime.yml +++ b/ansible_collections/community/general/meta/runtime.yml @@ -12,6 +12,23 @@ action_groups: - consul_role - consul_session - consul_token + proxmox: + - proxmox + - proxmox_disk + - proxmox_domain_info + - proxmox_group_info + - proxmox_kvm + - proxmox_nic + - proxmox_node_info + - proxmox_pool + - proxmox_pool_member + - proxmox_snap + - proxmox_storage_contents_info + - proxmox_storage_info + - proxmox_tasks_info + - proxmox_template + - proxmox_user_info + - proxmox_vm_info plugin_routing: callback: actionable: @@ -57,109 +74,109 @@ plugin_routing: removal_version: 10.0.0 warning_text: Use community.general.consul_token and/or community.general.consul_policy instead. rax_cbs_attachments: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on the deprecated package pyrax. + warning_text: This module relied on the deprecated package pyrax. rax_cbs: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on the deprecated package pyrax. + warning_text: This module relied on the deprecated package pyrax. rax_cdb_database: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on the deprecated package pyrax. + warning_text: This module relied on the deprecated package pyrax. rax_cdb_user: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on the deprecated package pyrax. + warning_text: This module relied on the deprecated package pyrax. rax_cdb: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on the deprecated package pyrax. + warning_text: This module relied on the deprecated package pyrax. rax_clb_nodes: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on the deprecated package pyrax. + warning_text: This module relied on the deprecated package pyrax. rax_clb_ssl: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on the deprecated package pyrax. + warning_text: This module relied on the deprecated package pyrax. rax_clb: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on the deprecated package pyrax. + warning_text: This module relied on the deprecated package pyrax. rax_dns_record: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on the deprecated package pyrax. + warning_text: This module relied on the deprecated package pyrax. rax_dns: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on the deprecated package pyrax. + warning_text: This module relied on the deprecated package pyrax. rax_facts: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on the deprecated package pyrax. + warning_text: This module relied on the deprecated package pyrax. rax_files_objects: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on the deprecated package pyrax. + warning_text: This module relied on the deprecated package pyrax. rax_files: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on the deprecated package pyrax. + warning_text: This module relied on the deprecated package pyrax. rax_identity: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on the deprecated package pyrax. + warning_text: This module relied on the deprecated package pyrax. rax_keypair: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on the deprecated package pyrax. + warning_text: This module relied on the deprecated package pyrax. rax_meta: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on the deprecated package pyrax. + warning_text: This module relied on the deprecated package pyrax. rax_mon_alarm: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on the deprecated package pyrax. + warning_text: This module relied on the deprecated package pyrax. rax: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on the deprecated package pyrax. + warning_text: This module relied on the deprecated package pyrax. rax_mon_check: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on the deprecated package pyrax. + warning_text: This module relied on the deprecated package pyrax. rax_mon_entity: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on the deprecated package pyrax. + warning_text: This module relied on the deprecated package pyrax. rax_mon_notification_plan: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on the deprecated package pyrax. + warning_text: This module relied on the deprecated package pyrax. rax_mon_notification: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on the deprecated package pyrax. + warning_text: This module relied on the deprecated package pyrax. rax_network: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on the deprecated package pyrax. + warning_text: This module relied on the deprecated package pyrax. rax_queue: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on the deprecated package pyrax. + warning_text: This module relied on the deprecated package pyrax. rax_scaling_group: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on the deprecated package pyrax. + warning_text: This module relied on the deprecated package pyrax. rax_scaling_policy: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on the deprecated package pyrax. + warning_text: This module relied on the deprecated package pyrax. rhn_channel: deprecation: removal_version: 10.0.0 @@ -170,543 +187,18 @@ plugin_routing: removal_version: 10.0.0 warning_text: RHN is EOL, please contact the community.general maintainers if still using this; see the module documentation for more details. - database.aerospike.aerospike_migrations: - redirect: community.general.aerospike_migrations - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.aerospike_migrations - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.airbrake_deployment: - redirect: community.general.airbrake_deployment - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.airbrake_deployment - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. stackdriver: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on HTTPS APIs that do not exist anymore, + warning_text: This module relied on HTTPS APIs that do not exist anymore, and any new development in the direction of providing an alternative should happen in the context of the google.cloud collection. - system.aix_devices: - redirect: community.general.aix_devices - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.aix_devices - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.aix_filesystem: - redirect: community.general.aix_filesystem - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.aix_filesystem - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.aix_inittab: - redirect: community.general.aix_inittab - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.aix_inittab - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.aix_lvg: - redirect: community.general.aix_lvg - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.aix_lvg - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.aix_lvol: - redirect: community.general.aix_lvol - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.aix_lvol - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.alerta_customer: - redirect: community.general.alerta_customer - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.alerta_customer - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.alicloud.ali_instance: - redirect: community.general.ali_instance - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ali_instance - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. ali_instance_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.ali_instance_info instead. - cloud.alicloud.ali_instance_info: - redirect: community.general.ali_instance_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ali_instance_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.alternatives: - redirect: community.general.alternatives - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.alternatives - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.language.ansible_galaxy_install: - redirect: community.general.ansible_galaxy_install - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ansible_galaxy_install - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.apache2_mod_proxy: - redirect: community.general.apache2_mod_proxy - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.apache2_mod_proxy - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.apache2_module: - redirect: community.general.apache2_module - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.apache2_module - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.apk: - redirect: community.general.apk - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.apk - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.apt_repo: - redirect: community.general.apt_repo - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.apt_repo - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.apt_rpm: - redirect: community.general.apt_rpm - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.apt_rpm - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - files.archive: - redirect: community.general.archive - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.archive - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.atomic.atomic_container: - redirect: community.general.atomic_container - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.atomic_container - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.atomic.atomic_host: - redirect: community.general.atomic_host - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.atomic_host - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.atomic.atomic_image: - redirect: community.general.atomic_image - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.atomic_image - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.awall: - redirect: community.general.awall - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.awall - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.beadm: - redirect: community.general.beadm - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.beadm - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - notification.bearychat: - redirect: community.general.bearychat - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.bearychat - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.bigpanda: - redirect: community.general.bigpanda - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.bigpanda - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - source_control.bitbucket.bitbucket_access_key: - redirect: community.general.bitbucket_access_key - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.bitbucket_access_key - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - source_control.bitbucket.bitbucket_pipeline_key_pair: - redirect: community.general.bitbucket_pipeline_key_pair - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.bitbucket_pipeline_key_pair - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - source_control.bitbucket.bitbucket_pipeline_known_host: - redirect: community.general.bitbucket_pipeline_known_host - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.bitbucket_pipeline_known_host - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - source_control.bitbucket.bitbucket_pipeline_variable: - redirect: community.general.bitbucket_pipeline_variable - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.bitbucket_pipeline_variable - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.language.bower: - redirect: community.general.bower - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.bower - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.language.bundler: - redirect: community.general.bundler - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.bundler - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - source_control.bzr: - redirect: community.general.bzr - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.bzr - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - notification.campfire: - redirect: community.general.campfire - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.campfire - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.capabilities: - redirect: community.general.capabilities - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.capabilities - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.language.cargo: - redirect: community.general.cargo - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.cargo - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - notification.catapult: - redirect: community.general.catapult - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.catapult - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.circonus_annotation: - redirect: community.general.circonus_annotation - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.circonus_annotation - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. cisco_spark: redirect: community.general.cisco_webex - notification.cisco_spark: - redirect: community.general.cisco_webex - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.cisco_webex - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - notification.cisco_webex: - redirect: community.general.cisco_webex - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.cisco_webex - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.centurylink.clc_aa_policy: - redirect: community.general.clc_aa_policy - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.clc_aa_policy - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.centurylink.clc_alert_policy: - redirect: community.general.clc_alert_policy - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.clc_alert_policy - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.centurylink.clc_blueprint_package: - redirect: community.general.clc_blueprint_package - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.clc_blueprint_package - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.centurylink.clc_firewall_policy: - redirect: community.general.clc_firewall_policy - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.clc_firewall_policy - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.centurylink.clc_group: - redirect: community.general.clc_group - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.clc_group - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.centurylink.clc_loadbalancer: - redirect: community.general.clc_loadbalancer - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.clc_loadbalancer - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.centurylink.clc_modify_server: - redirect: community.general.clc_modify_server - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.clc_modify_server - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.centurylink.clc_publicip: - redirect: community.general.clc_publicip - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.clc_publicip - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.centurylink.clc_server: - redirect: community.general.clc_server - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.clc_server - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.centurylink.clc_server_snapshot: - redirect: community.general.clc_server_snapshot - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.clc_server_snapshot - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.misc.cloud_init_data_facts: - redirect: community.general.cloud_init_data_facts - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.cloud_init_data_facts - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - net_tools.cloudflare_dns: - redirect: community.general.cloudflare_dns - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.cloudflare_dns - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.cobbler.cobbler_sync: - redirect: community.general.cobbler_sync - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.cobbler_sync - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.cobbler.cobbler_system: - redirect: community.general.cobbler_system - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.cobbler_system - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.language.composer: - redirect: community.general.composer - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.composer - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - clustering.consul.consul: - redirect: community.general.consul - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.consul - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - clustering.consul.consul_acl: - redirect: community.general.consul_acl - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.consul_acl - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - clustering.consul.consul_kv: - redirect: community.general.consul_kv - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.consul_kv - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - clustering.consul.consul_session: - redirect: community.general.consul_session - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.consul_session - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.copr: - redirect: community.general.copr - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.copr - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.language.cpanm: - redirect: community.general.cpanm - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.cpanm - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.cronvar: - redirect: community.general.cronvar - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.cronvar - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.crypttab: - redirect: community.general.crypttab - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.crypttab - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.datadog.datadog_downtime: - redirect: community.general.datadog_downtime - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.datadog_downtime - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.datadog.datadog_event: - redirect: community.general.datadog_event - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.datadog_event - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.datadog.datadog_monitor: - redirect: community.general.datadog_monitor - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.datadog_monitor - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.dconf: - redirect: community.general.dconf - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.dconf - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.deploy_helper: - redirect: community.general.deploy_helper - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.deploy_helper - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.dimensiondata.dimensiondata_network: - redirect: community.general.dimensiondata_network - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.dimensiondata_network - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.dimensiondata.dimensiondata_vlan: - redirect: community.general.dimensiondata_vlan - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.dimensiondata_vlan - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - notification.discord: - redirect: community.general.discord - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.discord - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.django_manage: - redirect: community.general.django_manage - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.django_manage - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.dnf_versionlock: - redirect: community.general.dnf_versionlock - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.dnf_versionlock - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - net_tools.dnsimple: - redirect: community.general.dnsimple - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.dnsimple - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - net_tools.dnsimple_info: - redirect: community.general.dnsimple_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.dnsimple_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - net_tools.dnsmadeeasy: - redirect: community.general.dnsmadeeasy - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.dnsmadeeasy - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. docker_compose: redirect: community.docker.docker_compose docker_config: @@ -761,106 +253,15 @@ plugin_routing: redirect: community.docker.docker_volume docker_volume_info: redirect: community.docker.docker_volume_info - system.dpkg_divert: - redirect: community.general.dpkg_divert - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.dpkg_divert - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.language.easy_install: - redirect: community.general.easy_install - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.easy_install - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.ejabberd_user: - redirect: community.general.ejabberd_user - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ejabberd_user - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - database.misc.elasticsearch_plugin: - redirect: community.general.elasticsearch_plugin - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.elasticsearch_plugin - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - storage.emc.emc_vnx_sg_member: - redirect: community.general.emc_vnx_sg_member - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.emc_vnx_sg_member - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - clustering.etcd3: - redirect: community.general.etcd3 - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.etcd3 - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.facter: - redirect: community.general.facter - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.facter - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - files.filesize: - redirect: community.general.filesize - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.filesize - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.filesystem: - redirect: community.general.filesystem - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.filesystem - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.flatpak: - redirect: community.general.flatpak - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.flatpak - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.flatpak_remote: - redirect: community.general.flatpak_remote - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.flatpak_remote - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. flowdock: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on HTTPS APIs that do not exist anymore and + warning_text: This module relied on HTTPS APIs that do not exist anymore and there is no clear path to update. - notification.flowdock: - redirect: community.general.flowdock - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.flowdock - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. foreman: tombstone: removal_version: 2.0.0 warning_text: Use the modules from the theforeman.foreman collection instead. - net_tools.gandi_livedns: - redirect: community.general.gandi_livedns - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.gandi_livedns - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. gc_storage: redirect: community.google.gc_storage gcdns_record: @@ -895,20 +296,6 @@ plugin_routing: redirect: community.google.gce_snapshot gce_tag: redirect: community.google.gce_tag - system.gconftool2: - redirect: community.general.gconftool2 - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.gconftool2 - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.gconftool2_info: - redirect: community.general.gconftool2_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.gconftool2_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. gcp_backend_service: tombstone: removal_version: 2.0.0 @@ -944,193 +331,11 @@ plugin_routing: removal_version: 2.0.0 warning_text: Use google.cloud.gcp_spanner_database and/or google.cloud.gcp_spanner_instance instead. - packaging.language.gem: - redirect: community.general.gem - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.gem - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - source_control.git_config: - redirect: community.general.git_config - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.git_config - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - source_control.github.github_deploy_key: - redirect: community.general.github_deploy_key - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.github_deploy_key - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. github_hooks: tombstone: removal_version: 2.0.0 warning_text: Use community.general.github_webhook and community.general.github_webhook_info instead. - source_control.github.github_issue: - redirect: community.general.github_issue - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.github_issue - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - source_control.github.github_key: - redirect: community.general.github_key - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.github_key - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - source_control.github.github_release: - redirect: community.general.github_release - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.github_release - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - source_control.github.github_repo: - redirect: community.general.github_repo - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.github_repo - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - source_control.github.github_webhook: - redirect: community.general.github_webhook - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.github_webhook - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - source_control.github.github_webhook_info: - redirect: community.general.github_webhook_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.github_webhook_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - source_control.gitlab.gitlab_branch: - redirect: community.general.gitlab_branch - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.gitlab_branch - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - source_control.gitlab.gitlab_deploy_key: - redirect: community.general.gitlab_deploy_key - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.gitlab_deploy_key - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - source_control.gitlab.gitlab_group: - redirect: community.general.gitlab_group - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.gitlab_group - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - source_control.gitlab.gitlab_group_members: - redirect: community.general.gitlab_group_members - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.gitlab_group_members - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - source_control.gitlab.gitlab_group_variable: - redirect: community.general.gitlab_group_variable - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.gitlab_group_variable - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - source_control.gitlab.gitlab_hook: - redirect: community.general.gitlab_hook - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.gitlab_hook - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - source_control.gitlab.gitlab_project: - redirect: community.general.gitlab_project - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.gitlab_project - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - source_control.gitlab.gitlab_project_members: - redirect: community.general.gitlab_project_members - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.gitlab_project_members - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - source_control.gitlab.gitlab_project_variable: - redirect: community.general.gitlab_project_variable - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.gitlab_project_variable - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - source_control.gitlab.gitlab_protected_branch: - redirect: community.general.gitlab_protected_branch - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.gitlab_protected_branch - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - source_control.gitlab.gitlab_runner: - redirect: community.general.gitlab_runner - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.gitlab_runner - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - source_control.gitlab.gitlab_user: - redirect: community.general.gitlab_user - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.gitlab_user - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - notification.grove: - redirect: community.general.grove - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.grove - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.gunicorn: - redirect: community.general.gunicorn - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.gunicorn - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - database.saphana.hana_query: - redirect: community.general.hana_query - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.hana_query - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - net_tools.haproxy: - redirect: community.general.haproxy - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.haproxy - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.heroku.heroku_collaborator: - redirect: community.general.heroku_collaborator - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.heroku_collaborator - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. hana_query: redirect: community.sap_libs.sap_hdbsql hetzner_failover_ip: @@ -1141,740 +346,26 @@ plugin_routing: redirect: community.hrobot.firewall hetzner_firewall_info: redirect: community.hrobot.firewall_info - source_control.hg: - redirect: community.general.hg - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.hg - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - notification.hipchat: - redirect: community.general.hipchat - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.hipchat - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.homebrew: - redirect: community.general.homebrew - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.homebrew - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.homebrew_cask: - redirect: community.general.homebrew_cask - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.homebrew_cask - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.homebrew_tap: - redirect: community.general.homebrew_tap - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.homebrew_tap - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.homectl: - redirect: community.general.homectl - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.homectl - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.honeybadger_deployment: - redirect: community.general.honeybadger_deployment - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.honeybadger_deployment - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.hpilo.hpilo_boot: - redirect: community.general.hpilo_boot - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.hpilo_boot - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. hpilo_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.hpilo_info instead. - remote_management.hpilo.hpilo_info: - redirect: community.general.hpilo_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.hpilo_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.hpilo.hponcfg: - redirect: community.general.hponcfg - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.hponcfg - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.htpasswd: - redirect: community.general.htpasswd - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.htpasswd - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.huawei.hwc_ecs_instance: - redirect: community.general.hwc_ecs_instance - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.hwc_ecs_instance - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.huawei.hwc_evs_disk: - redirect: community.general.hwc_evs_disk - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.hwc_evs_disk - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.huawei.hwc_network_vpc: - redirect: community.general.hwc_network_vpc - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.hwc_network_vpc - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.huawei.hwc_smn_topic: - redirect: community.general.hwc_smn_topic - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.hwc_smn_topic - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.huawei.hwc_vpc_eip: - redirect: community.general.hwc_vpc_eip - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.hwc_vpc_eip - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.huawei.hwc_vpc_peering_connect: - redirect: community.general.hwc_vpc_peering_connect - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.hwc_vpc_peering_connect - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.huawei.hwc_vpc_port: - redirect: community.general.hwc_vpc_port - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.hwc_vpc_port - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.huawei.hwc_vpc_private_ip: - redirect: community.general.hwc_vpc_private_ip - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.hwc_vpc_private_ip - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.huawei.hwc_vpc_route: - redirect: community.general.hwc_vpc_route - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.hwc_vpc_route - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.huawei.hwc_vpc_security_group: - redirect: community.general.hwc_vpc_security_group - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.hwc_vpc_security_group - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.huawei.hwc_vpc_security_group_rule: - redirect: community.general.hwc_vpc_security_group_rule - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.hwc_vpc_security_group_rule - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.huawei.hwc_vpc_subnet: - redirect: community.general.hwc_vpc_subnet - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.hwc_vpc_subnet - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - storage.ibm.ibm_sa_domain: - redirect: community.general.ibm_sa_domain - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ibm_sa_domain - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - storage.ibm.ibm_sa_host: - redirect: community.general.ibm_sa_host - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ibm_sa_host - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - storage.ibm.ibm_sa_host_ports: - redirect: community.general.ibm_sa_host_ports - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ibm_sa_host_ports - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - storage.ibm.ibm_sa_pool: - redirect: community.general.ibm_sa_pool - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ibm_sa_pool - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - storage.ibm.ibm_sa_vol: - redirect: community.general.ibm_sa_vol - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ibm_sa_vol - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - storage.ibm.ibm_sa_vol_map: - redirect: community.general.ibm_sa_vol_map - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ibm_sa_vol_map - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.icinga2_feature: - redirect: community.general.icinga2_feature - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.icinga2_feature - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.icinga2_host: - redirect: community.general.icinga2_host - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.icinga2_host - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. idrac_firmware: redirect: dellemc.openmanage.idrac_firmware - remote_management.redfish.idrac_redfish_command: - redirect: community.general.idrac_redfish_command - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.idrac_redfish_command - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.redfish.idrac_redfish_config: - redirect: community.general.idrac_redfish_config - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.idrac_redfish_config - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. idrac_redfish_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.idrac_redfish_info instead. - remote_management.redfish.idrac_redfish_info: - redirect: community.general.idrac_redfish_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.idrac_redfish_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. idrac_server_config_profile: redirect: dellemc.openmanage.idrac_server_config_profile - remote_management.redfish.ilo_redfish_config: - redirect: community.general.ilo_redfish_config - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ilo_redfish_config - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.redfish.ilo_redfish_info: - redirect: community.general.ilo_redfish_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ilo_redfish_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.imc.imc_rest: - redirect: community.general.imc_rest - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.imc_rest - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.smartos.imgadm: - redirect: community.general.imgadm - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.imgadm - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - net_tools.infinity.infinity: - redirect: community.general.infinity - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.infinity - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - database.influxdb.influxdb_database: - redirect: community.general.influxdb_database - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.influxdb_database - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - database.influxdb.influxdb_query: - redirect: community.general.influxdb_query - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.influxdb_query - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - database.influxdb.influxdb_retention_policy: - redirect: community.general.influxdb_retention_policy - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.influxdb_retention_policy - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - database.influxdb.influxdb_user: - redirect: community.general.influxdb_user - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.influxdb_user - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - database.influxdb.influxdb_write: - redirect: community.general.influxdb_write - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.influxdb_write - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - files.ini_file: - redirect: community.general.ini_file - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ini_file - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.installp: - redirect: community.general.installp - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.installp - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.interfaces_file: - redirect: community.general.interfaces_file - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.interfaces_file - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - net_tools.ip_netns: - redirect: community.general.ip_netns - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ip_netns - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.ipa.ipa_config: - redirect: community.general.ipa_config - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ipa_config - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.ipa.ipa_dnsrecord: - redirect: community.general.ipa_dnsrecord - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ipa_dnsrecord - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.ipa.ipa_dnszone: - redirect: community.general.ipa_dnszone - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ipa_dnszone - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.ipa.ipa_group: - redirect: community.general.ipa_group - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ipa_group - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.ipa.ipa_hbacrule: - redirect: community.general.ipa_hbacrule - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ipa_hbacrule - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.ipa.ipa_host: - redirect: community.general.ipa_host - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ipa_host - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.ipa.ipa_hostgroup: - redirect: community.general.ipa_hostgroup - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ipa_hostgroup - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.ipa.ipa_otpconfig: - redirect: community.general.ipa_otpconfig - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ipa_otpconfig - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.ipa.ipa_otptoken: - redirect: community.general.ipa_otptoken - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ipa_otptoken - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.ipa.ipa_pwpolicy: - redirect: community.general.ipa_pwpolicy - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ipa_pwpolicy - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.ipa.ipa_role: - redirect: community.general.ipa_role - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ipa_role - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.ipa.ipa_service: - redirect: community.general.ipa_service - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ipa_service - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.ipa.ipa_subca: - redirect: community.general.ipa_subca - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ipa_subca - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.ipa.ipa_sudocmd: - redirect: community.general.ipa_sudocmd - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ipa_sudocmd - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.ipa.ipa_sudocmdgroup: - redirect: community.general.ipa_sudocmdgroup - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ipa_sudocmdgroup - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.ipa.ipa_sudorule: - redirect: community.general.ipa_sudorule - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ipa_sudorule - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.ipa.ipa_user: - redirect: community.general.ipa_user - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ipa_user - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.ipa.ipa_vault: - redirect: community.general.ipa_vault - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ipa_vault - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - net_tools.ipify_facts: - redirect: community.general.ipify_facts - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ipify_facts - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - net_tools.ipinfoio_facts: - redirect: community.general.ipinfoio_facts - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ipinfoio_facts - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.ipmi.ipmi_boot: - redirect: community.general.ipmi_boot - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ipmi_boot - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.ipmi.ipmi_power: - redirect: community.general.ipmi_power - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ipmi_power - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.iptables_state: - redirect: community.general.iptables_state - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.iptables_state - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - net_tools.ipwcli_dns: - redirect: community.general.ipwcli_dns - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ipwcli_dns - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - notification.irc: - redirect: community.general.irc - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.irc - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - files.iso_create: - redirect: community.general.iso_create - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.iso_create - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - files.iso_extract: - redirect: community.general.iso_extract - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.iso_extract - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - files.iso_customize: - redirect: community.general.iso_customize - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.iso_customize - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - notification.jabber: - redirect: community.general.jabber - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.jabber - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.java_cert: - redirect: community.general.java_cert - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.java_cert - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.java_keystore: - redirect: community.general.java_keystore - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.java_keystore - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.jboss: - redirect: community.general.jboss - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.jboss - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.jenkins_build: - redirect: community.general.jenkins_build - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.jenkins_build - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.jenkins_job: - redirect: community.general.jenkins_job - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.jenkins_job - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. jenkins_job_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.jenkins_job_info instead. - web_infrastructure.jenkins_job_info: - redirect: community.general.jenkins_job_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.jenkins_job_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.jenkins_plugin: - redirect: community.general.jenkins_plugin - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.jenkins_plugin - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.jenkins_script: - redirect: community.general.jenkins_script - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.jenkins_script - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.jira: - redirect: community.general.jira - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.jira - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. katello: tombstone: removal_version: 2.0.0 warning_text: Use the modules from the theforeman.foreman collection instead. - system.kernel_blacklist: - redirect: community.general.kernel_blacklist - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.kernel_blacklist - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.keycloak.keycloak_authentication: - redirect: community.general.keycloak_authentication - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.keycloak_authentication - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.keycloak.keycloak_client: - redirect: community.general.keycloak_client - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.keycloak_client - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.keycloak.keycloak_client_rolemapping: - redirect: community.general.keycloak_client_rolemapping - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.keycloak_client_rolemapping - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.keycloak.keycloak_clientscope: - redirect: community.general.keycloak_clientscope - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.keycloak_clientscope - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.keycloak.keycloak_clienttemplate: - redirect: community.general.keycloak_clienttemplate - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.keycloak_clienttemplate - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.keycloak.keycloak_group: - redirect: community.general.keycloak_group - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.keycloak_group - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.keycloak.keycloak_identity_provider: - redirect: community.general.keycloak_identity_provider - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.keycloak_identity_provider - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.keycloak.keycloak_realm: - redirect: community.general.keycloak_realm - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.keycloak_realm - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.keycloak.keycloak_realm_info: - redirect: community.general.keycloak_realm_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.keycloak_realm_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.keycloak.keycloak_role: - redirect: community.general.keycloak_role - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.keycloak_role - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.keycloak.keycloak_user_federation: - redirect: community.general.keycloak_user_federation - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.keycloak_user_federation - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.keycloak.keycloak_user_rolemapping: - redirect: community.general.keycloak_user_rolemapping - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.keycloak_user_rolemapping - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.keyring: - redirect: community.general.keyring - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.keyring - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.keyring_info: - redirect: community.general.keyring_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.keyring_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - database.misc.kibana_plugin: - redirect: community.general.kibana_plugin - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.kibana_plugin - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. kubevirt_cdi_upload: redirect: community.kubevirt.kubevirt_cdi_upload kubevirt_preset: @@ -1887,115 +378,10 @@ plugin_routing: redirect: community.kubevirt.kubevirt_template kubevirt_vm: redirect: community.kubevirt.kubevirt_vm - system.launchd: - redirect: community.general.launchd - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.launchd - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.layman: - redirect: community.general.layman - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.layman - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.lbu: - redirect: community.general.lbu - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.lbu - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. ldap_attr: tombstone: removal_version: 3.0.0 warning_text: Use community.general.ldap_attrs instead. - net_tools.ldap.ldap_attrs: - redirect: community.general.ldap_attrs - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ldap_attrs - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - net_tools.ldap.ldap_entry: - redirect: community.general.ldap_entry - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ldap_entry - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - net_tools.ldap.ldap_passwd: - redirect: community.general.ldap_passwd - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ldap_passwd - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - net_tools.ldap.ldap_search: - redirect: community.general.ldap_search - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ldap_search - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.librato_annotation: - redirect: community.general.librato_annotation - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.librato_annotation - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.linode.linode: - redirect: community.general.linode - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.linode - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.linode.linode_v4: - redirect: community.general.linode_v4 - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.linode_v4 - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.listen_ports_facts: - redirect: community.general.listen_ports_facts - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.listen_ports_facts - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - net_tools.lldp: - redirect: community.general.lldp - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.lldp - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.locale_gen: - redirect: community.general.locale_gen - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.locale_gen - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.logentries: - redirect: community.general.logentries - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.logentries - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - notification.logentries_msg: - redirect: community.general.logentries_msg - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.logentries_msg - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. logicmonitor: tombstone: removal_version: 1.0.0 @@ -2006,280 +392,14 @@ plugin_routing: removal_version: 1.0.0 warning_text: The logicmonitor_facts module is no longer maintained and the API used has been disabled in 2017. - monitoring.logstash_plugin: - redirect: community.general.logstash_plugin - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.logstash_plugin - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.lvg: - redirect: community.general.lvg - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.lvg - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.lvol: - redirect: community.general.lvol - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.lvol - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.lxc.lxc_container: - redirect: community.general.lxc_container - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.lxc_container - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.lxca.lxca_cmms: - redirect: community.general.lxca_cmms - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.lxca_cmms - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.lxca.lxca_nodes: - redirect: community.general.lxca_nodes - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.lxca_nodes - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.lxd.lxd_container: - redirect: community.general.lxd_container - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.lxd_container - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.lxd.lxd_profile: - redirect: community.general.lxd_profile - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.lxd_profile - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.lxd.lxd_project: - redirect: community.general.lxd_project - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.lxd_project - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.macports: - redirect: community.general.macports - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.macports - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - notification.mail: - redirect: community.general.mail - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.mail - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.make: - redirect: community.general.make - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.make - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.manageiq.manageiq_alert_profiles: - redirect: community.general.manageiq_alert_profiles - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.manageiq_alert_profiles - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.manageiq.manageiq_alerts: - redirect: community.general.manageiq_alerts - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.manageiq_alerts - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.manageiq.manageiq_group: - redirect: community.general.manageiq_group - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.manageiq_group - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.manageiq.manageiq_policies: - redirect: community.general.manageiq_policies - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.manageiq_policies - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.manageiq.manageiq_policies_info: - redirect: community.general.manageiq_policies_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.manageiq_policies_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.manageiq.manageiq_provider: - redirect: community.general.manageiq_provider - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.manageiq_provider - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.manageiq.manageiq_tags: - redirect: community.general.manageiq_tags - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.manageiq_tags - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.manageiq.manageiq_tags_info: - redirect: community.general.manageiq_tags_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.manageiq_tags_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.manageiq.manageiq_tenant: - redirect: community.general.manageiq_tenant - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.manageiq_tenant - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.manageiq.manageiq_user: - redirect: community.general.manageiq_user - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.manageiq_user - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.mas: - redirect: community.general.mas - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.mas - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - notification.matrix: - redirect: community.general.matrix - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.matrix - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - notification.mattermost: - redirect: community.general.mattermost - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.mattermost - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.language.maven_artifact: - redirect: community.general.maven_artifact - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.maven_artifact - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.memset.memset_dns_reload: - redirect: community.general.memset_dns_reload - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.memset_dns_reload - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. memset_memstore_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.memset_memstore_info instead. - cloud.memset.memset_memstore_info: - redirect: community.general.memset_memstore_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.memset_memstore_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. memset_server_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.memset_server_info instead. - cloud.memset.memset_server_info: - redirect: community.general.memset_server_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.memset_server_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.memset.memset_zone: - redirect: community.general.memset_zone - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.memset_zone - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.memset.memset_zone_domain: - redirect: community.general.memset_zone_domain - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.memset_zone_domain - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.memset.memset_zone_record: - redirect: community.general.memset_zone_record - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.memset_zone_record - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.mksysb: - redirect: community.general.mksysb - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.mksysb - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.modprobe: - redirect: community.general.modprobe - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.modprobe - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.monit: - redirect: community.general.monit - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.monit - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - notification.mqtt: - redirect: community.general.mqtt - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.mqtt - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - database.mssql.mssql_db: - redirect: community.general.mssql_db - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.mssql_db - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - database.mssql.mssql_script: - redirect: community.general.mssql_script - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.mssql_script - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. na_cdot_aggregate: tombstone: removal_version: 2.0.0 @@ -2316,52 +436,10 @@ plugin_routing: tombstone: removal_version: 3.0.0 warning_text: Use netapp.ontap.na_ontap_info instead. - monitoring.nagios: - redirect: community.general.nagios - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.nagios - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - net_tools.netcup_dns: - redirect: community.general.netcup_dns - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.netcup_dns - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.newrelic_deployment: - redirect: community.general.newrelic_deployment - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.newrelic_deployment - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - notification.nexmo: - redirect: community.general.nexmo - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.nexmo - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. nginx_status_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.nginx_status_info instead. - web_infrastructure.nginx_status_info: - redirect: community.general.nginx_status_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.nginx_status_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.smartos.nictagadm: - redirect: community.general.nictagadm - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.nictagadm - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. nios_a_record: redirect: infoblox.nios_modules.nios_a_record nios_aaaa_record: @@ -2394,400 +472,57 @@ plugin_routing: redirect: infoblox.nios_modules.nios_txt_record nios_zone: redirect: infoblox.nios_modules.nios_zone - net_tools.nmcli: - redirect: community.general.nmcli - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.nmcli - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - clustering.nomad.nomad_job: - redirect: community.general.nomad_job - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.nomad_job - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - clustering.nomad.nomad_job_info: - redirect: community.general.nomad_job_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.nomad_job_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.nosh: - redirect: community.general.nosh - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.nosh - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.language.npm: - redirect: community.general.npm - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.npm - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - net_tools.nsupdate: - redirect: community.general.nsupdate - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.nsupdate - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.oracle.oci_vcn: - redirect: community.general.oci_vcn - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.oci_vcn - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - database.misc.odbc: - redirect: community.general.odbc - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.odbc - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - notification.office_365_connector_card: - redirect: community.general.office_365_connector_card - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.office_365_connector_card - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.ohai: - redirect: community.general.ohai - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ohai - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - net_tools.omapi_host: - redirect: community.general.omapi_host - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.omapi_host - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. ome_device_info: redirect: dellemc.openmanage.ome_device_info - cloud.opennebula.one_host: - redirect: community.general.one_host - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.one_host - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.opennebula.one_image: - redirect: community.general.one_image - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.one_image - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. one_image_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.one_image_info instead. - cloud.opennebula.one_image_info: - redirect: community.general.one_image_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.one_image_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.opennebula.one_service: - redirect: community.general.one_service - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.one_service - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.opennebula.one_template: - redirect: community.general.one_template - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.one_template - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.opennebula.one_vm: - redirect: community.general.one_vm - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.one_vm - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.oneandone.oneandone_firewall_policy: - redirect: community.general.oneandone_firewall_policy - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.oneandone_firewall_policy - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.oneandone.oneandone_load_balancer: - redirect: community.general.oneandone_load_balancer - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.oneandone_load_balancer - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.oneandone.oneandone_monitoring_policy: - redirect: community.general.oneandone_monitoring_policy - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.oneandone_monitoring_policy - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.oneandone.oneandone_private_network: - redirect: community.general.oneandone_private_network - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.oneandone_private_network - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.oneandone.oneandone_public_ip: - redirect: community.general.oneandone_public_ip - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.oneandone_public_ip - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.oneandone.oneandone_server: - redirect: community.general.oneandone_server - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.oneandone_server - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. onepassword_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.onepassword_info instead. - identity.onepassword_info: - redirect: community.general.onepassword_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.onepassword_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. oneview_datacenter_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.oneview_datacenter_info instead. - remote_management.oneview.oneview_datacenter_info: - redirect: community.general.oneview_datacenter_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.oneview_datacenter_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. oneview_enclosure_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.oneview_enclosure_info instead. - remote_management.oneview.oneview_enclosure_info: - redirect: community.general.oneview_enclosure_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.oneview_enclosure_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.oneview.oneview_ethernet_network: - redirect: community.general.oneview_ethernet_network - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.oneview_ethernet_network - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. oneview_ethernet_network_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.oneview_ethernet_network_info instead. - remote_management.oneview.oneview_ethernet_network_info: - redirect: community.general.oneview_ethernet_network_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.oneview_ethernet_network_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.oneview.oneview_fc_network: - redirect: community.general.oneview_fc_network - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.oneview_fc_network - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. oneview_fc_network_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.oneview_fc_network_info instead. - remote_management.oneview.oneview_fc_network_info: - redirect: community.general.oneview_fc_network_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.oneview_fc_network_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.oneview.oneview_fcoe_network: - redirect: community.general.oneview_fcoe_network - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.oneview_fcoe_network - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. oneview_fcoe_network_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.oneview_fcoe_network_info instead. - remote_management.oneview.oneview_fcoe_network_info: - redirect: community.general.oneview_fcoe_network_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.oneview_fcoe_network_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.oneview.oneview_logical_interconnect_group: - redirect: community.general.oneview_logical_interconnect_group - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.oneview_logical_interconnect_group - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. oneview_logical_interconnect_group_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.oneview_logical_interconnect_group_info instead. - remote_management.oneview.oneview_logical_interconnect_group_info: - redirect: community.general.oneview_logical_interconnect_group_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.oneview_logical_interconnect_group_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.oneview.oneview_network_set: - redirect: community.general.oneview_network_set - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.oneview_network_set - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. oneview_network_set_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.oneview_network_set_info instead. - remote_management.oneview.oneview_network_set_info: - redirect: community.general.oneview_network_set_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.oneview_network_set_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.oneview.oneview_san_manager: - redirect: community.general.oneview_san_manager - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.oneview_san_manager - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. oneview_san_manager_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.oneview_san_manager_info instead. - remote_management.oneview.oneview_san_manager_info: - redirect: community.general.oneview_san_manager_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.oneview_san_manager_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. online_server_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.online_server_info instead. - cloud.online.online_server_info: - redirect: community.general.online_server_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.online_server_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. online_user_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.online_user_info instead. - cloud.online.online_user_info: - redirect: community.general.online_user_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.online_user_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.open_iscsi: - redirect: community.general.open_iscsi - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.open_iscsi - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.openbsd_pkg: - redirect: community.general.openbsd_pkg - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.openbsd_pkg - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - identity.opendj.opendj_backendprop: - redirect: community.general.opendj_backendprop - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.opendj_backendprop - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.openwrt_init: - redirect: community.general.openwrt_init - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.openwrt_init - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.opkg: - redirect: community.general.opkg - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.opkg - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.osx_defaults: - redirect: community.general.osx_defaults - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.osx_defaults - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.ovh.ovh_ip_failover: - redirect: community.general.ovh_ip_failover - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ovh_ip_failover - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.ovh.ovh_ip_loadbalancing_backend: - redirect: community.general.ovh_ip_loadbalancing_backend - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ovh_ip_loadbalancing_backend - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.ovh.ovh_monthly_billing: - redirect: community.general.ovh_monthly_billing - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ovh_monthly_billing - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. ovirt: tombstone: removal_version: 3.0.0 @@ -2888,216 +623,6 @@ plugin_routing: tombstone: removal_version: 3.0.0 warning_text: Use ovirt.ovirt.ovirt_vmpool_info instead. - clustering.pacemaker_cluster: - redirect: community.general.pacemaker_cluster - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pacemaker_cluster - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.packet.packet_device: - redirect: community.general.packet_device - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.packet_device - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.packet.packet_ip_subnet: - redirect: community.general.packet_ip_subnet - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.packet_ip_subnet - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.packet.packet_project: - redirect: community.general.packet_project - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.packet_project - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.packet.packet_sshkey: - redirect: community.general.packet_sshkey - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.packet_sshkey - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.packet.packet_volume: - redirect: community.general.packet_volume - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.packet_volume - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.packet.packet_volume_attachment: - redirect: community.general.packet_volume_attachment - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.packet_volume_attachment - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.pacman: - redirect: community.general.pacman - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pacman - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.pacman_key: - redirect: community.general.pacman_key - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pacman_key - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.pagerduty: - redirect: community.general.pagerduty - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pagerduty - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.pagerduty_alert: - redirect: community.general.pagerduty_alert - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pagerduty_alert - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.pagerduty_change: - redirect: community.general.pagerduty_change - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pagerduty_change - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.pagerduty_user: - redirect: community.general.pagerduty_user - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pagerduty_user - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.pam_limits: - redirect: community.general.pam_limits - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pam_limits - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.pamd: - redirect: community.general.pamd - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pamd - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.parted: - redirect: community.general.parted - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.parted - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.language.pear: - redirect: community.general.pear - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pear - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.pids: - redirect: community.general.pids - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pids - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.pingdom: - redirect: community.general.pingdom - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pingdom - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.language.pip_package_info: - redirect: community.general.pip_package_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pip_package_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.language.pipx: - redirect: community.general.pipx - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pipx - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.language.pipx_info: - redirect: community.general.pipx_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pipx_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.pkg5: - redirect: community.general.pkg5 - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pkg5 - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.pkg5_publisher: - redirect: community.general.pkg5_publisher - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pkg5_publisher - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.pkgin: - redirect: community.general.pkgin - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pkgin - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.pkgng: - redirect: community.general.pkgng - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pkgng - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.pkgutil: - redirect: community.general.pkgutil - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pkgutil - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - storage.pmem.pmem: - redirect: community.general.pmem - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pmem - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.portage: - redirect: community.general.portage - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.portage - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.portinstall: - redirect: community.general.portinstall - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.portinstall - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. postgresql_copy: redirect: community.postgresql.postgresql_copy postgresql_db: @@ -3142,167 +667,6 @@ plugin_routing: redirect: community.postgresql.postgresql_user postgresql_user_obj_stat_info: redirect: community.postgresql.postgresql_user_obj_stat_info - net_tools.pritunl.pritunl_org: - redirect: community.general.pritunl_org - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pritunl_org - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - net_tools.pritunl.pritunl_org_info: - redirect: community.general.pritunl_org_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pritunl_org_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - net_tools.pritunl.pritunl_user: - redirect: community.general.pritunl_user - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pritunl_user - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - net_tools.pritunl.pritunl_user_info: - redirect: community.general.pritunl_user_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pritunl_user_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.profitbricks.profitbricks: - redirect: community.general.profitbricks - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.profitbricks - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.profitbricks.profitbricks_datacenter: - redirect: community.general.profitbricks_datacenter - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.profitbricks_datacenter - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.profitbricks.profitbricks_nic: - redirect: community.general.profitbricks_nic - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.profitbricks_nic - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.profitbricks.profitbricks_volume: - redirect: community.general.profitbricks_volume - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.profitbricks_volume - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.profitbricks.profitbricks_volume_attachments: - redirect: community.general.profitbricks_volume_attachments - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.profitbricks_volume_attachments - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.misc.proxmox: - redirect: community.general.proxmox - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.proxmox - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.misc.proxmox_disk: - redirect: community.general.proxmox_disk - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.proxmox_disk - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.misc.proxmox_domain_info: - redirect: community.general.proxmox_domain_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.proxmox_domain_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.misc.proxmox_group_info: - redirect: community.general.proxmox_group_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.proxmox_group_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.misc.proxmox_kvm: - redirect: community.general.proxmox_kvm - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.proxmox_kvm - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.misc.proxmox_nic: - redirect: community.general.proxmox_nic - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.proxmox_nic - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.misc.proxmox_snap: - redirect: community.general.proxmox_snap - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.proxmox_snap - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.misc.proxmox_storage_info: - redirect: community.general.proxmox_storage_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.proxmox_storage_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.misc.proxmox_tasks_info: - redirect: community.general.proxmox_tasks_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.proxmox_tasks_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.misc.proxmox_template: - redirect: community.general.proxmox_template - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.proxmox_template - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.misc.proxmox_user_info: - redirect: community.general.proxmox_user_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.proxmox_user_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.pubnub.pubnub_blocks: - redirect: community.general.pubnub_blocks - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pubnub_blocks - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.pulp_repo: - redirect: community.general.pulp_repo - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pulp_repo - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.puppet: - redirect: community.general.puppet - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.puppet - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. purefa_facts: tombstone: removal_version: 3.0.0 @@ -3311,669 +675,46 @@ plugin_routing: tombstone: removal_version: 3.0.0 warning_text: Use purestorage.flashblade.purefb_info instead. - notification.pushbullet: - redirect: community.general.pushbullet - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pushbullet - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - notification.pushover: - redirect: community.general.pushover - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.pushover - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. python_requirements_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.python_requirements_info instead. - system.python_requirements_info: - redirect: community.general.python_requirements_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.python_requirements_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.rackspace.rax: - redirect: community.general.rax - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rax - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.rackspace.rax_cbs: - redirect: community.general.rax_cbs - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rax_cbs - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.rackspace.rax_cbs_attachments: - redirect: community.general.rax_cbs_attachments - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rax_cbs_attachments - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.rackspace.rax_cdb: - redirect: community.general.rax_cdb - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rax_cdb - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.rackspace.rax_cdb_database: - redirect: community.general.rax_cdb_database - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rax_cdb_database - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.rackspace.rax_cdb_user: - redirect: community.general.rax_cdb_user - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rax_cdb_user - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.rackspace.rax_clb: - redirect: community.general.rax_clb - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rax_clb - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.rackspace.rax_clb_nodes: - redirect: community.general.rax_clb_nodes - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rax_clb_nodes - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.rackspace.rax_clb_ssl: - redirect: community.general.rax_clb_ssl - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rax_clb_ssl - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.rackspace.rax_dns: - redirect: community.general.rax_dns - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rax_dns - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.rackspace.rax_dns_record: - redirect: community.general.rax_dns_record - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rax_dns_record - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.rackspace.rax_facts: - redirect: community.general.rax_facts - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rax_facts - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.rackspace.rax_files: - redirect: community.general.rax_files - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rax_files - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.rackspace.rax_files_objects: - redirect: community.general.rax_files_objects - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rax_files_objects - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.rackspace.rax_identity: - redirect: community.general.rax_identity - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rax_identity - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.rackspace.rax_keypair: - redirect: community.general.rax_keypair - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rax_keypair - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.rackspace.rax_meta: - redirect: community.general.rax_meta - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rax_meta - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.rackspace.rax_mon_alarm: - redirect: community.general.rax_mon_alarm - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rax_mon_alarm - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.rackspace.rax_mon_check: - redirect: community.general.rax_mon_check - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rax_mon_check - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.rackspace.rax_mon_entity: - redirect: community.general.rax_mon_entity - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rax_mon_entity - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.rackspace.rax_mon_notification: - redirect: community.general.rax_mon_notification - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rax_mon_notification - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.rackspace.rax_mon_notification_plan: - redirect: community.general.rax_mon_notification_plan - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rax_mon_notification_plan - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.rackspace.rax_network: - redirect: community.general.rax_network - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rax_network - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.rackspace.rax_queue: - redirect: community.general.rax_queue - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rax_queue - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.rackspace.rax_scaling_group: - redirect: community.general.rax_scaling_group - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rax_scaling_group - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.rackspace.rax_scaling_policy: - redirect: community.general.rax_scaling_policy - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rax_scaling_policy - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - files.read_csv: - redirect: community.general.read_csv - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.read_csv - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.redfish.redfish_command: - redirect: community.general.redfish_command - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.redfish_command - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.redfish.redfish_config: - redirect: community.general.redfish_config - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.redfish_config - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. redfish_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.redfish_info instead. - remote_management.redfish.redfish_info: - redirect: community.general.redfish_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.redfish_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. sapcar_extract: redirect: community.sap_libs.sapcar_extract sap_task_list_execute: redirect: community.sap_libs.sap_task_list_execute - packaging.os.redhat_subscription: - redirect: community.general.redhat_subscription - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.redhat_subscription - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - database.misc.redis: - redirect: community.general.redis - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.redis - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - database.misc.redis_data: - redirect: community.general.redis_data - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.redis_data - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - database.misc.redis_data_incr: - redirect: community.general.redis_data_incr - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.redis_data_incr - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - database.misc.redis_data_info: - redirect: community.general.redis_data_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.redis_data_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - database.misc.redis_info: - redirect: community.general.redis_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.redis_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.misc.rhevm: - redirect: community.general.rhevm - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rhevm - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.rhn_channel: - redirect: community.general.rhn_channel - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rhn_channel - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.rhn_register: - redirect: community.general.rhn_register - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rhn_register - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.rhsm_release: - redirect: community.general.rhsm_release - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rhsm_release - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.rhsm_repository: - redirect: community.general.rhsm_repository - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rhsm_repository - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - database.misc.riak: - redirect: community.general.riak - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.riak - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - notification.rocketchat: - redirect: community.general.rocketchat - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rocketchat - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.rollbar_deployment: - redirect: community.general.rollbar_deployment - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rollbar_deployment - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.rpm_ostree_pkg: - redirect: community.general.rpm_ostree_pkg - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rpm_ostree_pkg - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.rundeck_acl_policy: - redirect: community.general.rundeck_acl_policy - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rundeck_acl_policy - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.rundeck_job_executions_info: - redirect: community.general.rundeck_job_executions_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rundeck_job_executions_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.rundeck_job_run: - redirect: community.general.rundeck_job_run - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rundeck_job_run - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.rundeck_project: - redirect: community.general.rundeck_project - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.rundeck_project - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.runit: - redirect: community.general.runit - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.runit - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.sap_task_list_execute: - redirect: community.general.sap_task_list_execute - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.sap_task_list_execute - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - files.sapcar_extract: - redirect: community.general.sapcar_extract - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.sapcar_extract - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - notification.say: - redirect: community.general.say - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.say - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.scaleway.scaleway_compute: - redirect: community.general.scaleway_compute - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.scaleway_compute - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.scaleway.scaleway_compute_private_network: - redirect: community.general.scaleway_compute_private_network - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.scaleway_compute_private_network - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.scaleway.scaleway_container_registry: - redirect: community.general.scaleway_container_registry - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.scaleway_container_registry - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.scaleway.scaleway_container_registry_info: - redirect: community.general.scaleway_container_registry_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.scaleway_container_registry_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.scaleway.scaleway_database_backup: - redirect: community.general.scaleway_database_backup - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.scaleway_database_backup - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.scaleway.scaleway_function_namespace: - redirect: community.general.scaleway_function_namespace - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.scaleway_function_namespace - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.scaleway.scaleway_function_namespace_info: - redirect: community.general.scaleway_function_namespace_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.scaleway_function_namespace_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. scaleway_image_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.scaleway_image_info instead. - cloud.scaleway.scaleway_image_info: - redirect: community.general.scaleway_image_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.scaleway_image_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.scaleway.scaleway_ip: - redirect: community.general.scaleway_ip - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.scaleway_ip - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. scaleway_ip_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.scaleway_ip_info instead. - cloud.scaleway.scaleway_ip_info: - redirect: community.general.scaleway_ip_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.scaleway_ip_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.scaleway.scaleway_lb: - redirect: community.general.scaleway_lb - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.scaleway_lb - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. scaleway_organization_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.scaleway_organization_info instead. - cloud.scaleway.scaleway_organization_info: - redirect: community.general.scaleway_organization_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.scaleway_organization_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.scaleway.scaleway_private_network: - redirect: community.general.scaleway_private_network - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.scaleway_private_network - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.scaleway.scaleway_security_group: - redirect: community.general.scaleway_security_group - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.scaleway_security_group - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. scaleway_security_group_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.scaleway_security_group_info instead. - cloud.scaleway.scaleway_security_group_info: - redirect: community.general.scaleway_security_group_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.scaleway_security_group_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.scaleway.scaleway_security_group_rule: - redirect: community.general.scaleway_security_group_rule - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.scaleway_security_group_rule - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. scaleway_server_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.scaleway_server_info instead. - cloud.scaleway.scaleway_server_info: - redirect: community.general.scaleway_server_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.scaleway_server_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. scaleway_snapshot_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.scaleway_snapshot_info instead. - cloud.scaleway.scaleway_snapshot_info: - redirect: community.general.scaleway_snapshot_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.scaleway_snapshot_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.scaleway.scaleway_sshkey: - redirect: community.general.scaleway_sshkey - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.scaleway_sshkey - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.scaleway.scaleway_user_data: - redirect: community.general.scaleway_user_data - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.scaleway_user_data - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.scaleway.scaleway_volume: - redirect: community.general.scaleway_volume - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.scaleway_volume - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. scaleway_volume_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.scaleway_volume_info instead. - cloud.scaleway.scaleway_volume_info: - redirect: community.general.scaleway_volume_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.scaleway_volume_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.sefcontext: - redirect: community.general.sefcontext - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.sefcontext - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.selinux_permissive: - redirect: community.general.selinux_permissive - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.selinux_permissive - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.selogin: - redirect: community.general.selogin - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.selogin - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - notification.sendgrid: - redirect: community.general.sendgrid - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.sendgrid - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.sensu.sensu_check: - redirect: community.general.sensu_check - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.sensu_check - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.sensu.sensu_client: - redirect: community.general.sensu_client - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.sensu_client - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.sensu.sensu_handler: - redirect: community.general.sensu_handler - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.sensu_handler - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.sensu.sensu_silence: - redirect: community.general.sensu_silence - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.sensu_silence - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.sensu.sensu_subscription: - redirect: community.general.sensu_subscription - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.sensu_subscription - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.seport: - redirect: community.general.seport - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.seport - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.misc.serverless: - redirect: community.general.serverless - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.serverless - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. sf_account_manager: tombstone: removal_version: 2.0.0 @@ -3994,699 +735,48 @@ plugin_routing: tombstone: removal_version: 2.0.0 warning_text: Use netapp.elementsw.na_elementsw_volume instead. - system.shutdown: - redirect: community.general.shutdown - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.shutdown - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.softlayer.sl_vm: - redirect: community.general.sl_vm - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.sl_vm - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - notification.slack: - redirect: community.general.slack - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.slack - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.slackpkg: - redirect: community.general.slackpkg - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.slackpkg - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. smartos_image_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.smartos_image_info instead. - cloud.smartos.smartos_image_info: - redirect: community.general.smartos_image_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.smartos_image_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.snap: - redirect: community.general.snap - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.snap - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.snap_alias: - redirect: community.general.snap_alias - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.snap_alias - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - net_tools.snmp_facts: - redirect: community.general.snmp_facts - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.snmp_facts - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.solaris_zone: - redirect: community.general.solaris_zone - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.solaris_zone - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.sorcery: - redirect: community.general.sorcery - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.sorcery - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.spectrum_device: - redirect: community.general.spectrum_device - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.spectrum_device - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.spectrum_model_attrs: - redirect: community.general.spectrum_model_attrs - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.spectrum_model_attrs - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.spotinst.spotinst_aws_elastigroup: - redirect: community.general.spotinst_aws_elastigroup - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.spotinst_aws_elastigroup - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - storage.hpe3par.ss_3par_cpg: - redirect: community.general.ss_3par_cpg - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ss_3par_cpg - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.ssh_config: - redirect: community.general.ssh_config - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ssh_config - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.stackdriver: - redirect: community.general.stackdriver - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.stackdriver - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.stacki.stacki_host: - redirect: community.general.stacki_host - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.stacki_host - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.statsd: - redirect: community.general.statsd - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.statsd - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.statusio_maintenance: - redirect: community.general.statusio_maintenance - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.statusio_maintenance - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.sudoers: - redirect: community.general.sudoers - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.sudoers - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.supervisorctl: - redirect: community.general.supervisorctl - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.supervisorctl - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.svc: - redirect: community.general.svc - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.svc - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.svr4pkg: - redirect: community.general.svr4pkg - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.svr4pkg - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.swdepot: - redirect: community.general.swdepot - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.swdepot - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.swupd: - redirect: community.general.swupd - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.swupd - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - notification.syslogger: - redirect: community.general.syslogger - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.syslogger - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.syspatch: - redirect: community.general.syspatch - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.syspatch - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.sysrc: - redirect: community.general.sysrc - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.sysrc - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.sysupgrade: - redirect: community.general.sysupgrade - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.sysupgrade - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.taiga_issue: - redirect: community.general.taiga_issue - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.taiga_issue - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - notification.telegram: - redirect: community.general.telegram - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.telegram - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.misc.terraform: - redirect: community.general.terraform - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.terraform - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.timezone: - redirect: community.general.timezone - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.timezone - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - notification.twilio: - redirect: community.general.twilio - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.twilio - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - notification.typetalk: - redirect: community.general.typetalk - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.typetalk - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.univention.udm_dns_record: - redirect: community.general.udm_dns_record - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.udm_dns_record - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.univention.udm_dns_zone: - redirect: community.general.udm_dns_zone - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.udm_dns_zone - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.univention.udm_group: - redirect: community.general.udm_group - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.udm_group - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.univention.udm_share: - redirect: community.general.udm_share - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.udm_share - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.univention.udm_user: - redirect: community.general.udm_user - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.udm_user - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.ufw: - redirect: community.general.ufw - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.ufw - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - monitoring.uptimerobot: - redirect: community.general.uptimerobot - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.uptimerobot - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.urpmi: - redirect: community.general.urpmi - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.urpmi - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.sophos_utm.utm_aaa_group: - redirect: community.general.utm_aaa_group - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.utm_aaa_group - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.sophos_utm.utm_aaa_group_info: - redirect: community.general.utm_aaa_group_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.utm_aaa_group_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.sophos_utm.utm_ca_host_key_cert: - redirect: community.general.utm_ca_host_key_cert - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.utm_ca_host_key_cert - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.sophos_utm.utm_ca_host_key_cert_info: - redirect: community.general.utm_ca_host_key_cert_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.utm_ca_host_key_cert_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.sophos_utm.utm_dns_host: - redirect: community.general.utm_dns_host - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.utm_dns_host - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.sophos_utm.utm_network_interface_address: - redirect: community.general.utm_network_interface_address - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.utm_network_interface_address - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.sophos_utm.utm_network_interface_address_info: - redirect: community.general.utm_network_interface_address_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.utm_network_interface_address_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.sophos_utm.utm_proxy_auth_profile: - redirect: community.general.utm_proxy_auth_profile - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.utm_proxy_auth_profile - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.sophos_utm.utm_proxy_exception: - redirect: community.general.utm_proxy_exception - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.utm_proxy_exception - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.sophos_utm.utm_proxy_frontend: - redirect: community.general.utm_proxy_frontend - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.utm_proxy_frontend - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.sophos_utm.utm_proxy_frontend_info: - redirect: community.general.utm_proxy_frontend_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.utm_proxy_frontend_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.sophos_utm.utm_proxy_location: - redirect: community.general.utm_proxy_location - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.utm_proxy_location - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - web_infrastructure.sophos_utm.utm_proxy_location_info: - redirect: community.general.utm_proxy_location_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.utm_proxy_location_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.vdo: - redirect: community.general.vdo - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.vdo - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - database.vertica.vertica_configuration: - redirect: community.general.vertica_configuration - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.vertica_configuration - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. vertica_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.vertica_info instead. - database.vertica.vertica_info: - redirect: community.general.vertica_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.vertica_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - database.vertica.vertica_role: - redirect: community.general.vertica_role - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.vertica_role - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - database.vertica.vertica_schema: - redirect: community.general.vertica_schema - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.vertica_schema - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - database.vertica.vertica_user: - redirect: community.general.vertica_user - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.vertica_user - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - storage.vexata.vexata_eg: - redirect: community.general.vexata_eg - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.vexata_eg - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - storage.vexata.vexata_volume: - redirect: community.general.vexata_volume - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.vexata_volume - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.smartos.vmadm: - redirect: community.general.vmadm - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.vmadm - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.wakeonlan: - redirect: community.general.wakeonlan - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.wakeonlan - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.redfish.wdc_redfish_command: - redirect: community.general.wdc_redfish_command - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.wdc_redfish_command - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.redfish.wdc_redfish_info: - redirect: community.general.wdc_redfish_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.wdc_redfish_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. webfaction_app: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on HTTPS APIs that do not exist anymore and + warning_text: This module relied on HTTPS APIs that do not exist anymore and there is no clear path to update. - cloud.webfaction.webfaction_app: - redirect: community.general.webfaction_app - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.webfaction_app - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. webfaction_db: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on HTTPS APIs that do not exist anymore and + warning_text: This module relied on HTTPS APIs that do not exist anymore and there is no clear path to update. - cloud.webfaction.webfaction_db: - redirect: community.general.webfaction_db - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.webfaction_db - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. webfaction_domain: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on HTTPS APIs that do not exist anymore and + warning_text: This module relied on HTTPS APIs that do not exist anymore and there is no clear path to update. - cloud.webfaction.webfaction_domain: - redirect: community.general.webfaction_domain - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.webfaction_domain - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. webfaction_mailbox: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on HTTPS APIs that do not exist anymore and + warning_text: This module relied on HTTPS APIs that do not exist anymore and there is no clear path to update. - cloud.webfaction.webfaction_mailbox: - redirect: community.general.webfaction_mailbox - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.webfaction_mailbox - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. webfaction_site: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module relies on HTTPS APIs that do not exist anymore and + warning_text: This module relied on HTTPS APIs that do not exist anymore and there is no clear path to update. - cloud.webfaction.webfaction_site: - redirect: community.general.webfaction_site - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.webfaction_site - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - files.xattr: - redirect: community.general.xattr - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.xattr - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.xbps: - redirect: community.general.xbps - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.xbps - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - remote_management.lenovoxcc.xcc_redfish_command: - redirect: community.general.xcc_redfish_command - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.xcc_redfish_command - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.misc.xenserver_facts: - redirect: community.general.xenserver_facts - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.xenserver_facts - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.xenserver.xenserver_guest: - redirect: community.general.xenserver_guest - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.xenserver_guest - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. xenserver_guest_facts: tombstone: removal_version: 3.0.0 warning_text: Use community.general.xenserver_guest_info instead. - cloud.xenserver.xenserver_guest_info: - redirect: community.general.xenserver_guest_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.xenserver_guest_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - cloud.xenserver.xenserver_guest_powerstate: - redirect: community.general.xenserver_guest_powerstate - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.xenserver_guest_powerstate - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.xfconf: - redirect: community.general.xfconf - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.xfconf - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.xfconf_info: - redirect: community.general.xfconf_info - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.xfconf_info - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.xfs_quota: - redirect: community.general.xfs_quota - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.xfs_quota - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - files.xml: - redirect: community.general.xml - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.xml - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.language.yarn: - redirect: community.general.yarn - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.yarn - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.yum_versionlock: - redirect: community.general.yum_versionlock - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.yum_versionlock - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - storage.zfs.zfs: - redirect: community.general.zfs - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.zfs - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - storage.zfs.zfs_delegate_admin: - redirect: community.general.zfs_delegate_admin - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.zfs_delegate_admin - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - storage.zfs.zfs_facts: - redirect: community.general.zfs_facts - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.zfs_facts - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - clustering.znode: - redirect: community.general.znode - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.znode - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - storage.zfs.zpool_facts: - redirect: community.general.zpool_facts - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.zpool_facts - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.zypper: - redirect: community.general.zypper - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.zypper - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. - packaging.os.zypper_repository: - redirect: community.general.zypper_repository - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.zypper_repository - modules. This has never been supported or documented, and will stop working - in community.general 9.0.0. doc_fragments: rackspace: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This doc fragment is used by rax modules, that rely on the deprecated + warning_text: This doc fragment was used by rax modules, that relied on the deprecated package pyrax. _gcp: redirect: community.google._gcp @@ -4704,9 +794,9 @@ plugin_routing: redirect: community.postgresql.postgresql module_utils: rax: - deprecation: + tombstone: removal_version: 9.0.0 - warning_text: This module util relies on the deprecated package pyrax. + warning_text: This module util relied on the deprecated package pyrax. docker.common: redirect: community.docker.common docker.swarm: @@ -4746,18 +836,3 @@ plugin_routing: # for Ansible 2.9 or earlier. Now we only will have the redirect until we # eventually will deprecate and then remove it. redirect: ansible.builtin.path_join - action: - system.iptables_state: - redirect: community.general.iptables_state - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.iptables_state - action. This has never been supported or documented, and will stop working - in community.general 9.0.0. - system.shutdown: - redirect: community.general.shutdown - deprecation: - removal_version: 9.0.0 - warning_text: You are using an internal name to access the community.general.shutdown - action. This has never been supported or documented, and will stop working - in community.general 9.0.0. diff --git a/ansible_collections/community/general/plugins/become/machinectl.py b/ansible_collections/community/general/plugins/become/machinectl.py index 9b9ac7ec5..e2773ed6a 100644 --- a/ansible_collections/community/general/plugins/become/machinectl.py +++ b/ansible_collections/community/general/plugins/become/machinectl.py @@ -78,12 +78,13 @@ DOCUMENTATION = ''' EXAMPLES = r''' # A polkit rule needed to use the module with a non-root user. # See the Notes section for details. -60-machinectl-fast-user-auth.rules: | - polkit.addRule(function(action, subject) { - if(action.id == "org.freedesktop.machine1.host-shell" && subject.isInGroup("wheel")) { - return polkit.Result.AUTH_SELF_KEEP; - } - }); +/etc/polkit-1/rules.d/60-machinectl-fast-user-auth.rules: | + polkit.addRule(function(action, subject) { + if(action.id == "org.freedesktop.machine1.host-shell" && + subject.isInGroup("wheel")) { + return polkit.Result.AUTH_SELF_KEEP; + } + }); ''' from re import compile as re_compile diff --git a/ansible_collections/community/general/plugins/become/run0.py b/ansible_collections/community/general/plugins/become/run0.py new file mode 100644 index 000000000..a718e86f2 --- /dev/null +++ b/ansible_collections/community/general/plugins/become/run0.py @@ -0,0 +1,128 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2024, 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 absolute_import, division, print_function + +__metaclass__ = type + +DOCUMENTATION = """ + name: run0 + short_description: Systemd's run0 + description: + - This become plugins allows your remote/login user to execute commands as another user via the C(run0) utility. + author: + - Thomas Sjögren (@konstruktoid) + version_added: '9.0.0' + options: + become_user: + description: User you 'become' to execute the task. + default: root + ini: + - section: privilege_escalation + key: become_user + - section: run0_become_plugin + key: user + vars: + - name: ansible_become_user + - name: ansible_run0_user + env: + - name: ANSIBLE_BECOME_USER + - name: ANSIBLE_RUN0_USER + type: string + become_exe: + description: The C(run0) executable. + default: run0 + ini: + - section: privilege_escalation + key: become_exe + - section: run0_become_plugin + key: executable + vars: + - name: ansible_become_exe + - name: ansible_run0_exe + env: + - name: ANSIBLE_BECOME_EXE + - name: ANSIBLE_RUN0_EXE + type: string + become_flags: + description: Options to pass to run0. + default: '' + ini: + - section: privilege_escalation + key: become_flags + - section: run0_become_plugin + key: flags + vars: + - name: ansible_become_flags + - name: ansible_run0_flags + env: + - name: ANSIBLE_BECOME_FLAGS + - name: ANSIBLE_RUN0_FLAGS + type: string + notes: + - This plugin will only work when a polkit rule is in place. +""" + +EXAMPLES = r""" +# An example polkit rule that allows the user 'ansible' in the 'wheel' group +# to execute commands using run0 without authentication. +/etc/polkit-1/rules.d/60-run0-fast-user-auth.rules: | + polkit.addRule(function(action, subject) { + if(action.id == "org.freedesktop.systemd1.manage-units" && + subject.isInGroup("wheel") && + subject.user == "ansible") { + return polkit.Result.YES; + } + }); +""" + +from re import compile as re_compile + +from ansible.plugins.become import BecomeBase +from ansible.module_utils._text import to_bytes + +ansi_color_codes = re_compile(to_bytes(r"\x1B\[[0-9;]+m")) + + +class BecomeModule(BecomeBase): + + name = "community.general.run0" + + prompt = "Password: " + fail = ("==== AUTHENTICATION FAILED ====",) + success = ("==== AUTHENTICATION COMPLETE ====",) + require_tty = ( + True # see https://github.com/ansible-collections/community.general/issues/6932 + ) + + @staticmethod + def remove_ansi_codes(line): + return ansi_color_codes.sub(b"", line) + + def build_become_command(self, cmd, shell): + super().build_become_command(cmd, shell) + + if not cmd: + return cmd + + become = self.get_option("become_exe") + flags = self.get_option("become_flags") + user = self.get_option("become_user") + + return ( + f"{become} --user={user} {flags} {self._build_success_command(cmd, shell)}" + ) + + def check_success(self, b_output): + b_output = self.remove_ansi_codes(b_output) + return super().check_success(b_output) + + def check_incorrect_password(self, b_output): + b_output = self.remove_ansi_codes(b_output) + return super().check_incorrect_password(b_output) + + def check_missing_password(self, b_output): + b_output = self.remove_ansi_codes(b_output) + return super().check_missing_password(b_output) diff --git a/ansible_collections/community/general/plugins/callback/opentelemetry.py b/ansible_collections/community/general/plugins/callback/opentelemetry.py index 492e42071..58cfa057b 100644 --- a/ansible_collections/community/general/plugins/callback/opentelemetry.py +++ b/ansible_collections/community/general/plugins/callback/opentelemetry.py @@ -84,6 +84,33 @@ DOCUMENTATION = ''' - section: callback_opentelemetry key: disable_attributes_in_logs version_added: 7.1.0 + store_spans_in_file: + default: None + type: str + description: + - It stores the exported spans in the given file + env: + - name: ANSIBLE_OPENTELEMETRY_STORE_SPANS_IN_FILE + ini: + - section: callback_opentelemetry + key: store_spans_in_file + version_added: 9.0.0 + otel_exporter_otlp_traces_protocol: + type: str + description: + - E(OTEL_EXPORTER_OTLP_TRACES_PROTOCOL) represents the the transport protocol for spans. + - See + U(https://opentelemetry-python.readthedocs.io/en/latest/sdk/environment_variables.html#envvar-OTEL_EXPORTER_OTLP_TRACES_PROTOCOL). + default: grpc + choices: + - grpc + - http/protobuf + env: + - name: OTEL_EXPORTER_OTLP_TRACES_PROTOCOL + ini: + - section: callback_opentelemetry + key: otel_exporter_otlp_traces_protocol + version_added: 9.0.0 requirements: - opentelemetry-api (Python library) - opentelemetry-exporter-otlp (Python library) @@ -107,6 +134,7 @@ examples: | ''' import getpass +import json import os import socket import sys @@ -124,15 +152,19 @@ from ansible.plugins.callback import CallbackBase try: from opentelemetry import trace from opentelemetry.trace import SpanKind - from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter + from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter as GRPCOTLPSpanExporter + from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter as HTTPOTLPSpanExporter from opentelemetry.sdk.resources import SERVICE_NAME, Resource from opentelemetry.trace.status import Status, StatusCode from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import ( - BatchSpanProcessor + BatchSpanProcessor, + SimpleSpanProcessor + ) + from opentelemetry.sdk.trace.export.in_memory_span_exporter import ( + InMemorySpanExporter ) - # Support for opentelemetry-api <= 1.12 try: from opentelemetry.util._time import _time_ns @@ -255,7 +287,16 @@ class OpenTelemetrySource(object): task.dump = dump task.add_host(HostData(host_uuid, host_name, status, result)) - def generate_distributed_traces(self, otel_service_name, ansible_playbook, tasks_data, status, traceparent, disable_logs, disable_attributes_in_logs): + def generate_distributed_traces(self, + otel_service_name, + ansible_playbook, + tasks_data, + status, + traceparent, + disable_logs, + disable_attributes_in_logs, + otel_exporter_otlp_traces_protocol, + store_spans_in_file): """ generate distributed traces from the collected TaskData and HostData """ tasks = [] @@ -271,7 +312,16 @@ class OpenTelemetrySource(object): ) ) - processor = BatchSpanProcessor(OTLPSpanExporter()) + otel_exporter = None + if store_spans_in_file: + otel_exporter = InMemorySpanExporter() + processor = SimpleSpanProcessor(otel_exporter) + else: + if otel_exporter_otlp_traces_protocol == 'grpc': + otel_exporter = GRPCOTLPSpanExporter() + else: + otel_exporter = HTTPOTLPSpanExporter() + processor = BatchSpanProcessor(otel_exporter) trace.get_tracer_provider().add_span_processor(processor) @@ -293,6 +343,8 @@ class OpenTelemetrySource(object): with tracer.start_as_current_span(task.name, start_time=task.start, end_on_exit=False) as span: self.update_span_data(task, host_data, span, disable_logs, disable_attributes_in_logs) + return otel_exporter + def update_span_data(self, task_data, host_data, span, disable_logs, disable_attributes_in_logs): """ update the span with the given TaskData and HostData """ @@ -350,7 +402,8 @@ class OpenTelemetrySource(object): if not disable_logs: # This will avoid populating span attributes to the logs span.add_event(task_data.dump, attributes={} if disable_attributes_in_logs else attributes) - span.end(end_time=host_data.finish) + # Close span always + span.end(end_time=host_data.finish) def set_span_attributes(self, span, attributes): """ update the span attributes with the given attributes if not None """ @@ -462,6 +515,8 @@ class CallbackModule(CallbackBase): self.errors = 0 self.disabled = False self.traceparent = False + self.store_spans_in_file = False + self.otel_exporter_otlp_traces_protocol = None if OTEL_LIBRARY_IMPORT_ERROR: raise_from( @@ -489,6 +544,8 @@ class CallbackModule(CallbackBase): self.disable_logs = self.get_option('disable_logs') + self.store_spans_in_file = self.get_option('store_spans_in_file') + self.otel_service_name = self.get_option('otel_service_name') if not self.otel_service_name: @@ -497,6 +554,14 @@ class CallbackModule(CallbackBase): # See https://github.com/open-telemetry/opentelemetry-specification/issues/740 self.traceparent = self.get_option('traceparent') + self.otel_exporter_otlp_traces_protocol = self.get_option('otel_exporter_otlp_traces_protocol') + + def dump_results(self, result): + """ dump the results if disable_logs is not enabled """ + if self.disable_logs: + return "" + return self._dump_results(result._result) + def v2_playbook_on_start(self, playbook): self.ansible_playbook = basename(playbook._file_name) @@ -546,7 +611,7 @@ class CallbackModule(CallbackBase): self.tasks_data, status, result, - self._dump_results(result._result) + self.dump_results(result) ) def v2_runner_on_ok(self, result): @@ -554,7 +619,7 @@ class CallbackModule(CallbackBase): self.tasks_data, 'ok', result, - self._dump_results(result._result) + self.dump_results(result) ) def v2_runner_on_skipped(self, result): @@ -562,7 +627,7 @@ class CallbackModule(CallbackBase): self.tasks_data, 'skipped', result, - self._dump_results(result._result) + self.dump_results(result) ) def v2_playbook_on_include(self, included_file): @@ -578,15 +643,22 @@ class CallbackModule(CallbackBase): status = Status(status_code=StatusCode.OK) else: status = Status(status_code=StatusCode.ERROR) - self.opentelemetry.generate_distributed_traces( + otel_exporter = self.opentelemetry.generate_distributed_traces( self.otel_service_name, self.ansible_playbook, self.tasks_data, status, self.traceparent, self.disable_logs, - self.disable_attributes_in_logs + self.disable_attributes_in_logs, + self.otel_exporter_otlp_traces_protocol, + self.store_spans_in_file ) + if self.store_spans_in_file: + spans = [json.loads(span.to_json()) for span in otel_exporter.get_finished_spans()] + with open(self.store_spans_in_file, "w", encoding="utf-8") as output: + json.dump({"spans": spans}, output, indent=4) + def v2_runner_on_async_failed(self, result, **kwargs): self.errors += 1 diff --git a/ansible_collections/community/general/plugins/callback/timestamp.py b/ansible_collections/community/general/plugins/callback/timestamp.py new file mode 100644 index 000000000..07cd8d239 --- /dev/null +++ b/ansible_collections/community/general/plugins/callback/timestamp.py @@ -0,0 +1,127 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2024, kurokobo <kurokobo@protonmail.com> +# Copyright (c) 2014, Michael DeHaan <michael.dehaan@gmail.com> +# 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 + +DOCUMENTATION = r""" + name: timestamp + type: stdout + short_description: Adds simple timestamp for each header + version_added: 9.0.0 + description: + - This callback adds simple timestamp for each header. + author: kurokobo (@kurokobo) + options: + timezone: + description: + - Timezone to use for the timestamp in IANA time zone format. + - For example C(America/New_York), C(Asia/Tokyo)). Ignored on Python < 3.9. + ini: + - section: callback_timestamp + key: timezone + env: + - name: ANSIBLE_CALLBACK_TIMESTAMP_TIMEZONE + type: string + format_string: + description: + - Format of the timestamp shown to user in 1989 C standard format. + - > + Refer to L(the Python documentation,https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes) + for the available format codes. + ini: + - section: callback_timestamp + key: format_string + env: + - name: ANSIBLE_CALLBACK_TIMESTAMP_FORMAT_STRING + default: "%H:%M:%S" + type: string + seealso: + - plugin: ansible.posix.profile_tasks + plugin_type: callback + description: > + You can use P(ansible.posix.profile_tasks#callback) callback plugin to time individual tasks and overall execution time + with detailed timestamps. + extends_documentation_fragment: + - ansible.builtin.default_callback + - ansible.builtin.result_format_callback +""" + + +from ansible.plugins.callback.default import CallbackModule as Default +from ansible.utils.display import get_text_width +from ansible.module_utils.common.text.converters import to_text +from datetime import datetime +import types +import sys + +# Store whether the zoneinfo module is available +_ZONEINFO_AVAILABLE = sys.version_info >= (3, 9) + + +def get_datetime_now(tz): + """ + Returns the current timestamp with the specified timezone + """ + return datetime.now(tz=tz) + + +def banner(self, msg, color=None, cows=True): + """ + Prints a header-looking line with cowsay or stars with length depending on terminal width (3 minimum) with trailing timestamp + + Based on the banner method of Display class from ansible.utils.display + + https://github.com/ansible/ansible/blob/4403519afe89138042108e237aef317fd5f09c33/lib/ansible/utils/display.py#L511 + """ + timestamp = get_datetime_now(self.timestamp_tzinfo).strftime(self.timestamp_format_string) + timestamp_len = get_text_width(timestamp) + 1 # +1 for leading space + + msg = to_text(msg) + if self.b_cowsay and cows: + try: + self.banner_cowsay("%s @ %s" % (msg, timestamp)) + return + except OSError: + self.warning("somebody cleverly deleted cowsay or something during the PB run. heh.") + + msg = msg.strip() + try: + star_len = self.columns - get_text_width(msg) - timestamp_len + except EnvironmentError: + star_len = self.columns - len(msg) - timestamp_len + if star_len <= 3: + star_len = 3 + stars = "*" * star_len + self.display("\n%s %s %s" % (msg, stars, timestamp), color=color) + + +class CallbackModule(Default): + CALLBACK_VERSION = 2.0 + CALLBACK_TYPE = "stdout" + CALLBACK_NAME = "community.general.timestamp" + + def __init__(self): + super(CallbackModule, self).__init__() + + # Replace the banner method of the display object with the custom one + self._display.banner = types.MethodType(banner, self._display) + + def set_options(self, task_keys=None, var_options=None, direct=None): + super(CallbackModule, self).set_options(task_keys=task_keys, var_options=var_options, direct=direct) + + # Store zoneinfo for specified timezone if available + tzinfo = None + if _ZONEINFO_AVAILABLE and self.get_option("timezone"): + from zoneinfo import ZoneInfo + + tzinfo = ZoneInfo(self.get_option("timezone")) + + # Inject options into the display object + setattr(self._display, "timestamp_tzinfo", tzinfo) + setattr(self._display, "timestamp_format_string", self.get_option("format_string")) diff --git a/ansible_collections/community/general/plugins/callback/yaml.py b/ansible_collections/community/general/plugins/callback/yaml.py index ae2c8f881..e41f69ec5 100644 --- a/ansible_collections/community/general/plugins/callback/yaml.py +++ b/ansible_collections/community/general/plugins/callback/yaml.py @@ -19,6 +19,16 @@ DOCUMENTATION = ''' - default_callback requirements: - set as stdout in configuration + seealso: + - plugin: ansible.builtin.default + plugin_type: callback + description: > + There is a parameter O(ansible.builtin.default#callback:result_format) in P(ansible.builtin.default#callback) + that allows you to change the output format to YAML. + notes: + - > + With ansible-core 2.13 or newer, you can instead specify V(yaml) for the parameter O(ansible.builtin.default#callback:result_format) + in P(ansible.builtin.default#callback). ''' import yaml diff --git a/ansible_collections/community/general/plugins/doc_fragments/consul.py b/ansible_collections/community/general/plugins/doc_fragments/consul.py index fbe3f33d4..d4cf11995 100644 --- a/ansible_collections/community/general/plugins/doc_fragments/consul.py +++ b/ansible_collections/community/general/plugins/doc_fragments/consul.py @@ -56,5 +56,4 @@ attributes: support: full membership: - community.general.consul - version_added: 8.3.0 """ diff --git a/ansible_collections/community/general/plugins/doc_fragments/django.py b/ansible_collections/community/general/plugins/doc_fragments/django.py new file mode 100644 index 000000000..d92799937 --- /dev/null +++ b/ansible_collections/community/general/plugins/doc_fragments/django.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2024, Alexei Znamensky <russoz@gmail.com> +# 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): + DOCUMENTATION = r''' +options: + venv: + description: + - Use the the Python interpreter from this virtual environment. + - Pass the path to the root of the virtualenv, not the C(bin/) directory nor the C(python) executable. + type: path + settings: + description: + - Specifies the settings module to use. + - The value will be passed as is to the C(--settings) argument in C(django-admin). + type: str + required: true + pythonpath: + description: + - Adds the given filesystem path to the Python import search path. + - The value will be passed as is to the C(--pythonpath) argument in C(django-admin). + type: path + traceback: + description: + - Provides a full stack trace in the output when a C(CommandError) is raised. + type: bool + verbosity: + description: + - Specifies the amount of notification and debug information in the output of C(django-admin). + type: int + choices: [0, 1, 2, 3] + skip_checks: + description: + - Skips running system checks prior to running the command. + type: bool + + +notes: + - The C(django-admin) command is always executed using the C(C) locale, and the option C(--no-color) is always passed. + +seealso: + - name: django-admin and manage.py in official Django documentation + description: >- + Refer to this documentation for the builtin commands and options of C(django-admin). + Please make sure that you select the right version of Django in the version selector on that page. + link: https://docs.djangoproject.com/en/5.0/ref/django-admin/ +''' diff --git a/ansible_collections/community/general/plugins/doc_fragments/proxmox.py b/ansible_collections/community/general/plugins/doc_fragments/proxmox.py index 4972da498..cb533fefa 100644 --- a/ansible_collections/community/general/plugins/doc_fragments/proxmox.py +++ b/ansible_collections/community/general/plugins/doc_fragments/proxmox.py @@ -65,3 +65,13 @@ options: - Add the new VM to the specified pool. type: str ''' + + ACTIONGROUP_PROXMOX = r""" +options: {} +attributes: + action_group: + description: Use C(group/community.general.proxmox) in C(module_defaults) to set defaults for this module. + support: full + membership: + - community.general.proxmox +""" diff --git a/ansible_collections/community/general/plugins/doc_fragments/rackspace.py b/ansible_collections/community/general/plugins/doc_fragments/rackspace.py deleted file mode 100644 index f28be777c..000000000 --- a/ansible_collections/community/general/plugins/doc_fragments/rackspace.py +++ /dev/null @@ -1,120 +0,0 @@ -# -*- coding: utf-8 -*- - -# Copyright (c) 2014, Matt Martz <matt@sivel.net> -# 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): - - # Standard Rackspace only documentation fragment - DOCUMENTATION = r''' -options: - api_key: - description: - - Rackspace API key, overrides O(credentials). - type: str - aliases: [ password ] - credentials: - description: - - File to find the Rackspace credentials in. Ignored if O(api_key) and - O(username) are provided. - type: path - aliases: [ creds_file ] - env: - description: - - Environment as configured in C(~/.pyrax.cfg), - see U(https://github.com/rackspace/pyrax/blob/master/docs/getting_started.md#pyrax-configuration). - type: str - region: - description: - - Region to create an instance in. - type: str - username: - description: - - Rackspace username, overrides O(credentials). - type: str - validate_certs: - description: - - Whether or not to require SSL validation of API endpoints. - type: bool - aliases: [ verify_ssl ] -requirements: - - pyrax -notes: - - The following environment variables can be used, E(RAX_USERNAME), - E(RAX_API_KEY), E(RAX_CREDS_FILE), E(RAX_CREDENTIALS), E(RAX_REGION). - - E(RAX_CREDENTIALS) and E(RAX_CREDS_FILE) point to a credentials file - appropriate for pyrax. See U(https://github.com/rackspace/pyrax/blob/master/docs/getting_started.md#authenticating). - - E(RAX_USERNAME) and E(RAX_API_KEY) obviate the use of a credentials file. - - E(RAX_REGION) defines a Rackspace Public Cloud region (DFW, ORD, LON, ...). -''' - - # Documentation fragment including attributes to enable communication - # of other OpenStack clouds. Not all rax modules support this. - OPENSTACK = r''' -options: - api_key: - type: str - description: - - Rackspace API key, overrides O(credentials). - aliases: [ password ] - auth_endpoint: - type: str - description: - - The URI of the authentication service. - - If not specified will be set to U(https://identity.api.rackspacecloud.com/v2.0/). - credentials: - type: path - description: - - File to find the Rackspace credentials in. Ignored if O(api_key) and - O(username) are provided. - aliases: [ creds_file ] - env: - type: str - description: - - Environment as configured in C(~/.pyrax.cfg), - see U(https://github.com/rackspace/pyrax/blob/master/docs/getting_started.md#pyrax-configuration). - identity_type: - type: str - description: - - Authentication mechanism to use, such as rackspace or keystone. - default: rackspace - region: - type: str - description: - - Region to create an instance in. - tenant_id: - type: str - description: - - The tenant ID used for authentication. - tenant_name: - type: str - description: - - The tenant name used for authentication. - username: - type: str - description: - - Rackspace username, overrides O(credentials). - validate_certs: - description: - - Whether or not to require SSL validation of API endpoints. - type: bool - aliases: [ verify_ssl ] -deprecated: - removed_in: 9.0.0 - why: This module relies on the deprecated package pyrax. - alternative: Use the Openstack modules instead. -requirements: - - pyrax -notes: - - The following environment variables can be used, E(RAX_USERNAME), - E(RAX_API_KEY), E(RAX_CREDS_FILE), E(RAX_CREDENTIALS), E(RAX_REGION). - - E(RAX_CREDENTIALS) and E(RAX_CREDS_FILE) points to a credentials file - appropriate for pyrax. See U(https://github.com/rackspace/pyrax/blob/master/docs/getting_started.md#authenticating). - - E(RAX_USERNAME) and E(RAX_API_KEY) obviate the use of a credentials file. - - E(RAX_REGION) defines a Rackspace Public Cloud region (DFW, ORD, LON, ...). -''' diff --git a/ansible_collections/community/general/plugins/lookup/merge_variables.py b/ansible_collections/community/general/plugins/lookup/merge_variables.py index 4fc33014c..ce7621ad2 100644 --- a/ansible_collections/community/general/plugins/lookup/merge_variables.py +++ b/ansible_collections/community/general/plugins/lookup/merge_variables.py @@ -157,7 +157,9 @@ class LookupModule(LookupBase): cross_host_merge_result = initial_value for host in variables["hostvars"]: if self._is_host_in_allowed_groups(variables["hostvars"][host]["group_names"]): - cross_host_merge_result = self._merge_vars(term, cross_host_merge_result, variables["hostvars"][host]) + host_variables = dict(variables["hostvars"].raw_get(host)) + host_variables["hostvars"] = variables["hostvars"] # re-add hostvars + cross_host_merge_result = self._merge_vars(term, cross_host_merge_result, host_variables) ret.append(cross_host_merge_result) return ret @@ -195,7 +197,8 @@ class LookupModule(LookupBase): result = initial_value for var_name in var_merge_names: - var_value = self._templar.template(variables[var_name]) # Render jinja2 templates + with self._templar.set_temporary_context(available_variables=variables): # tmp. switch renderer to context of current variables + var_value = self._templar.template(variables[var_name]) # Render jinja2 templates var_type = _verify_and_get_type(var_value) if prev_var_type is None: diff --git a/ansible_collections/community/general/plugins/module_utils/cmd_runner.py b/ansible_collections/community/general/plugins/module_utils/cmd_runner.py index 864987120..2bf2b32e8 100644 --- a/ansible_collections/community/general/plugins/module_utils/cmd_runner.py +++ b/ansible_collections/community/general/plugins/module_utils/cmd_runner.py @@ -129,8 +129,15 @@ class _Format(object): return _ArgFormat(lambda value: ["{0}={1}".format(arg, value)], ignore_none=ignore_none) @staticmethod - def as_list(ignore_none=None): - return _ArgFormat(_ensure_list, ignore_none=ignore_none) + def as_list(ignore_none=None, min_len=0, max_len=None): + def func(value): + value = _ensure_list(value) + if len(value) < min_len: + raise ValueError("Parameter must have at least {0} element(s)".format(min_len)) + if max_len is not None and len(value) > max_len: + raise ValueError("Parameter must have at most {0} element(s)".format(max_len)) + return value + return _ArgFormat(func, ignore_none=ignore_none) @staticmethod def as_fixed(args): diff --git a/ansible_collections/community/general/plugins/module_utils/django.py b/ansible_collections/community/general/plugins/module_utils/django.py new file mode 100644 index 000000000..fbaf840db --- /dev/null +++ b/ansible_collections/community/general/plugins/module_utils/django.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2024, Alexei Znamensky <russoz@gmail.com> +# 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 + + +from ansible_collections.community.general.plugins.module_utils.cmd_runner import cmd_runner_fmt +from ansible_collections.community.general.plugins.module_utils.python_runner import PythonRunner +from ansible_collections.community.general.plugins.module_utils.module_helper import ModuleHelper + + +django_std_args = dict( + # environmental options + venv=dict(type="path"), + # default options of django-admin + settings=dict(type="str", required=True), + pythonpath=dict(type="path"), + traceback=dict(type="bool"), + verbosity=dict(type="int", choices=[0, 1, 2, 3]), + skip_checks=dict(type="bool"), +) + +_django_std_arg_fmts = dict( + command=cmd_runner_fmt.as_list(), + settings=cmd_runner_fmt.as_opt_eq_val("--settings"), + pythonpath=cmd_runner_fmt.as_opt_eq_val("--pythonpath"), + traceback=cmd_runner_fmt.as_bool("--traceback"), + verbosity=cmd_runner_fmt.as_opt_val("--verbosity"), + no_color=cmd_runner_fmt.as_fixed("--no-color"), + skip_checks=cmd_runner_fmt.as_bool("--skip-checks"), +) + + +class _DjangoRunner(PythonRunner): + def __init__(self, module, arg_formats=None, **kwargs): + arg_fmts = dict(arg_formats) if arg_formats else {} + arg_fmts.update(_django_std_arg_fmts) + + super(_DjangoRunner, self).__init__(module, ["-m", "django"], arg_formats=arg_fmts, **kwargs) + + def __call__(self, output_process=None, ignore_value_none=True, check_mode_skip=False, check_mode_return=None, **kwargs): + args_order = ( + ("command", "no_color", "settings", "pythonpath", "traceback", "verbosity", "skip_checks") + self._prepare_args_order(self.default_args_order) + ) + return super(_DjangoRunner, self).__call__(args_order, output_process, ignore_value_none, check_mode_skip, check_mode_return, **kwargs) + + +class DjangoModuleHelper(ModuleHelper): + module = {} + use_old_vardict = False + django_admin_cmd = None + arg_formats = {} + django_admin_arg_order = () + use_old_vardict = False + + def __init__(self): + argument_spec = dict(django_std_args) + argument_spec.update(self.module.get("argument_spec", {})) + self.module["argument_spec"] = argument_spec + super(DjangoModuleHelper, self).__init__(self.module) + if self.django_admin_cmd is not None: + self.vars.command = self.django_admin_cmd + + def __run__(self): + runner = _DjangoRunner(self.module, + default_args_order=self.django_admin_arg_order, + arg_formats=self.arg_formats, + venv=self.vars.venv, + check_rc=True) + with runner() as ctx: + results = ctx.run() + self.vars.stdout = ctx.results_out + self.vars.stderr = ctx.results_err + self.vars.cmd = ctx.cmd + if self.verbosity >= 3: + self.vars.run_info = ctx.run_info + + return results + + @classmethod + def execute(cls): + cls().run() diff --git a/ansible_collections/community/general/plugins/module_utils/gandi_livedns_api.py b/ansible_collections/community/general/plugins/module_utils/gandi_livedns_api.py index 53245d44d..824fea46e 100644 --- a/ansible_collections/community/general/plugins/module_utils/gandi_livedns_api.py +++ b/ansible_collections/community/general/plugins/module_utils/gandi_livedns_api.py @@ -33,6 +33,7 @@ class GandiLiveDNSAPI(object): def __init__(self, module): self.module = module self.api_key = module.params['api_key'] + self.personal_access_token = module.params['personal_access_token'] def _build_error_message(self, module, info): s = '' @@ -50,7 +51,12 @@ class GandiLiveDNSAPI(object): return s def _gandi_api_call(self, api_call, method='GET', payload=None, error_on_404=True): - headers = {'Authorization': 'Apikey {0}'.format(self.api_key), + authorization_header = ( + 'Bearer {0}'.format(self.personal_access_token) + if self.personal_access_token + else 'Apikey {0}'.format(self.api_key) + ) + headers = {'Authorization': authorization_header, 'Content-Type': 'application/json'} data = None if payload: diff --git a/ansible_collections/community/general/plugins/module_utils/gitlab.py b/ansible_collections/community/general/plugins/module_utils/gitlab.py index b1354d8a9..224789a71 100644 --- a/ansible_collections/community/general/plugins/module_utils/gitlab.py +++ b/ansible_collections/community/general/plugins/module_utils/gitlab.py @@ -115,6 +115,11 @@ def gitlab_authentication(module, min_version=None): # Changelog : https://github.com/python-gitlab/python-gitlab/releases/tag/v1.13.0 # This condition allow to still support older version of the python-gitlab library if LooseVersion(gitlab.__version__) < LooseVersion("1.13.0"): + module.deprecate( + "GitLab basic auth is deprecated and will be removed in next major version, " + "using another auth method (API token or OAuth) is strongly recommended.", + version='10.0.0', + collection_name='community.general') gitlab_instance = gitlab.Gitlab(url=gitlab_url, ssl_verify=verify, email=gitlab_user, password=gitlab_password, private_token=gitlab_token, api_version=4) else: diff --git a/ansible_collections/community/general/plugins/module_utils/homebrew.py b/ansible_collections/community/general/plugins/module_utils/homebrew.py new file mode 100644 index 000000000..281683210 --- /dev/null +++ b/ansible_collections/community/general/plugins/module_utils/homebrew.py @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Ansible project +# Simplified BSD License (see LICENSES/BSD-2-Clause.txt or https://opensource.org/licenses/BSD-2-Clause) +# SPDX-License-Identifier: BSD-2-Clause + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +import os +import re +from ansible.module_utils.six import string_types + + +def _create_regex_group_complement(s): + lines = (line.strip() for line in s.split("\n") if line.strip()) + chars = filter(None, (line.split("#")[0].strip() for line in lines)) + group = r"[^" + r"".join(chars) + r"]" + return re.compile(group) + + +class HomebrewValidate(object): + # class regexes ------------------------------------------------ {{{ + VALID_PATH_CHARS = r""" + \w # alphanumeric characters (i.e., [a-zA-Z0-9_]) + \s # spaces + : # colons + {sep} # the OS-specific path separator + . # dots + \- # dashes + """.format( + sep=os.path.sep + ) + + VALID_BREW_PATH_CHARS = r""" + \w # alphanumeric characters (i.e., [a-zA-Z0-9_]) + \s # spaces + {sep} # the OS-specific path separator + . # dots + \- # dashes + """.format( + sep=os.path.sep + ) + + VALID_PACKAGE_CHARS = r""" + \w # alphanumeric characters (i.e., [a-zA-Z0-9_]) + . # dots + / # slash (for taps) + \+ # plusses + \- # dashes + : # colons (for URLs) + @ # at-sign + """ + + INVALID_PATH_REGEX = _create_regex_group_complement(VALID_PATH_CHARS) + INVALID_BREW_PATH_REGEX = _create_regex_group_complement(VALID_BREW_PATH_CHARS) + INVALID_PACKAGE_REGEX = _create_regex_group_complement(VALID_PACKAGE_CHARS) + # /class regexes ----------------------------------------------- }}} + + # class validations -------------------------------------------- {{{ + @classmethod + def valid_path(cls, path): + """ + `path` must be one of: + - list of paths + - a string containing only: + - alphanumeric characters + - dashes + - dots + - spaces + - colons + - os.path.sep + """ + + if isinstance(path, string_types): + return not cls.INVALID_PATH_REGEX.search(path) + + try: + iter(path) + except TypeError: + return False + else: + paths = path + return all(cls.valid_brew_path(path_) for path_ in paths) + + @classmethod + def valid_brew_path(cls, brew_path): + """ + `brew_path` must be one of: + - None + - a string containing only: + - alphanumeric characters + - dashes + - dots + - spaces + - os.path.sep + """ + + if brew_path is None: + return True + + return isinstance( + brew_path, string_types + ) and not cls.INVALID_BREW_PATH_REGEX.search(brew_path) + + @classmethod + def valid_package(cls, package): + """A valid package is either None or alphanumeric.""" + + if package is None: + return True + + return isinstance( + package, string_types + ) and not cls.INVALID_PACKAGE_REGEX.search(package) diff --git a/ansible_collections/community/general/plugins/module_utils/mh/mixins/deps.py b/ansible_collections/community/general/plugins/module_utils/mh/mixins/deps.py index 772df8c0e..dd879ff4b 100644 --- a/ansible_collections/community/general/plugins/module_utils/mh/mixins/deps.py +++ b/ansible_collections/community/general/plugins/module_utils/mh/mixins/deps.py @@ -7,13 +7,14 @@ from __future__ import absolute_import, division, print_function __metaclass__ = type -import traceback - -from ansible_collections.community.general.plugins.module_utils.mh.base import ModuleHelperBase -from ansible_collections.community.general.plugins.module_utils.mh.deco import module_fails_on_exception - class DependencyCtxMgr(object): + """ + DEPRECATION WARNING + + This class is deprecated and will be removed in community.general 11.0.0 + Modules should use plugins/module_utils/deps.py instead. + """ def __init__(self, name, msg=None): self.name = name self.msg = msg @@ -35,39 +36,3 @@ class DependencyCtxMgr(object): @property def text(self): return self.msg or str(self.exc_val) - - -class DependencyMixin(ModuleHelperBase): - """ - THIS CLASS IS BEING DEPRECATED. - See the deprecation notice in ``DependencyMixin.fail_on_missing_deps()`` below. - - Mixin for mapping module options to running a CLI command with its arguments. - """ - _dependencies = [] - - @classmethod - def dependency(cls, name, msg): - cls._dependencies.append(DependencyCtxMgr(name, msg)) - return cls._dependencies[-1] - - def fail_on_missing_deps(self): - if not self._dependencies: - return - self.module.deprecate( - 'The DependencyMixin is being deprecated. ' - 'Modules should use community.general.plugins.module_utils.deps instead.', - version='9.0.0', - collection_name='community.general', - ) - for d in self._dependencies: - if not d.has_it: - self.module.fail_json(changed=False, - exception="\n".join(traceback.format_exception(d.exc_type, d.exc_val, d.exc_tb)), - msg=d.text, - **self.output) - - @module_fails_on_exception - def run(self): - self.fail_on_missing_deps() - super(DependencyMixin, self).run() diff --git a/ansible_collections/community/general/plugins/module_utils/mh/mixins/vars.py b/ansible_collections/community/general/plugins/module_utils/mh/mixins/vars.py index 91f4e4a18..161560973 100644 --- a/ansible_collections/community/general/plugins/module_utils/mh/mixins/vars.py +++ b/ansible_collections/community/general/plugins/module_utils/mh/mixins/vars.py @@ -14,7 +14,7 @@ class VarMeta(object): """ DEPRECATION WARNING - This class is deprecated and will be removed in community.general 10.0.0 + This class is deprecated and will be removed in community.general 11.0.0 Modules should use the VarDict from plugins/module_utils/vardict.py instead. """ @@ -70,7 +70,7 @@ class VarDict(object): """ DEPRECATION WARNING - This class is deprecated and will be removed in community.general 10.0.0 + This class is deprecated and will be removed in community.general 11.0.0 Modules should use the VarDict from plugins/module_utils/vardict.py instead. """ def __init__(self): @@ -139,7 +139,7 @@ class VarsMixin(object): """ DEPRECATION WARNING - This class is deprecated and will be removed in community.general 10.0.0 + This class is deprecated and will be removed in community.general 11.0.0 Modules should use the VarDict from plugins/module_utils/vardict.py instead. """ def __init__(self, module=None): diff --git a/ansible_collections/community/general/plugins/module_utils/mh/module_helper.py b/ansible_collections/community/general/plugins/module_utils/mh/module_helper.py index c33efb16b..ca95199d9 100644 --- a/ansible_collections/community/general/plugins/module_utils/mh/module_helper.py +++ b/ansible_collections/community/general/plugins/module_utils/mh/module_helper.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# (c) 2020, Alexei Znamensky <russoz@gmail.com> -# Copyright (c) 2020, Ansible Project +# (c) 2020-2024, Alexei Znamensky <russoz@gmail.com> +# Copyright (c) 2020-2024, Ansible Project # Simplified BSD License (see LICENSES/BSD-2-Clause.txt or https://opensource.org/licenses/BSD-2-Clause) # SPDX-License-Identifier: BSD-2-Clause @@ -10,23 +10,40 @@ __metaclass__ = type from ansible.module_utils.common.dict_transformations import dict_merge +from ansible_collections.community.general.plugins.module_utils.vardict import VarDict as _NewVarDict # remove "as NewVarDict" in 11.0.0 # (TODO: remove AnsibleModule!) pylint: disable-next=unused-import -from ansible_collections.community.general.plugins.module_utils.mh.base import ModuleHelperBase, AnsibleModule # noqa: F401 +from ansible_collections.community.general.plugins.module_utils.mh.base import AnsibleModule # noqa: F401 DEPRECATED, remove in 11.0.0 +from ansible_collections.community.general.plugins.module_utils.mh.base import ModuleHelperBase from ansible_collections.community.general.plugins.module_utils.mh.mixins.state import StateMixin -from ansible_collections.community.general.plugins.module_utils.mh.mixins.deps import DependencyMixin -from ansible_collections.community.general.plugins.module_utils.mh.mixins.vars import VarsMixin +# (TODO: remove mh.mixins.vars!) pylint: disable-next=unused-import +from ansible_collections.community.general.plugins.module_utils.mh.mixins.vars import VarsMixin, VarDict as _OldVarDict # noqa: F401 remove in 11.0.0 from ansible_collections.community.general.plugins.module_utils.mh.mixins.deprecate_attrs import DeprecateAttrsMixin -class ModuleHelper(DeprecateAttrsMixin, VarsMixin, DependencyMixin, ModuleHelperBase): +class ModuleHelper(DeprecateAttrsMixin, ModuleHelperBase): facts_name = None output_params = () diff_params = () change_params = () facts_params = () + use_old_vardict = True # remove in 11.0.0 + mute_vardict_deprecation = False def __init__(self, module=None): - super(ModuleHelper, self).__init__(module) + if self.use_old_vardict: # remove first half of the if in 11.0.0 + self.vars = _OldVarDict() + super(ModuleHelper, self).__init__(module) + if not self.mute_vardict_deprecation: + self.module.deprecate( + "This class is using the old VarDict from ModuleHelper, which is deprecated. " + "Set the class variable use_old_vardict to False and make the necessary adjustments." + "The old VarDict class will be removed in community.general 11.0.0", + version="11.0.0", collection_name="community.general" + ) + else: + self.vars = _NewVarDict() + super(ModuleHelper, self).__init__(module) + for name, value in self.module.params.items(): self.vars.set( name, value, @@ -36,6 +53,12 @@ class ModuleHelper(DeprecateAttrsMixin, VarsMixin, DependencyMixin, ModuleHelper fact=name in self.facts_params, ) + def update_vars(self, meta=None, **kwargs): + if meta is None: + meta = {} + for k, v in kwargs.items(): + self.vars.set(k, v, **meta) + def update_output(self, **kwargs): self.update_vars(meta={"output": True}, **kwargs) @@ -43,7 +66,10 @@ class ModuleHelper(DeprecateAttrsMixin, VarsMixin, DependencyMixin, ModuleHelper self.update_vars(meta={"fact": True}, **kwargs) def _vars_changed(self): - return any(self.vars.has_changed(v) for v in self.vars.change_vars()) + if self.use_old_vardict: + return any(self.vars.has_changed(v) for v in self.vars.change_vars()) + + return self.vars.has_changed def has_changed(self): return self.changed or self._vars_changed() diff --git a/ansible_collections/community/general/plugins/module_utils/module_helper.py b/ansible_collections/community/general/plugins/module_utils/module_helper.py index 5aa16c057..366699329 100644 --- a/ansible_collections/community/general/plugins/module_utils/module_helper.py +++ b/ansible_collections/community/general/plugins/module_utils/module_helper.py @@ -9,14 +9,14 @@ __metaclass__ = type # pylint: disable=unused-import - from ansible_collections.community.general.plugins.module_utils.mh.module_helper import ( - ModuleHelper, StateModuleHelper, AnsibleModule + ModuleHelper, StateModuleHelper, + AnsibleModule # remove in 11.0.0 ) -from ansible_collections.community.general.plugins.module_utils.mh.mixins.state import StateMixin # noqa: F401 -from ansible_collections.community.general.plugins.module_utils.mh.mixins.deps import DependencyCtxMgr, DependencyMixin # noqa: F401 +from ansible_collections.community.general.plugins.module_utils.mh.mixins.state import StateMixin # noqa: F401 remove in 11.0.0 +from ansible_collections.community.general.plugins.module_utils.mh.mixins.deps import DependencyCtxMgr # noqa: F401 remove in 11.0.0 from ansible_collections.community.general.plugins.module_utils.mh.exceptions import ModuleHelperException # noqa: F401 from ansible_collections.community.general.plugins.module_utils.mh.deco import ( cause_changes, module_fails_on_exception, check_mode_skip, check_mode_skip_returns, ) -from ansible_collections.community.general.plugins.module_utils.mh.mixins.vars import VarMeta, VarDict, VarsMixin # noqa: F401 +from ansible_collections.community.general.plugins.module_utils.mh.mixins.vars import VarMeta, VarDict, VarsMixin # noqa: F401 remove in 11.0.0 diff --git a/ansible_collections/community/general/plugins/module_utils/puppet.py b/ansible_collections/community/general/plugins/module_utils/puppet.py index f05b0673f..e06683b3e 100644 --- a/ansible_collections/community/general/plugins/module_utils/puppet.py +++ b/ansible_collections/community/general/plugins/module_utils/puppet.py @@ -103,6 +103,7 @@ def puppet_runner(module): modulepath=cmd_runner_fmt.as_opt_eq_val("--modulepath"), _execute=cmd_runner_fmt.as_func(execute_func), summarize=cmd_runner_fmt.as_bool("--summarize"), + waitforlock=cmd_runner_fmt.as_opt_val("--waitforlock"), debug=cmd_runner_fmt.as_bool("--debug"), verbose=cmd_runner_fmt.as_bool("--verbose"), ), diff --git a/ansible_collections/community/general/plugins/module_utils/python_runner.py b/ansible_collections/community/general/plugins/module_utils/python_runner.py new file mode 100644 index 000000000..f678f247b --- /dev/null +++ b/ansible_collections/community/general/plugins/module_utils/python_runner.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2024, Alexei Znamensky <russoz@gmail.com> +# 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 + +import os + +from ansible_collections.community.general.plugins.module_utils.cmd_runner import CmdRunner, _ensure_list + + +class PythonRunner(CmdRunner): + def __init__(self, module, command, arg_formats=None, default_args_order=(), + check_rc=False, force_lang="C", path_prefix=None, environ_update=None, + python="python", venv=None): + self.python = python + self.venv = venv + self.has_venv = venv is not None + + if (os.path.isabs(python) or '/' in python): + self.python = python + elif self.has_venv: + path_prefix = os.path.join(venv, "bin") + if environ_update is None: + environ_update = {} + environ_update["PATH"] = "%s:%s" % (path_prefix, os.environ["PATH"]) + environ_update["VIRTUAL_ENV"] = venv + + python_cmd = [self.python] + _ensure_list(command) + + super(PythonRunner, self).__init__(module, python_cmd, arg_formats, default_args_order, + check_rc, force_lang, path_prefix, environ_update) diff --git a/ansible_collections/community/general/plugins/module_utils/rax.py b/ansible_collections/community/general/plugins/module_utils/rax.py deleted file mode 100644 index 6331c0d1b..000000000 --- a/ansible_collections/community/general/plugins/module_utils/rax.py +++ /dev/null @@ -1,334 +0,0 @@ -# -*- coding: utf-8 -*- -# This code is part of Ansible, but is an independent component. -# This particular file snippet, and this file snippet only, is BSD licensed. -# Modules you write using this snippet, which is embedded dynamically by -# Ansible still belong to the author of the module, and may assign their own -# license to the complete work. -# -# Copyright (c), Michael DeHaan <michael.dehaan@gmail.com>, 2012-2013 -# -# Simplified BSD License (see LICENSES/BSD-2-Clause.txt or https://opensource.org/licenses/BSD-2-Clause) -# SPDX-License-Identifier: BSD-2-Clause - -from __future__ import (absolute_import, division, print_function) -__metaclass__ = type - - -import os -import re -from uuid import UUID - -from ansible.module_utils.six import text_type, binary_type - -FINAL_STATUSES = ('ACTIVE', 'ERROR') -VOLUME_STATUS = ('available', 'attaching', 'creating', 'deleting', 'in-use', - 'error', 'error_deleting') - -CLB_ALGORITHMS = ['RANDOM', 'LEAST_CONNECTIONS', 'ROUND_ROBIN', - 'WEIGHTED_LEAST_CONNECTIONS', 'WEIGHTED_ROUND_ROBIN'] -CLB_PROTOCOLS = ['DNS_TCP', 'DNS_UDP', 'FTP', 'HTTP', 'HTTPS', 'IMAPS', - 'IMAPv4', 'LDAP', 'LDAPS', 'MYSQL', 'POP3', 'POP3S', 'SMTP', - 'TCP', 'TCP_CLIENT_FIRST', 'UDP', 'UDP_STREAM', 'SFTP'] - -NON_CALLABLES = (text_type, binary_type, bool, dict, int, list, type(None)) -PUBLIC_NET_ID = "00000000-0000-0000-0000-000000000000" -SERVICE_NET_ID = "11111111-1111-1111-1111-111111111111" - - -def rax_slugify(value): - """Prepend a key with rax_ and normalize the key name""" - return 'rax_%s' % (re.sub(r'[^\w-]', '_', value).lower().lstrip('_')) - - -def rax_clb_node_to_dict(obj): - """Function to convert a CLB Node object to a dict""" - if not obj: - return {} - node = obj.to_dict() - node['id'] = obj.id - node['weight'] = obj.weight - return node - - -def rax_to_dict(obj, obj_type='standard'): - """Generic function to convert a pyrax object to a dict - - obj_type values: - standard - clb - server - - """ - instance = {} - for key in dir(obj): - value = getattr(obj, key) - if obj_type == 'clb' and key == 'nodes': - instance[key] = [] - for node in value: - instance[key].append(rax_clb_node_to_dict(node)) - elif (isinstance(value, list) and len(value) > 0 and - not isinstance(value[0], NON_CALLABLES)): - instance[key] = [] - for item in value: - instance[key].append(rax_to_dict(item)) - elif (isinstance(value, NON_CALLABLES) and not key.startswith('_')): - if obj_type == 'server': - if key == 'image': - if not value: - instance['rax_boot_source'] = 'volume' - else: - instance['rax_boot_source'] = 'local' - key = rax_slugify(key) - instance[key] = value - - if obj_type == 'server': - for attr in ['id', 'accessIPv4', 'name', 'status']: - instance[attr] = instance.get(rax_slugify(attr)) - - return instance - - -def rax_find_bootable_volume(module, rax_module, server, exit=True): - """Find a servers bootable volume""" - cs = rax_module.cloudservers - cbs = rax_module.cloud_blockstorage - server_id = rax_module.utils.get_id(server) - volumes = cs.volumes.get_server_volumes(server_id) - bootable_volumes = [] - for volume in volumes: - vol = cbs.get(volume) - if module.boolean(vol.bootable): - bootable_volumes.append(vol) - if not bootable_volumes: - if exit: - module.fail_json(msg='No bootable volumes could be found for ' - 'server %s' % server_id) - else: - return False - elif len(bootable_volumes) > 1: - if exit: - module.fail_json(msg='Multiple bootable volumes found for server ' - '%s' % server_id) - else: - return False - - return bootable_volumes[0] - - -def rax_find_image(module, rax_module, image, exit=True): - """Find a server image by ID or Name""" - cs = rax_module.cloudservers - try: - UUID(image) - except ValueError: - try: - image = cs.images.find(human_id=image) - except (cs.exceptions.NotFound, cs.exceptions.NoUniqueMatch): - try: - image = cs.images.find(name=image) - except (cs.exceptions.NotFound, - cs.exceptions.NoUniqueMatch): - if exit: - module.fail_json(msg='No matching image found (%s)' % - image) - else: - return False - - return rax_module.utils.get_id(image) - - -def rax_find_volume(module, rax_module, name): - """Find a Block storage volume by ID or name""" - cbs = rax_module.cloud_blockstorage - try: - UUID(name) - volume = cbs.get(name) - except ValueError: - try: - volume = cbs.find(name=name) - except rax_module.exc.NotFound: - volume = None - except Exception as e: - module.fail_json(msg='%s' % e) - return volume - - -def rax_find_network(module, rax_module, network): - """Find a cloud network by ID or name""" - cnw = rax_module.cloud_networks - try: - UUID(network) - except ValueError: - if network.lower() == 'public': - return cnw.get_server_networks(PUBLIC_NET_ID) - elif network.lower() == 'private': - return cnw.get_server_networks(SERVICE_NET_ID) - else: - try: - network_obj = cnw.find_network_by_label(network) - except (rax_module.exceptions.NetworkNotFound, - rax_module.exceptions.NetworkLabelNotUnique): - module.fail_json(msg='No matching network found (%s)' % - network) - else: - return cnw.get_server_networks(network_obj) - else: - return cnw.get_server_networks(network) - - -def rax_find_server(module, rax_module, server): - """Find a Cloud Server by ID or name""" - cs = rax_module.cloudservers - try: - UUID(server) - server = cs.servers.get(server) - except ValueError: - servers = cs.servers.list(search_opts=dict(name='^%s$' % server)) - if not servers: - module.fail_json(msg='No Server was matched by name, ' - 'try using the Server ID instead') - if len(servers) > 1: - module.fail_json(msg='Multiple servers matched by name, ' - 'try using the Server ID instead') - - # We made it this far, grab the first and hopefully only server - # in the list - server = servers[0] - return server - - -def rax_find_loadbalancer(module, rax_module, loadbalancer): - """Find a Cloud Load Balancer by ID or name""" - clb = rax_module.cloud_loadbalancers - try: - found = clb.get(loadbalancer) - except Exception: - found = [] - for lb in clb.list(): - if loadbalancer == lb.name: - found.append(lb) - - if not found: - module.fail_json(msg='No loadbalancer was matched') - - if len(found) > 1: - module.fail_json(msg='Multiple loadbalancers matched') - - # We made it this far, grab the first and hopefully only item - # in the list - found = found[0] - - return found - - -def rax_argument_spec(): - """Return standard base dictionary used for the argument_spec - argument in AnsibleModule - - """ - return dict( - api_key=dict(type='str', aliases=['password'], no_log=True), - auth_endpoint=dict(type='str'), - credentials=dict(type='path', aliases=['creds_file']), - env=dict(type='str'), - identity_type=dict(type='str', default='rackspace'), - region=dict(type='str'), - tenant_id=dict(type='str'), - tenant_name=dict(type='str'), - username=dict(type='str'), - validate_certs=dict(type='bool', aliases=['verify_ssl']), - ) - - -def rax_required_together(): - """Return the default list used for the required_together argument to - AnsibleModule""" - return [['api_key', 'username']] - - -def setup_rax_module(module, rax_module, region_required=True): - """Set up pyrax in a standard way for all modules""" - rax_module.USER_AGENT = 'ansible/%s %s' % (module.ansible_version, - rax_module.USER_AGENT) - - api_key = module.params.get('api_key') - auth_endpoint = module.params.get('auth_endpoint') - credentials = module.params.get('credentials') - env = module.params.get('env') - identity_type = module.params.get('identity_type') - region = module.params.get('region') - tenant_id = module.params.get('tenant_id') - tenant_name = module.params.get('tenant_name') - username = module.params.get('username') - verify_ssl = module.params.get('validate_certs') - - if env is not None: - rax_module.set_environment(env) - - rax_module.set_setting('identity_type', identity_type) - if verify_ssl is not None: - rax_module.set_setting('verify_ssl', verify_ssl) - if auth_endpoint is not None: - rax_module.set_setting('auth_endpoint', auth_endpoint) - if tenant_id is not None: - rax_module.set_setting('tenant_id', tenant_id) - if tenant_name is not None: - rax_module.set_setting('tenant_name', tenant_name) - - try: - username = username or os.environ.get('RAX_USERNAME') - if not username: - username = rax_module.get_setting('keyring_username') - if username: - api_key = 'USE_KEYRING' - if not api_key: - api_key = os.environ.get('RAX_API_KEY') - credentials = (credentials or os.environ.get('RAX_CREDENTIALS') or - os.environ.get('RAX_CREDS_FILE')) - region = (region or os.environ.get('RAX_REGION') or - rax_module.get_setting('region')) - except KeyError as e: - module.fail_json(msg='Unable to load %s' % e.message) - - try: - if api_key and username: - if api_key == 'USE_KEYRING': - rax_module.keyring_auth(username, region=region) - else: - rax_module.set_credentials(username, api_key=api_key, - region=region) - elif credentials: - credentials = os.path.expanduser(credentials) - rax_module.set_credential_file(credentials, region=region) - else: - raise Exception('No credentials supplied!') - except Exception as e: - if e.message: - msg = str(e.message) - else: - msg = repr(e) - module.fail_json(msg=msg) - - if region_required and region not in rax_module.regions: - module.fail_json(msg='%s is not a valid region, must be one of: %s' % - (region, ','.join(rax_module.regions))) - - return rax_module - - -def rax_scaling_group_personality_file(module, files): - if not files: - return [] - - results = [] - for rpath, lpath in files.items(): - lpath = os.path.expanduser(lpath) - try: - with open(lpath, 'r') as f: - results.append({ - 'path': rpath, - 'contents': f.read(), - }) - except Exception as e: - module.fail_json(msg='Failed to load %s: %s' % (lpath, str(e))) - return results diff --git a/ansible_collections/community/general/plugins/module_utils/redhat.py b/ansible_collections/community/general/plugins/module_utils/redhat.py index 110159ddf..321386a0a 100644 --- a/ansible_collections/community/general/plugins/module_utils/redhat.py +++ b/ansible_collections/community/general/plugins/module_utils/redhat.py @@ -15,10 +15,8 @@ __metaclass__ = type import os -import re import shutil import tempfile -import types from ansible.module_utils.six.moves import configparser @@ -76,241 +74,3 @@ class RegistrationBase(object): def subscribe(self, **kwargs): raise NotImplementedError("Must be implemented by a sub-class") - - -class Rhsm(RegistrationBase): - """ - DEPRECATION WARNING - - This class is deprecated and will be removed in community.general 9.0.0. - There is no replacement for it; please contact the community.general - maintainers in case you are using it. - """ - - def __init__(self, module, username=None, password=None): - RegistrationBase.__init__(self, module, username, password) - self.config = self._read_config() - self.module = module - self.module.deprecate( - 'The Rhsm class is deprecated with no replacement.', - version='9.0.0', - collection_name='community.general', - ) - - def _read_config(self, rhsm_conf='/etc/rhsm/rhsm.conf'): - ''' - Load RHSM configuration from /etc/rhsm/rhsm.conf. - Returns: - * ConfigParser object - ''' - - # Read RHSM defaults ... - cp = configparser.ConfigParser() - cp.read(rhsm_conf) - - # Add support for specifying a default value w/o having to standup some configuration - # Yeah, I know this should be subclassed ... but, oh well - def get_option_default(self, key, default=''): - sect, opt = key.split('.', 1) - if self.has_section(sect) and self.has_option(sect, opt): - return self.get(sect, opt) - else: - return default - - cp.get_option = types.MethodType(get_option_default, cp, configparser.ConfigParser) - - return cp - - def enable(self): - ''' - Enable the system to receive updates from subscription-manager. - This involves updating affected yum plugins and removing any - conflicting yum repositories. - ''' - RegistrationBase.enable(self) - self.update_plugin_conf('rhnplugin', False) - self.update_plugin_conf('subscription-manager', True) - - def configure(self, **kwargs): - ''' - Configure the system as directed for registration with RHN - Raises: - * Exception - if error occurs while running command - ''' - args = ['subscription-manager', 'config'] - - # Pass supplied **kwargs as parameters to subscription-manager. Ignore - # non-configuration parameters and replace '_' with '.'. For example, - # 'server_hostname' becomes '--system.hostname'. - for k, v in kwargs.items(): - if re.search(r'^(system|rhsm)_', k): - args.append('--%s=%s' % (k.replace('_', '.'), v)) - - self.module.run_command(args, check_rc=True) - - @property - def is_registered(self): - ''' - Determine whether the current system - Returns: - * Boolean - whether the current system is currently registered to - RHN. - ''' - args = ['subscription-manager', 'identity'] - rc, stdout, stderr = self.module.run_command(args, check_rc=False) - if rc == 0: - return True - else: - return False - - def register(self, username, password, autosubscribe, activationkey): - ''' - Register the current system to the provided RHN server - Raises: - * Exception - if error occurs while running command - ''' - args = ['subscription-manager', 'register'] - - # Generate command arguments - if activationkey: - args.append('--activationkey "%s"' % activationkey) - else: - if autosubscribe: - args.append('--autosubscribe') - if username: - args.extend(['--username', username]) - if password: - args.extend(['--password', password]) - - # Do the needful... - rc, stderr, stdout = self.module.run_command(args, check_rc=True) - - def unsubscribe(self): - ''' - Unsubscribe a system from all subscribed channels - Raises: - * Exception - if error occurs while running command - ''' - args = ['subscription-manager', 'unsubscribe', '--all'] - rc, stderr, stdout = self.module.run_command(args, check_rc=True) - - def unregister(self): - ''' - Unregister a currently registered system - Raises: - * Exception - if error occurs while running command - ''' - args = ['subscription-manager', 'unregister'] - rc, stderr, stdout = self.module.run_command(args, check_rc=True) - self.update_plugin_conf('rhnplugin', False) - self.update_plugin_conf('subscription-manager', False) - - def subscribe(self, regexp): - ''' - Subscribe current system to available pools matching the specified - regular expression - Raises: - * Exception - if error occurs while running command - ''' - - # Available pools ready for subscription - available_pools = RhsmPools(self.module) - - for pool in available_pools.filter(regexp): - pool.subscribe() - - -class RhsmPool(object): - """ - Convenience class for housing subscription information - - DEPRECATION WARNING - - This class is deprecated and will be removed in community.general 9.0.0. - There is no replacement for it; please contact the community.general - maintainers in case you are using it. - """ - - def __init__(self, module, **kwargs): - self.module = module - for k, v in kwargs.items(): - setattr(self, k, v) - self.module.deprecate( - 'The RhsmPool class is deprecated with no replacement.', - version='9.0.0', - collection_name='community.general', - ) - - def __str__(self): - return str(self.__getattribute__('_name')) - - def subscribe(self): - args = "subscription-manager subscribe --pool %s" % self.PoolId - rc, stdout, stderr = self.module.run_command(args, check_rc=True) - if rc == 0: - return True - else: - return False - - -class RhsmPools(object): - """ - This class is used for manipulating pools subscriptions with RHSM - - DEPRECATION WARNING - - This class is deprecated and will be removed in community.general 9.0.0. - There is no replacement for it; please contact the community.general - maintainers in case you are using it. - """ - - def __init__(self, module): - self.module = module - self.products = self._load_product_list() - self.module.deprecate( - 'The RhsmPools class is deprecated with no replacement.', - version='9.0.0', - collection_name='community.general', - ) - - def __iter__(self): - return self.products.__iter__() - - def _load_product_list(self): - """ - Loads list of all available pools for system in data structure - """ - args = "subscription-manager list --available" - rc, stdout, stderr = self.module.run_command(args, check_rc=True) - - products = [] - for line in stdout.split('\n'): - # Remove leading+trailing whitespace - line = line.strip() - # An empty line implies the end of an output group - if len(line) == 0: - continue - # If a colon ':' is found, parse - elif ':' in line: - (key, value) = line.split(':', 1) - key = key.strip().replace(" ", "") # To unify - value = value.strip() - if key in ['ProductName', 'SubscriptionName']: - # Remember the name for later processing - products.append(RhsmPool(self.module, _name=value, key=value)) - elif products: - # Associate value with most recently recorded product - products[-1].__setattr__(key, value) - # FIXME - log some warning? - # else: - # warnings.warn("Unhandled subscription key/value: %s/%s" % (key,value)) - return products - - def filter(self, regexp='^$'): - ''' - Return a list of RhsmPools whose name matches the provided regular expression - ''' - r = re.compile(regexp) - for product in self.products: - if r.search(product._name): - yield product diff --git a/ansible_collections/community/general/plugins/module_utils/rundeck.py b/ansible_collections/community/general/plugins/module_utils/rundeck.py index 7df68a360..cffca7b4e 100644 --- a/ansible_collections/community/general/plugins/module_utils/rundeck.py +++ b/ansible_collections/community/general/plugins/module_utils/rundeck.py @@ -28,7 +28,7 @@ def api_argument_spec(): return api_argument_spec -def api_request(module, endpoint, data=None, method="GET"): +def api_request(module, endpoint, data=None, method="GET", content_type="application/json"): """Manages Rundeck API requests via HTTP(S) :arg module: The AnsibleModule (used to get url, api_version, api_token, etc). @@ -63,7 +63,7 @@ def api_request(module, endpoint, data=None, method="GET"): data=json.dumps(data), method=method, headers={ - "Content-Type": "application/json", + "Content-Type": content_type, "Accept": "application/json", "X-Rundeck-Auth-Token": module.params["api_token"] } diff --git a/ansible_collections/community/general/plugins/module_utils/vardict.py b/ansible_collections/community/general/plugins/module_utils/vardict.py index cfcce4d4d..51f802483 100644 --- a/ansible_collections/community/general/plugins/module_utils/vardict.py +++ b/ansible_collections/community/general/plugins/module_utils/vardict.py @@ -100,7 +100,7 @@ class _Variable(object): return def __str__(self): - return "<_Variable: value={0!r}, initial={1!r}, diff={2}, output={3}, change={4}, verbosity={5}>".format( + return "<Variable: value={0!r}, initial={1!r}, diff={2}, output={3}, change={4}, verbosity={5}>".format( self.value, self.initial_value, self.diff, self.output, self.change, self.verbosity ) diff --git a/ansible_collections/community/general/plugins/modules/aix_lvol.py b/ansible_collections/community/general/plugins/modules/aix_lvol.py index 1e7b42568..7d0fb1ee0 100644 --- a/ansible_collections/community/general/plugins/modules/aix_lvol.py +++ b/ansible_collections/community/general/plugins/modules/aix_lvol.py @@ -240,8 +240,6 @@ def main(): state = module.params['state'] pvs = module.params['pvs'] - pv_list = ' '.join(pvs) - if policy == 'maximum': lv_policy = 'x' else: @@ -249,16 +247,16 @@ def main(): # Add echo command when running in check-mode if module.check_mode: - test_opt = 'echo ' + test_opt = [module.get_bin_path("echo", required=True)] else: - test_opt = '' + test_opt = [] # check if system commands are available lsvg_cmd = module.get_bin_path("lsvg", required=True) lslv_cmd = module.get_bin_path("lslv", required=True) # Get information on volume group requested - rc, vg_info, err = module.run_command("%s %s" % (lsvg_cmd, vg)) + rc, vg_info, err = module.run_command([lsvg_cmd, vg]) if rc != 0: if state == 'absent': @@ -273,8 +271,7 @@ def main(): lv_size = round_ppsize(convert_size(module, size), base=this_vg['pp_size']) # Get information on logical volume requested - rc, lv_info, err = module.run_command( - "%s %s" % (lslv_cmd, lv)) + rc, lv_info, err = module.run_command([lslv_cmd, lv]) if rc != 0: if state == 'absent': @@ -296,7 +293,7 @@ def main(): # create LV mklv_cmd = module.get_bin_path("mklv", required=True) - cmd = "%s %s -t %s -y %s -c %s -e %s %s %s %sM %s" % (test_opt, mklv_cmd, lv_type, lv, copies, lv_policy, opts, vg, lv_size, pv_list) + cmd = test_opt + [mklv_cmd, "-t", lv_type, "-y", lv, "-c", copies, "-e", lv_policy, opts, vg, "%sM" % (lv_size, )] + pvs rc, out, err = module.run_command(cmd) if rc == 0: module.exit_json(changed=True, msg="Logical volume %s created." % lv) @@ -306,7 +303,7 @@ def main(): if state == 'absent': # remove LV rmlv_cmd = module.get_bin_path("rmlv", required=True) - rc, out, err = module.run_command("%s %s -f %s" % (test_opt, rmlv_cmd, this_lv['name'])) + rc, out, err = module.run_command(test_opt + [rmlv_cmd, "-f", this_lv['name']]) if rc == 0: module.exit_json(changed=True, msg="Logical volume %s deleted." % lv) else: @@ -315,7 +312,7 @@ def main(): if this_lv['policy'] != policy: # change lv allocation policy chlv_cmd = module.get_bin_path("chlv", required=True) - rc, out, err = module.run_command("%s %s -e %s %s" % (test_opt, chlv_cmd, lv_policy, this_lv['name'])) + rc, out, err = module.run_command(test_opt + [chlv_cmd, "-e", lv_policy, this_lv['name']]) if rc == 0: module.exit_json(changed=True, msg="Logical volume %s policy changed: %s." % (lv, policy)) else: @@ -331,7 +328,7 @@ def main(): # resize LV based on absolute values if int(lv_size) > this_lv['size']: extendlv_cmd = module.get_bin_path("extendlv", required=True) - cmd = "%s %s %s %sM" % (test_opt, extendlv_cmd, lv, lv_size - this_lv['size']) + cmd = test_opt + [extendlv_cmd, lv, "%sM" % (lv_size - this_lv['size'], )] rc, out, err = module.run_command(cmd) if rc == 0: module.exit_json(changed=True, msg="Logical volume %s size extended to %sMB." % (lv, lv_size)) diff --git a/ansible_collections/community/general/plugins/modules/ansible_galaxy_install.py b/ansible_collections/community/general/plugins/modules/ansible_galaxy_install.py index 3b0a8fd47..d382ed93a 100644 --- a/ansible_collections/community/general/plugins/modules/ansible_galaxy_install.py +++ b/ansible_collections/community/general/plugins/modules/ansible_galaxy_install.py @@ -73,16 +73,6 @@ options: - Using O(force=true) is mandatory when downgrading. type: bool default: false - ack_ansible29: - description: - - This option has no longer any effect and will be removed in community.general 9.0.0. - type: bool - default: false - ack_min_ansiblecore211: - description: - - This option has no longer any effect and will be removed in community.general 9.0.0. - type: bool - default: false """ EXAMPLES = """ @@ -181,7 +171,7 @@ RETURN = """ import re -from ansible_collections.community.general.plugins.module_utils.cmd_runner import CmdRunner, cmd_runner_fmt as fmt +from ansible_collections.community.general.plugins.module_utils.cmd_runner import CmdRunner, cmd_runner_fmt from ansible_collections.community.general.plugins.module_utils.module_helper import ModuleHelper, ModuleHelperException @@ -190,7 +180,9 @@ class AnsibleGalaxyInstall(ModuleHelper): _RE_LIST_PATH = re.compile(r'^# (?P<path>.*)$') _RE_LIST_COLL = re.compile(r'^(?P<elem>\w+\.\w+)\s+(?P<version>[\d\.]+)\s*$') _RE_LIST_ROLE = re.compile(r'^- (?P<elem>\w+\.\w+),\s+(?P<version>[\d\.]+)\s*$') - _RE_INSTALL_OUTPUT = None # Set after determining ansible version, see __init_module__() + _RE_INSTALL_OUTPUT = re.compile( + r'^(?:(?P<collection>\w+\.\w+):(?P<cversion>[\d\.]+)|- (?P<role>\w+\.\w+) \((?P<rversion>[\d\.]+)\)) was installed successfully$' + ) ansible_version = None output_params = ('type', 'name', 'dest', 'requirements_file', 'force', 'no_deps') @@ -202,35 +194,24 @@ class AnsibleGalaxyInstall(ModuleHelper): dest=dict(type='path'), force=dict(type='bool', default=False), no_deps=dict(type='bool', default=False), - ack_ansible29=dict( - type='bool', - default=False, - removed_in_version='9.0.0', - removed_from_collection='community.general', - ), - ack_min_ansiblecore211=dict( - type='bool', - default=False, - removed_in_version='9.0.0', - removed_from_collection='community.general', - ), ), mutually_exclusive=[('name', 'requirements_file')], required_one_of=[('name', 'requirements_file')], required_if=[('type', 'both', ['requirements_file'])], supports_check_mode=False, ) + use_old_vardict = False command = 'ansible-galaxy' command_args_formats = dict( - type=fmt.as_func(lambda v: [] if v == 'both' else [v]), - galaxy_cmd=fmt.as_list(), - requirements_file=fmt.as_opt_val('-r'), - dest=fmt.as_opt_val('-p'), - force=fmt.as_bool("--force"), - no_deps=fmt.as_bool("--no-deps"), - version=fmt.as_bool("--version"), - name=fmt.as_list(), + type=cmd_runner_fmt.as_func(lambda v: [] if v == 'both' else [v]), + galaxy_cmd=cmd_runner_fmt.as_list(), + requirements_file=cmd_runner_fmt.as_opt_val('-r'), + dest=cmd_runner_fmt.as_opt_val('-p'), + force=cmd_runner_fmt.as_bool("--force"), + no_deps=cmd_runner_fmt.as_bool("--no-deps"), + version=cmd_runner_fmt.as_fixed("--version"), + name=cmd_runner_fmt.as_list(), ) def _make_runner(self, lang): @@ -254,25 +235,18 @@ class AnsibleGalaxyInstall(ModuleHelper): try: runner = self._make_runner("C.UTF-8") with runner("version", check_rc=False, output_process=process) as ctx: - return runner, ctx.run(version=True) - except UnsupportedLocale as e: + return runner, ctx.run() + except UnsupportedLocale: runner = self._make_runner("en_US.UTF-8") with runner("version", check_rc=True, output_process=process) as ctx: - return runner, ctx.run(version=True) + return runner, ctx.run() def __init_module__(self): - # self.runner = CmdRunner(self.module, command=self.command, arg_formats=self.command_args_formats, force_lang=self.force_lang) self.runner, self.ansible_version = self._get_ansible_galaxy_version() if self.ansible_version < (2, 11): self.module.fail_json( - msg="Support for Ansible 2.9 and ansible-base 2.10 has ben removed." + msg="Support for Ansible 2.9 and ansible-base 2.10 has been removed." ) - # Collection install output changed: - # ansible-base 2.10: "coll.name (x.y.z)" - # ansible-core 2.11+: "coll.name:x.y.z" - self._RE_INSTALL_OUTPUT = re.compile(r'^(?:(?P<collection>\w+\.\w+)(?: \(|:)(?P<cversion>[\d\.]+)\)?' - r'|- (?P<role>\w+\.\w+) \((?P<rversion>[\d\.]+)\))' - r' was installed successfully$') self.vars.set("new_collections", {}, change=True) self.vars.set("new_roles", {}, change=True) if self.vars.type != "collection": diff --git a/ansible_collections/community/general/plugins/modules/apt_rpm.py b/ansible_collections/community/general/plugins/modules/apt_rpm.py index 03b87e78f..3a0b6d805 100644 --- a/ansible_collections/community/general/plugins/modules/apt_rpm.py +++ b/ansible_collections/community/general/plugins/modules/apt_rpm.py @@ -170,7 +170,7 @@ def local_rpm_package_name(path): def query_package(module, name): # rpm -q returns 0 if the package is installed, # 1 if it is not installed - rc, out, err = module.run_command("%s -q %s" % (RPM_PATH, name)) + rc, out, err = module.run_command([RPM_PATH, "-q", name]) if rc == 0: return True else: @@ -203,7 +203,7 @@ def query_package_provides(module, name, allow_upgrade=False): name = local_rpm_package_name(name) - rc, out, err = module.run_command("%s -q --provides %s" % (RPM_PATH, name)) + rc, out, err = module.run_command([RPM_PATH, "-q", "--provides", name]) if rc == 0: if not allow_upgrade: return True @@ -253,7 +253,7 @@ def remove_packages(module, packages): if not query_package(module, package): continue - rc, out, err = module.run_command("%s -y remove %s" % (APT_PATH, package), environ_update={"LANG": "C"}) + rc, out, err = module.run_command([APT_PATH, "-y", "remove", package], environ_update={"LANG": "C"}) if rc != 0: module.fail_json(msg="failed to remove %s: %s" % (package, err)) @@ -271,14 +271,14 @@ def install_packages(module, pkgspec, allow_upgrade=False): if pkgspec is None: return (False, "Empty package list") - packages = "" + packages = [] for package in pkgspec: if not query_package_provides(module, package, allow_upgrade=allow_upgrade): - packages += "'%s' " % package + packages.append(package) - if len(packages) != 0: - - rc, out, err = module.run_command("%s -y install %s" % (APT_PATH, packages), environ_update={"LANG": "C"}) + if packages: + command = [APT_PATH, "-y", "install"] + packages + rc, out, err = module.run_command(command, environ_update={"LANG": "C"}) installed = True for package in pkgspec: @@ -287,7 +287,7 @@ def install_packages(module, pkgspec, allow_upgrade=False): # apt-rpm always have 0 for exit code if --force is used if rc or not installed: - module.fail_json(msg="'apt-get -y install %s' failed: %s" % (packages, err)) + module.fail_json(msg="'%s' failed: %s" % (" ".join(command), err)) else: return (True, "%s present(s)" % packages) else: @@ -310,6 +310,18 @@ def main(): module.fail_json(msg="cannot find /usr/bin/apt-get and/or /usr/bin/rpm") p = module.params + if p['state'] in ['installed', 'present']: + module.deprecate( + 'state=%s currently behaves unexpectedly by always upgrading to the latest version if' + ' the package is already installed. This behavior is deprecated and will change in' + ' community.general 11.0.0. You can use state=latest to explicitly request this behavior' + ' or state=present_not_latest to explicitly request the behavior that state=%s will have' + ' in community.general 11.0.0, namely that the package will not be upgraded if it is' + ' already installed.' % (p['state'], p['state']), + version='11.0.0', + collection_name='community.general', + ) + modified = False output = "" diff --git a/ansible_collections/community/general/plugins/modules/btrfs_subvolume.py b/ansible_collections/community/general/plugins/modules/btrfs_subvolume.py index 864bb65a6..35327bfe0 100644 --- a/ansible_collections/community/general/plugins/modules/btrfs_subvolume.py +++ b/ansible_collections/community/general/plugins/modules/btrfs_subvolume.py @@ -572,10 +572,7 @@ class BtrfsSubvolumeModule(object): self.__temporary_mounts[cache_key] = mountpoint mount = self.module.get_bin_path("mount", required=True) - command = "%s -o noatime,subvolid=%d %s %s " % (mount, - subvolid, - device, - mountpoint) + command = [mount, "-o", "noatime,subvolid=%d" % subvolid, device, mountpoint] result = self.module.run_command(command, check_rc=True) return mountpoint @@ -586,10 +583,10 @@ class BtrfsSubvolumeModule(object): def __cleanup_mount(self, mountpoint): umount = self.module.get_bin_path("umount", required=True) - result = self.module.run_command("%s %s" % (umount, mountpoint)) + result = self.module.run_command([umount, mountpoint]) if result[0] == 0: rmdir = self.module.get_bin_path("rmdir", required=True) - self.module.run_command("%s %s" % (rmdir, mountpoint)) + self.module.run_command([rmdir, mountpoint]) # Format and return results def get_results(self): diff --git a/ansible_collections/community/general/plugins/modules/cloudflare_dns.py b/ansible_collections/community/general/plugins/modules/cloudflare_dns.py index d2bea4266..190497644 100644 --- a/ansible_collections/community/general/plugins/modules/cloudflare_dns.py +++ b/ansible_collections/community/general/plugins/modules/cloudflare_dns.py @@ -148,9 +148,9 @@ options: type: description: - The type of DNS record to create. Required if O(state=present). - - Note that V(SPF) is no longer supported by CloudFlare. Support for it will be removed from community.general 9.0.0. + - Support for V(SPF) has been removed from community.general 9.0.0 since that record type is no longer supported by CloudFlare. type: str - choices: [ A, AAAA, CNAME, DS, MX, NS, SPF, SRV, SSHFP, TLSA, CAA, TXT ] + choices: [ A, AAAA, CNAME, DS, MX, NS, SRV, SSHFP, TLSA, CAA, TXT ] value: description: - The record value. @@ -674,7 +674,7 @@ class CloudflareAPI(object): if (params['type'] is None) or (params['record'] is None): self.module.fail_json(msg="You must provide a type and a record to create a new record") - if (params['type'] in ['A', 'AAAA', 'CNAME', 'TXT', 'MX', 'NS', 'SPF']): + if (params['type'] in ['A', 'AAAA', 'CNAME', 'TXT', 'MX', 'NS']): if not params['value']: self.module.fail_json(msg="You must provide a non-empty value to create this record type") @@ -869,7 +869,7 @@ def main(): state=dict(type='str', default='present', choices=['absent', 'present']), timeout=dict(type='int', default=30), ttl=dict(type='int', default=1), - type=dict(type='str', choices=['A', 'AAAA', 'CNAME', 'DS', 'MX', 'NS', 'SPF', 'SRV', 'SSHFP', 'TLSA', 'CAA', 'TXT']), + type=dict(type='str', choices=['A', 'AAAA', 'CNAME', 'DS', 'MX', 'NS', 'SRV', 'SSHFP', 'TLSA', 'CAA', 'TXT']), value=dict(type='str', aliases=['content']), weight=dict(type='int', default=1), zone=dict(type='str', required=True, aliases=['domain']), diff --git a/ansible_collections/community/general/plugins/modules/consul_policy.py b/ansible_collections/community/general/plugins/modules/consul_policy.py index f020622a0..2ed6021b0 100644 --- a/ansible_collections/community/general/plugins/modules/consul_policy.py +++ b/ansible_collections/community/general/plugins/modules/consul_policy.py @@ -33,6 +33,8 @@ attributes: version_added: 8.3.0 details: - In check mode the diff will miss operational attributes. + action_group: + version_added: 8.3.0 options: state: description: diff --git a/ansible_collections/community/general/plugins/modules/consul_role.py b/ansible_collections/community/general/plugins/modules/consul_role.py index 0da71507a..e07e2036f 100644 --- a/ansible_collections/community/general/plugins/modules/consul_role.py +++ b/ansible_collections/community/general/plugins/modules/consul_role.py @@ -32,6 +32,8 @@ attributes: details: - In check mode the diff will miss operational attributes. version_added: 8.3.0 + action_group: + version_added: 8.3.0 options: name: description: diff --git a/ansible_collections/community/general/plugins/modules/consul_session.py b/ansible_collections/community/general/plugins/modules/consul_session.py index bd03b561a..87a5f1914 100644 --- a/ansible_collections/community/general/plugins/modules/consul_session.py +++ b/ansible_collections/community/general/plugins/modules/consul_session.py @@ -29,6 +29,8 @@ attributes: support: none diff_mode: support: none + action_group: + version_added: 8.3.0 options: id: description: diff --git a/ansible_collections/community/general/plugins/modules/consul_token.py b/ansible_collections/community/general/plugins/modules/consul_token.py index eee419863..02bc544da 100644 --- a/ansible_collections/community/general/plugins/modules/consul_token.py +++ b/ansible_collections/community/general/plugins/modules/consul_token.py @@ -31,6 +31,8 @@ attributes: support: partial details: - In check mode the diff will miss operational attributes. + action_group: + version_added: 8.3.0 options: state: description: diff --git a/ansible_collections/community/general/plugins/modules/cpanm.py b/ansible_collections/community/general/plugins/modules/cpanm.py index 20ac3e714..3beae895d 100644 --- a/ansible_collections/community/general/plugins/modules/cpanm.py +++ b/ansible_collections/community/general/plugins/modules/cpanm.py @@ -68,9 +68,10 @@ options: mode: description: - Controls the module behavior. See notes below for more details. - - Default is V(compatibility) but that behavior is deprecated and will be changed to V(new) in community.general 9.0.0. + - The default changed from V(compatibility) to V(new) in community.general 9.0.0. type: str choices: [compatibility, new] + default: new version_added: 3.0.0 name_check: description: @@ -80,12 +81,16 @@ options: notes: - Please note that U(http://search.cpan.org/dist/App-cpanminus/bin/cpanm, cpanm) must be installed on the remote host. - "This module now comes with a choice of execution O(mode): V(compatibility) or V(new)." - - "O(mode=compatibility): When using V(compatibility) mode, the module will keep backward compatibility. This is the default mode. + - > + O(mode=compatibility): When using V(compatibility) mode, the module will keep backward compatibility. + This was the default mode before community.general 9.0.0. O(name) must be either a module name or a distribution file. If the perl module given by O(name) is installed (at the exact O(version) when specified), then nothing happens. Otherwise, it will be installed using the C(cpanm) executable. O(name) cannot be an URL, or a git URL. - C(cpanm) version specifiers do not work in this mode." - - "O(mode=new): When using V(new) mode, the module will behave differently. The O(name) parameter may refer to a module name, a distribution file, - a HTTP URL or a git repository URL as described in C(cpanminus) documentation. C(cpanm) version specifiers are recognized." + C(cpanm) version specifiers do not work in this mode. + - > + O(mode=new): When using V(new) mode, the module will behave differently. The O(name) parameter may refer to a module name, a distribution file, + a HTTP URL or a git repository URL as described in C(cpanminus) documentation. C(cpanm) version specifiers are recognized. + This is the default mode from community.general 9.0.0 onwards. author: - "Franck Cuny (@fcuny)" - "Alexei Znamensky (@russoz)" @@ -150,7 +155,7 @@ class CPANMinus(ModuleHelper): mirror_only=dict(type='bool', default=False), installdeps=dict(type='bool', default=False), executable=dict(type='path'), - mode=dict(type='str', choices=['compatibility', 'new']), + mode=dict(type='str', default='new', choices=['compatibility', 'new']), name_check=dict(type='str') ), required_one_of=[('name', 'from_path')], @@ -165,17 +170,10 @@ class CPANMinus(ModuleHelper): installdeps=cmd_runner_fmt.as_bool("--installdeps"), pkg_spec=cmd_runner_fmt.as_list(), ) + use_old_vardict = False def __init_module__(self): v = self.vars - if v.mode is None: - self.deprecate( - "The default value 'compatibility' for parameter 'mode' is being deprecated " - "and it will be replaced by 'new'", - version="9.0.0", - collection_name="community.general" - ) - v.mode = "compatibility" if v.mode == "compatibility": if v.name_check: self.do_raise("Parameter name_check can only be used with mode=new") diff --git a/ansible_collections/community/general/plugins/modules/django_command.py b/ansible_collections/community/general/plugins/modules/django_command.py new file mode 100644 index 000000000..788f4a100 --- /dev/null +++ b/ansible_collections/community/general/plugins/modules/django_command.py @@ -0,0 +1,83 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# Copyright (c) 2024, Alexei Znamensky <russoz@gmail.com> +# 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 + +DOCUMENTATION = """ +module: django_command +author: + - Alexei Znamensky (@russoz) +short_description: Run Django admin commands +version_added: 9.0.0 +description: + - This module allows the execution of arbitrary Django admin commands. +extends_documentation_fragment: + - community.general.attributes + - community.general.django +attributes: + check_mode: + support: none + diff_mode: + support: none +options: + command: + description: + - Django admin command. It must be a valid command accepted by C(python -m django) at the target system. + type: str + required: true + extra_args: + type: list + elements: str + description: + - List of extra arguments passed to the django admin command. +""" + +EXAMPLES = """ +- name: Check the project + community.general.django_command: + command: check + settings: myproject.settings + +- name: Check the project in specified python path, using virtual environment + community.general.django_command: + command: check + settings: fancysite.settings + pythonpath: /home/joedoe/project/fancysite + venv: /home/joedoe/project/fancysite/venv +""" + +RETURN = """ +run_info: + description: Command-line execution information. + type: dict + returned: success and O(verbosity) >= 3 +""" + +from ansible_collections.community.general.plugins.module_utils.django import DjangoModuleHelper +from ansible_collections.community.general.plugins.module_utils.cmd_runner import cmd_runner_fmt + + +class DjangoCommand(DjangoModuleHelper): + module = dict( + argument_spec=dict( + command=dict(type="str", required=True), + extra_args=dict(type="list", elements="str"), + ), + supports_check_mode=False, + ) + arg_formats = dict( + extra_args=cmd_runner_fmt.as_list(), + ) + django_admin_arg_order = "extra_args" + + +def main(): + DjangoCommand.execute() + + +if __name__ == '__main__': + main() diff --git a/ansible_collections/community/general/plugins/modules/django_manage.py b/ansible_collections/community/general/plugins/modules/django_manage.py index 114ec0353..352bfe4b5 100644 --- a/ansible_collections/community/general/plugins/modules/django_manage.py +++ b/ansible_collections/community/general/plugins/modules/django_manage.py @@ -28,23 +28,16 @@ options: command: description: - The name of the Django management command to run. The commands listed below are built in this module and have some basic parameter validation. - - > - V(cleanup) - clean up old data from the database (deprecated in Django 1.5). This parameter will be - removed in community.general 9.0.0. Use V(clearsessions) instead. - V(collectstatic) - Collects the static files into C(STATIC_ROOT). - V(createcachetable) - Creates the cache tables for use with the database cache backend. - V(flush) - Removes all data from the database. - V(loaddata) - Searches for and loads the contents of the named O(fixtures) into the database. - V(migrate) - Synchronizes the database state with models and migrations. - - > - V(syncdb) - Synchronizes the database state with models and migrations (deprecated in Django 1.7). - This parameter will be removed in community.general 9.0.0. Use V(migrate) instead. - V(test) - Runs tests for all installed apps. - - > - V(validate) - Validates all installed models (deprecated in Django 1.7). This parameter will be - removed in community.general 9.0.0. Use V(check) instead. - - Other commands can be entered, but will fail if they are unknown to Django. Other commands that may + - Other commands can be entered, but will fail if they are unknown to Django. Other commands that may prompt for user input should be run with the C(--noinput) flag. + - Support for the values V(cleanup), V(syncdb), V(validate) was removed in community.general 9.0.0. + See note about supported versions of Django. type: str required: true project_path: @@ -69,6 +62,7 @@ options: virtualenv: description: - An optional path to a C(virtualenv) installation to use while running the manage application. + - The virtual environment must exist, otherwise the module will fail. type: path aliases: [virtual_env] apps: @@ -132,31 +126,24 @@ options: aliases: [test_runner] ack_venv_creation_deprecation: description: - - >- - When a O(virtualenv) is set but the virtual environment does not exist, the current behavior is - to create a new virtual environment. That behavior is deprecated and if that case happens it will - generate a deprecation warning. Set this flag to V(true) to suppress the deprecation warning. - - Please note that you will receive no further warning about this being removed until the module - will start failing in such cases from community.general 9.0.0 on. + - This option no longer has any effect since community.general 9.0.0. + - It will be removed from community.general 11.0.0. type: bool version_added: 5.8.0 notes: - > - B(ATTENTION - DEPRECATION): Support for Django releases older than 4.1 will be removed in - community.general version 9.0.0 (estimated to be released in May 2024). - Please notice that Django 4.1 requires Python 3.8 or greater. - - C(virtualenv) (U(http://www.virtualenv.org)) must be installed on the remote host if the O(virtualenv) parameter - is specified. This requirement is deprecated and will be removed in community.general version 9.0.0. - - This module will create a virtualenv if the O(virtualenv) parameter is specified and a virtual environment does not already - exist at the given location. This behavior is deprecated and will be removed in community.general version 9.0.0. - - The parameter O(virtualenv) will remain in use, but it will require the specified virtualenv to exist. - The recommended way to create one in Ansible is by using M(ansible.builtin.pip). + B(ATTENTION): Support for Django releases older than 4.1 has been removed in + community.general version 9.0.0. While the module allows for free-form commands + does not verify the version of Django being used, it is B(strongly recommended) + to use a more recent version of Django. + - Please notice that Django 4.1 requires Python 3.8 or greater. + - This module will not create a virtualenv if the O(virtualenv) parameter is specified and a virtual environment + does not already exist at the given location. This behavior changed in community.general version 9.0.0. + - The recommended way to create a virtual environment in Ansible is by using M(ansible.builtin.pip). - This module assumes English error messages for the V(createcachetable) command to detect table existence, unfortunately. - - To be able to use the V(migrate) command with django versions < 1.7, you must have C(south) installed and added - as an app in your settings. - - To be able to use the V(collectstatic) command, you must have enabled staticfiles in your settings. + - To be able to use the V(collectstatic) command, you must have enabled C(staticfiles) in your settings. - Your C(manage.py) application must be executable (C(rwxr-xr-x)), and must have a valid shebang, for example C(#!/usr/bin/env python), for invoking the appropriate Python interpreter. seealso: @@ -169,7 +156,7 @@ seealso: - name: What Python version can I use with Django? description: From the Django FAQ, the response to Python requirements for the framework. link: https://docs.djangoproject.com/en/dev/faq/install/#what-python-version-can-i-use-with-django -requirements: [ "virtualenv", "django" ] +requirements: [ "django >= 4.1" ] author: - Alexei Znamensky (@russoz) - Scott Anderson (@tastychutney) @@ -178,7 +165,7 @@ author: EXAMPLES = """ - name: Run cleanup on the application installed in django_dir community.general.django_manage: - command: cleanup + command: clearsessions project_path: "{{ django_dir }}" - name: Load the initial_data fixture into the application @@ -189,7 +176,7 @@ EXAMPLES = """ - name: Run syncdb on the application community.general.django_manage: - command: syncdb + command: migrate project_path: "{{ django_dir }}" settings: "{{ settings_app_name }}" pythonpath: "{{ settings_dir }}" @@ -233,22 +220,7 @@ def _ensure_virtualenv(module): activate = os.path.join(vbin, 'activate') if not os.path.exists(activate): - # In version 9.0.0, if the venv is not found, it should fail_json() here. - if not module.params['ack_venv_creation_deprecation']: - module.deprecate( - 'The behavior of "creating the virtual environment when missing" is being ' - 'deprecated and will be removed in community.general version 9.0.0. ' - 'Set the module parameter `ack_venv_creation_deprecation: true` to ' - 'prevent this message from showing up when creating a virtualenv.', - version='9.0.0', - collection_name='community.general', - ) - - virtualenv = module.get_bin_path('virtualenv', True) - vcmd = [virtualenv, venv_param] - rc, out_venv, err_venv = module.run_command(vcmd) - if rc != 0: - _fail(module, vcmd, out_venv, err_venv) + module.fail_json(msg='%s does not point to a valid virtual environment' % venv_param) os.environ["PATH"] = "%s:%s" % (vbin, os.environ["PATH"]) os.environ["VIRTUAL_ENV"] = venv_param @@ -266,11 +238,6 @@ def loaddata_filter_output(line): return "Installed" in line and "Installed 0 object" not in line -def syncdb_filter_output(line): - return ("Creating table " in line) \ - or ("Installed" in line and "Installed 0 object" not in line) - - def migrate_filter_output(line): return ("Migrating forwards " in line) \ or ("Installed" in line and "Installed 0 object" not in line) \ @@ -283,13 +250,10 @@ def collectstatic_filter_output(line): def main(): command_allowed_param_map = dict( - cleanup=(), createcachetable=('cache_table', 'database', ), flush=('database', ), loaddata=('database', 'fixtures', ), - syncdb=('database', ), test=('failfast', 'testrunner', 'apps', ), - validate=(), migrate=('apps', 'skip', 'merge', 'database',), collectstatic=('clear', 'link', ), ) @@ -301,7 +265,6 @@ def main(): # forces --noinput on every command that needs it noinput_commands = ( 'flush', - 'syncdb', 'migrate', 'test', 'collectstatic', @@ -333,7 +296,7 @@ def main(): skip=dict(type='bool'), merge=dict(type='bool'), link=dict(type='bool'), - ack_venv_creation_deprecation=dict(type='bool'), + ack_venv_creation_deprecation=dict(type='bool', removed_in_version='11.0.0', removed_from_collection='community.general'), ), ) @@ -342,21 +305,6 @@ def main(): project_path = module.params['project_path'] virtualenv = module.params['virtualenv'] - try: - _deprecation = dict( - cleanup="clearsessions", - syncdb="migrate", - validate="check", - ) - module.deprecate( - 'The command {0} has been deprecated as it is no longer supported in recent Django versions.' - 'Please use the command {1} instead that provide similar capability.'.format(command_bin, _deprecation[command_bin]), - version='9.0.0', - collection_name='community.general' - ) - except KeyError: - pass - for param in specific_params: value = module.params[param] if value and param not in command_allowed_param_map[command_bin]: diff --git a/ansible_collections/community/general/plugins/modules/flowdock.py b/ansible_collections/community/general/plugins/modules/flowdock.py deleted file mode 100644 index 0e8a7461d..000000000 --- a/ansible_collections/community/general/plugins/modules/flowdock.py +++ /dev/null @@ -1,211 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Copyright 2013 Matt Coddington <coddington@gmail.com> -# 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 - - -DOCUMENTATION = ''' ---- - -deprecated: - removed_in: 9.0.0 - why: the endpoints this module relies on do not exist any more and do not resolve to IPs in DNS. - alternative: no known alternative at this point - -module: flowdock -author: "Matt Coddington (@mcodd)" -short_description: Send a message to a flowdock -description: - - Send a message to a flowdock team inbox or chat using the push API (see https://www.flowdock.com/api/team-inbox and https://www.flowdock.com/api/chat) -extends_documentation_fragment: - - community.general.attributes -attributes: - check_mode: - support: full - diff_mode: - support: none -options: - token: - type: str - description: - - API token. - required: true - type: - type: str - description: - - Whether to post to 'inbox' or 'chat' - required: true - choices: [ "inbox", "chat" ] - msg: - type: str - description: - - Content of the message - required: true - tags: - type: str - description: - - tags of the message, separated by commas - required: false - external_user_name: - type: str - description: - - (chat only - required) Name of the "user" sending the message - required: false - from_address: - type: str - description: - - (inbox only - required) Email address of the message sender - required: false - source: - type: str - description: - - (inbox only - required) Human readable identifier of the application that uses the Flowdock API - required: false - subject: - type: str - description: - - (inbox only - required) Subject line of the message - required: false - from_name: - type: str - description: - - (inbox only) Name of the message sender - required: false - reply_to: - type: str - description: - - (inbox only) Email address for replies - required: false - project: - type: str - description: - - (inbox only) Human readable identifier for more detailed message categorization - required: false - link: - type: str - description: - - (inbox only) Link associated with the message. This will be used to link the message subject in Team Inbox. - required: false - validate_certs: - description: - - If V(false), SSL certificates will not be validated. This should only be used - on personally controlled sites using self-signed certificates. - required: false - default: true - type: bool - -requirements: [ ] -''' - -EXAMPLES = ''' -- name: Send a message to a flowdock - community.general.flowdock: - type: inbox - token: AAAAAA - from_address: user@example.com - source: my cool app - msg: test from ansible - subject: test subject - -- name: Send a message to a flowdock - community.general.flowdock: - type: chat - token: AAAAAA - external_user_name: testuser - msg: test from ansible - tags: tag1,tag2,tag3 -''' - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.six.moves.urllib.parse import urlencode -from ansible.module_utils.urls import fetch_url - - -# =========================================== -# Module execution. -# - -def main(): - - module = AnsibleModule( - argument_spec=dict( - token=dict(required=True, no_log=True), - msg=dict(required=True), - type=dict(required=True, choices=["inbox", "chat"]), - external_user_name=dict(required=False), - from_address=dict(required=False), - source=dict(required=False), - subject=dict(required=False), - from_name=dict(required=False), - reply_to=dict(required=False), - project=dict(required=False), - tags=dict(required=False), - link=dict(required=False), - validate_certs=dict(default=True, type='bool'), - ), - supports_check_mode=True - ) - - type = module.params["type"] - token = module.params["token"] - if type == 'inbox': - url = "https://api.flowdock.com/v1/messages/team_inbox/%s" % (token) - else: - url = "https://api.flowdock.com/v1/messages/chat/%s" % (token) - - params = {} - - # required params - params['content'] = module.params["msg"] - - # required params for the 'chat' type - if module.params['external_user_name']: - if type == 'inbox': - module.fail_json(msg="external_user_name is not valid for the 'inbox' type") - else: - params['external_user_name'] = module.params["external_user_name"] - elif type == 'chat': - module.fail_json(msg="external_user_name is required for the 'chat' type") - - # required params for the 'inbox' type - for item in ['from_address', 'source', 'subject']: - if module.params[item]: - if type == 'chat': - module.fail_json(msg="%s is not valid for the 'chat' type" % item) - else: - params[item] = module.params[item] - elif type == 'inbox': - module.fail_json(msg="%s is required for the 'inbox' type" % item) - - # optional params - if module.params["tags"]: - params['tags'] = module.params["tags"] - - # optional params for the 'inbox' type - for item in ['from_name', 'reply_to', 'project', 'link']: - if module.params[item]: - if type == 'chat': - module.fail_json(msg="%s is not valid for the 'chat' type" % item) - else: - params[item] = module.params[item] - - # If we're in check mode, just exit pretending like we succeeded - if module.check_mode: - module.exit_json(changed=False) - - # Send the data to Flowdock - data = urlencode(params) - response, info = fetch_url(module, url, data=data) - if info['status'] != 200: - module.fail_json(msg="unable to send msg: %s" % info['msg']) - - module.exit_json(changed=True, msg=module.params["msg"]) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/gandi_livedns.py b/ansible_collections/community/general/plugins/modules/gandi_livedns.py index fdb7993a5..ad2e96fd1 100644 --- a/ansible_collections/community/general/plugins/modules/gandi_livedns.py +++ b/ansible_collections/community/general/plugins/modules/gandi_livedns.py @@ -25,11 +25,19 @@ attributes: diff_mode: support: none options: + personal_access_token: + description: + - Scoped API token. + - One of O(personal_access_token) and O(api_key) must be specified. + type: str + version_added: 9.0.0 api_key: description: - Account API token. + - Note that these type of keys are deprecated and might stop working at some point. + Use personal access tokens instead. + - One of O(personal_access_token) and O(api_key) must be specified. type: str - required: true record: description: - Record to add. @@ -73,7 +81,7 @@ EXAMPLES = r''' values: - 127.0.0.1 ttl: 7200 - api_key: dummyapitoken + personal_access_token: dummytoken register: record - name: Create a mail CNAME record to www.my.com domain @@ -84,7 +92,7 @@ EXAMPLES = r''' values: - www ttl: 7200 - api_key: dummyapitoken + personal_access_token: dummytoken state: present - name: Change its TTL @@ -95,7 +103,7 @@ EXAMPLES = r''' values: - www ttl: 10800 - api_key: dummyapitoken + personal_access_token: dummytoken state: present - name: Delete the record @@ -103,8 +111,18 @@ EXAMPLES = r''' domain: my.com type: CNAME record: mail - api_key: dummyapitoken + personal_access_token: dummytoken state: absent + +- name: Use a (deprecated) API Key + community.general.gandi_livedns: + domain: my.com + record: test + type: A + values: + - 127.0.0.1 + ttl: 7200 + api_key: dummyapikey ''' RETURN = r''' @@ -151,7 +169,8 @@ from ansible_collections.community.general.plugins.module_utils.gandi_livedns_ap def main(): module = AnsibleModule( argument_spec=dict( - api_key=dict(type='str', required=True, no_log=True), + api_key=dict(type='str', no_log=True), + personal_access_token=dict(type='str', no_log=True), record=dict(type='str', required=True), state=dict(type='str', default='present', choices=['absent', 'present']), ttl=dict(type='int'), @@ -163,6 +182,12 @@ def main(): required_if=[ ('state', 'present', ['values', 'ttl']), ], + mutually_exclusive=[ + ('api_key', 'personal_access_token'), + ], + required_one_of=[ + ('api_key', 'personal_access_token'), + ], ) gandi_api = GandiLiveDNSAPI(module) diff --git a/ansible_collections/community/general/plugins/modules/gconftool2.py b/ansible_collections/community/general/plugins/modules/gconftool2.py index a40304a16..db7c6dc88 100644 --- a/ansible_collections/community/general/plugins/modules/gconftool2.py +++ b/ansible_collections/community/general/plugins/modules/gconftool2.py @@ -123,6 +123,7 @@ class GConftool(StateModuleHelper): ], supports_check_mode=True, ) + use_old_vardict = False def __init_module__(self): self.runner = gconftool2_runner(self.module, check_rc=True) diff --git a/ansible_collections/community/general/plugins/modules/gconftool2_info.py b/ansible_collections/community/general/plugins/modules/gconftool2_info.py index 282065b95..f66e2da8f 100644 --- a/ansible_collections/community/general/plugins/modules/gconftool2_info.py +++ b/ansible_collections/community/general/plugins/modules/gconftool2_info.py @@ -60,6 +60,7 @@ class GConftoolInfo(ModuleHelper): ), supports_check_mode=True, ) + use_old_vardict = False def __init_module__(self): self.runner = gconftool2_runner(self.module, check_rc=True) diff --git a/ansible_collections/community/general/plugins/modules/gitlab_runner.py b/ansible_collections/community/general/plugins/modules/gitlab_runner.py index e6163a6b6..96b3eb3fa 100644 --- a/ansible_collections/community/general/plugins/modules/gitlab_runner.py +++ b/ansible_collections/community/general/plugins/modules/gitlab_runner.py @@ -15,17 +15,20 @@ DOCUMENTATION = ''' module: gitlab_runner short_description: Create, modify and delete GitLab Runners description: - - Register, update and delete runners with the GitLab API. + - Register, update and delete runners on GitLab Server side with the GitLab API. - All operations are performed using the GitLab API v4. - - For details, consult the full API documentation at U(https://docs.gitlab.com/ee/api/runners.html). + - For details, consult the full API documentation at U(https://docs.gitlab.com/ee/api/runners.html) + and U(https://docs.gitlab.com/ee/api/users.html#create-a-runner-linked-to-a-user). - A valid private API token is required for all operations. You can create as many tokens as you like using the GitLab web interface at U(https://$GITLAB_URL/profile/personal_access_tokens). - A valid registration token is required for registering a new runner. To create shared runners, you need to ask your administrator to give you this token. It can be found at U(https://$GITLAB_URL/admin/runners/). + - This module does not handle the C(gitlab-runner) process part, but only manages the runner on GitLab Server side through its API. + Once the module has created the runner, you may use the generated token to run C(gitlab-runner register) command notes: - To create a new runner at least the O(api_token), O(description) and O(api_url) options are required. - - Runners need to have unique descriptions. + - Runners need to have unique descriptions, since this attribute is used as key for idempotency author: - Samy Coenen (@SamyCoenen) - Guillaume Martinez (@Lunik) @@ -153,7 +156,45 @@ options: ''' EXAMPLES = ''' -- name: "Register runner" +- name: Create an instance-level runner + community.general.gitlab_runner: + api_url: https://gitlab.example.com/ + api_token: "{{ access_token }}" + description: Docker Machine t1 + state: present + active: true + tag_list: ['docker'] + run_untagged: false + locked: false + register: runner # Register module output to run C(gitlab-runner register) command in another task + +- name: Create a group-level runner + community.general.gitlab_runner: + api_url: https://gitlab.example.com/ + api_token: "{{ access_token }}" + description: Docker Machine t1 + state: present + active: true + tag_list: ['docker'] + run_untagged: false + locked: false + group: top-level-group/subgroup + register: runner # Register module output to run C(gitlab-runner register) command in another task + +- name: Create a project-level runner + community.general.gitlab_runner: + api_url: https://gitlab.example.com/ + api_token: "{{ access_token }}" + description: Docker Machine t1 + state: present + active: true + tag_list: ['docker'] + run_untagged: false + locked: false + project: top-level-group/subgroup/project + register: runner # Register module output to run C(gitlab-runner register) command in another task + +- name: "Register instance-level runner with registration token (deprecated)" community.general.gitlab_runner: api_url: https://gitlab.example.com/ api_token: "{{ access_token }}" @@ -164,6 +205,7 @@ EXAMPLES = ''' tag_list: ['docker'] run_untagged: false locked: false + register: runner # Register module output to run C(gitlab-runner register) command in another task - name: "Delete runner" community.general.gitlab_runner: @@ -180,7 +222,7 @@ EXAMPLES = ''' owned: true state: absent -- name: Register runner for a specific project +- name: "Register a project-level runner with registration token (deprecated)" community.general.gitlab_runner: api_url: https://gitlab.example.com/ api_token: "{{ access_token }}" @@ -188,6 +230,7 @@ EXAMPLES = ''' description: MyProject runner state: present project: mygroup/mysubgroup/myproject + register: runner # Register module output to run C(gitlab-runner register) command in another task ''' RETURN = ''' diff --git a/ansible_collections/community/general/plugins/modules/homebrew.py b/ansible_collections/community/general/plugins/modules/homebrew.py index 5d471797a..2b60846b4 100644 --- a/ansible_collections/community/general/plugins/modules/homebrew.py +++ b/ansible_collections/community/general/plugins/modules/homebrew.py @@ -76,6 +76,13 @@ options: type: list elements: str version_added: '0.2.0' + force_formula: + description: + - Force the package(s) to be treated as a formula (equivalent to C(brew --formula)). + - To install a cask, use the M(community.general.homebrew_cask) module. + type: bool + default: false + version_added: 9.0.0 notes: - When used with a C(loop:) each package will be processed individually, it is much more efficient to pass the list directly to the O(name) option. @@ -141,6 +148,12 @@ EXAMPLES = ''' community.general.homebrew: upgrade_all: true upgrade_options: ignore-pinned + +- name: Force installing a formula whose name is also a cask name + community.general.homebrew: + name: ambiguous_formula + state: present + force_formula: true ''' RETURN = ''' @@ -166,9 +179,10 @@ changed_pkgs: ''' import json -import os.path import re +from ansible_collections.community.general.plugins.module_utils.homebrew import HomebrewValidate + from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.six import iteritems, string_types @@ -195,99 +209,8 @@ def _check_package_in_json(json_output, package_type): class Homebrew(object): '''A class to manage Homebrew packages.''' - # class regexes ------------------------------------------------ {{{ - VALID_PATH_CHARS = r''' - \w # alphanumeric characters (i.e., [a-zA-Z0-9_]) - \s # spaces - : # colons - {sep} # the OS-specific path separator - . # dots - \- # dashes - '''.format(sep=os.path.sep) - - VALID_BREW_PATH_CHARS = r''' - \w # alphanumeric characters (i.e., [a-zA-Z0-9_]) - \s # spaces - {sep} # the OS-specific path separator - . # dots - \- # dashes - '''.format(sep=os.path.sep) - - VALID_PACKAGE_CHARS = r''' - \w # alphanumeric characters (i.e., [a-zA-Z0-9_]) - . # dots - / # slash (for taps) - \+ # plusses - \- # dashes - : # colons (for URLs) - @ # at-sign - ''' - - INVALID_PATH_REGEX = _create_regex_group_complement(VALID_PATH_CHARS) - INVALID_BREW_PATH_REGEX = _create_regex_group_complement(VALID_BREW_PATH_CHARS) - INVALID_PACKAGE_REGEX = _create_regex_group_complement(VALID_PACKAGE_CHARS) - # /class regexes ----------------------------------------------- }}} - # class validations -------------------------------------------- {{{ @classmethod - def valid_path(cls, path): - ''' - `path` must be one of: - - list of paths - - a string containing only: - - alphanumeric characters - - dashes - - dots - - spaces - - colons - - os.path.sep - ''' - - if isinstance(path, string_types): - return not cls.INVALID_PATH_REGEX.search(path) - - try: - iter(path) - except TypeError: - return False - else: - paths = path - return all(cls.valid_brew_path(path_) for path_ in paths) - - @classmethod - def valid_brew_path(cls, brew_path): - ''' - `brew_path` must be one of: - - None - - a string containing only: - - alphanumeric characters - - dashes - - dots - - spaces - - os.path.sep - ''' - - if brew_path is None: - return True - - return ( - isinstance(brew_path, string_types) - and not cls.INVALID_BREW_PATH_REGEX.search(brew_path) - ) - - @classmethod - def valid_package(cls, package): - '''A valid package is either None or alphanumeric.''' - - if package is None: - return True - - return ( - isinstance(package, string_types) - and not cls.INVALID_PACKAGE_REGEX.search(package) - ) - - @classmethod def valid_state(cls, state): ''' A valid state is one of: @@ -346,7 +269,7 @@ class Homebrew(object): @path.setter def path(self, path): - if not self.valid_path(path): + if not HomebrewValidate.valid_path(path): self._path = [] self.failed = True self.message = 'Invalid path: {0}.'.format(path) @@ -366,7 +289,7 @@ class Homebrew(object): @brew_path.setter def brew_path(self, brew_path): - if not self.valid_brew_path(brew_path): + if not HomebrewValidate.valid_brew_path(brew_path): self._brew_path = None self.failed = True self.message = 'Invalid brew_path: {0}.'.format(brew_path) @@ -391,7 +314,7 @@ class Homebrew(object): @current_package.setter def current_package(self, package): - if not self.valid_package(package): + if not HomebrewValidate.valid_package(package): self._current_package = None self.failed = True self.message = 'Invalid package: {0}.'.format(package) @@ -404,7 +327,8 @@ class Homebrew(object): def __init__(self, module, path, packages=None, state=None, update_homebrew=False, upgrade_all=False, - install_options=None, upgrade_options=None): + install_options=None, upgrade_options=None, + force_formula=False): if not install_options: install_options = list() if not upgrade_options: @@ -414,7 +338,8 @@ class Homebrew(object): state=state, update_homebrew=update_homebrew, upgrade_all=upgrade_all, install_options=install_options, - upgrade_options=upgrade_options,) + upgrade_options=upgrade_options, + force_formula=force_formula) self._prep() @@ -476,7 +401,7 @@ class Homebrew(object): # checks ------------------------------------------------------- {{{ def _current_package_is_installed(self): - if not self.valid_package(self.current_package): + if not HomebrewValidate.valid_package(self.current_package): self.failed = True self.message = 'Invalid package: {0}.'.format(self.current_package) raise HomebrewException(self.message) @@ -487,17 +412,19 @@ class Homebrew(object): "--json=v2", self.current_package, ] + if self.force_formula: + cmd.append("--formula") rc, out, err = self.module.run_command(cmd) - if err: + if rc != 0: self.failed = True - self.message = err.strip() + self.message = err.strip() or ("Unknown failure with exit code %d" % rc) raise HomebrewException(self.message) data = json.loads(out) return _check_package_in_json(data, "formulae") or _check_package_in_json(data, "casks") def _current_package_is_outdated(self): - if not self.valid_package(self.current_package): + if not HomebrewValidate.valid_package(self.current_package): return False rc, out, err = self.module.run_command([ @@ -509,7 +436,7 @@ class Homebrew(object): return rc != 0 def _current_package_is_installed_from_head(self): - if not Homebrew.valid_package(self.current_package): + if not HomebrewValidate.valid_package(self.current_package): return False elif not self._current_package_is_installed(): return False @@ -607,7 +534,7 @@ class Homebrew(object): # installed ------------------------------ {{{ def _install_current_package(self): - if not self.valid_package(self.current_package): + if not HomebrewValidate.valid_package(self.current_package): self.failed = True self.message = 'Invalid package: {0}.'.format(self.current_package) raise HomebrewException(self.message) @@ -632,10 +559,15 @@ class Homebrew(object): else: head = None + if self.force_formula: + formula = '--formula' + else: + formula = None + opts = ( [self.brew_path, 'install'] + self.install_options - + [self.current_package, head] + + [self.current_package, head, formula] ) cmd = [opt for opt in opts if opt] rc, out, err = self.module.run_command(cmd) @@ -663,7 +595,7 @@ class Homebrew(object): def _upgrade_current_package(self): command = 'upgrade' - if not self.valid_package(self.current_package): + if not HomebrewValidate.valid_package(self.current_package): self.failed = True self.message = 'Invalid package: {0}.'.format(self.current_package) raise HomebrewException(self.message) @@ -734,7 +666,7 @@ class Homebrew(object): # uninstalled ---------------------------- {{{ def _uninstall_current_package(self): - if not self.valid_package(self.current_package): + if not HomebrewValidate.valid_package(self.current_package): self.failed = True self.message = 'Invalid package: {0}.'.format(self.current_package) raise HomebrewException(self.message) @@ -783,7 +715,7 @@ class Homebrew(object): # linked --------------------------------- {{{ def _link_current_package(self): - if not self.valid_package(self.current_package): + if not HomebrewValidate.valid_package(self.current_package): self.failed = True self.message = 'Invalid package: {0}.'.format(self.current_package) raise HomebrewException(self.message) @@ -830,7 +762,7 @@ class Homebrew(object): # unlinked ------------------------------- {{{ def _unlink_current_package(self): - if not self.valid_package(self.current_package): + if not HomebrewValidate.valid_package(self.current_package): self.failed = True self.message = 'Invalid package: {0}.'.format(self.current_package) raise HomebrewException(self.message) @@ -919,7 +851,11 @@ def main(): default=None, type='list', elements='str', - ) + ), + force_formula=dict( + default=False, + type='bool', + ), ), supports_check_mode=True, ) @@ -951,6 +887,7 @@ def main(): if state in ('absent', 'removed', 'uninstalled'): state = 'absent' + force_formula = p['force_formula'] update_homebrew = p['update_homebrew'] if not update_homebrew: module.run_command_environ_update.update( @@ -967,7 +904,7 @@ def main(): brew = Homebrew(module=module, path=path, packages=packages, state=state, update_homebrew=update_homebrew, upgrade_all=upgrade_all, install_options=install_options, - upgrade_options=upgrade_options) + upgrade_options=upgrade_options, force_formula=force_formula) (failed, changed, message) = brew.run() changed_pkgs = brew.changed_pkgs unchanged_pkgs = brew.unchanged_pkgs diff --git a/ansible_collections/community/general/plugins/modules/homebrew_cask.py b/ansible_collections/community/general/plugins/modules/homebrew_cask.py index c992693b6..dc9aea5db 100644 --- a/ansible_collections/community/general/plugins/modules/homebrew_cask.py +++ b/ansible_collections/community/general/plugins/modules/homebrew_cask.py @@ -158,6 +158,7 @@ import re import tempfile from ansible_collections.community.general.plugins.module_utils.version import LooseVersion +from ansible_collections.community.general.plugins.module_utils.homebrew import HomebrewValidate from ansible.module_utils.common.text.converters import to_bytes from ansible.module_utils.basic import AnsibleModule @@ -183,23 +184,6 @@ class HomebrewCask(object): '''A class to manage Homebrew casks.''' # class regexes ------------------------------------------------ {{{ - VALID_PATH_CHARS = r''' - \w # alphanumeric characters (i.e., [a-zA-Z0-9_]) - \s # spaces - : # colons - {sep} # the OS-specific path separator - . # dots - \- # dashes - '''.format(sep=os.path.sep) - - VALID_BREW_PATH_CHARS = r''' - \w # alphanumeric characters (i.e., [a-zA-Z0-9_]) - \s # spaces - {sep} # the OS-specific path separator - . # dots - \- # dashes - '''.format(sep=os.path.sep) - VALID_CASK_CHARS = r''' \w # alphanumeric characters (i.e., [a-zA-Z0-9_]) . # dots @@ -208,59 +192,11 @@ class HomebrewCask(object): @ # at symbol ''' - INVALID_PATH_REGEX = _create_regex_group_complement(VALID_PATH_CHARS) - INVALID_BREW_PATH_REGEX = _create_regex_group_complement(VALID_BREW_PATH_CHARS) INVALID_CASK_REGEX = _create_regex_group_complement(VALID_CASK_CHARS) # /class regexes ----------------------------------------------- }}} # class validations -------------------------------------------- {{{ @classmethod - def valid_path(cls, path): - ''' - `path` must be one of: - - list of paths - - a string containing only: - - alphanumeric characters - - dashes - - dots - - spaces - - colons - - os.path.sep - ''' - - if isinstance(path, (string_types)): - return not cls.INVALID_PATH_REGEX.search(path) - - try: - iter(path) - except TypeError: - return False - else: - paths = path - return all(cls.valid_brew_path(path_) for path_ in paths) - - @classmethod - def valid_brew_path(cls, brew_path): - ''' - `brew_path` must be one of: - - None - - a string containing only: - - alphanumeric characters - - dashes - - dots - - spaces - - os.path.sep - ''' - - if brew_path is None: - return True - - return ( - isinstance(brew_path, string_types) - and not cls.INVALID_BREW_PATH_REGEX.search(brew_path) - ) - - @classmethod def valid_cask(cls, cask): '''A valid cask is either None or alphanumeric + backslashes.''' @@ -321,7 +257,7 @@ class HomebrewCask(object): @path.setter def path(self, path): - if not self.valid_path(path): + if not HomebrewValidate.valid_path(path): self._path = [] self.failed = True self.message = 'Invalid path: {0}.'.format(path) @@ -341,7 +277,7 @@ class HomebrewCask(object): @brew_path.setter def brew_path(self, brew_path): - if not self.valid_brew_path(brew_path): + if not HomebrewValidate.valid_brew_path(brew_path): self._brew_path = None self.failed = True self.message = 'Invalid brew_path: {0}.'.format(brew_path) diff --git a/ansible_collections/community/general/plugins/modules/hponcfg.py b/ansible_collections/community/general/plugins/modules/hponcfg.py index 612a20d92..206565a23 100644 --- a/ansible_collections/community/general/plugins/modules/hponcfg.py +++ b/ansible_collections/community/general/plugins/modules/hponcfg.py @@ -98,6 +98,7 @@ class HPOnCfg(ModuleHelper): verbose=cmd_runner_fmt.as_bool("-v"), minfw=cmd_runner_fmt.as_opt_val("-m"), ) + use_old_vardict = False def __run__(self): runner = CmdRunner( diff --git a/ansible_collections/community/general/plugins/modules/installp.py b/ansible_collections/community/general/plugins/modules/installp.py index 4b5a6949c..1531d2cad 100644 --- a/ansible_collections/community/general/plugins/modules/installp.py +++ b/ansible_collections/community/general/plugins/modules/installp.py @@ -106,7 +106,7 @@ def _check_new_pkg(module, package, repository_path): if os.path.isdir(repository_path): installp_cmd = module.get_bin_path('installp', True) - rc, package_result, err = module.run_command("%s -l -MR -d %s" % (installp_cmd, repository_path)) + rc, package_result, err = module.run_command([installp_cmd, "-l", "-MR", "-d", repository_path]) if rc != 0: module.fail_json(msg="Failed to run installp.", rc=rc, err=err) @@ -142,7 +142,7 @@ def _check_installed_pkg(module, package, repository_path): """ lslpp_cmd = module.get_bin_path('lslpp', True) - rc, lslpp_result, err = module.run_command("%s -lcq %s*" % (lslpp_cmd, package)) + rc, lslpp_result, err = module.run_command([lslpp_cmd, "-lcq", "%s*" % (package, )]) if rc == 1: package_state = ' '.join(err.split()[-2:]) @@ -173,7 +173,7 @@ def remove(module, installp_cmd, packages): if pkg_check: if not module.check_mode: - rc, remove_out, err = module.run_command("%s -u %s" % (installp_cmd, package)) + rc, remove_out, err = module.run_command([installp_cmd, "-u", package]) if rc != 0: module.fail_json(msg="Failed to run installp.", rc=rc, err=err) remove_count += 1 @@ -202,8 +202,8 @@ def install(module, installp_cmd, packages, repository_path, accept_license): already_installed_pkgs = {} accept_license_param = { - True: '-Y', - False: '', + True: ['-Y'], + False: [], } # Validate if package exists on repository path. @@ -230,7 +230,8 @@ def install(module, installp_cmd, packages, repository_path, accept_license): else: if not module.check_mode: - rc, out, err = module.run_command("%s -a %s -X -d %s %s" % (installp_cmd, accept_license_param[accept_license], repository_path, package)) + rc, out, err = module.run_command( + [installp_cmd, "-a"] + accept_license_param[accept_license] + ["-X", "-d", repository_path, package]) if rc != 0: module.fail_json(msg="Failed to run installp", rc=rc, err=err) installed_pkgs.append(package) diff --git a/ansible_collections/community/general/plugins/modules/irc.py b/ansible_collections/community/general/plugins/modules/irc.py index 00ff299ee..e40ba2d0b 100644 --- a/ansible_collections/community/general/plugins/modules/irc.py +++ b/ansible_collections/community/general/plugins/modules/irc.py @@ -85,8 +85,10 @@ options: was exlusively called O(use_ssl). The latter is now an alias of O(use_tls). - B(Note:) for security reasons, you should always set O(use_tls=true) and O(validate_certs=true) whenever possible. + - The option currently defaults to V(false). The default has been B(deprecated) and will + change to V(true) in community.general 10.0.0. To avoid deprecation warnings, explicitly + set this option to a value (preferably V(true)). type: bool - default: false aliases: - use_ssl part: @@ -108,7 +110,9 @@ options: if the network between between Ansible and the IRC server is known to be safe. - B(Note:) for security reasons, you should always set O(use_tls=true) and O(validate_certs=true) whenever possible. - default: false + - The option currently defaults to V(false). The default has been B(deprecated) and will + change to V(true) in community.general 10.0.0. To avoid deprecation warnings, explicitly + set this option to a value (preferably V(true)). type: bool version_added: 8.1.0 @@ -309,8 +313,8 @@ def main(): passwd=dict(no_log=True), timeout=dict(type='int', default=30), part=dict(type='bool', default=True), - use_tls=dict(type='bool', default=False, aliases=['use_ssl']), - validate_certs=dict(type='bool', default=False), + use_tls=dict(type='bool', aliases=['use_ssl']), + validate_certs=dict(type='bool'), ), supports_check_mode=True, required_one_of=[['channel', 'nick_to']] @@ -334,6 +338,25 @@ def main(): style = module.params["style"] validate_certs = module.params["validate_certs"] + if use_tls is None: + module.deprecate( + 'The default of use_tls will change to true in community.general 10.0.0.' + ' Set a value now (preferably true, if possible) to avoid the deprecation warning.', + version='10.0.0', + collection_name='community.general', + ) + use_tls = False + + if validate_certs is None: + if use_tls: + module.deprecate( + 'The default of validate_certs will change to true in community.general 10.0.0.' + ' Set a value now (prefarably true, if possible) to avoid the deprecation warning.', + version='10.0.0', + collection_name='community.general', + ) + validate_certs = False + try: send_msg(msg, server, port, channel, nick_to, key, topic, nick, color, passwd, timeout, use_tls, validate_certs, part, style) except Exception as e: diff --git a/ansible_collections/community/general/plugins/modules/kernel_blacklist.py b/ansible_collections/community/general/plugins/modules/kernel_blacklist.py index b5bd90403..224b5bba8 100644 --- a/ansible_collections/community/general/plugins/modules/kernel_blacklist.py +++ b/ansible_collections/community/general/plugins/modules/kernel_blacklist.py @@ -67,6 +67,7 @@ class Blacklist(StateModuleHelper): ), supports_check_mode=True, ) + use_old_vardict = False def __init_module__(self): self.pattern = re.compile(r'^blacklist\s+{0}$'.format(re.escape(self.vars.name))) diff --git a/ansible_collections/community/general/plugins/modules/keycloak_client.py b/ansible_collections/community/general/plugins/modules/keycloak_client.py index cd9c60bac..3628e5a51 100644 --- a/ansible_collections/community/general/plugins/modules/keycloak_client.py +++ b/ansible_collections/community/general/plugins/modules/keycloak_client.py @@ -775,8 +775,9 @@ def sanitize_cr(clientrep): if 'secret' in result: result['secret'] = 'no_log' if 'attributes' in result: - if 'saml.signing.private.key' in result['attributes']: - result['attributes']['saml.signing.private.key'] = 'no_log' + attributes = result['attributes'] + if isinstance(attributes, dict) and 'saml.signing.private.key' in attributes: + attributes['saml.signing.private.key'] = 'no_log' return normalise_cr(result) diff --git a/ansible_collections/community/general/plugins/modules/keycloak_identity_provider.py b/ansible_collections/community/general/plugins/modules/keycloak_identity_provider.py index 588f553e8..2eca3a06d 100644 --- a/ansible_collections/community/general/plugins/modules/keycloak_identity_provider.py +++ b/ansible_collections/community/general/plugins/modules/keycloak_identity_provider.py @@ -437,7 +437,7 @@ def sanitize(idp): idpcopy = deepcopy(idp) if 'config' in idpcopy: if 'clientSecret' in idpcopy['config']: - idpcopy['clientSecret'] = '**********' + idpcopy['config']['clientSecret'] = '**********' return idpcopy diff --git a/ansible_collections/community/general/plugins/modules/keycloak_user_federation.py b/ansible_collections/community/general/plugins/modules/keycloak_user_federation.py index fee0d1265..f87ef936c 100644 --- a/ansible_collections/community/general/plugins/modules/keycloak_user_federation.py +++ b/ansible_collections/community/general/plugins/modules/keycloak_user_federation.py @@ -719,6 +719,9 @@ def sanitize(comp): compcopy['config'] = dict((k, v[0]) for k, v in compcopy['config'].items()) if 'bindCredential' in compcopy['config']: compcopy['config']['bindCredential'] = '**********' + # an empty string is valid for krbPrincipalAttribute but is filtered out in diff + if 'krbPrincipalAttribute' not in compcopy['config']: + compcopy['config']['krbPrincipalAttribute'] = '' if 'mappers' in compcopy: for mapper in compcopy['mappers']: if 'config' in mapper: diff --git a/ansible_collections/community/general/plugins/modules/ldap_search.py b/ansible_collections/community/general/plugins/modules/ldap_search.py index 45744e634..7958f86e0 100644 --- a/ansible_collections/community/general/plugins/modules/ldap_search.py +++ b/ansible_collections/community/general/plugins/modules/ldap_search.py @@ -44,6 +44,8 @@ options: type: str description: - The LDAP scope to use. + - V(subordinate) requires the LDAPv3 subordinate feature extension. + - V(children) is equivalent to a "subtree" scope. filter: default: '(objectClass=*)' type: str diff --git a/ansible_collections/community/general/plugins/modules/locale_gen.py b/ansible_collections/community/general/plugins/modules/locale_gen.py index 0dd76c9ab..fe501e023 100644 --- a/ansible_collections/community/general/plugins/modules/locale_gen.py +++ b/ansible_collections/community/general/plugins/modules/locale_gen.py @@ -79,6 +79,7 @@ class LocaleGen(StateModuleHelper): ), supports_check_mode=True, ) + use_old_vardict = False def __init_module__(self): self.vars.set("ubuntu_mode", False) diff --git a/ansible_collections/community/general/plugins/modules/lvg.py b/ansible_collections/community/general/plugins/modules/lvg.py index 8a6384369..7ff7e3a2e 100644 --- a/ansible_collections/community/general/plugins/modules/lvg.py +++ b/ansible_collections/community/general/plugins/modules/lvg.py @@ -179,7 +179,7 @@ def parse_vgs(data): def find_mapper_device_name(module, dm_device): dmsetup_cmd = module.get_bin_path('dmsetup', True) mapper_prefix = '/dev/mapper/' - rc, dm_name, err = module.run_command("%s info -C --noheadings -o name %s" % (dmsetup_cmd, dm_device)) + rc, dm_name, err = module.run_command([dmsetup_cmd, "info", "-C", "--noheadings", "-o", "name", dm_device]) if rc != 0: module.fail_json(msg="Failed executing dmsetup command.", rc=rc, err=err) mapper_device = mapper_prefix + dm_name.rstrip() @@ -204,7 +204,7 @@ def find_vg(module, vg): if not vg: return None vgs_cmd = module.get_bin_path('vgs', True) - dummy, current_vgs, dummy = module.run_command("%s --noheadings -o vg_name,pv_count,lv_count --separator ';'" % vgs_cmd, check_rc=True) + dummy, current_vgs, dummy = module.run_command([vgs_cmd, "--noheadings", "-o", "vg_name,pv_count,lv_count", "--separator", ";"], check_rc=True) vgs = parse_vgs(current_vgs) @@ -431,10 +431,10 @@ def main(): for x in itertools.chain(dev_list, module.params['pvs']) ) pvs_filter_vg_name = 'vg_name = {0}'.format(vg) - pvs_filter = "--select '{0} || {1}' ".format(pvs_filter_pv_name, pvs_filter_vg_name) + pvs_filter = ["--select", "{0} || {1}".format(pvs_filter_pv_name, pvs_filter_vg_name)] else: - pvs_filter = '' - rc, current_pvs, err = module.run_command("%s --noheadings -o pv_name,vg_name --separator ';' %s" % (pvs_cmd, pvs_filter)) + pvs_filter = [] + rc, current_pvs, err = module.run_command([pvs_cmd, "--noheadings", "-o", "pv_name,vg_name", "--separator", ";"] + pvs_filter) if rc != 0: module.fail_json(msg="Failed executing pvs command.", rc=rc, err=err) @@ -473,7 +473,7 @@ def main(): if this_vg['lv_count'] == 0 or force: # remove VG vgremove_cmd = module.get_bin_path('vgremove', True) - rc, dummy, err = module.run_command("%s --force %s" % (vgremove_cmd, vg)) + rc, dummy, err = module.run_command([vgremove_cmd, "--force", vg]) if rc == 0: module.exit_json(changed=True) else: @@ -509,7 +509,6 @@ def main(): changed = True else: if devs_to_add: - devs_to_add_string = ' '.join(devs_to_add) # create PV pvcreate_cmd = module.get_bin_path('pvcreate', True) for current_dev in devs_to_add: @@ -520,21 +519,20 @@ def main(): module.fail_json(msg="Creating physical volume '%s' failed" % current_dev, rc=rc, err=err) # add PV to our VG vgextend_cmd = module.get_bin_path('vgextend', True) - rc, dummy, err = module.run_command("%s %s %s" % (vgextend_cmd, vg, devs_to_add_string)) + rc, dummy, err = module.run_command([vgextend_cmd, vg] + devs_to_add) if rc == 0: changed = True else: - module.fail_json(msg="Unable to extend %s by %s." % (vg, devs_to_add_string), rc=rc, err=err) + module.fail_json(msg="Unable to extend %s by %s." % (vg, ' '.join(devs_to_add)), rc=rc, err=err) # remove some PV from our VG if devs_to_remove: - devs_to_remove_string = ' '.join(devs_to_remove) vgreduce_cmd = module.get_bin_path('vgreduce', True) - rc, dummy, err = module.run_command("%s --force %s %s" % (vgreduce_cmd, vg, devs_to_remove_string)) + rc, dummy, err = module.run_command([vgreduce_cmd, "--force", vg] + devs_to_remove) if rc == 0: changed = True else: - module.fail_json(msg="Unable to reduce %s by %s." % (vg, devs_to_remove_string), rc=rc, err=err) + module.fail_json(msg="Unable to reduce %s by %s." % (vg, ' '.join(devs_to_remove)), rc=rc, err=err) module.exit_json(changed=changed) diff --git a/ansible_collections/community/general/plugins/modules/lvol.py b/ansible_collections/community/general/plugins/modules/lvol.py index a2a870260..3a2f5c7cd 100644 --- a/ansible_collections/community/general/plugins/modules/lvol.py +++ b/ansible_collections/community/general/plugins/modules/lvol.py @@ -236,6 +236,7 @@ EXAMPLES = ''' ''' import re +import shlex from ansible.module_utils.basic import AnsibleModule @@ -281,7 +282,7 @@ def parse_vgs(data): def get_lvm_version(module): ver_cmd = module.get_bin_path("lvm", required=True) - rc, out, err = module.run_command("%s version" % (ver_cmd)) + rc, out, err = module.run_command([ver_cmd, "version"]) if rc != 0: return None m = re.search(r"LVM version:\s+(\d+)\.(\d+)\.(\d+).*(\d{4}-\d{2}-\d{2})", out) @@ -320,14 +321,14 @@ def main(): module.fail_json(msg="Failed to get LVM version number") version_yesopt = mkversion(2, 2, 99) # First LVM with the "--yes" option if version_found >= version_yesopt: - yesopt = "--yes" + yesopt = ["--yes"] else: - yesopt = "" + yesopt = [] vg = module.params['vg'] lv = module.params['lv'] size = module.params['size'] - opts = module.params['opts'] + opts = shlex.split(module.params['opts'] or '') state = module.params['state'] force = module.boolean(module.params['force']) shrink = module.boolean(module.params['shrink']) @@ -338,21 +339,13 @@ def main(): size_unit = 'm' size_operator = None snapshot = module.params['snapshot'] - pvs = module.params['pvs'] - - if pvs is None: - pvs = "" - else: - pvs = " ".join(pvs) - - if opts is None: - opts = "" + pvs = module.params['pvs'] or [] # Add --test option when running in check-mode if module.check_mode: - test_opt = ' --test' + test_opt = ['--test'] else: - test_opt = '' + test_opt = [] if size: # LVEXTEND(8)/LVREDUCE(8) -l, -L options: Check for relative value for resizing @@ -400,7 +393,7 @@ def main(): # Get information on volume group requested vgs_cmd = module.get_bin_path("vgs", required=True) rc, current_vgs, err = module.run_command( - "%s --noheadings --nosuffix -o vg_name,size,free,vg_extent_size --units %s --separator ';' %s" % (vgs_cmd, unit.lower(), vg)) + [vgs_cmd, "--noheadings", "--nosuffix", "-o", "vg_name,size,free,vg_extent_size", "--units", unit.lower(), "--separator", ";", vg]) if rc != 0: if state == 'absent': @@ -414,7 +407,7 @@ def main(): # Get information on logical volume requested lvs_cmd = module.get_bin_path("lvs", required=True) rc, current_lvs, err = module.run_command( - "%s -a --noheadings --nosuffix -o lv_name,size,lv_attr --units %s --separator ';' %s" % (lvs_cmd, unit.lower(), vg)) + [lvs_cmd, "-a", "--noheadings", "--nosuffix", "-o", "lv_name,size,lv_attr", "--units", unit.lower(), "--separator", ";", vg]) if rc != 0: if state == 'absent': @@ -474,20 +467,23 @@ def main(): # create LV lvcreate_cmd = module.get_bin_path("lvcreate", required=True) + cmd = [lvcreate_cmd] + test_opt + yesopt if snapshot is not None: if size: - cmd = "%s %s %s -%s %s%s -s -n %s %s %s/%s" % (lvcreate_cmd, test_opt, yesopt, size_opt, size, size_unit, snapshot, opts, vg, lv) - else: - cmd = "%s %s %s -s -n %s %s %s/%s" % (lvcreate_cmd, test_opt, yesopt, snapshot, opts, vg, lv) - elif thinpool and lv: - if size_opt == 'l': - module.fail_json(changed=False, msg="Thin volume sizing with percentage not supported.") - size_opt = 'V' - cmd = "%s %s %s -n %s -%s %s%s %s -T %s/%s" % (lvcreate_cmd, test_opt, yesopt, lv, size_opt, size, size_unit, opts, vg, thinpool) - elif thinpool and not lv: - cmd = "%s %s %s -%s %s%s %s -T %s/%s" % (lvcreate_cmd, test_opt, yesopt, size_opt, size, size_unit, opts, vg, thinpool) + cmd += ["-%s" % size_opt, "%s%s" % (size, size_unit)] + cmd += ["-s", "-n", snapshot] + opts + ["%s/%s" % (vg, lv)] + elif thinpool: + if lv: + if size_opt == 'l': + module.fail_json(changed=False, msg="Thin volume sizing with percentage not supported.") + size_opt = 'V' + cmd += ["-n", lv] + cmd += ["-%s" % size_opt, "%s%s" % (size, size_unit)] + cmd += opts + ["-T", "%s/%s" % (vg, thinpool)] else: - cmd = "%s %s %s -n %s -%s %s%s %s %s %s" % (lvcreate_cmd, test_opt, yesopt, lv, size_opt, size, size_unit, opts, vg, pvs) + cmd += ["-n", lv] + cmd += ["-%s" % size_opt, "%s%s" % (size, size_unit)] + cmd += opts + [vg] + pvs rc, dummy, err = module.run_command(cmd) if rc == 0: changed = True @@ -499,7 +495,7 @@ def main(): if not force: module.fail_json(msg="Sorry, no removal of logical volume %s without force=true." % (this_lv['name'])) lvremove_cmd = module.get_bin_path("lvremove", required=True) - rc, dummy, err = module.run_command("%s %s --force %s/%s" % (lvremove_cmd, test_opt, vg, this_lv['name'])) + rc, dummy, err = module.run_command([lvremove_cmd] + test_opt + ["--force", "%s/%s" % (vg, this_lv['name'])]) if rc == 0: module.exit_json(changed=True) else: @@ -527,7 +523,7 @@ def main(): if this_lv['size'] < size_requested: if (size_free > 0) and (size_free >= (size_requested - this_lv['size'])): - tool = module.get_bin_path("lvextend", required=True) + tool = [module.get_bin_path("lvextend", required=True)] else: module.fail_json( msg="Logical Volume %s could not be extended. Not enough free space left (%s%s required / %s%s available)" % @@ -539,16 +535,17 @@ def main(): elif not force: module.fail_json(msg="Sorry, no shrinking of %s without force=true" % (this_lv['name'])) else: - tool = module.get_bin_path("lvreduce", required=True) - tool = '%s %s' % (tool, '--force') + tool = [module.get_bin_path("lvreduce", required=True), '--force'] if tool: if resizefs: - tool = '%s %s' % (tool, '--resizefs') + tool += ['--resizefs'] + cmd = tool + test_opt if size_operator: - cmd = "%s %s -%s %s%s%s %s/%s %s" % (tool, test_opt, size_opt, size_operator, size, size_unit, vg, this_lv['name'], pvs) + cmd += ["-%s" % size_opt, "%s%s%s" % (size_operator, size, size_unit)] else: - cmd = "%s %s -%s %s%s %s/%s %s" % (tool, test_opt, size_opt, size, size_unit, vg, this_lv['name'], pvs) + cmd += ["-%s" % size_opt, "%s%s" % (size, size_unit)] + cmd += ["%s/%s" % (vg, this_lv['name'])] + pvs rc, out, err = module.run_command(cmd) if "Reached maximum COW size" in out: module.fail_json(msg="Unable to resize %s to %s%s" % (lv, size, size_unit), rc=rc, err=err, out=out) @@ -566,23 +563,24 @@ def main(): # resize LV based on absolute values tool = None if float(size) > this_lv['size'] or size_operator == '+': - tool = module.get_bin_path("lvextend", required=True) + tool = [module.get_bin_path("lvextend", required=True)] elif shrink and float(size) < this_lv['size'] or size_operator == '-': if float(size) == 0: module.fail_json(msg="Sorry, no shrinking of %s to 0 permitted." % (this_lv['name'])) if not force: module.fail_json(msg="Sorry, no shrinking of %s without force=true." % (this_lv['name'])) else: - tool = module.get_bin_path("lvreduce", required=True) - tool = '%s %s' % (tool, '--force') + tool = [module.get_bin_path("lvreduce", required=True), '--force'] if tool: if resizefs: - tool = '%s %s' % (tool, '--resizefs') + tool += ['--resizefs'] + cmd = tool + test_opt if size_operator: - cmd = "%s %s -%s %s%s%s %s/%s %s" % (tool, test_opt, size_opt, size_operator, size, size_unit, vg, this_lv['name'], pvs) + cmd += ["-%s" % size_opt, "%s%s%s" % (size_operator, size, size_unit)] else: - cmd = "%s %s -%s %s%s %s/%s %s" % (tool, test_opt, size_opt, size, size_unit, vg, this_lv['name'], pvs) + cmd += ["-%s" % size_opt, "%s%s" % (size, size_unit)] + cmd += ["%s/%s" % (vg, this_lv['name'])] + pvs rc, out, err = module.run_command(cmd) if "Reached maximum COW size" in out: module.fail_json(msg="Unable to resize %s to %s%s" % (lv, size, size_unit), rc=rc, err=err, out=out) @@ -598,14 +596,14 @@ def main(): if this_lv is not None: if active: lvchange_cmd = module.get_bin_path("lvchange", required=True) - rc, dummy, err = module.run_command("%s -ay %s/%s" % (lvchange_cmd, vg, this_lv['name'])) + rc, dummy, err = module.run_command([lvchange_cmd, "-ay", "%s/%s" % (vg, this_lv['name'])]) if rc == 0: module.exit_json(changed=((not this_lv['active']) or changed), vg=vg, lv=this_lv['name'], size=this_lv['size']) else: module.fail_json(msg="Failed to activate logical volume %s" % (lv), rc=rc, err=err) else: lvchange_cmd = module.get_bin_path("lvchange", required=True) - rc, dummy, err = module.run_command("%s -an %s/%s" % (lvchange_cmd, vg, this_lv['name'])) + rc, dummy, err = module.run_command([lvchange_cmd, "-an", "%s/%s" % (vg, this_lv['name'])]) if rc == 0: module.exit_json(changed=(this_lv['active'] or changed), vg=vg, lv=this_lv['name'], size=this_lv['size']) else: diff --git a/ansible_collections/community/general/plugins/modules/lxd_container.py b/ansible_collections/community/general/plugins/modules/lxd_container.py index b82e2be9b..f44523a75 100644 --- a/ansible_collections/community/general/plugins/modules/lxd_container.py +++ b/ansible_collections/community/general/plugins/modules/lxd_container.py @@ -400,7 +400,7 @@ EXAMPLES = ''' protocol: simplestreams type: image mode: pull - server: https://images.linuxcontainers.org + server: [...] # URL to the image server alias: debian/11 timeout: 600 ''' diff --git a/ansible_collections/community/general/plugins/modules/macports.py b/ansible_collections/community/general/plugins/modules/macports.py index e81fb9142..cd620687d 100644 --- a/ansible_collections/community/general/plugins/modules/macports.py +++ b/ansible_collections/community/general/plugins/modules/macports.py @@ -111,7 +111,7 @@ from ansible.module_utils.basic import AnsibleModule def selfupdate(module, port_path): """ Update Macports and the ports tree. """ - rc, out, err = module.run_command("%s -v selfupdate" % port_path) + rc, out, err = module.run_command([port_path, "-v", "selfupdate"]) if rc == 0: updated = any( @@ -135,7 +135,7 @@ def selfupdate(module, port_path): def upgrade(module, port_path): """ Upgrade outdated ports. """ - rc, out, err = module.run_command("%s upgrade outdated" % port_path) + rc, out, err = module.run_command([port_path, "upgrade", "outdated"]) # rc is 1 when nothing to upgrade so check stdout first. if out.strip() == "Nothing to upgrade.": @@ -182,7 +182,7 @@ def remove_ports(module, port_path, ports, stdout, stderr): if not query_port(module, port_path, port): continue - rc, out, err = module.run_command("%s uninstall %s" % (port_path, port)) + rc, out, err = module.run_command([port_path, "uninstall", port]) stdout += out stderr += err if query_port(module, port_path, port): @@ -206,7 +206,7 @@ def install_ports(module, port_path, ports, variant, stdout, stderr): if query_port(module, port_path, port): continue - rc, out, err = module.run_command("%s install %s %s" % (port_path, port, variant)) + rc, out, err = module.run_command([port_path, "install", port, variant]) stdout += out stderr += err if not query_port(module, port_path, port): @@ -232,7 +232,7 @@ def activate_ports(module, port_path, ports, stdout, stderr): if query_port(module, port_path, port, state="active"): continue - rc, out, err = module.run_command("%s activate %s" % (port_path, port)) + rc, out, err = module.run_command([port_path, "activate", port]) stdout += out stderr += err @@ -259,7 +259,7 @@ def deactivate_ports(module, port_path, ports, stdout, stderr): if not query_port(module, port_path, port, state="active"): continue - rc, out, err = module.run_command("%s deactivate %s" % (port_path, port)) + rc, out, err = module.run_command([port_path, "deactivate", port]) stdout += out stderr += err if query_port(module, port_path, port, state="active"): diff --git a/ansible_collections/community/general/plugins/modules/mksysb.py b/ansible_collections/community/general/plugins/modules/mksysb.py index 8272dbf7d..1280f04d5 100644 --- a/ansible_collections/community/general/plugins/modules/mksysb.py +++ b/ansible_collections/community/general/plugins/modules/mksysb.py @@ -138,6 +138,7 @@ class MkSysB(ModuleHelper): backup_dmapi_fs=cmd_runner_fmt.as_bool("-A"), combined_path=cmd_runner_fmt.as_func(cmd_runner_fmt.unpack_args(lambda p, n: ["%s/%s" % (p, n)])), ) + use_old_vardict = False def __init_module__(self): if not os.path.isdir(self.vars.storage_path): diff --git a/ansible_collections/community/general/plugins/modules/opkg.py b/ansible_collections/community/general/plugins/modules/opkg.py index 757c88c5d..2f9794ab8 100644 --- a/ansible_collections/community/general/plugins/modules/opkg.py +++ b/ansible_collections/community/general/plugins/modules/opkg.py @@ -127,6 +127,7 @@ class Opkg(StateModuleHelper): executable=dict(type="path"), ), ) + use_old_vardict = False def __init_module__(self): self.vars.set("install_c", 0, output=False, change=True) diff --git a/ansible_collections/community/general/plugins/modules/parted.py b/ansible_collections/community/general/plugins/modules/parted.py index 382e47a47..b3616a8ec 100644 --- a/ansible_collections/community/general/plugins/modules/parted.py +++ b/ansible_collections/community/general/plugins/modules/parted.py @@ -480,12 +480,12 @@ def get_device_info(device, unit): if label_needed: return get_unlabeled_device_info(device, unit) - command = "%s -s -m %s -- unit '%s' print" % (parted_exec, device, unit) + command = [parted_exec, "-s", "-m", device, "--", "unit", unit, "print"] rc, out, err = module.run_command(command) if rc != 0 and 'unrecognised disk label' not in err: module.fail_json(msg=( "Error while getting device information with parted " - "script: '%s'" % command), + "script: '%s'" % " ".join(command)), rc=rc, out=out, err=err ) @@ -506,7 +506,7 @@ def check_parted_label(device): return False # Older parted versions return a message in the stdout and RC > 0. - rc, out, err = module.run_command("%s -s -m %s print" % (parted_exec, device)) + rc, out, err = module.run_command([parted_exec, "-s", "-m", device, "print"]) if rc != 0 and 'unrecognised disk label' in out.lower(): return True @@ -546,7 +546,7 @@ def parted_version(): """ global module, parted_exec # pylint: disable=global-variable-not-assigned - rc, out, err = module.run_command("%s --version" % parted_exec) + rc, out, err = module.run_command([parted_exec, "--version"]) if rc != 0: module.fail_json( msg="Failed to get parted version.", rc=rc, out=out, err=err @@ -580,6 +580,7 @@ def parted(script, device, align): script_option = '-s' if script and not module.check_mode: + # TODO: convert run_comand() argument to list! command = "%s %s -m %s %s -- %s" % (parted_exec, script_option, align_option, device, script) rc, out, err = module.run_command(command) diff --git a/ansible_collections/community/general/plugins/modules/pipx.py b/ansible_collections/community/general/plugins/modules/pipx.py index 705cc71a7..e82e4c32a 100644 --- a/ansible_collections/community/general/plugins/modules/pipx.py +++ b/ansible_collections/community/general/plugins/modules/pipx.py @@ -201,6 +201,7 @@ class PipX(StateModuleHelper): ], supports_check_mode=True, ) + use_old_vardict = False def _retrieve_installed(self): def process_list(rc, out, err): diff --git a/ansible_collections/community/general/plugins/modules/pipx_info.py b/ansible_collections/community/general/plugins/modules/pipx_info.py index 34f9681b0..992ca7941 100644 --- a/ansible_collections/community/general/plugins/modules/pipx_info.py +++ b/ansible_collections/community/general/plugins/modules/pipx_info.py @@ -150,6 +150,7 @@ class PipXInfo(ModuleHelper): ), supports_check_mode=True, ) + use_old_vardict = False def __init_module__(self): if self.vars.executable: diff --git a/ansible_collections/community/general/plugins/modules/pkg5.py b/ansible_collections/community/general/plugins/modules/pkg5.py index c4aace9f2..08fa9272f 100644 --- a/ansible_collections/community/general/plugins/modules/pkg5.py +++ b/ansible_collections/community/general/plugins/modules/pkg5.py @@ -54,6 +54,12 @@ options: - Refresh publishers before execution. type: bool default: true + verbose: + description: + - Set to V(true) to disable quiet execution. + type: bool + default: false + version_added: 9.0.0 ''' EXAMPLES = ''' - name: Install Vim @@ -90,6 +96,7 @@ def main(): accept_licenses=dict(type='bool', default=False, aliases=['accept', 'accept_licences']), be_name=dict(type='str'), refresh=dict(type='bool', default=True), + verbose=dict(type='bool', default=False), ), supports_check_mode=True, ) @@ -156,9 +163,15 @@ def ensure(module, state, packages, params): else: no_refresh = ['--no-refresh'] + if params['verbose']: + verbosity = [] + else: + verbosity = ['-q'] + to_modify = list(filter(behaviour[state]['filter'], packages)) if to_modify: - rc, out, err = module.run_command(['pkg', behaviour[state]['subcommand']] + dry_run + accept_licenses + beadm + no_refresh + ['-q', '--'] + to_modify) + rc, out, err = module.run_command( + ['pkg', behaviour[state]['subcommand']] + dry_run + accept_licenses + beadm + no_refresh + verbosity + ['--'] + to_modify) response['rc'] = rc response['results'].append(out) response['msg'] += err diff --git a/ansible_collections/community/general/plugins/modules/pkgin.py b/ansible_collections/community/general/plugins/modules/pkgin.py index 5b2e478b8..8b29655d3 100644 --- a/ansible_collections/community/general/plugins/modules/pkgin.py +++ b/ansible_collections/community/general/plugins/modules/pkgin.py @@ -145,18 +145,18 @@ def query_package(module, name): """ # test whether '-p' (parsable) flag is supported. - rc, out, err = module.run_command("%s -p -v" % PKGIN_PATH) + rc, out, err = module.run_command([PKGIN_PATH, "-p", "-v"]) if rc == 0: - pflag = '-p' + pflag = ['-p'] splitchar = ';' else: - pflag = '' + pflag = [] splitchar = ' ' # Use "pkgin search" to find the package. The regular expression will # only match on the complete name. - rc, out, err = module.run_command("%s %s search \"^%s$\"" % (PKGIN_PATH, pflag, name)) + rc, out, err = module.run_command([PKGIN_PATH] + pflag + ["search", "^%s$" % name]) # rc will not be 0 unless the search was a success if rc == 0: @@ -234,22 +234,19 @@ def format_pkgin_command(module, command, package=None): # an empty string. Some commands (e.g. 'update') will ignore extra # arguments, however this behaviour cannot be relied on for others. if package is None: - package = "" + packages = [] + else: + packages = [package] if module.params["force"]: - force = "-F" + force = ["-F"] else: - force = "" - - vars = {"pkgin": PKGIN_PATH, - "command": command, - "package": package, - "force": force} + force = [] if module.check_mode: - return "%(pkgin)s -n %(command)s %(package)s" % vars + return [PKGIN_PATH, "-n", command] + packages else: - return "%(pkgin)s -y %(force)s %(command)s %(package)s" % vars + return [PKGIN_PATH, "-y"] + force + [command] + packages def remove_packages(module, packages): diff --git a/ansible_collections/community/general/plugins/modules/portinstall.py b/ansible_collections/community/general/plugins/modules/portinstall.py index e263b7181..59dafb1eb 100644 --- a/ansible_collections/community/general/plugins/modules/portinstall.py +++ b/ansible_collections/community/general/plugins/modules/portinstall.py @@ -79,12 +79,13 @@ def query_package(module, name): if pkg_info_path: pkgng = False pkg_glob_path = module.get_bin_path('pkg_glob', True) + # TODO: convert run_comand() argument to list! rc, out, err = module.run_command("%s -e `pkg_glob %s`" % (pkg_info_path, shlex_quote(name)), use_unsafe_shell=True) + pkg_info_path = [pkg_info_path] else: pkgng = True - pkg_info_path = module.get_bin_path('pkg', True) - pkg_info_path = pkg_info_path + " info" - rc, out, err = module.run_command("%s %s" % (pkg_info_path, name)) + pkg_info_path = [module.get_bin_path('pkg', True), "info"] + rc, out, err = module.run_command(pkg_info_path + [name]) found = rc == 0 @@ -94,10 +95,7 @@ def query_package(module, name): # some package is installed name_without_digits = re.sub('[0-9]', '', name) if name != name_without_digits: - if pkgng: - rc, out, err = module.run_command("%s %s" % (pkg_info_path, name_without_digits)) - else: - rc, out, err = module.run_command("%s %s" % (pkg_info_path, name_without_digits)) + rc, out, err = module.run_command(pkg_info_path + [name_without_digits]) found = rc == 0 @@ -107,13 +105,13 @@ def query_package(module, name): def matching_packages(module, name): ports_glob_path = module.get_bin_path('ports_glob', True) - rc, out, err = module.run_command("%s %s" % (ports_glob_path, name)) + rc, out, err = module.run_command([ports_glob_path, name]) # counts the number of packages found occurrences = out.count('\n') if occurrences == 0: name_without_digits = re.sub('[0-9]', '', name) if name != name_without_digits: - rc, out, err = module.run_command("%s %s" % (ports_glob_path, name_without_digits)) + rc, out, err = module.run_command([ports_glob_path, name_without_digits]) occurrences = out.count('\n') return occurrences @@ -135,10 +133,12 @@ def remove_packages(module, packages): if not query_package(module, package): continue + # TODO: convert run_comand() argument to list! rc, out, err = module.run_command("%s `%s %s`" % (pkg_delete_path, pkg_glob_path, shlex_quote(package)), use_unsafe_shell=True) if query_package(module, package): name_without_digits = re.sub('[0-9]', '', package) + # TODO: convert run_comand() argument to list! rc, out, err = module.run_command("%s `%s %s`" % (pkg_delete_path, pkg_glob_path, shlex_quote(name_without_digits)), use_unsafe_shell=True) @@ -163,13 +163,13 @@ def install_packages(module, packages, use_packages): if not portinstall_path: pkg_path = module.get_bin_path('pkg', False) if pkg_path: - module.run_command("pkg install -y portupgrade") + module.run_command([pkg_path, "install", "-y", "portupgrade"]) portinstall_path = module.get_bin_path('portinstall', True) if use_packages: - portinstall_params = "--use-packages" + portinstall_params = ["--use-packages"] else: - portinstall_params = "" + portinstall_params = [] for package in packages: if query_package(module, package): @@ -178,7 +178,7 @@ def install_packages(module, packages, use_packages): # TODO: check how many match matches = matching_packages(module, package) if matches == 1: - rc, out, err = module.run_command("%s --batch %s %s" % (portinstall_path, portinstall_params, package)) + rc, out, err = module.run_command([portinstall_path, "--batch"] + portinstall_params + [package]) if not query_package(module, package): module.fail_json(msg="failed to install %s: %s" % (package, out)) elif matches == 0: diff --git a/ansible_collections/community/general/plugins/modules/proxmox.py b/ansible_collections/community/general/plugins/modules/proxmox.py index 47f3faa4f..73afd952e 100644 --- a/ansible_collections/community/general/plugins/modules/proxmox.py +++ b/ansible_collections/community/general/plugins/modules/proxmox.py @@ -15,12 +15,14 @@ short_description: Management of instances in Proxmox VE cluster description: - Allows you to create/delete/stop instances in Proxmox VE cluster. - The module automatically detects containerization type (lxc for PVE 4, openvz for older). - - Since community.general 4.0.0 on, there are no more default values, see O(proxmox_default_behavior). + - Since community.general 4.0.0 on, there are no more default values. attributes: check_mode: support: none diff_mode: support: none + action_group: + version_added: 9.0.0 options: password: description: @@ -47,28 +49,23 @@ options: comma-delimited list C([volume=]<volume> [,acl=<1|0>] [,mountoptions=<opt[;opt...]>] [,quota=<1|0>] [,replicate=<1|0>] [,ro=<1|0>] [,shared=<1|0>] [,size=<DiskSize>])." - See U(https://pve.proxmox.com/wiki/Linux_Container) for a full description. - - This option has no default unless O(proxmox_default_behavior) is set to V(compatibility); then the default is V(3). - Should not be used in conjunction with O(storage). type: str cores: description: - Specify number of cores per socket. - - This option has no default unless O(proxmox_default_behavior) is set to V(compatibility); then the default is V(1). type: int cpus: description: - numbers of allocated cpus for instance - - This option has no default unless O(proxmox_default_behavior) is set to V(compatibility); then the default is V(1). type: int memory: description: - memory size in MB for instance - - This option has no default unless O(proxmox_default_behavior) is set to V(compatibility); then the default is V(512). type: int swap: description: - swap memory size in MB for instance - - This option has no default unless O(proxmox_default_behavior) is set to V(compatibility); then the default is V(0). type: int netif: description: @@ -101,7 +98,6 @@ options: onboot: description: - specifies whether a VM will be started during system bootup - - This option has no default unless O(proxmox_default_behavior) is set to V(compatibility); then the default is V(false). type: bool storage: description: @@ -120,7 +116,6 @@ options: cpuunits: description: - CPU weight for a VM - - This option has no default unless O(proxmox_default_behavior) is set to V(compatibility); then the default is V(1000). type: int nameserver: description: @@ -200,25 +195,6 @@ options: - The special value V(host) configures the same timezone used by Proxmox host. type: str version_added: '7.1.0' - proxmox_default_behavior: - description: - - As of community.general 4.0.0, various options no longer have default values. - These default values caused problems when users expected different behavior from Proxmox - by default or filled options which caused problems when set. - - The value V(compatibility) (default before community.general 4.0.0) will ensure that the default values - are used when the values are not explicitly specified by the user. The new default is V(no_defaults), - which makes sure these options have no defaults. - - This affects the O(disk), O(cores), O(cpus), O(memory), O(onboot), O(swap), and O(cpuunits) options. - - > - This parameter is now B(deprecated) and it will be removed in community.general 10.0.0. - By then, the module's behavior should be to not set default values, equivalent to V(no_defaults). - If a consistent set of defaults is needed, the playbook or role should be responsible for setting it. - type: str - default: no_defaults - choices: - - compatibility - - no_defaults - version_added: "1.3.0" clone: description: - ID of the container to be cloned. @@ -242,6 +218,7 @@ author: Sergei Antipov (@UnderGreen) seealso: - module: community.general.proxmox_vm_info extends_documentation_fragment: + - community.general.proxmox.actiongroup_proxmox - community.general.proxmox.documentation - community.general.proxmox.selection - community.general.attributes @@ -785,8 +762,6 @@ def main(): description=dict(type='str'), hookscript=dict(type='str'), timezone=dict(type='str'), - proxmox_default_behavior=dict(type='str', default='no_defaults', choices=['compatibility', 'no_defaults'], - removed_in_version='9.0.0', removed_from_collection='community.general'), clone=dict(type='int'), clone_type=dict(default='opportunistic', choices=['full', 'linked', 'opportunistic']), tags=dict(type='list', elements='str') @@ -827,20 +802,6 @@ def main(): timeout = module.params['timeout'] clone = module.params['clone'] - if module.params['proxmox_default_behavior'] == 'compatibility': - old_default_values = dict( - disk="3", - cores=1, - cpus=1, - memory=512, - swap=0, - onboot=False, - cpuunits=1000, - ) - for param, value in old_default_values.items(): - if module.params[param] is None: - module.params[param] = value - # If vmid not set get the Next VM id from ProxmoxAPI # If hostname is set get the VM id from ProxmoxAPI if not vmid and state == 'present': diff --git a/ansible_collections/community/general/plugins/modules/proxmox_disk.py b/ansible_collections/community/general/plugins/modules/proxmox_disk.py index 69a7300df..83cdbeee5 100644 --- a/ansible_collections/community/general/plugins/modules/proxmox_disk.py +++ b/ansible_collections/community/general/plugins/modules/proxmox_disk.py @@ -21,6 +21,8 @@ attributes: support: none diff_mode: support: none + action_group: + version_added: 9.0.0 options: name: description: @@ -325,6 +327,7 @@ options: - The drive's worldwide name, encoded as 16 bytes hex string, prefixed by V(0x). type: str extends_documentation_fragment: + - community.general.proxmox.actiongroup_proxmox - community.general.proxmox.documentation - community.general.attributes ''' diff --git a/ansible_collections/community/general/plugins/modules/proxmox_domain_info.py b/ansible_collections/community/general/plugins/modules/proxmox_domain_info.py index 7435695a9..f3ff212bf 100644 --- a/ansible_collections/community/general/plugins/modules/proxmox_domain_info.py +++ b/ansible_collections/community/general/plugins/modules/proxmox_domain_info.py @@ -16,6 +16,9 @@ short_description: Retrieve information about one or more Proxmox VE domains version_added: 1.3.0 description: - Retrieve information about one or more Proxmox VE domains. +attributes: + action_group: + version_added: 9.0.0 options: domain: description: @@ -24,6 +27,7 @@ options: type: str author: Tristan Le Guern (@tleguern) extends_documentation_fragment: + - community.general.proxmox.actiongroup_proxmox - community.general.proxmox.documentation - community.general.attributes - community.general.attributes.info_module diff --git a/ansible_collections/community/general/plugins/modules/proxmox_group_info.py b/ansible_collections/community/general/plugins/modules/proxmox_group_info.py index 531a9dae7..eda1fe04d 100644 --- a/ansible_collections/community/general/plugins/modules/proxmox_group_info.py +++ b/ansible_collections/community/general/plugins/modules/proxmox_group_info.py @@ -16,6 +16,9 @@ short_description: Retrieve information about one or more Proxmox VE groups version_added: 1.3.0 description: - Retrieve information about one or more Proxmox VE groups +attributes: + action_group: + version_added: 9.0.0 options: group: description: @@ -24,6 +27,7 @@ options: type: str author: Tristan Le Guern (@tleguern) extends_documentation_fragment: + - community.general.proxmox.actiongroup_proxmox - community.general.proxmox.documentation - community.general.attributes - community.general.attributes.info_module diff --git a/ansible_collections/community/general/plugins/modules/proxmox_kvm.py b/ansible_collections/community/general/plugins/modules/proxmox_kvm.py index 8779dcdc1..9fe805c7a 100644 --- a/ansible_collections/community/general/plugins/modules/proxmox_kvm.py +++ b/ansible_collections/community/general/plugins/modules/proxmox_kvm.py @@ -21,6 +21,8 @@ attributes: support: none diff_mode: support: none + action_group: + version_added: 9.0.0 options: archive: description: @@ -517,6 +519,16 @@ options: default: '2.0' type: dict version_added: 7.1.0 + usb: + description: + - A hash/dictionary of USB devices for the VM. O(usb='{"key":"value", "key":"value"}'). + - Keys allowed are - C(usb[n]) where 0 ≤ n ≤ N. + - Values allowed are - C(host="value|spice",mapping="value",usb3="1|0"). + - host is either C(spice) or the USB id/port. + - Option C(mapping) is the mapped USB device name. + - Option C(usb3) enables USB 3 support. + type: dict + version_added: 9.0.0 update: description: - If V(true), the VM will be updated with new value. @@ -579,6 +591,7 @@ options: seealso: - module: community.general.proxmox_vm_info extends_documentation_fragment: + - community.general.proxmox.actiongroup_proxmox - community.general.proxmox.documentation - community.general.proxmox.selection - community.general.attributes @@ -1091,7 +1104,7 @@ class ProxmoxKvmAnsible(ProxmoxAnsible): ) # Convert all dict in kwargs to elements. - # For hostpci[n], ide[n], net[n], numa[n], parallel[n], sata[n], scsi[n], serial[n], virtio[n], ipconfig[n] + # For hostpci[n], ide[n], net[n], numa[n], parallel[n], sata[n], scsi[n], serial[n], virtio[n], ipconfig[n], usb[n] for k in list(kwargs.keys()): if isinstance(kwargs[k], dict): kwargs.update(kwargs[k]) @@ -1308,6 +1321,7 @@ def main(): storage=dict(type='str', required=True), version=dict(type='str', choices=['2.0', '1.2'], default='2.0') )), + usb=dict(type='dict'), update=dict(type='bool', default=False), update_unsafe=dict(type='bool', default=False), vcpus=dict(type='int'), @@ -1513,6 +1527,7 @@ def main(): tdf=module.params['tdf'], template=module.params['template'], tpmstate0=module.params['tpmstate0'], + usb=module.params['usb'], vcpus=module.params['vcpus'], vga=module.params['vga'], virtio=module.params['virtio'], diff --git a/ansible_collections/community/general/plugins/modules/proxmox_nic.py b/ansible_collections/community/general/plugins/modules/proxmox_nic.py index 9afe49447..6e94ed0bb 100644 --- a/ansible_collections/community/general/plugins/modules/proxmox_nic.py +++ b/ansible_collections/community/general/plugins/modules/proxmox_nic.py @@ -21,6 +21,8 @@ attributes: support: full diff_mode: support: none + action_group: + version_added: 9.0.0 options: bridge: description: @@ -94,6 +96,7 @@ options: - Specifies the instance ID. type: int extends_documentation_fragment: + - community.general.proxmox.actiongroup_proxmox - community.general.proxmox.documentation - community.general.attributes ''' diff --git a/ansible_collections/community/general/plugins/modules/proxmox_node_info.py b/ansible_collections/community/general/plugins/modules/proxmox_node_info.py index 82ef7aa38..51d8745c0 100644 --- a/ansible_collections/community/general/plugins/modules/proxmox_node_info.py +++ b/ansible_collections/community/general/plugins/modules/proxmox_node_info.py @@ -17,7 +17,11 @@ version_added: 8.2.0 description: - Retrieve information about one or more Proxmox VE nodes. author: John Berninger (@jwbernin) +attributes: + action_group: + version_added: 9.0.0 extends_documentation_fragment: + - community.general.proxmox.actiongroup_proxmox - community.general.proxmox.documentation - community.general.attributes - community.general.attributes.info_module diff --git a/ansible_collections/community/general/plugins/modules/proxmox_pool.py b/ansible_collections/community/general/plugins/modules/proxmox_pool.py index 704632070..5089ec3be 100644 --- a/ansible_collections/community/general/plugins/modules/proxmox_pool.py +++ b/ansible_collections/community/general/plugins/modules/proxmox_pool.py @@ -21,6 +21,8 @@ attributes: support: full diff_mode: support: none + action_group: + version_added: 9.0.0 options: poolid: description: @@ -42,8 +44,9 @@ options: type: str extends_documentation_fragment: - - community.general.proxmox.documentation - - community.general.attributes + - community.general.proxmox.actiongroup_proxmox + - community.general.proxmox.documentation + - community.general.attributes """ EXAMPLES = """ diff --git a/ansible_collections/community/general/plugins/modules/proxmox_pool_member.py b/ansible_collections/community/general/plugins/modules/proxmox_pool_member.py index 7d6b24949..b26082f97 100644 --- a/ansible_collections/community/general/plugins/modules/proxmox_pool_member.py +++ b/ansible_collections/community/general/plugins/modules/proxmox_pool_member.py @@ -20,6 +20,8 @@ attributes: support: full diff_mode: support: full + action_group: + version_added: 9.0.0 options: poolid: description: @@ -48,8 +50,9 @@ options: type: str extends_documentation_fragment: - - community.general.proxmox.documentation - - community.general.attributes + - community.general.proxmox.actiongroup_proxmox + - community.general.proxmox.documentation + - community.general.attributes """ EXAMPLES = """ diff --git a/ansible_collections/community/general/plugins/modules/proxmox_snap.py b/ansible_collections/community/general/plugins/modules/proxmox_snap.py index 4991423c2..4f7b345b8 100644 --- a/ansible_collections/community/general/plugins/modules/proxmox_snap.py +++ b/ansible_collections/community/general/plugins/modules/proxmox_snap.py @@ -21,6 +21,8 @@ attributes: support: full diff_mode: support: none + action_group: + version_added: 9.0.0 options: hostname: description: @@ -89,8 +91,9 @@ notes: requirements: [ "proxmoxer", "requests" ] author: Jeffrey van Pelt (@Thulium-Drake) extends_documentation_fragment: - - community.general.proxmox.documentation - - community.general.attributes + - community.general.proxmox.actiongroup_proxmox + - community.general.proxmox.documentation + - community.general.attributes ''' EXAMPLES = r''' diff --git a/ansible_collections/community/general/plugins/modules/proxmox_storage_contents_info.py b/ansible_collections/community/general/plugins/modules/proxmox_storage_contents_info.py index 498490fe4..b777870e5 100644 --- a/ansible_collections/community/general/plugins/modules/proxmox_storage_contents_info.py +++ b/ansible_collections/community/general/plugins/modules/proxmox_storage_contents_info.py @@ -17,6 +17,9 @@ short_description: List content from a Proxmox VE storage version_added: 8.2.0 description: - Retrieves information about stored objects on a specific storage attached to a node. +attributes: + action_group: + version_added: 9.0.0 options: storage: description: @@ -41,6 +44,7 @@ options: type: int author: Julian Vanden Broeck (@l00ptr) extends_documentation_fragment: + - community.general.proxmox.actiongroup_proxmox - community.general.proxmox.documentation - community.general.attributes - community.general.attributes.info_module diff --git a/ansible_collections/community/general/plugins/modules/proxmox_storage_info.py b/ansible_collections/community/general/plugins/modules/proxmox_storage_info.py index 3c29e59cf..fd5a6ee0d 100644 --- a/ansible_collections/community/general/plugins/modules/proxmox_storage_info.py +++ b/ansible_collections/community/general/plugins/modules/proxmox_storage_info.py @@ -16,6 +16,9 @@ short_description: Retrieve information about one or more Proxmox VE storages version_added: 2.2.0 description: - Retrieve information about one or more Proxmox VE storages. +attributes: + action_group: + version_added: 9.0.0 options: storage: description: @@ -28,6 +31,7 @@ options: type: str author: Tristan Le Guern (@tleguern) extends_documentation_fragment: + - community.general.proxmox.actiongroup_proxmox - community.general.proxmox.documentation - community.general.attributes - community.general.attributes.info_module diff --git a/ansible_collections/community/general/plugins/modules/proxmox_tasks_info.py b/ansible_collections/community/general/plugins/modules/proxmox_tasks_info.py index d31a04980..65a07566a 100644 --- a/ansible_collections/community/general/plugins/modules/proxmox_tasks_info.py +++ b/ansible_collections/community/general/plugins/modules/proxmox_tasks_info.py @@ -17,6 +17,9 @@ version_added: 3.8.0 description: - Retrieve information about one or more Proxmox VE tasks. author: 'Andreas Botzner (@paginabianca) <andreas at botzner dot com>' +attributes: + action_group: + version_added: 9.0.0 options: node: description: @@ -29,9 +32,10 @@ options: aliases: ['upid', 'name'] type: str extends_documentation_fragment: - - community.general.proxmox.documentation - - community.general.attributes - - community.general.attributes.info_module + - community.general.proxmox.actiongroup_proxmox + - community.general.proxmox.documentation + - community.general.attributes + - community.general.attributes.info_module ''' diff --git a/ansible_collections/community/general/plugins/modules/proxmox_template.py b/ansible_collections/community/general/plugins/modules/proxmox_template.py index 615bfc182..f73109931 100644 --- a/ansible_collections/community/general/plugins/modules/proxmox_template.py +++ b/ansible_collections/community/general/plugins/modules/proxmox_template.py @@ -20,6 +20,8 @@ attributes: support: none diff_mode: support: none + action_group: + version_added: 9.0.0 options: node: description: @@ -69,6 +71,7 @@ notes: - C(proxmoxer) >= 1.2.0 requires C(requests_toolbelt) to upload files larger than 256 MB. author: Sergei Antipov (@UnderGreen) extends_documentation_fragment: + - community.general.proxmox.actiongroup_proxmox - community.general.proxmox.documentation - community.general.attributes ''' diff --git a/ansible_collections/community/general/plugins/modules/proxmox_user_info.py b/ansible_collections/community/general/plugins/modules/proxmox_user_info.py index 20154528a..8680dec7c 100644 --- a/ansible_collections/community/general/plugins/modules/proxmox_user_info.py +++ b/ansible_collections/community/general/plugins/modules/proxmox_user_info.py @@ -16,6 +16,9 @@ short_description: Retrieve information about one or more Proxmox VE users version_added: 1.3.0 description: - Retrieve information about one or more Proxmox VE users +attributes: + action_group: + version_added: 9.0.0 options: domain: description: @@ -33,6 +36,7 @@ options: type: str author: Tristan Le Guern (@tleguern) extends_documentation_fragment: + - community.general.proxmox.actiongroup_proxmox - community.general.proxmox.documentation - community.general.attributes - community.general.attributes.info_module diff --git a/ansible_collections/community/general/plugins/modules/proxmox_vm_info.py b/ansible_collections/community/general/plugins/modules/proxmox_vm_info.py index 30342b684..39d8307a4 100644 --- a/ansible_collections/community/general/plugins/modules/proxmox_vm_info.py +++ b/ansible_collections/community/general/plugins/modules/proxmox_vm_info.py @@ -17,6 +17,9 @@ version_added: 7.2.0 description: - Retrieve information about one or more Proxmox VE virtual machines. author: 'Sergei Antipov (@UnderGreen) <greendayonfire at gmail dot com>' +attributes: + action_group: + version_added: 9.0.0 options: node: description: @@ -55,9 +58,10 @@ options: default: none version_added: 8.1.0 extends_documentation_fragment: - - community.general.proxmox.documentation - - community.general.attributes - - community.general.attributes.info_module + - community.general.proxmox.actiongroup_proxmox + - community.general.proxmox.documentation + - community.general.attributes + - community.general.attributes.info_module """ EXAMPLES = """ diff --git a/ansible_collections/community/general/plugins/modules/puppet.py b/ansible_collections/community/general/plugins/modules/puppet.py index b28583fe0..073a08324 100644 --- a/ansible_collections/community/general/plugins/modules/puppet.py +++ b/ansible_collections/community/general/plugins/modules/puppet.py @@ -101,6 +101,12 @@ options: - Whether to print a transaction summary. type: bool default: false + waitforlock: + description: + - The maximum amount of time C(puppet) should wait for an already running C(puppet) agent to finish before starting. + - If a number without unit is provided, it is assumed to be a number of seconds. Allowed units are V(m) for minutes and V(h) for hours. + type: str + version_added: 9.0.0 verbose: description: - Print extra information. @@ -159,6 +165,14 @@ EXAMPLES = r''' skip_tags: - service +- name: Wait 30 seconds for any current puppet runs to finish + community.general.puppet: + waitforlock: 30 + +- name: Wait 5 minutes for any current puppet runs to finish + community.general.puppet: + waitforlock: 5m + - name: Run puppet agent in noop mode community.general.puppet: noop: true @@ -214,6 +228,7 @@ def main(): skip_tags=dict(type='list', elements='str'), execute=dict(type='str'), summarize=dict(type='bool', default=False), + waitforlock=dict(type='str'), debug=dict(type='bool', default=False), verbose=dict(type='bool', default=False), use_srv_records=dict(type='bool'), @@ -247,11 +262,11 @@ def main(): runner = puppet_utils.puppet_runner(module) if not p['manifest'] and not p['execute']: - args_order = "_agent_fixed puppetmaster show_diff confdir environment tags skip_tags certname noop use_srv_records" + args_order = "_agent_fixed puppetmaster show_diff confdir environment tags skip_tags certname noop use_srv_records waitforlock" with runner(args_order) as ctx: rc, stdout, stderr = ctx.run() else: - args_order = "_apply_fixed logdest modulepath environment certname tags skip_tags noop _execute summarize debug verbose" + args_order = "_apply_fixed logdest modulepath environment certname tags skip_tags noop _execute summarize debug verbose waitforlock" with runner(args_order) as ctx: rc, stdout, stderr = ctx.run(_execute=[p['execute'], p['manifest']]) diff --git a/ansible_collections/community/general/plugins/modules/rax.py b/ansible_collections/community/general/plugins/modules/rax.py deleted file mode 100644 index 76e429944..000000000 --- a/ansible_collections/community/general/plugins/modules/rax.py +++ /dev/null @@ -1,903 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright 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 absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- -module: rax -short_description: Create / delete an instance in Rackspace Public Cloud -description: - - creates / deletes a Rackspace Public Cloud instance and optionally - waits for it to be 'running'. -attributes: - check_mode: - support: none - diff_mode: - support: none -options: - auto_increment: - description: - - Whether or not to increment a single number with the name of the - created servers. Only applicable when used with the O(group) attribute - or meta key. - type: bool - default: true - boot_from_volume: - description: - - Whether or not to boot the instance from a Cloud Block Storage volume. - If V(true) and O(image) is specified a new volume will be created at - boot time. O(boot_volume_size) is required with O(image) to create a - new volume at boot time. - type: bool - default: false - boot_volume: - type: str - description: - - Cloud Block Storage ID or Name to use as the boot volume of the - instance - boot_volume_size: - type: int - description: - - Size of the volume to create in Gigabytes. This is only required with - O(image) and O(boot_from_volume). - default: 100 - boot_volume_terminate: - description: - - Whether the O(boot_volume) or newly created volume from O(image) will - be terminated when the server is terminated - type: bool - default: false - config_drive: - description: - - Attach read-only configuration drive to server as label config-2 - type: bool - default: false - count: - type: int - description: - - number of instances to launch - default: 1 - count_offset: - type: int - description: - - number count to start at - default: 1 - disk_config: - type: str - description: - - Disk partitioning strategy - - If not specified it will assume the value V(auto). - choices: - - auto - - manual - exact_count: - description: - - Explicitly ensure an exact count of instances, used with - state=active/present. If specified as V(true) and O(count) is less than - the servers matched, servers will be deleted to match the count. If - the number of matched servers is fewer than specified in O(count) - additional servers will be added. - type: bool - default: false - extra_client_args: - type: dict - default: {} - description: - - A hash of key/value pairs to be used when creating the cloudservers - client. This is considered an advanced option, use it wisely and - with caution. - extra_create_args: - type: dict - default: {} - description: - - A hash of key/value pairs to be used when creating a new server. - This is considered an advanced option, use it wisely and with caution. - files: - type: dict - default: {} - description: - - Files to insert into the instance. remotefilename:localcontent - flavor: - type: str - description: - - flavor to use for the instance - group: - type: str - description: - - host group to assign to server, is also used for idempotent operations - to ensure a specific number of instances - image: - type: str - description: - - image to use for the instance. Can be an C(id), C(human_id) or C(name). - With O(boot_from_volume), a Cloud Block Storage volume will be created - with this image - instance_ids: - type: list - elements: str - description: - - list of instance ids, currently only used when state='absent' to - remove instances - key_name: - type: str - description: - - key pair to use on the instance - aliases: - - keypair - meta: - type: dict - default: {} - description: - - A hash of metadata to associate with the instance - name: - type: str - description: - - Name to give the instance - networks: - type: list - elements: str - description: - - The network to attach to the instances. If specified, you must include - ALL networks including the public and private interfaces. Can be C(id) - or C(label). - default: - - public - - private - state: - type: str - description: - - Indicate desired state of the resource - choices: - - present - - absent - default: present - user_data: - type: str - description: - - Data to be uploaded to the servers config drive. This option implies - O(config_drive). Can be a file path or a string - wait: - description: - - wait for the instance to be in state 'running' before returning - type: bool - default: false - wait_timeout: - type: int - description: - - how long before wait gives up, in seconds - default: 300 -author: - - "Jesse Keating (@omgjlk)" - - "Matt Martz (@sivel)" -notes: - - O(exact_count) can be "destructive" if the number of running servers in - the O(group) is larger than that specified in O(count). In such a case, the - O(state) is effectively set to V(absent) and the extra servers are deleted. - In the case of deletion, the returned data structure will have RV(ignore:action) - set to V(delete), and the oldest servers in the group will be deleted. -extends_documentation_fragment: - - community.general.rackspace.openstack - - community.general.attributes - -''' - -EXAMPLES = ''' -- name: Build a Cloud Server - gather_facts: false - tasks: - - name: Server build request - local_action: - module: rax - credentials: ~/.raxpub - name: rax-test1 - flavor: 5 - image: b11d9567-e412-4255-96b9-bd63ab23bcfe - key_name: my_rackspace_key - files: - /root/test.txt: /home/localuser/test.txt - wait: true - state: present - networks: - - private - - public - register: rax - -- name: Build an exact count of cloud servers with incremented names - hosts: local - gather_facts: false - tasks: - - name: Server build requests - local_action: - module: rax - credentials: ~/.raxpub - name: test%03d.example.org - flavor: performance1-1 - image: ubuntu-1204-lts-precise-pangolin - state: present - count: 10 - count_offset: 10 - exact_count: true - group: test - wait: true - register: rax -''' - -import json -import os -import re -import time - -try: - import pyrax - HAS_PYRAX = True -except ImportError: - HAS_PYRAX = False - -from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.rax import (FINAL_STATUSES, rax_argument_spec, rax_find_bootable_volume, - rax_find_image, rax_find_network, rax_find_volume, - rax_required_together, rax_to_dict, setup_rax_module) -from ansible.module_utils.six.moves import xrange -from ansible.module_utils.six import string_types - - -def rax_find_server_image(module, server, image, boot_volume): - if not image and boot_volume: - vol = rax_find_bootable_volume(module, pyrax, server, - exit=False) - if not vol: - return None - volume_image_metadata = vol.volume_image_metadata - vol_image_id = volume_image_metadata.get('image_id') - if vol_image_id: - server_image = rax_find_image(module, pyrax, - vol_image_id, exit=False) - if server_image: - server.image = dict(id=server_image) - - # Match image IDs taking care of boot from volume - if image and not server.image: - vol = rax_find_bootable_volume(module, pyrax, server) - volume_image_metadata = vol.volume_image_metadata - vol_image_id = volume_image_metadata.get('image_id') - if not vol_image_id: - return None - server_image = rax_find_image(module, pyrax, - vol_image_id, exit=False) - if image != server_image: - return None - - server.image = dict(id=server_image) - elif image and server.image['id'] != image: - return None - - return server.image - - -def create(module, names=None, flavor=None, image=None, meta=None, key_name=None, - files=None, wait=True, wait_timeout=300, disk_config=None, - group=None, nics=None, extra_create_args=None, user_data=None, - config_drive=False, existing=None, block_device_mapping_v2=None): - names = [] if names is None else names - meta = {} if meta is None else meta - files = {} if files is None else files - nics = [] if nics is None else nics - extra_create_args = {} if extra_create_args is None else extra_create_args - existing = [] if existing is None else existing - block_device_mapping_v2 = [] if block_device_mapping_v2 is None else block_device_mapping_v2 - - cs = pyrax.cloudservers - changed = False - - if user_data: - config_drive = True - - if user_data and os.path.isfile(os.path.expanduser(user_data)): - try: - user_data = os.path.expanduser(user_data) - f = open(user_data) - user_data = f.read() - f.close() - except Exception as e: - module.fail_json(msg='Failed to load %s' % user_data) - - # Handle the file contents - for rpath in files.keys(): - lpath = os.path.expanduser(files[rpath]) - try: - fileobj = open(lpath, 'r') - files[rpath] = fileobj.read() - fileobj.close() - except Exception as e: - module.fail_json(msg='Failed to load %s' % lpath) - try: - servers = [] - bdmv2 = block_device_mapping_v2 - for name in names: - servers.append(cs.servers.create(name=name, image=image, - flavor=flavor, meta=meta, - key_name=key_name, - files=files, nics=nics, - disk_config=disk_config, - config_drive=config_drive, - userdata=user_data, - block_device_mapping_v2=bdmv2, - **extra_create_args)) - except Exception as e: - if e.message: - msg = str(e.message) - else: - msg = repr(e) - module.fail_json(msg=msg) - else: - changed = True - - if wait: - end_time = time.time() + wait_timeout - infinite = wait_timeout == 0 - while infinite or time.time() < end_time: - for server in servers: - try: - server.get() - except Exception: - server.status = 'ERROR' - - if not filter(lambda s: s.status not in FINAL_STATUSES, - servers): - break - time.sleep(5) - - success = [] - error = [] - timeout = [] - for server in servers: - try: - server.get() - except Exception: - server.status = 'ERROR' - instance = rax_to_dict(server, 'server') - if server.status == 'ACTIVE' or not wait: - success.append(instance) - elif server.status == 'ERROR': - error.append(instance) - elif wait: - timeout.append(instance) - - untouched = [rax_to_dict(s, 'server') for s in existing] - instances = success + untouched - - results = { - 'changed': changed, - 'action': 'create', - 'instances': instances, - 'success': success, - 'error': error, - 'timeout': timeout, - 'instance_ids': { - 'instances': [i['id'] for i in instances], - 'success': [i['id'] for i in success], - 'error': [i['id'] for i in error], - 'timeout': [i['id'] for i in timeout] - } - } - - if timeout: - results['msg'] = 'Timeout waiting for all servers to build' - elif error: - results['msg'] = 'Failed to build all servers' - - if 'msg' in results: - module.fail_json(**results) - else: - module.exit_json(**results) - - -def delete(module, instance_ids=None, wait=True, wait_timeout=300, kept=None): - instance_ids = [] if instance_ids is None else instance_ids - kept = [] if kept is None else kept - - cs = pyrax.cloudservers - - changed = False - instances = {} - servers = [] - - for instance_id in instance_ids: - servers.append(cs.servers.get(instance_id)) - - for server in servers: - try: - server.delete() - except Exception as e: - module.fail_json(msg=e.message) - else: - changed = True - - instance = rax_to_dict(server, 'server') - instances[instance['id']] = instance - - # If requested, wait for server deletion - if wait: - end_time = time.time() + wait_timeout - infinite = wait_timeout == 0 - while infinite or time.time() < end_time: - for server in servers: - instance_id = server.id - try: - server.get() - except Exception: - instances[instance_id]['status'] = 'DELETED' - instances[instance_id]['rax_status'] = 'DELETED' - - if not filter(lambda s: s['status'] not in ('', 'DELETED', - 'ERROR'), - instances.values()): - break - - time.sleep(5) - - timeout = filter(lambda s: s['status'] not in ('', 'DELETED', 'ERROR'), - instances.values()) - error = filter(lambda s: s['status'] in ('ERROR'), - instances.values()) - success = filter(lambda s: s['status'] in ('', 'DELETED'), - instances.values()) - - instances = [rax_to_dict(s, 'server') for s in kept] - - results = { - 'changed': changed, - 'action': 'delete', - 'instances': instances, - 'success': success, - 'error': error, - 'timeout': timeout, - 'instance_ids': { - 'instances': [i['id'] for i in instances], - 'success': [i['id'] for i in success], - 'error': [i['id'] for i in error], - 'timeout': [i['id'] for i in timeout] - } - } - - if timeout: - results['msg'] = 'Timeout waiting for all servers to delete' - elif error: - results['msg'] = 'Failed to delete all servers' - - if 'msg' in results: - module.fail_json(**results) - else: - module.exit_json(**results) - - -def cloudservers(module, state=None, name=None, flavor=None, image=None, - meta=None, key_name=None, files=None, wait=True, wait_timeout=300, - disk_config=None, count=1, group=None, instance_ids=None, - exact_count=False, networks=None, count_offset=0, - auto_increment=False, extra_create_args=None, user_data=None, - config_drive=False, boot_from_volume=False, - boot_volume=None, boot_volume_size=None, - boot_volume_terminate=False): - meta = {} if meta is None else meta - files = {} if files is None else files - instance_ids = [] if instance_ids is None else instance_ids - networks = [] if networks is None else networks - extra_create_args = {} if extra_create_args is None else extra_create_args - - cs = pyrax.cloudservers - cnw = pyrax.cloud_networks - if not cnw: - module.fail_json(msg='Failed to instantiate client. This ' - 'typically indicates an invalid region or an ' - 'incorrectly capitalized region name.') - - if state == 'present' or (state == 'absent' and instance_ids is None): - if not boot_from_volume and not boot_volume and not image: - module.fail_json(msg='image is required for the "rax" module') - - for arg, value in dict(name=name, flavor=flavor).items(): - if not value: - module.fail_json(msg='%s is required for the "rax" module' % - arg) - - if boot_from_volume and not image and not boot_volume: - module.fail_json(msg='image or boot_volume are required for the ' - '"rax" with boot_from_volume') - - if boot_from_volume and image and not boot_volume_size: - module.fail_json(msg='boot_volume_size is required for the "rax" ' - 'module with boot_from_volume and image') - - if boot_from_volume and image and boot_volume: - image = None - - servers = [] - - # Add the group meta key - if group and 'group' not in meta: - meta['group'] = group - elif 'group' in meta and group is None: - group = meta['group'] - - # Normalize and ensure all metadata values are strings - for k, v in meta.items(): - if isinstance(v, list): - meta[k] = ','.join(['%s' % i for i in v]) - elif isinstance(v, dict): - meta[k] = json.dumps(v) - elif not isinstance(v, string_types): - meta[k] = '%s' % v - - # When using state=absent with group, the absent block won't match the - # names properly. Use the exact_count functionality to decrease the count - # to the desired level - was_absent = False - if group is not None and state == 'absent': - exact_count = True - state = 'present' - was_absent = True - - if image: - image = rax_find_image(module, pyrax, image) - - nics = [] - if networks: - for network in networks: - nics.extend(rax_find_network(module, pyrax, network)) - - # act on the state - if state == 'present': - # Idempotent ensurance of a specific count of servers - if exact_count is not False: - # See if we can find servers that match our options - if group is None: - module.fail_json(msg='"group" must be provided when using ' - '"exact_count"') - - if auto_increment: - numbers = set() - - # See if the name is a printf like string, if not append - # %d to the end - try: - name % 0 - except TypeError as e: - if e.message.startswith('not all'): - name = '%s%%d' % name - else: - module.fail_json(msg=e.message) - - # regex pattern to match printf formatting - pattern = re.sub(r'%\d*[sd]', r'(\d+)', name) - for server in cs.servers.list(): - # Ignore DELETED servers - if server.status == 'DELETED': - continue - if server.metadata.get('group') == group: - servers.append(server) - match = re.search(pattern, server.name) - if match: - number = int(match.group(1)) - numbers.add(number) - - number_range = xrange(count_offset, count_offset + count) - available_numbers = list(set(number_range) - .difference(numbers)) - else: # Not auto incrementing - for server in cs.servers.list(): - # Ignore DELETED servers - if server.status == 'DELETED': - continue - if server.metadata.get('group') == group: - servers.append(server) - # available_numbers not needed here, we inspect auto_increment - # again later - - # If state was absent but the count was changed, - # assume we only wanted to remove that number of instances - if was_absent: - diff = len(servers) - count - if diff < 0: - count = 0 - else: - count = diff - - if len(servers) > count: - # We have more servers than we need, set state='absent' - # and delete the extras, this should delete the oldest - state = 'absent' - kept = servers[:count] - del servers[:count] - instance_ids = [] - for server in servers: - instance_ids.append(server.id) - delete(module, instance_ids=instance_ids, wait=wait, - wait_timeout=wait_timeout, kept=kept) - elif len(servers) < count: - # we have fewer servers than we need - if auto_increment: - # auto incrementing server numbers - names = [] - name_slice = count - len(servers) - numbers_to_use = available_numbers[:name_slice] - for number in numbers_to_use: - names.append(name % number) - else: - # We are not auto incrementing server numbers, - # create a list of 'name' that matches how many we need - names = [name] * (count - len(servers)) - else: - # we have the right number of servers, just return info - # about all of the matched servers - instances = [] - instance_ids = [] - for server in servers: - instances.append(rax_to_dict(server, 'server')) - instance_ids.append(server.id) - module.exit_json(changed=False, action=None, - instances=instances, - success=[], error=[], timeout=[], - instance_ids={'instances': instance_ids, - 'success': [], 'error': [], - 'timeout': []}) - else: # not called with exact_count=True - if group is not None: - if auto_increment: - # we are auto incrementing server numbers, but not with - # exact_count - numbers = set() - - # See if the name is a printf like string, if not append - # %d to the end - try: - name % 0 - except TypeError as e: - if e.message.startswith('not all'): - name = '%s%%d' % name - else: - module.fail_json(msg=e.message) - - # regex pattern to match printf formatting - pattern = re.sub(r'%\d*[sd]', r'(\d+)', name) - for server in cs.servers.list(): - # Ignore DELETED servers - if server.status == 'DELETED': - continue - if server.metadata.get('group') == group: - servers.append(server) - match = re.search(pattern, server.name) - if match: - number = int(match.group(1)) - numbers.add(number) - - number_range = xrange(count_offset, - count_offset + count + len(numbers)) - available_numbers = list(set(number_range) - .difference(numbers)) - names = [] - numbers_to_use = available_numbers[:count] - for number in numbers_to_use: - names.append(name % number) - else: - # Not auto incrementing - names = [name] * count - else: - # No group was specified, and not using exact_count - # Perform more simplistic matching - search_opts = { - 'name': '^%s$' % name, - 'flavor': flavor - } - servers = [] - for server in cs.servers.list(search_opts=search_opts): - # Ignore DELETED servers - if server.status == 'DELETED': - continue - - if not rax_find_server_image(module, server, image, - boot_volume): - continue - - # Ignore servers with non matching metadata - if server.metadata != meta: - continue - servers.append(server) - - if len(servers) >= count: - # We have more servers than were requested, don't do - # anything. Not running with exact_count=True, so we assume - # more is OK - instances = [] - for server in servers: - instances.append(rax_to_dict(server, 'server')) - - instance_ids = [i['id'] for i in instances] - module.exit_json(changed=False, action=None, - instances=instances, success=[], error=[], - timeout=[], - instance_ids={'instances': instance_ids, - 'success': [], 'error': [], - 'timeout': []}) - - # We need more servers to reach out target, create names for - # them, we aren't performing auto_increment here - names = [name] * (count - len(servers)) - - block_device_mapping_v2 = [] - if boot_from_volume: - mapping = { - 'boot_index': '0', - 'delete_on_termination': boot_volume_terminate, - 'destination_type': 'volume', - } - if image: - mapping.update({ - 'uuid': image, - 'source_type': 'image', - 'volume_size': boot_volume_size, - }) - image = None - elif boot_volume: - volume = rax_find_volume(module, pyrax, boot_volume) - mapping.update({ - 'uuid': pyrax.utils.get_id(volume), - 'source_type': 'volume', - }) - block_device_mapping_v2.append(mapping) - - create(module, names=names, flavor=flavor, image=image, - meta=meta, key_name=key_name, files=files, wait=wait, - wait_timeout=wait_timeout, disk_config=disk_config, group=group, - nics=nics, extra_create_args=extra_create_args, - user_data=user_data, config_drive=config_drive, - existing=servers, - block_device_mapping_v2=block_device_mapping_v2) - - elif state == 'absent': - if instance_ids is None: - # We weren't given an explicit list of server IDs to delete - # Let's match instead - search_opts = { - 'name': '^%s$' % name, - 'flavor': flavor - } - for server in cs.servers.list(search_opts=search_opts): - # Ignore DELETED servers - if server.status == 'DELETED': - continue - - if not rax_find_server_image(module, server, image, - boot_volume): - continue - - # Ignore servers with non matching metadata - if meta != server.metadata: - continue - - servers.append(server) - - # Build a list of server IDs to delete - instance_ids = [] - for server in servers: - if len(instance_ids) < count: - instance_ids.append(server.id) - else: - break - - if not instance_ids: - # No server IDs were matched for deletion, or no IDs were - # explicitly provided, just exit and don't do anything - module.exit_json(changed=False, action=None, instances=[], - success=[], error=[], timeout=[], - instance_ids={'instances': [], - 'success': [], 'error': [], - 'timeout': []}) - - delete(module, instance_ids=instance_ids, wait=wait, - wait_timeout=wait_timeout) - - -def main(): - argument_spec = rax_argument_spec() - argument_spec.update( - dict( - auto_increment=dict(default=True, type='bool'), - boot_from_volume=dict(default=False, type='bool'), - boot_volume=dict(type='str'), - boot_volume_size=dict(type='int', default=100), - boot_volume_terminate=dict(type='bool', default=False), - config_drive=dict(default=False, type='bool'), - count=dict(default=1, type='int'), - count_offset=dict(default=1, type='int'), - disk_config=dict(choices=['auto', 'manual']), - exact_count=dict(default=False, type='bool'), - extra_client_args=dict(type='dict', default={}), - extra_create_args=dict(type='dict', default={}), - files=dict(type='dict', default={}), - flavor=dict(), - group=dict(), - image=dict(), - instance_ids=dict(type='list', elements='str'), - key_name=dict(aliases=['keypair']), - meta=dict(type='dict', default={}), - name=dict(), - networks=dict(type='list', elements='str', default=['public', 'private']), - state=dict(default='present', choices=['present', 'absent']), - user_data=dict(no_log=True), - wait=dict(default=False, type='bool'), - wait_timeout=dict(default=300, type='int'), - ) - ) - - module = AnsibleModule( - argument_spec=argument_spec, - required_together=rax_required_together(), - ) - - if not HAS_PYRAX: - module.fail_json(msg='pyrax is required for this module') - - auto_increment = module.params.get('auto_increment') - boot_from_volume = module.params.get('boot_from_volume') - boot_volume = module.params.get('boot_volume') - boot_volume_size = module.params.get('boot_volume_size') - boot_volume_terminate = module.params.get('boot_volume_terminate') - config_drive = module.params.get('config_drive') - count = module.params.get('count') - count_offset = module.params.get('count_offset') - disk_config = module.params.get('disk_config') - if disk_config: - disk_config = disk_config.upper() - exact_count = module.params.get('exact_count', False) - extra_client_args = module.params.get('extra_client_args') - extra_create_args = module.params.get('extra_create_args') - files = module.params.get('files') - flavor = module.params.get('flavor') - group = module.params.get('group') - image = module.params.get('image') - instance_ids = module.params.get('instance_ids') - key_name = module.params.get('key_name') - meta = module.params.get('meta') - name = module.params.get('name') - networks = module.params.get('networks') - state = module.params.get('state') - user_data = module.params.get('user_data') - wait = module.params.get('wait') - wait_timeout = int(module.params.get('wait_timeout')) - - setup_rax_module(module, pyrax) - - if extra_client_args: - pyrax.cloudservers = pyrax.connect_to_cloudservers( - region=pyrax.cloudservers.client.region_name, - **extra_client_args) - client = pyrax.cloudservers.client - if 'bypass_url' in extra_client_args: - client.management_url = extra_client_args['bypass_url'] - - if pyrax.cloudservers is None: - module.fail_json(msg='Failed to instantiate client. This ' - 'typically indicates an invalid region or an ' - 'incorrectly capitalized region name.') - - cloudservers(module, state=state, name=name, flavor=flavor, - image=image, meta=meta, key_name=key_name, files=files, - wait=wait, wait_timeout=wait_timeout, disk_config=disk_config, - count=count, group=group, instance_ids=instance_ids, - exact_count=exact_count, networks=networks, - count_offset=count_offset, auto_increment=auto_increment, - extra_create_args=extra_create_args, user_data=user_data, - config_drive=config_drive, boot_from_volume=boot_from_volume, - boot_volume=boot_volume, boot_volume_size=boot_volume_size, - boot_volume_terminate=boot_volume_terminate) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/rax_cbs.py b/ansible_collections/community/general/plugins/modules/rax_cbs.py deleted file mode 100644 index 77e7cebad..000000000 --- a/ansible_collections/community/general/plugins/modules/rax_cbs.py +++ /dev/null @@ -1,235 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright 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 absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- -module: rax_cbs -short_description: Manipulate Rackspace Cloud Block Storage Volumes -description: - - Manipulate Rackspace Cloud Block Storage Volumes -attributes: - check_mode: - support: none - diff_mode: - support: none -options: - description: - type: str - description: - - Description to give the volume being created. - image: - type: str - description: - - Image to use for bootable volumes. Can be an C(id), C(human_id) or - C(name). This option requires C(pyrax>=1.9.3). - meta: - type: dict - default: {} - description: - - A hash of metadata to associate with the volume. - name: - type: str - description: - - Name to give the volume being created. - required: true - size: - type: int - description: - - Size of the volume to create in Gigabytes. - default: 100 - snapshot_id: - type: str - description: - - The id of the snapshot to create the volume from. - state: - type: str - description: - - Indicate desired state of the resource. - choices: - - present - - absent - default: present - volume_type: - type: str - description: - - Type of the volume being created. - choices: - - SATA - - SSD - default: SATA - wait: - description: - - Wait for the volume to be in state C(available) before returning. - type: bool - default: false - wait_timeout: - type: int - description: - - how long before wait gives up, in seconds. - default: 300 -author: - - "Christopher H. Laco (@claco)" - - "Matt Martz (@sivel)" -extends_documentation_fragment: - - community.general.rackspace.openstack - - community.general.attributes - -''' - -EXAMPLES = ''' -- name: Build a Block Storage Volume - gather_facts: false - hosts: local - connection: local - tasks: - - name: Storage volume create request - local_action: - module: rax_cbs - credentials: ~/.raxpub - name: my-volume - description: My Volume - volume_type: SSD - size: 150 - region: DFW - wait: true - state: present - meta: - app: my-cool-app - register: my_volume -''' - -from ansible_collections.community.general.plugins.module_utils.version import LooseVersion - -try: - import pyrax - HAS_PYRAX = True -except ImportError: - HAS_PYRAX = False - -from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.rax import (VOLUME_STATUS, rax_argument_spec, rax_find_image, rax_find_volume, - rax_required_together, rax_to_dict, setup_rax_module) - - -def cloud_block_storage(module, state, name, description, meta, size, - snapshot_id, volume_type, wait, wait_timeout, - image): - changed = False - volume = None - instance = {} - - cbs = pyrax.cloud_blockstorage - - if cbs is None: - module.fail_json(msg='Failed to instantiate client. This ' - 'typically indicates an invalid region or an ' - 'incorrectly capitalized region name.') - - if image: - # pyrax<1.9.3 did not have support for specifying an image when - # creating a volume which is required for bootable volumes - if LooseVersion(pyrax.version.version) < LooseVersion('1.9.3'): - module.fail_json(msg='Creating a bootable volume requires ' - 'pyrax>=1.9.3') - image = rax_find_image(module, pyrax, image) - - volume = rax_find_volume(module, pyrax, name) - - if state == 'present': - if not volume: - kwargs = dict() - if image: - kwargs['image'] = image - try: - volume = cbs.create(name, size=size, volume_type=volume_type, - description=description, - metadata=meta, - snapshot_id=snapshot_id, **kwargs) - changed = True - except Exception as e: - module.fail_json(msg='%s' % e.message) - else: - if wait: - attempts = wait_timeout // 5 - pyrax.utils.wait_for_build(volume, interval=5, - attempts=attempts) - - volume.get() - instance = rax_to_dict(volume) - - result = dict(changed=changed, volume=instance) - - if volume.status == 'error': - result['msg'] = '%s failed to build' % volume.id - elif wait and volume.status not in VOLUME_STATUS: - result['msg'] = 'Timeout waiting on %s' % volume.id - - if 'msg' in result: - module.fail_json(**result) - else: - module.exit_json(**result) - - elif state == 'absent': - if volume: - instance = rax_to_dict(volume) - try: - volume.delete() - changed = True - except Exception as e: - module.fail_json(msg='%s' % e.message) - - module.exit_json(changed=changed, volume=instance) - - -def main(): - argument_spec = rax_argument_spec() - argument_spec.update( - dict( - description=dict(type='str'), - image=dict(type='str'), - meta=dict(type='dict', default={}), - name=dict(required=True), - size=dict(type='int', default=100), - snapshot_id=dict(), - state=dict(default='present', choices=['present', 'absent']), - volume_type=dict(choices=['SSD', 'SATA'], default='SATA'), - wait=dict(type='bool', default=False), - wait_timeout=dict(type='int', default=300) - ) - ) - - module = AnsibleModule( - argument_spec=argument_spec, - required_together=rax_required_together() - ) - - if not HAS_PYRAX: - module.fail_json(msg='pyrax is required for this module') - - description = module.params.get('description') - image = module.params.get('image') - meta = module.params.get('meta') - name = module.params.get('name') - size = module.params.get('size') - snapshot_id = module.params.get('snapshot_id') - state = module.params.get('state') - volume_type = module.params.get('volume_type') - wait = module.params.get('wait') - wait_timeout = module.params.get('wait_timeout') - - setup_rax_module(module, pyrax) - - cloud_block_storage(module, state, name, description, meta, size, - snapshot_id, volume_type, wait, wait_timeout, - image) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/rax_cbs_attachments.py b/ansible_collections/community/general/plugins/modules/rax_cbs_attachments.py deleted file mode 100644 index 00b860a90..000000000 --- a/ansible_collections/community/general/plugins/modules/rax_cbs_attachments.py +++ /dev/null @@ -1,226 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright 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 absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- -module: rax_cbs_attachments -short_description: Manipulate Rackspace Cloud Block Storage Volume Attachments -description: - - Manipulate Rackspace Cloud Block Storage Volume Attachments -attributes: - check_mode: - support: none - diff_mode: - support: none -options: - device: - type: str - description: - - The device path to attach the volume to, e.g. /dev/xvde. - - Before 2.4 this was a required field. Now it can be left to null to auto assign the device name. - volume: - type: str - description: - - Name or id of the volume to attach/detach - required: true - server: - type: str - description: - - Name or id of the server to attach/detach - required: true - state: - type: str - description: - - Indicate desired state of the resource - choices: - - present - - absent - default: present - wait: - description: - - wait for the volume to be in 'in-use'/'available' state before returning - type: bool - default: false - wait_timeout: - type: int - description: - - how long before wait gives up, in seconds - default: 300 -author: - - "Christopher H. Laco (@claco)" - - "Matt Martz (@sivel)" -extends_documentation_fragment: - - community.general.rackspace.openstack - - community.general.attributes - -''' - -EXAMPLES = ''' -- name: Attach a Block Storage Volume - gather_facts: false - hosts: local - connection: local - tasks: - - name: Storage volume attach request - local_action: - module: rax_cbs_attachments - credentials: ~/.raxpub - volume: my-volume - server: my-server - device: /dev/xvdd - region: DFW - wait: true - state: present - register: my_volume -''' - -try: - import pyrax - HAS_PYRAX = True -except ImportError: - HAS_PYRAX = False - -from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.rax import (NON_CALLABLES, - rax_argument_spec, - rax_find_server, - rax_find_volume, - rax_required_together, - rax_to_dict, - setup_rax_module, - ) - - -def cloud_block_storage_attachments(module, state, volume, server, device, - wait, wait_timeout): - cbs = pyrax.cloud_blockstorage - cs = pyrax.cloudservers - - if cbs is None or cs is None: - module.fail_json(msg='Failed to instantiate client. This ' - 'typically indicates an invalid region or an ' - 'incorrectly capitalized region name.') - - changed = False - instance = {} - - volume = rax_find_volume(module, pyrax, volume) - - if not volume: - module.fail_json(msg='No matching storage volumes were found') - - if state == 'present': - server = rax_find_server(module, pyrax, server) - - if (volume.attachments and - volume.attachments[0]['server_id'] == server.id): - changed = False - elif volume.attachments: - module.fail_json(msg='Volume is attached to another server') - else: - try: - volume.attach_to_instance(server, mountpoint=device) - changed = True - except Exception as e: - module.fail_json(msg='%s' % e.message) - - volume.get() - - for key, value in vars(volume).items(): - if (isinstance(value, NON_CALLABLES) and - not key.startswith('_')): - instance[key] = value - - result = dict(changed=changed) - - if volume.status == 'error': - result['msg'] = '%s failed to build' % volume.id - elif wait: - attempts = wait_timeout // 5 - pyrax.utils.wait_until(volume, 'status', 'in-use', - interval=5, attempts=attempts) - - volume.get() - result['volume'] = rax_to_dict(volume) - - if 'msg' in result: - module.fail_json(**result) - else: - module.exit_json(**result) - - elif state == 'absent': - server = rax_find_server(module, pyrax, server) - - if (volume.attachments and - volume.attachments[0]['server_id'] == server.id): - try: - volume.detach() - if wait: - pyrax.utils.wait_until(volume, 'status', 'available', - interval=3, attempts=0, - verbose=False) - changed = True - except Exception as e: - module.fail_json(msg='%s' % e.message) - - volume.get() - changed = True - elif volume.attachments: - module.fail_json(msg='Volume is attached to another server') - - result = dict(changed=changed, volume=rax_to_dict(volume)) - - if volume.status == 'error': - result['msg'] = '%s failed to build' % volume.id - - if 'msg' in result: - module.fail_json(**result) - else: - module.exit_json(**result) - - module.exit_json(changed=changed, volume=instance) - - -def main(): - argument_spec = rax_argument_spec() - argument_spec.update( - dict( - device=dict(required=False), - volume=dict(required=True), - server=dict(required=True), - state=dict(default='present', choices=['present', 'absent']), - wait=dict(type='bool', default=False), - wait_timeout=dict(type='int', default=300) - ) - ) - - module = AnsibleModule( - argument_spec=argument_spec, - required_together=rax_required_together() - ) - - if not HAS_PYRAX: - module.fail_json(msg='pyrax is required for this module') - - device = module.params.get('device') - volume = module.params.get('volume') - server = module.params.get('server') - state = module.params.get('state') - wait = module.params.get('wait') - wait_timeout = module.params.get('wait_timeout') - - setup_rax_module(module, pyrax) - - cloud_block_storage_attachments(module, state, volume, server, device, - wait, wait_timeout) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/rax_cdb.py b/ansible_collections/community/general/plugins/modules/rax_cdb.py deleted file mode 100644 index 9538579fa..000000000 --- a/ansible_collections/community/general/plugins/modules/rax_cdb.py +++ /dev/null @@ -1,266 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright 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 absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- -module: rax_cdb -short_description: Create/delete or resize a Rackspace Cloud Databases instance -description: - - creates / deletes or resize a Rackspace Cloud Databases instance - and optionally waits for it to be 'running'. The name option needs to be - unique since it's used to identify the instance. -attributes: - check_mode: - support: none - diff_mode: - support: none -options: - name: - type: str - description: - - Name of the databases server instance - required: true - flavor: - type: int - description: - - flavor to use for the instance 1 to 6 (i.e. 512MB to 16GB) - default: 1 - volume: - type: int - description: - - Volume size of the database 1-150GB - default: 2 - cdb_type: - type: str - description: - - type of instance (i.e. MySQL, MariaDB, Percona) - default: MySQL - aliases: ['type'] - cdb_version: - type: str - description: - - version of database (MySQL supports 5.1 and 5.6, MariaDB supports 10, Percona supports 5.6) - - "The available choices are: V(5.1), V(5.6) and V(10)." - default: '5.6' - aliases: ['version'] - state: - type: str - description: - - Indicate desired state of the resource - choices: ['present', 'absent'] - default: present - wait: - description: - - wait for the instance to be in state 'running' before returning - type: bool - default: false - wait_timeout: - type: int - description: - - how long before wait gives up, in seconds - default: 300 -author: "Simon JAILLET (@jails)" -extends_documentation_fragment: - - community.general.rackspace - - community.general.rackspace.openstack - - community.general.attributes - -''' - -EXAMPLES = ''' -- name: Build a Cloud Databases - gather_facts: false - tasks: - - name: Server build request - local_action: - module: rax_cdb - credentials: ~/.raxpub - region: IAD - name: db-server1 - flavor: 1 - volume: 2 - cdb_type: MySQL - cdb_version: 5.6 - wait: true - state: present - register: rax_db_server -''' - -try: - import pyrax - HAS_PYRAX = True -except ImportError: - HAS_PYRAX = False - -from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.rax import rax_argument_spec, rax_required_together, rax_to_dict, setup_rax_module - - -def find_instance(name): - - cdb = pyrax.cloud_databases - instances = cdb.list() - if instances: - for instance in instances: - if instance.name == name: - return instance - return False - - -def save_instance(module, name, flavor, volume, cdb_type, cdb_version, wait, - wait_timeout): - - for arg, value in dict(name=name, flavor=flavor, - volume=volume, type=cdb_type, version=cdb_version - ).items(): - if not value: - module.fail_json(msg='%s is required for the "rax_cdb"' - ' module' % arg) - - if not (volume >= 1 and volume <= 150): - module.fail_json(msg='volume is required to be between 1 and 150') - - cdb = pyrax.cloud_databases - - flavors = [] - for item in cdb.list_flavors(): - flavors.append(item.id) - - if not (flavor in flavors): - module.fail_json(msg='unexisting flavor reference "%s"' % str(flavor)) - - changed = False - - instance = find_instance(name) - - if not instance: - action = 'create' - try: - instance = cdb.create(name=name, flavor=flavor, volume=volume, - type=cdb_type, version=cdb_version) - except Exception as e: - module.fail_json(msg='%s' % e.message) - else: - changed = True - - else: - action = None - - if instance.volume.size != volume: - action = 'resize' - if instance.volume.size > volume: - module.fail_json(changed=False, action=action, - msg='The new volume size must be larger than ' - 'the current volume size', - cdb=rax_to_dict(instance)) - instance.resize_volume(volume) - changed = True - - if int(instance.flavor.id) != flavor: - action = 'resize' - pyrax.utils.wait_until(instance, 'status', 'ACTIVE', - attempts=wait_timeout) - instance.resize(flavor) - changed = True - - if wait: - pyrax.utils.wait_until(instance, 'status', 'ACTIVE', - attempts=wait_timeout) - - if wait and instance.status != 'ACTIVE': - module.fail_json(changed=changed, action=action, - cdb=rax_to_dict(instance), - msg='Timeout waiting for "%s" databases instance to ' - 'be created' % name) - - module.exit_json(changed=changed, action=action, cdb=rax_to_dict(instance)) - - -def delete_instance(module, name, wait, wait_timeout): - - if not name: - module.fail_json(msg='name is required for the "rax_cdb" module') - - changed = False - - instance = find_instance(name) - if not instance: - module.exit_json(changed=False, action='delete') - - try: - instance.delete() - except Exception as e: - module.fail_json(msg='%s' % e.message) - else: - changed = True - - if wait: - pyrax.utils.wait_until(instance, 'status', 'SHUTDOWN', - attempts=wait_timeout) - - if wait and instance.status != 'SHUTDOWN': - module.fail_json(changed=changed, action='delete', - cdb=rax_to_dict(instance), - msg='Timeout waiting for "%s" databases instance to ' - 'be deleted' % name) - - module.exit_json(changed=changed, action='delete', - cdb=rax_to_dict(instance)) - - -def rax_cdb(module, state, name, flavor, volume, cdb_type, cdb_version, wait, - wait_timeout): - - # act on the state - if state == 'present': - save_instance(module, name, flavor, volume, cdb_type, cdb_version, wait, - wait_timeout) - elif state == 'absent': - delete_instance(module, name, wait, wait_timeout) - - -def main(): - argument_spec = rax_argument_spec() - argument_spec.update( - dict( - name=dict(type='str', required=True), - flavor=dict(type='int', default=1), - volume=dict(type='int', default=2), - cdb_type=dict(type='str', default='MySQL', aliases=['type']), - cdb_version=dict(type='str', default='5.6', aliases=['version']), - state=dict(default='present', choices=['present', 'absent']), - wait=dict(type='bool', default=False), - wait_timeout=dict(type='int', default=300), - ) - ) - - module = AnsibleModule( - argument_spec=argument_spec, - required_together=rax_required_together(), - ) - - if not HAS_PYRAX: - module.fail_json(msg='pyrax is required for this module') - - name = module.params.get('name') - flavor = module.params.get('flavor') - volume = module.params.get('volume') - cdb_type = module.params.get('cdb_type') - cdb_version = module.params.get('cdb_version') - state = module.params.get('state') - wait = module.params.get('wait') - wait_timeout = module.params.get('wait_timeout') - - setup_rax_module(module, pyrax) - rax_cdb(module, state, name, flavor, volume, cdb_type, cdb_version, wait, wait_timeout) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/rax_cdb_database.py b/ansible_collections/community/general/plugins/modules/rax_cdb_database.py deleted file mode 100644 index b0db11814..000000000 --- a/ansible_collections/community/general/plugins/modules/rax_cdb_database.py +++ /dev/null @@ -1,179 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright 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 absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' -module: rax_cdb_database -short_description: Create / delete a database in the Cloud Databases -description: - - create / delete a database in the Cloud Databases. -attributes: - check_mode: - support: none - diff_mode: - support: none -options: - cdb_id: - type: str - description: - - The databases server UUID - required: true - name: - type: str - description: - - Name to give to the database - required: true - character_set: - type: str - description: - - Set of symbols and encodings - default: 'utf8' - collate: - type: str - description: - - Set of rules for comparing characters in a character set - default: 'utf8_general_ci' - state: - type: str - description: - - Indicate desired state of the resource - choices: ['present', 'absent'] - default: present -author: "Simon JAILLET (@jails)" -extends_documentation_fragment: - - community.general.rackspace - - community.general.rackspace.openstack - - community.general.attributes - -''' - -EXAMPLES = ''' -- name: Build a database in Cloud Databases - tasks: - - name: Database build request - local_action: - module: rax_cdb_database - credentials: ~/.raxpub - region: IAD - cdb_id: 323e7ce0-9cb0-11e3-a5e2-0800200c9a66 - name: db1 - state: present - register: rax_db_database -''' - -try: - import pyrax - HAS_PYRAX = True -except ImportError: - HAS_PYRAX = False - -from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.rax import rax_argument_spec, rax_required_together, rax_to_dict, setup_rax_module - - -def find_database(instance, name): - try: - database = instance.get_database(name) - except Exception: - return False - - return database - - -def save_database(module, cdb_id, name, character_set, collate): - cdb = pyrax.cloud_databases - - try: - instance = cdb.get(cdb_id) - except Exception as e: - module.fail_json(msg='%s' % e.message) - - changed = False - - database = find_database(instance, name) - - if not database: - try: - database = instance.create_database(name=name, - character_set=character_set, - collate=collate) - except Exception as e: - module.fail_json(msg='%s' % e.message) - else: - changed = True - - module.exit_json(changed=changed, action='create', - database=rax_to_dict(database)) - - -def delete_database(module, cdb_id, name): - cdb = pyrax.cloud_databases - - try: - instance = cdb.get(cdb_id) - except Exception as e: - module.fail_json(msg='%s' % e.message) - - changed = False - - database = find_database(instance, name) - - if database: - try: - database.delete() - except Exception as e: - module.fail_json(msg='%s' % e.message) - else: - changed = True - - module.exit_json(changed=changed, action='delete', - database=rax_to_dict(database)) - - -def rax_cdb_database(module, state, cdb_id, name, character_set, collate): - - # act on the state - if state == 'present': - save_database(module, cdb_id, name, character_set, collate) - elif state == 'absent': - delete_database(module, cdb_id, name) - - -def main(): - argument_spec = rax_argument_spec() - argument_spec.update( - dict( - cdb_id=dict(type='str', required=True), - name=dict(type='str', required=True), - character_set=dict(type='str', default='utf8'), - collate=dict(type='str', default='utf8_general_ci'), - state=dict(default='present', choices=['present', 'absent']) - ) - ) - - module = AnsibleModule( - argument_spec=argument_spec, - required_together=rax_required_together(), - ) - - if not HAS_PYRAX: - module.fail_json(msg='pyrax is required for this module') - - cdb_id = module.params.get('cdb_id') - name = module.params.get('name') - character_set = module.params.get('character_set') - collate = module.params.get('collate') - state = module.params.get('state') - - setup_rax_module(module, pyrax) - rax_cdb_database(module, state, cdb_id, name, character_set, collate) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/rax_cdb_user.py b/ansible_collections/community/general/plugins/modules/rax_cdb_user.py deleted file mode 100644 index 6ee86c4fe..000000000 --- a/ansible_collections/community/general/plugins/modules/rax_cdb_user.py +++ /dev/null @@ -1,227 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright 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 absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- -module: rax_cdb_user -short_description: Create / delete a Rackspace Cloud Database -description: - - create / delete a database in the Cloud Databases. -attributes: - check_mode: - support: none - diff_mode: - support: none -options: - cdb_id: - type: str - description: - - The databases server UUID - required: true - db_username: - type: str - description: - - Name of the database user - required: true - db_password: - type: str - description: - - Database user password - required: true - databases: - type: list - elements: str - description: - - Name of the databases that the user can access - default: [] - host: - type: str - description: - - Specifies the host from which a user is allowed to connect to - the database. Possible values are a string containing an IPv4 address - or "%" to allow connecting from any host - default: '%' - state: - type: str - description: - - Indicate desired state of the resource - choices: ['present', 'absent'] - default: present -author: "Simon JAILLET (@jails)" -extends_documentation_fragment: - - community.general.rackspace - - community.general.rackspace.openstack - - community.general.attributes - -''' - -EXAMPLES = ''' -- name: Build a user in Cloud Databases - tasks: - - name: User build request - local_action: - module: rax_cdb_user - credentials: ~/.raxpub - region: IAD - cdb_id: 323e7ce0-9cb0-11e3-a5e2-0800200c9a66 - db_username: user1 - db_password: user1 - databases: ['db1'] - state: present - register: rax_db_user -''' - -try: - import pyrax - HAS_PYRAX = True -except ImportError: - HAS_PYRAX = False - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.common.text.converters import to_text -from ansible_collections.community.general.plugins.module_utils.rax import rax_argument_spec, rax_required_together, rax_to_dict, setup_rax_module - - -def find_user(instance, name): - try: - user = instance.get_user(name) - except Exception: - return False - - return user - - -def save_user(module, cdb_id, name, password, databases, host): - - for arg, value in dict(cdb_id=cdb_id, name=name).items(): - if not value: - module.fail_json(msg='%s is required for the "rax_cdb_user" ' - 'module' % arg) - - cdb = pyrax.cloud_databases - - try: - instance = cdb.get(cdb_id) - except Exception as e: - module.fail_json(msg='%s' % e.message) - - changed = False - - user = find_user(instance, name) - - if not user: - action = 'create' - try: - user = instance.create_user(name=name, - password=password, - database_names=databases, - host=host) - except Exception as e: - module.fail_json(msg='%s' % e.message) - else: - changed = True - else: - action = 'update' - - if user.host != host: - changed = True - - user.update(password=password, host=host) - - former_dbs = set([item.name for item in user.list_user_access()]) - databases = set(databases) - - if databases != former_dbs: - try: - revoke_dbs = [db for db in former_dbs if db not in databases] - user.revoke_user_access(db_names=revoke_dbs) - - new_dbs = [db for db in databases if db not in former_dbs] - user.grant_user_access(db_names=new_dbs) - except Exception as e: - module.fail_json(msg='%s' % e.message) - else: - changed = True - - module.exit_json(changed=changed, action=action, user=rax_to_dict(user)) - - -def delete_user(module, cdb_id, name): - - for arg, value in dict(cdb_id=cdb_id, name=name).items(): - if not value: - module.fail_json(msg='%s is required for the "rax_cdb_user"' - ' module' % arg) - - cdb = pyrax.cloud_databases - - try: - instance = cdb.get(cdb_id) - except Exception as e: - module.fail_json(msg='%s' % e.message) - - changed = False - - user = find_user(instance, name) - - if user: - try: - user.delete() - except Exception as e: - module.fail_json(msg='%s' % e.message) - else: - changed = True - - module.exit_json(changed=changed, action='delete') - - -def rax_cdb_user(module, state, cdb_id, name, password, databases, host): - - # act on the state - if state == 'present': - save_user(module, cdb_id, name, password, databases, host) - elif state == 'absent': - delete_user(module, cdb_id, name) - - -def main(): - argument_spec = rax_argument_spec() - argument_spec.update( - dict( - cdb_id=dict(type='str', required=True), - db_username=dict(type='str', required=True), - db_password=dict(type='str', required=True, no_log=True), - databases=dict(type='list', elements='str', default=[]), - host=dict(type='str', default='%'), - state=dict(default='present', choices=['present', 'absent']) - ) - ) - - module = AnsibleModule( - argument_spec=argument_spec, - required_together=rax_required_together(), - ) - - if not HAS_PYRAX: - module.fail_json(msg='pyrax is required for this module') - - cdb_id = module.params.get('cdb_id') - name = module.params.get('db_username') - password = module.params.get('db_password') - databases = module.params.get('databases') - host = to_text(module.params.get('host'), errors='surrogate_or_strict') - state = module.params.get('state') - - setup_rax_module(module, pyrax) - rax_cdb_user(module, state, cdb_id, name, password, databases, host) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/rax_clb.py b/ansible_collections/community/general/plugins/modules/rax_clb.py deleted file mode 100644 index 23c795f39..000000000 --- a/ansible_collections/community/general/plugins/modules/rax_clb.py +++ /dev/null @@ -1,320 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright 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 absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- -module: rax_clb -short_description: Create / delete a load balancer in Rackspace Public Cloud -description: - - creates / deletes a Rackspace Public Cloud load balancer. -attributes: - check_mode: - support: none - diff_mode: - support: none -options: - algorithm: - type: str - description: - - algorithm for the balancer being created - choices: - - RANDOM - - LEAST_CONNECTIONS - - ROUND_ROBIN - - WEIGHTED_LEAST_CONNECTIONS - - WEIGHTED_ROUND_ROBIN - default: LEAST_CONNECTIONS - meta: - type: dict - default: {} - description: - - A hash of metadata to associate with the instance - name: - type: str - description: - - Name to give the load balancer - required: true - port: - type: int - description: - - Port for the balancer being created - default: 80 - protocol: - type: str - description: - - Protocol for the balancer being created - choices: - - DNS_TCP - - DNS_UDP - - FTP - - HTTP - - HTTPS - - IMAPS - - IMAPv4 - - LDAP - - LDAPS - - MYSQL - - POP3 - - POP3S - - SMTP - - TCP - - TCP_CLIENT_FIRST - - UDP - - UDP_STREAM - - SFTP - default: HTTP - state: - type: str - description: - - Indicate desired state of the resource - choices: - - present - - absent - default: present - timeout: - type: int - description: - - timeout for communication between the balancer and the node - default: 30 - type: - type: str - description: - - type of interface for the balancer being created - choices: - - PUBLIC - - SERVICENET - default: PUBLIC - vip_id: - type: str - description: - - Virtual IP ID to use when creating the load balancer for purposes of - sharing an IP with another load balancer of another protocol - wait: - description: - - wait for the balancer to be in state 'running' before returning - type: bool - default: false - wait_timeout: - type: int - description: - - how long before wait gives up, in seconds - default: 300 -author: - - "Christopher H. Laco (@claco)" - - "Matt Martz (@sivel)" -extends_documentation_fragment: - - community.general.rackspace - - community.general.rackspace.openstack - - community.general.attributes - -''' - -EXAMPLES = ''' -- name: Build a Load Balancer - gather_facts: false - hosts: local - connection: local - tasks: - - name: Load Balancer create request - local_action: - module: rax_clb - credentials: ~/.raxpub - name: my-lb - port: 8080 - protocol: HTTP - type: SERVICENET - timeout: 30 - region: DFW - wait: true - state: present - meta: - app: my-cool-app - register: my_lb -''' - - -try: - import pyrax - HAS_PYRAX = True -except ImportError: - HAS_PYRAX = False - -from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.rax import (CLB_ALGORITHMS, - CLB_PROTOCOLS, - rax_argument_spec, - rax_required_together, - rax_to_dict, - setup_rax_module, - ) - - -def cloud_load_balancer(module, state, name, meta, algorithm, port, protocol, - vip_type, timeout, wait, wait_timeout, vip_id): - if int(timeout) < 30: - module.fail_json(msg='"timeout" must be greater than or equal to 30') - - changed = False - balancers = [] - - clb = pyrax.cloud_loadbalancers - if not clb: - module.fail_json(msg='Failed to instantiate client. This ' - 'typically indicates an invalid region or an ' - 'incorrectly capitalized region name.') - - balancer_list = clb.list() - while balancer_list: - retrieved = clb.list(marker=balancer_list.pop().id) - balancer_list.extend(retrieved) - if len(retrieved) < 2: - break - - for balancer in balancer_list: - if name != balancer.name and name != balancer.id: - continue - - balancers.append(balancer) - - if len(balancers) > 1: - module.fail_json(msg='Multiple Load Balancers were matched by name, ' - 'try using the Load Balancer ID instead') - - if state == 'present': - if isinstance(meta, dict): - metadata = [dict(key=k, value=v) for k, v in meta.items()] - - if not balancers: - try: - virtual_ips = [clb.VirtualIP(type=vip_type, id=vip_id)] - balancer = clb.create(name, metadata=metadata, port=port, - algorithm=algorithm, protocol=protocol, - timeout=timeout, virtual_ips=virtual_ips) - changed = True - except Exception as e: - module.fail_json(msg='%s' % e.message) - else: - balancer = balancers[0] - setattr(balancer, 'metadata', - [dict(key=k, value=v) for k, v in - balancer.get_metadata().items()]) - atts = { - 'name': name, - 'algorithm': algorithm, - 'port': port, - 'protocol': protocol, - 'timeout': timeout - } - for att, value in atts.items(): - current = getattr(balancer, att) - if current != value: - changed = True - - if changed: - balancer.update(**atts) - - if balancer.metadata != metadata: - balancer.set_metadata(meta) - changed = True - - virtual_ips = [clb.VirtualIP(type=vip_type)] - current_vip_types = set([v.type for v in balancer.virtual_ips]) - vip_types = set([v.type for v in virtual_ips]) - if current_vip_types != vip_types: - module.fail_json(msg='Load balancer Virtual IP type cannot ' - 'be changed') - - if wait: - attempts = wait_timeout // 5 - pyrax.utils.wait_for_build(balancer, interval=5, attempts=attempts) - - balancer.get() - instance = rax_to_dict(balancer, 'clb') - - result = dict(changed=changed, balancer=instance) - - if balancer.status == 'ERROR': - result['msg'] = '%s failed to build' % balancer.id - elif wait and balancer.status not in ('ACTIVE', 'ERROR'): - result['msg'] = 'Timeout waiting on %s' % balancer.id - - if 'msg' in result: - module.fail_json(**result) - else: - module.exit_json(**result) - - elif state == 'absent': - if balancers: - balancer = balancers[0] - try: - balancer.delete() - changed = True - except Exception as e: - module.fail_json(msg='%s' % e.message) - - instance = rax_to_dict(balancer, 'clb') - - if wait: - attempts = wait_timeout // 5 - pyrax.utils.wait_until(balancer, 'status', ('DELETED'), - interval=5, attempts=attempts) - else: - instance = {} - - module.exit_json(changed=changed, balancer=instance) - - -def main(): - argument_spec = rax_argument_spec() - argument_spec.update( - dict( - algorithm=dict(choices=CLB_ALGORITHMS, - default='LEAST_CONNECTIONS'), - meta=dict(type='dict', default={}), - name=dict(required=True), - port=dict(type='int', default=80), - protocol=dict(choices=CLB_PROTOCOLS, default='HTTP'), - state=dict(default='present', choices=['present', 'absent']), - timeout=dict(type='int', default=30), - type=dict(choices=['PUBLIC', 'SERVICENET'], default='PUBLIC'), - vip_id=dict(), - wait=dict(type='bool', default=False), - wait_timeout=dict(type='int', default=300), - ) - ) - - module = AnsibleModule( - argument_spec=argument_spec, - required_together=rax_required_together(), - ) - - if not HAS_PYRAX: - module.fail_json(msg='pyrax is required for this module') - - algorithm = module.params.get('algorithm') - meta = module.params.get('meta') - name = module.params.get('name') - port = module.params.get('port') - protocol = module.params.get('protocol') - state = module.params.get('state') - timeout = int(module.params.get('timeout')) - vip_id = module.params.get('vip_id') - vip_type = module.params.get('type') - wait = module.params.get('wait') - wait_timeout = int(module.params.get('wait_timeout')) - - setup_rax_module(module, pyrax) - - cloud_load_balancer(module, state, name, meta, algorithm, port, protocol, - vip_type, timeout, wait, wait_timeout, vip_id) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/rax_clb_nodes.py b/ansible_collections/community/general/plugins/modules/rax_clb_nodes.py deleted file mode 100644 index c076dced7..000000000 --- a/ansible_collections/community/general/plugins/modules/rax_clb_nodes.py +++ /dev/null @@ -1,291 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright 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 absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- -module: rax_clb_nodes -short_description: Add, modify and remove nodes from a Rackspace Cloud Load Balancer -description: - - Adds, modifies and removes nodes from a Rackspace Cloud Load Balancer -attributes: - check_mode: - support: none - diff_mode: - support: none -options: - address: - type: str - required: false - description: - - IP address or domain name of the node - condition: - type: str - required: false - choices: - - enabled - - disabled - - draining - description: - - Condition for the node, which determines its role within the load - balancer - load_balancer_id: - type: int - required: true - description: - - Load balancer id - node_id: - type: int - required: false - description: - - Node id - port: - type: int - required: false - description: - - Port number of the load balanced service on the node - state: - type: str - required: false - default: "present" - choices: - - present - - absent - description: - - Indicate desired state of the node - type: - type: str - required: false - choices: - - primary - - secondary - description: - - Type of node - wait: - required: false - default: false - type: bool - description: - - Wait for the load balancer to become active before returning - wait_timeout: - type: int - required: false - default: 30 - description: - - How long to wait before giving up and returning an error - weight: - type: int - required: false - description: - - Weight of node - virtualenv: - type: path - description: - - Virtualenv to execute this module in -author: "Lukasz Kawczynski (@neuroid)" -extends_documentation_fragment: - - community.general.rackspace - - community.general.rackspace.openstack - - community.general.attributes - -''' - -EXAMPLES = ''' -- name: Add a new node to the load balancer - local_action: - module: rax_clb_nodes - load_balancer_id: 71 - address: 10.2.2.3 - port: 80 - condition: enabled - type: primary - wait: true - credentials: /path/to/credentials - -- name: Drain connections from a node - local_action: - module: rax_clb_nodes - load_balancer_id: 71 - node_id: 410 - condition: draining - wait: true - credentials: /path/to/credentials - -- name: Remove a node from the load balancer - local_action: - module: rax_clb_nodes - load_balancer_id: 71 - node_id: 410 - state: absent - wait: true - credentials: /path/to/credentials -''' - -import os - -try: - import pyrax - HAS_PYRAX = True -except ImportError: - HAS_PYRAX = False - -from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.rax import rax_argument_spec, rax_clb_node_to_dict, rax_required_together, setup_rax_module - - -def _activate_virtualenv(path): - activate_this = os.path.join(path, 'bin', 'activate_this.py') - with open(activate_this) as f: - code = compile(f.read(), activate_this, 'exec') - exec(code) - - -def _get_node(lb, node_id=None, address=None, port=None): - """Return a matching node""" - for node in getattr(lb, 'nodes', []): - match_list = [] - if node_id is not None: - match_list.append(getattr(node, 'id', None) == node_id) - if address is not None: - match_list.append(getattr(node, 'address', None) == address) - if port is not None: - match_list.append(getattr(node, 'port', None) == port) - - if match_list and all(match_list): - return node - - return None - - -def main(): - argument_spec = rax_argument_spec() - argument_spec.update( - dict( - address=dict(), - condition=dict(choices=['enabled', 'disabled', 'draining']), - load_balancer_id=dict(required=True, type='int'), - node_id=dict(type='int'), - port=dict(type='int'), - state=dict(default='present', choices=['present', 'absent']), - type=dict(choices=['primary', 'secondary']), - virtualenv=dict(type='path'), - wait=dict(default=False, type='bool'), - wait_timeout=dict(default=30, type='int'), - weight=dict(type='int'), - ) - ) - - module = AnsibleModule( - argument_spec=argument_spec, - required_together=rax_required_together(), - ) - - if not HAS_PYRAX: - module.fail_json(msg='pyrax is required for this module') - - address = module.params['address'] - condition = (module.params['condition'] and - module.params['condition'].upper()) - load_balancer_id = module.params['load_balancer_id'] - node_id = module.params['node_id'] - port = module.params['port'] - state = module.params['state'] - typ = module.params['type'] and module.params['type'].upper() - virtualenv = module.params['virtualenv'] - wait = module.params['wait'] - wait_timeout = module.params['wait_timeout'] or 1 - weight = module.params['weight'] - - if virtualenv: - try: - _activate_virtualenv(virtualenv) - except IOError as e: - module.fail_json(msg='Failed to activate virtualenv %s (%s)' % ( - virtualenv, e)) - - setup_rax_module(module, pyrax) - - if not pyrax.cloud_loadbalancers: - module.fail_json(msg='Failed to instantiate client. This ' - 'typically indicates an invalid region or an ' - 'incorrectly capitalized region name.') - - try: - lb = pyrax.cloud_loadbalancers.get(load_balancer_id) - except pyrax.exc.PyraxException as e: - module.fail_json(msg='%s' % e.message) - - node = _get_node(lb, node_id, address, port) - - result = rax_clb_node_to_dict(node) - - if state == 'absent': - if not node: # Removing a non-existent node - module.exit_json(changed=False, state=state) - try: - lb.delete_node(node) - result = {} - except pyrax.exc.NotFound: - module.exit_json(changed=False, state=state) - except pyrax.exc.PyraxException as e: - module.fail_json(msg='%s' % e.message) - else: # present - if not node: - if node_id: # Updating a non-existent node - msg = 'Node %d not found' % node_id - if lb.nodes: - msg += (' (available nodes: %s)' % - ', '.join([str(x.id) for x in lb.nodes])) - module.fail_json(msg=msg) - else: # Creating a new node - try: - node = pyrax.cloudloadbalancers.Node( - address=address, port=port, condition=condition, - weight=weight, type=typ) - resp, body = lb.add_nodes([node]) - result.update(body['nodes'][0]) - except pyrax.exc.PyraxException as e: - module.fail_json(msg='%s' % e.message) - else: # Updating an existing node - mutable = { - 'condition': condition, - 'type': typ, - 'weight': weight, - } - - for name in list(mutable): - value = mutable[name] - if value is None or value == getattr(node, name): - mutable.pop(name) - - if not mutable: - module.exit_json(changed=False, state=state, node=result) - - try: - # The diff has to be set explicitly to update node's weight and - # type; this should probably be fixed in pyrax - lb.update_node(node, diff=mutable) - result.update(mutable) - except pyrax.exc.PyraxException as e: - module.fail_json(msg='%s' % e.message) - - if wait: - pyrax.utils.wait_until(lb, "status", "ACTIVE", interval=1, - attempts=wait_timeout) - if lb.status != 'ACTIVE': - module.fail_json( - msg='Load balancer not active after %ds (current status: %s)' % - (wait_timeout, lb.status.lower())) - - kwargs = {'node': result} if result else {} - module.exit_json(changed=True, state=state, **kwargs) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/rax_clb_ssl.py b/ansible_collections/community/general/plugins/modules/rax_clb_ssl.py deleted file mode 100644 index b794130cf..000000000 --- a/ansible_collections/community/general/plugins/modules/rax_clb_ssl.py +++ /dev/null @@ -1,289 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright 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 absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' -module: rax_clb_ssl -short_description: Manage SSL termination for a Rackspace Cloud Load Balancer -description: -- Set up, reconfigure, or remove SSL termination for an existing load balancer. -attributes: - check_mode: - support: none - diff_mode: - support: none -options: - loadbalancer: - type: str - description: - - Name or ID of the load balancer on which to manage SSL termination. - required: true - state: - type: str - description: - - If set to "present", SSL termination will be added to this load balancer. - - If "absent", SSL termination will be removed instead. - choices: - - present - - absent - default: present - enabled: - description: - - If set to "false", temporarily disable SSL termination without discarding - - existing credentials. - default: true - type: bool - private_key: - type: str - description: - - The private SSL key as a string in PEM format. - certificate: - type: str - description: - - The public SSL certificates as a string in PEM format. - intermediate_certificate: - type: str - description: - - One or more intermediate certificate authorities as a string in PEM - - format, concatenated into a single string. - secure_port: - type: int - description: - - The port to listen for secure traffic. - default: 443 - secure_traffic_only: - description: - - If "true", the load balancer will *only* accept secure traffic. - default: false - type: bool - https_redirect: - description: - - If "true", the load balancer will redirect HTTP traffic to HTTPS. - - Requires "secure_traffic_only" to be true. Incurs an implicit wait if SSL - - termination is also applied or removed. - type: bool - wait: - description: - - Wait for the balancer to be in state "running" before turning. - default: false - type: bool - wait_timeout: - type: int - description: - - How long before "wait" gives up, in seconds. - default: 300 -author: Ash Wilson (@smashwilson) -extends_documentation_fragment: - - community.general.rackspace - - community.general.rackspace.openstack - - community.general.attributes - -''' - -EXAMPLES = ''' -- name: Enable SSL termination on a load balancer - community.general.rax_clb_ssl: - loadbalancer: the_loadbalancer - state: present - private_key: "{{ lookup('file', 'credentials/server.key' ) }}" - certificate: "{{ lookup('file', 'credentials/server.crt' ) }}" - intermediate_certificate: "{{ lookup('file', 'credentials/trust-chain.crt') }}" - secure_traffic_only: true - wait: true - -- name: Disable SSL termination - community.general.rax_clb_ssl: - loadbalancer: "{{ registered_lb.balancer.id }}" - state: absent - wait: true -''' - -try: - import pyrax - HAS_PYRAX = True -except ImportError: - HAS_PYRAX = False - -from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.rax import (rax_argument_spec, - rax_find_loadbalancer, - rax_required_together, - rax_to_dict, - setup_rax_module, - ) - - -def cloud_load_balancer_ssl(module, loadbalancer, state, enabled, private_key, - certificate, intermediate_certificate, secure_port, - secure_traffic_only, https_redirect, - wait, wait_timeout): - # Validate arguments. - - if state == 'present': - if not private_key: - module.fail_json(msg="private_key must be provided.") - else: - private_key = private_key.strip() - - if not certificate: - module.fail_json(msg="certificate must be provided.") - else: - certificate = certificate.strip() - - attempts = wait_timeout // 5 - - # Locate the load balancer. - - balancer = rax_find_loadbalancer(module, pyrax, loadbalancer) - existing_ssl = balancer.get_ssl_termination() - - changed = False - - if state == 'present': - # Apply or reconfigure SSL termination on the load balancer. - ssl_attrs = dict( - securePort=secure_port, - privatekey=private_key, - certificate=certificate, - intermediateCertificate=intermediate_certificate, - enabled=enabled, - secureTrafficOnly=secure_traffic_only - ) - - needs_change = False - - if existing_ssl: - for ssl_attr, value in ssl_attrs.items(): - if ssl_attr == 'privatekey': - # The private key is not included in get_ssl_termination's - # output (as it shouldn't be). Also, if you're changing the - # private key, you'll also be changing the certificate, - # so we don't lose anything by not checking it. - continue - - if value is not None and existing_ssl.get(ssl_attr) != value: - # module.fail_json(msg='Unnecessary change', attr=ssl_attr, value=value, existing=existing_ssl.get(ssl_attr)) - needs_change = True - else: - needs_change = True - - if needs_change: - try: - balancer.add_ssl_termination(**ssl_attrs) - except pyrax.exceptions.PyraxException as e: - module.fail_json(msg='%s' % e.message) - changed = True - elif state == 'absent': - # Remove SSL termination if it's already configured. - if existing_ssl: - try: - balancer.delete_ssl_termination() - except pyrax.exceptions.PyraxException as e: - module.fail_json(msg='%s' % e.message) - changed = True - - if https_redirect is not None and balancer.httpsRedirect != https_redirect: - if changed: - # This wait is unavoidable because load balancers are immutable - # while the SSL termination changes above are being applied. - pyrax.utils.wait_for_build(balancer, interval=5, attempts=attempts) - - try: - balancer.update(httpsRedirect=https_redirect) - except pyrax.exceptions.PyraxException as e: - module.fail_json(msg='%s' % e.message) - changed = True - - if changed and wait: - pyrax.utils.wait_for_build(balancer, interval=5, attempts=attempts) - - balancer.get() - new_ssl_termination = balancer.get_ssl_termination() - - # Intentionally omit the private key from the module output, so you don't - # accidentally echo it with `ansible-playbook -v` or `debug`, and the - # certificate, which is just long. Convert other attributes to snake_case - # and include https_redirect at the top-level. - if new_ssl_termination: - new_ssl = dict( - enabled=new_ssl_termination['enabled'], - secure_port=new_ssl_termination['securePort'], - secure_traffic_only=new_ssl_termination['secureTrafficOnly'] - ) - else: - new_ssl = None - - result = dict( - changed=changed, - https_redirect=balancer.httpsRedirect, - ssl_termination=new_ssl, - balancer=rax_to_dict(balancer, 'clb') - ) - success = True - - if balancer.status == 'ERROR': - result['msg'] = '%s failed to build' % balancer.id - success = False - elif wait and balancer.status not in ('ACTIVE', 'ERROR'): - result['msg'] = 'Timeout waiting on %s' % balancer.id - success = False - - if success: - module.exit_json(**result) - else: - module.fail_json(**result) - - -def main(): - argument_spec = rax_argument_spec() - argument_spec.update(dict( - loadbalancer=dict(required=True), - state=dict(default='present', choices=['present', 'absent']), - enabled=dict(type='bool', default=True), - private_key=dict(no_log=True), - certificate=dict(), - intermediate_certificate=dict(), - secure_port=dict(type='int', default=443), - secure_traffic_only=dict(type='bool', default=False), - https_redirect=dict(type='bool'), - wait=dict(type='bool', default=False), - wait_timeout=dict(type='int', default=300) - )) - - module = AnsibleModule( - argument_spec=argument_spec, - required_together=rax_required_together(), - ) - - if not HAS_PYRAX: - module.fail_json(msg='pyrax is required for this module.') - - loadbalancer = module.params.get('loadbalancer') - state = module.params.get('state') - enabled = module.boolean(module.params.get('enabled')) - private_key = module.params.get('private_key') - certificate = module.params.get('certificate') - intermediate_certificate = module.params.get('intermediate_certificate') - secure_port = module.params.get('secure_port') - secure_traffic_only = module.boolean(module.params.get('secure_traffic_only')) - https_redirect = module.boolean(module.params.get('https_redirect')) - wait = module.boolean(module.params.get('wait')) - wait_timeout = module.params.get('wait_timeout') - - setup_rax_module(module, pyrax) - - cloud_load_balancer_ssl( - module, loadbalancer, state, enabled, private_key, certificate, - intermediate_certificate, secure_port, secure_traffic_only, - https_redirect, wait, wait_timeout - ) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/rax_dns.py b/ansible_collections/community/general/plugins/modules/rax_dns.py deleted file mode 100644 index 31782cd88..000000000 --- a/ansible_collections/community/general/plugins/modules/rax_dns.py +++ /dev/null @@ -1,180 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright 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 absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- -module: rax_dns -short_description: Manage domains on Rackspace Cloud DNS -description: - - Manage domains on Rackspace Cloud DNS -attributes: - check_mode: - support: none - diff_mode: - support: none -options: - comment: - type: str - description: - - Brief description of the domain. Maximum length of 160 characters - email: - type: str - description: - - Email address of the domain administrator - name: - type: str - description: - - Domain name to create - state: - type: str - description: - - Indicate desired state of the resource - choices: - - present - - absent - default: present - ttl: - type: int - description: - - Time to live of domain in seconds - default: 3600 -notes: - - "It is recommended that plays utilizing this module be run with - C(serial: 1) to avoid exceeding the API request limit imposed by - the Rackspace CloudDNS API" -author: "Matt Martz (@sivel)" -extends_documentation_fragment: - - community.general.rackspace - - community.general.rackspace.openstack - - community.general.attributes - -''' - -EXAMPLES = ''' -- name: Create domain - hosts: all - gather_facts: false - tasks: - - name: Domain create request - local_action: - module: rax_dns - credentials: ~/.raxpub - name: example.org - email: admin@example.org - register: rax_dns -''' - -try: - import pyrax - HAS_PYRAX = True -except ImportError: - HAS_PYRAX = False - -from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.rax import (rax_argument_spec, - rax_required_together, - rax_to_dict, - setup_rax_module, - ) - - -def rax_dns(module, comment, email, name, state, ttl): - changed = False - - dns = pyrax.cloud_dns - if not dns: - module.fail_json(msg='Failed to instantiate client. This ' - 'typically indicates an invalid region or an ' - 'incorrectly capitalized region name.') - - if state == 'present': - if not email: - module.fail_json(msg='An "email" attribute is required for ' - 'creating a domain') - - try: - domain = dns.find(name=name) - except pyrax.exceptions.NoUniqueMatch as e: - module.fail_json(msg='%s' % e.message) - except pyrax.exceptions.NotFound: - try: - domain = dns.create(name=name, emailAddress=email, ttl=ttl, - comment=comment) - changed = True - except Exception as e: - module.fail_json(msg='%s' % e.message) - - update = {} - if comment != getattr(domain, 'comment', None): - update['comment'] = comment - if ttl != getattr(domain, 'ttl', None): - update['ttl'] = ttl - if email != getattr(domain, 'emailAddress', None): - update['emailAddress'] = email - - if update: - try: - domain.update(**update) - changed = True - domain.get() - except Exception as e: - module.fail_json(msg='%s' % e.message) - - elif state == 'absent': - try: - domain = dns.find(name=name) - except pyrax.exceptions.NotFound: - domain = {} - except Exception as e: - module.fail_json(msg='%s' % e.message) - - if domain: - try: - domain.delete() - changed = True - except Exception as e: - module.fail_json(msg='%s' % e.message) - - module.exit_json(changed=changed, domain=rax_to_dict(domain)) - - -def main(): - argument_spec = rax_argument_spec() - argument_spec.update( - dict( - comment=dict(), - email=dict(), - name=dict(), - state=dict(default='present', choices=['present', 'absent']), - ttl=dict(type='int', default=3600), - ) - ) - - module = AnsibleModule( - argument_spec=argument_spec, - required_together=rax_required_together(), - ) - - if not HAS_PYRAX: - module.fail_json(msg='pyrax is required for this module') - - comment = module.params.get('comment') - email = module.params.get('email') - name = module.params.get('name') - state = module.params.get('state') - ttl = module.params.get('ttl') - - setup_rax_module(module, pyrax, False) - - rax_dns(module, comment, email, name, state, ttl) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/rax_dns_record.py b/ansible_collections/community/general/plugins/modules/rax_dns_record.py deleted file mode 100644 index cb3cd279e..000000000 --- a/ansible_collections/community/general/plugins/modules/rax_dns_record.py +++ /dev/null @@ -1,358 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright 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 absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- -module: rax_dns_record -short_description: Manage DNS records on Rackspace Cloud DNS -description: - - Manage DNS records on Rackspace Cloud DNS -attributes: - check_mode: - support: none - diff_mode: - support: none -options: - comment: - type: str - description: - - Brief description of the domain. Maximum length of 160 characters - data: - type: str - description: - - IP address for A/AAAA record, FQDN for CNAME/MX/NS, or text data for - SRV/TXT - required: true - domain: - type: str - description: - - Domain name to create the record in. This is an invalid option when - type=PTR - loadbalancer: - type: str - description: - - Load Balancer ID to create a PTR record for. Only used with type=PTR - name: - type: str - description: - - FQDN record name to create - required: true - overwrite: - description: - - Add new records if data doesn't match, instead of updating existing - record with matching name. If there are already multiple records with - matching name and overwrite=true, this module will fail. - default: true - type: bool - priority: - type: int - description: - - Required for MX and SRV records, but forbidden for other record types. - If specified, must be an integer from 0 to 65535. - server: - type: str - description: - - Server ID to create a PTR record for. Only used with type=PTR - state: - type: str - description: - - Indicate desired state of the resource - choices: - - present - - absent - default: present - ttl: - type: int - description: - - Time to live of record in seconds - default: 3600 - type: - type: str - description: - - DNS record type - choices: - - A - - AAAA - - CNAME - - MX - - NS - - SRV - - TXT - - PTR - required: true -notes: - - "It is recommended that plays utilizing this module be run with - C(serial: 1) to avoid exceeding the API request limit imposed by - the Rackspace CloudDNS API." - - To manipulate a C(PTR) record either C(loadbalancer) or C(server) must be - supplied. -author: "Matt Martz (@sivel)" -extends_documentation_fragment: - - community.general.rackspace - - community.general.rackspace.openstack - - community.general.attributes - -''' - -EXAMPLES = ''' -- name: Create DNS Records - hosts: all - gather_facts: false - tasks: - - name: Create A record - local_action: - module: rax_dns_record - credentials: ~/.raxpub - domain: example.org - name: www.example.org - data: "{{ rax_accessipv4 }}" - type: A - register: a_record - - - name: Create PTR record - local_action: - module: rax_dns_record - credentials: ~/.raxpub - server: "{{ rax_id }}" - name: "{{ inventory_hostname }}" - region: DFW - register: ptr_record -''' - -try: - import pyrax - HAS_PYRAX = True -except ImportError: - HAS_PYRAX = False - -from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.rax import (rax_argument_spec, - rax_find_loadbalancer, - rax_find_server, - rax_required_together, - rax_to_dict, - setup_rax_module, - ) - - -def rax_dns_record_ptr(module, data=None, comment=None, loadbalancer=None, - name=None, server=None, state='present', ttl=7200): - changed = False - results = [] - - dns = pyrax.cloud_dns - - if not dns: - module.fail_json(msg='Failed to instantiate client. This ' - 'typically indicates an invalid region or an ' - 'incorrectly capitalized region name.') - - if loadbalancer: - item = rax_find_loadbalancer(module, pyrax, loadbalancer) - elif server: - item = rax_find_server(module, pyrax, server) - - if state == 'present': - current = dns.list_ptr_records(item) - for record in current: - if record.data == data: - if record.ttl != ttl or record.name != name: - try: - dns.update_ptr_record(item, record, name, data, ttl) - changed = True - except Exception as e: - module.fail_json(msg='%s' % e.message) - record.ttl = ttl - record.name = name - results.append(rax_to_dict(record)) - break - else: - results.append(rax_to_dict(record)) - break - - if not results: - record = dict(name=name, type='PTR', data=data, ttl=ttl, - comment=comment) - try: - results = dns.add_ptr_records(item, [record]) - changed = True - except Exception as e: - module.fail_json(msg='%s' % e.message) - - module.exit_json(changed=changed, records=results) - - elif state == 'absent': - current = dns.list_ptr_records(item) - for record in current: - if record.data == data: - results.append(rax_to_dict(record)) - break - - if results: - try: - dns.delete_ptr_records(item, data) - changed = True - except Exception as e: - module.fail_json(msg='%s' % e.message) - - module.exit_json(changed=changed, records=results) - - -def rax_dns_record(module, comment=None, data=None, domain=None, name=None, - overwrite=True, priority=None, record_type='A', - state='present', ttl=7200): - """Function for manipulating record types other than PTR""" - - changed = False - - dns = pyrax.cloud_dns - if not dns: - module.fail_json(msg='Failed to instantiate client. This ' - 'typically indicates an invalid region or an ' - 'incorrectly capitalized region name.') - - if state == 'present': - if not priority and record_type in ['MX', 'SRV']: - module.fail_json(msg='A "priority" attribute is required for ' - 'creating a MX or SRV record') - - try: - domain = dns.find(name=domain) - except Exception as e: - module.fail_json(msg='%s' % e.message) - - try: - if overwrite: - record = domain.find_record(record_type, name=name) - else: - record = domain.find_record(record_type, name=name, data=data) - except pyrax.exceptions.DomainRecordNotUnique as e: - module.fail_json(msg='overwrite=true and there are multiple matching records') - except pyrax.exceptions.DomainRecordNotFound as e: - try: - record_data = { - 'type': record_type, - 'name': name, - 'data': data, - 'ttl': ttl - } - if comment: - record_data.update(dict(comment=comment)) - if priority and record_type.upper() in ['MX', 'SRV']: - record_data.update(dict(priority=priority)) - - record = domain.add_records([record_data])[0] - changed = True - except Exception as e: - module.fail_json(msg='%s' % e.message) - - update = {} - if comment != getattr(record, 'comment', None): - update['comment'] = comment - if ttl != getattr(record, 'ttl', None): - update['ttl'] = ttl - if priority != getattr(record, 'priority', None): - update['priority'] = priority - if data != getattr(record, 'data', None): - update['data'] = data - - if update: - try: - record.update(**update) - changed = True - record.get() - except Exception as e: - module.fail_json(msg='%s' % e.message) - - elif state == 'absent': - try: - domain = dns.find(name=domain) - except Exception as e: - module.fail_json(msg='%s' % e.message) - - try: - record = domain.find_record(record_type, name=name, data=data) - except pyrax.exceptions.DomainRecordNotFound as e: - record = {} - except pyrax.exceptions.DomainRecordNotUnique as e: - module.fail_json(msg='%s' % e.message) - - if record: - try: - record.delete() - changed = True - except Exception as e: - module.fail_json(msg='%s' % e.message) - - module.exit_json(changed=changed, record=rax_to_dict(record)) - - -def main(): - argument_spec = rax_argument_spec() - argument_spec.update( - dict( - comment=dict(), - data=dict(required=True), - domain=dict(), - loadbalancer=dict(), - name=dict(required=True), - overwrite=dict(type='bool', default=True), - priority=dict(type='int'), - server=dict(), - state=dict(default='present', choices=['present', 'absent']), - ttl=dict(type='int', default=3600), - type=dict(required=True, choices=['A', 'AAAA', 'CNAME', 'MX', 'NS', - 'SRV', 'TXT', 'PTR']) - ) - ) - - module = AnsibleModule( - argument_spec=argument_spec, - required_together=rax_required_together(), - mutually_exclusive=[ - ['server', 'loadbalancer', 'domain'], - ], - required_one_of=[ - ['server', 'loadbalancer', 'domain'], - ], - ) - - if not HAS_PYRAX: - module.fail_json(msg='pyrax is required for this module') - - comment = module.params.get('comment') - data = module.params.get('data') - domain = module.params.get('domain') - loadbalancer = module.params.get('loadbalancer') - name = module.params.get('name') - overwrite = module.params.get('overwrite') - priority = module.params.get('priority') - server = module.params.get('server') - state = module.params.get('state') - ttl = module.params.get('ttl') - record_type = module.params.get('type') - - setup_rax_module(module, pyrax, False) - - if record_type.upper() == 'PTR': - if not server and not loadbalancer: - module.fail_json(msg='one of the following is required: ' - 'server,loadbalancer') - rax_dns_record_ptr(module, data=data, comment=comment, - loadbalancer=loadbalancer, name=name, server=server, - state=state, ttl=ttl) - else: - rax_dns_record(module, comment=comment, data=data, domain=domain, - name=name, overwrite=overwrite, priority=priority, - record_type=record_type, state=state, ttl=ttl) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/rax_facts.py b/ansible_collections/community/general/plugins/modules/rax_facts.py deleted file mode 100644 index f8bb0e050..000000000 --- a/ansible_collections/community/general/plugins/modules/rax_facts.py +++ /dev/null @@ -1,152 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright 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 absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- -module: rax_facts -short_description: Gather facts for Rackspace Cloud Servers -description: - - Gather facts for Rackspace Cloud Servers. -attributes: - check_mode: - version_added: 3.3.0 - # This was backported to 2.5.4 and 1.3.11 as well, since this was a bugfix -options: - address: - type: str - description: - - Server IP address to retrieve facts for, will match any IP assigned to - the server - id: - type: str - description: - - Server ID to retrieve facts for - name: - type: str - description: - - Server name to retrieve facts for -author: "Matt Martz (@sivel)" -extends_documentation_fragment: - - community.general.rackspace.openstack - - community.general.attributes - - community.general.attributes.facts - - community.general.attributes.facts_module - -''' - -EXAMPLES = ''' -- name: Gather info about servers - hosts: all - gather_facts: false - tasks: - - name: Get facts about servers - local_action: - module: rax_facts - credentials: ~/.raxpub - name: "{{ inventory_hostname }}" - region: DFW - - name: Map some facts - ansible.builtin.set_fact: - ansible_ssh_host: "{{ rax_accessipv4 }}" -''' - -try: - import pyrax - HAS_PYRAX = True -except ImportError: - HAS_PYRAX = False - -from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.rax import (rax_argument_spec, - rax_required_together, - rax_to_dict, - setup_rax_module, - ) - - -def rax_facts(module, address, name, server_id): - changed = False - - cs = pyrax.cloudservers - - if cs is None: - module.fail_json(msg='Failed to instantiate client. This ' - 'typically indicates an invalid region or an ' - 'incorrectly capitalized region name.') - - ansible_facts = {} - - search_opts = {} - if name: - search_opts = dict(name='^%s$' % name) - try: - servers = cs.servers.list(search_opts=search_opts) - except Exception as e: - module.fail_json(msg='%s' % e.message) - elif address: - servers = [] - try: - for server in cs.servers.list(): - for addresses in server.networks.values(): - if address in addresses: - servers.append(server) - break - except Exception as e: - module.fail_json(msg='%s' % e.message) - elif server_id: - servers = [] - try: - servers.append(cs.servers.get(server_id)) - except Exception as e: - pass - - servers[:] = [server for server in servers if server.status != "DELETED"] - - if len(servers) > 1: - module.fail_json(msg='Multiple servers found matching provided ' - 'search parameters') - elif len(servers) == 1: - ansible_facts = rax_to_dict(servers[0], 'server') - - module.exit_json(changed=changed, ansible_facts=ansible_facts) - - -def main(): - argument_spec = rax_argument_spec() - argument_spec.update( - dict( - address=dict(), - id=dict(), - name=dict(), - ) - ) - - module = AnsibleModule( - argument_spec=argument_spec, - required_together=rax_required_together(), - mutually_exclusive=[['address', 'id', 'name']], - required_one_of=[['address', 'id', 'name']], - supports_check_mode=True, - ) - - if not HAS_PYRAX: - module.fail_json(msg='pyrax is required for this module') - - address = module.params.get('address') - server_id = module.params.get('id') - name = module.params.get('name') - - setup_rax_module(module, pyrax) - - rax_facts(module, address, name, server_id) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/rax_files.py b/ansible_collections/community/general/plugins/modules/rax_files.py deleted file mode 100644 index a63e107eb..000000000 --- a/ansible_collections/community/general/plugins/modules/rax_files.py +++ /dev/null @@ -1,400 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright (c) 2013, Paul Durivage <paul.durivage@rackspace.com> -# 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 - - -DOCUMENTATION = ''' ---- -module: rax_files -short_description: Manipulate Rackspace Cloud Files Containers -description: - - Manipulate Rackspace Cloud Files Containers -attributes: - check_mode: - support: none - diff_mode: - support: none -options: - clear_meta: - description: - - Optionally clear existing metadata when applying metadata to existing containers. - Selecting this option is only appropriate when setting type=meta - type: bool - default: false - container: - type: str - description: - - The container to use for container or metadata operations. - meta: - type: dict - default: {} - description: - - A hash of items to set as metadata values on a container - private: - description: - - Used to set a container as private, removing it from the CDN. B(Warning!) - Private containers, if previously made public, can have live objects - available until the TTL on cached objects expires - type: bool - default: false - public: - description: - - Used to set a container as public, available via the Cloud Files CDN - type: bool - default: false - region: - type: str - description: - - Region to create an instance in - state: - type: str - description: - - Indicate desired state of the resource - choices: ['present', 'absent', 'list'] - default: present - ttl: - type: int - description: - - In seconds, set a container-wide TTL for all objects cached on CDN edge nodes. - Setting a TTL is only appropriate for containers that are public - type: - type: str - description: - - Type of object to do work on, i.e. metadata object or a container object - choices: - - container - - meta - default: container - web_error: - type: str - description: - - Sets an object to be presented as the HTTP error page when accessed by the CDN URL - web_index: - type: str - description: - - Sets an object to be presented as the HTTP index page when accessed by the CDN URL -author: "Paul Durivage (@angstwad)" -extends_documentation_fragment: - - community.general.rackspace - - community.general.rackspace.openstack - - community.general.attributes - -''' - -EXAMPLES = ''' -- name: "Test Cloud Files Containers" - hosts: local - gather_facts: false - tasks: - - name: "List all containers" - community.general.rax_files: - state: list - - - name: "Create container called 'mycontainer'" - community.general.rax_files: - container: mycontainer - - - name: "Create container 'mycontainer2' with metadata" - community.general.rax_files: - container: mycontainer2 - meta: - key: value - file_for: someuser@example.com - - - name: "Set a container's web index page" - community.general.rax_files: - container: mycontainer - web_index: index.html - - - name: "Set a container's web error page" - community.general.rax_files: - container: mycontainer - web_error: error.html - - - name: "Make container public" - community.general.rax_files: - container: mycontainer - public: true - - - name: "Make container public with a 24 hour TTL" - community.general.rax_files: - container: mycontainer - public: true - ttl: 86400 - - - name: "Make container private" - community.general.rax_files: - container: mycontainer - private: true - -- name: "Test Cloud Files Containers Metadata Storage" - hosts: local - gather_facts: false - tasks: - - name: "Get mycontainer2 metadata" - community.general.rax_files: - container: mycontainer2 - type: meta - - - name: "Set mycontainer2 metadata" - community.general.rax_files: - container: mycontainer2 - type: meta - meta: - uploaded_by: someuser@example.com - - - name: "Remove mycontainer2 metadata" - community.general.rax_files: - container: "mycontainer2" - type: meta - state: absent - meta: - key: "" - file_for: "" -''' - -try: - import pyrax - HAS_PYRAX = True -except ImportError as e: - HAS_PYRAX = False - -from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.rax import rax_argument_spec, rax_required_together, setup_rax_module - - -EXIT_DICT = dict(success=True) -META_PREFIX = 'x-container-meta-' - - -def _get_container(module, cf, container): - try: - return cf.get_container(container) - except pyrax.exc.NoSuchContainer as e: - module.fail_json(msg=e.message) - - -def _fetch_meta(module, container): - EXIT_DICT['meta'] = dict() - try: - for k, v in container.get_metadata().items(): - split_key = k.split(META_PREFIX)[-1] - EXIT_DICT['meta'][split_key] = v - except Exception as e: - module.fail_json(msg=e.message) - - -def meta(cf, module, container_, state, meta_, clear_meta): - c = _get_container(module, cf, container_) - - if meta_ and state == 'present': - try: - meta_set = c.set_metadata(meta_, clear=clear_meta) - except Exception as e: - module.fail_json(msg=e.message) - elif meta_ and state == 'absent': - remove_results = [] - for k, v in meta_.items(): - c.remove_metadata_key(k) - remove_results.append(k) - EXIT_DICT['deleted_meta_keys'] = remove_results - elif state == 'absent': - remove_results = [] - for k, v in c.get_metadata().items(): - c.remove_metadata_key(k) - remove_results.append(k) - EXIT_DICT['deleted_meta_keys'] = remove_results - - _fetch_meta(module, c) - _locals = locals().keys() - - EXIT_DICT['container'] = c.name - if 'meta_set' in _locals or 'remove_results' in _locals: - EXIT_DICT['changed'] = True - - module.exit_json(**EXIT_DICT) - - -def container(cf, module, container_, state, meta_, clear_meta, ttl, public, - private, web_index, web_error): - if public and private: - module.fail_json(msg='container cannot be simultaneously ' - 'set to public and private') - - if state == 'absent' and (meta_ or clear_meta or public or private or web_index or web_error): - module.fail_json(msg='state cannot be omitted when setting/removing ' - 'attributes on a container') - - if state == 'list': - # We don't care if attributes are specified, let's list containers - EXIT_DICT['containers'] = cf.list_containers() - module.exit_json(**EXIT_DICT) - - try: - c = cf.get_container(container_) - except pyrax.exc.NoSuchContainer as e: - # Make the container if state=present, otherwise bomb out - if state == 'present': - try: - c = cf.create_container(container_) - except Exception as e: - module.fail_json(msg=e.message) - else: - EXIT_DICT['changed'] = True - EXIT_DICT['created'] = True - else: - module.fail_json(msg=e.message) - else: - # Successfully grabbed a container object - # Delete if state is absent - if state == 'absent': - try: - cont_deleted = c.delete() - except Exception as e: - module.fail_json(msg=e.message) - else: - EXIT_DICT['deleted'] = True - - if meta_: - try: - meta_set = c.set_metadata(meta_, clear=clear_meta) - except Exception as e: - module.fail_json(msg=e.message) - finally: - _fetch_meta(module, c) - - if ttl: - try: - c.cdn_ttl = ttl - except Exception as e: - module.fail_json(msg=e.message) - else: - EXIT_DICT['ttl'] = c.cdn_ttl - - if public: - try: - cont_public = c.make_public() - except Exception as e: - module.fail_json(msg=e.message) - else: - EXIT_DICT['container_urls'] = dict(url=c.cdn_uri, - ssl_url=c.cdn_ssl_uri, - streaming_url=c.cdn_streaming_uri, - ios_uri=c.cdn_ios_uri) - - if private: - try: - cont_private = c.make_private() - except Exception as e: - module.fail_json(msg=e.message) - else: - EXIT_DICT['set_private'] = True - - if web_index: - try: - cont_web_index = c.set_web_index_page(web_index) - except Exception as e: - module.fail_json(msg=e.message) - else: - EXIT_DICT['set_index'] = True - finally: - _fetch_meta(module, c) - - if web_error: - try: - cont_err_index = c.set_web_error_page(web_error) - except Exception as e: - module.fail_json(msg=e.message) - else: - EXIT_DICT['set_error'] = True - finally: - _fetch_meta(module, c) - - EXIT_DICT['container'] = c.name - EXIT_DICT['objs_in_container'] = c.object_count - EXIT_DICT['total_bytes'] = c.total_bytes - - _locals = locals().keys() - if ('cont_deleted' in _locals - or 'meta_set' in _locals - or 'cont_public' in _locals - or 'cont_private' in _locals - or 'cont_web_index' in _locals - or 'cont_err_index' in _locals): - EXIT_DICT['changed'] = True - - module.exit_json(**EXIT_DICT) - - -def cloudfiles(module, container_, state, meta_, clear_meta, typ, ttl, public, - private, web_index, web_error): - """ Dispatch from here to work with metadata or file objects """ - cf = pyrax.cloudfiles - - if cf is None: - module.fail_json(msg='Failed to instantiate client. This ' - 'typically indicates an invalid region or an ' - 'incorrectly capitalized region name.') - - if typ == "container": - container(cf, module, container_, state, meta_, clear_meta, ttl, - public, private, web_index, web_error) - else: - meta(cf, module, container_, state, meta_, clear_meta) - - -def main(): - argument_spec = rax_argument_spec() - argument_spec.update( - dict( - container=dict(), - state=dict(choices=['present', 'absent', 'list'], - default='present'), - meta=dict(type='dict', default=dict()), - clear_meta=dict(default=False, type='bool'), - type=dict(choices=['container', 'meta'], default='container'), - ttl=dict(type='int'), - public=dict(default=False, type='bool'), - private=dict(default=False, type='bool'), - web_index=dict(), - web_error=dict() - ) - ) - - module = AnsibleModule( - argument_spec=argument_spec, - required_together=rax_required_together() - ) - - if not HAS_PYRAX: - module.fail_json(msg='pyrax is required for this module') - - container_ = module.params.get('container') - state = module.params.get('state') - meta_ = module.params.get('meta') - clear_meta = module.params.get('clear_meta') - typ = module.params.get('type') - ttl = module.params.get('ttl') - public = module.params.get('public') - private = module.params.get('private') - web_index = module.params.get('web_index') - web_error = module.params.get('web_error') - - if state in ['present', 'absent'] and not container_: - module.fail_json(msg='please specify a container name') - if clear_meta and not typ == 'meta': - module.fail_json(msg='clear_meta can only be used when setting ' - 'metadata') - - setup_rax_module(module, pyrax) - cloudfiles(module, container_, state, meta_, clear_meta, typ, ttl, public, - private, web_index, web_error) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/rax_files_objects.py b/ansible_collections/community/general/plugins/modules/rax_files_objects.py deleted file mode 100644 index bbcdfe4f8..000000000 --- a/ansible_collections/community/general/plugins/modules/rax_files_objects.py +++ /dev/null @@ -1,556 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright (c) 2013, Paul Durivage <paul.durivage@rackspace.com> -# 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 - - -DOCUMENTATION = ''' ---- -module: rax_files_objects -short_description: Upload, download, and delete objects in Rackspace Cloud Files -description: - - Upload, download, and delete objects in Rackspace Cloud Files. -attributes: - check_mode: - support: none - diff_mode: - support: none -options: - clear_meta: - description: - - Optionally clear existing metadata when applying metadata to existing objects. - Selecting this option is only appropriate when setting O(type=meta). - type: bool - default: false - container: - type: str - description: - - The container to use for file object operations. - required: true - dest: - type: str - description: - - The destination of a C(get) operation; i.e. a local directory, C(/home/user/myfolder). - Used to specify the destination of an operation on a remote object; i.e. a file name, - V(file1), or a comma-separated list of remote objects, V(file1,file2,file17). - expires: - type: int - description: - - Used to set an expiration in seconds on an uploaded file or folder. - meta: - type: dict - default: {} - description: - - Items to set as metadata values on an uploaded file or folder. - method: - type: str - description: - - > - The method of operation to be performed: V(put) to upload files, V(get) to download files or - V(delete) to remove remote objects in Cloud Files. - choices: - - get - - put - - delete - default: get - src: - type: str - description: - - Source from which to upload files. Used to specify a remote object as a source for - an operation, i.e. a file name, V(file1), or a comma-separated list of remote objects, - V(file1,file2,file17). Parameters O(src) and O(dest) are mutually exclusive on remote-only object operations - structure: - description: - - Used to specify whether to maintain nested directory structure when downloading objects - from Cloud Files. Setting to false downloads the contents of a container to a single, - flat directory - type: bool - default: true - type: - type: str - description: - - Type of object to do work on - - Metadata object or a file object - choices: - - file - - meta - default: file -author: "Paul Durivage (@angstwad)" -extends_documentation_fragment: - - community.general.rackspace - - community.general.rackspace.openstack - - community.general.attributes - -''' - -EXAMPLES = ''' -- name: "Test Cloud Files Objects" - hosts: local - gather_facts: false - tasks: - - name: "Get objects from test container" - community.general.rax_files_objects: - container: testcont - dest: ~/Downloads/testcont - - - name: "Get single object from test container" - community.general.rax_files_objects: - container: testcont - src: file1 - dest: ~/Downloads/testcont - - - name: "Get several objects from test container" - community.general.rax_files_objects: - container: testcont - src: file1,file2,file3 - dest: ~/Downloads/testcont - - - name: "Delete one object in test container" - community.general.rax_files_objects: - container: testcont - method: delete - dest: file1 - - - name: "Delete several objects in test container" - community.general.rax_files_objects: - container: testcont - method: delete - dest: file2,file3,file4 - - - name: "Delete all objects in test container" - community.general.rax_files_objects: - container: testcont - method: delete - - - name: "Upload all files to test container" - community.general.rax_files_objects: - container: testcont - method: put - src: ~/Downloads/onehundred - - - name: "Upload one file to test container" - community.general.rax_files_objects: - container: testcont - method: put - src: ~/Downloads/testcont/file1 - - - name: "Upload one file to test container with metadata" - community.general.rax_files_objects: - container: testcont - src: ~/Downloads/testcont/file2 - method: put - meta: - testkey: testdata - who_uploaded_this: someuser@example.com - - - name: "Upload one file to test container with TTL of 60 seconds" - community.general.rax_files_objects: - container: testcont - method: put - src: ~/Downloads/testcont/file3 - expires: 60 - - - name: "Attempt to get remote object that does not exist" - community.general.rax_files_objects: - container: testcont - method: get - src: FileThatDoesNotExist.jpg - dest: ~/Downloads/testcont - ignore_errors: true - - - name: "Attempt to delete remote object that does not exist" - community.general.rax_files_objects: - container: testcont - method: delete - dest: FileThatDoesNotExist.jpg - ignore_errors: true - -- name: "Test Cloud Files Objects Metadata" - hosts: local - gather_facts: false - tasks: - - name: "Get metadata on one object" - community.general.rax_files_objects: - container: testcont - type: meta - dest: file2 - - - name: "Get metadata on several objects" - community.general.rax_files_objects: - container: testcont - type: meta - src: file2,file1 - - - name: "Set metadata on an object" - community.general.rax_files_objects: - container: testcont - type: meta - dest: file17 - method: put - meta: - key1: value1 - key2: value2 - clear_meta: true - - - name: "Verify metadata is set" - community.general.rax_files_objects: - container: testcont - type: meta - src: file17 - - - name: "Delete metadata" - community.general.rax_files_objects: - container: testcont - type: meta - dest: file17 - method: delete - meta: - key1: '' - key2: '' - - - name: "Get metadata on all objects" - community.general.rax_files_objects: - container: testcont - type: meta -''' - -import os - -try: - import pyrax - HAS_PYRAX = True -except ImportError: - HAS_PYRAX = False - -from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.rax import rax_argument_spec, rax_required_together, setup_rax_module - - -EXIT_DICT = dict(success=False) -META_PREFIX = 'x-object-meta-' - - -def _get_container(module, cf, container): - try: - return cf.get_container(container) - except pyrax.exc.NoSuchContainer as e: - module.fail_json(msg=e.message) - - -def _upload_folder(cf, folder, container, ttl=None, headers=None): - """ Uploads a folder to Cloud Files. - """ - total_bytes = 0 - for root, dummy, files in os.walk(folder): - for fname in files: - full_path = os.path.join(root, fname) - obj_name = os.path.relpath(full_path, folder) - obj_size = os.path.getsize(full_path) - cf.upload_file(container, full_path, obj_name=obj_name, return_none=True, ttl=ttl, headers=headers) - total_bytes += obj_size - return total_bytes - - -def upload(module, cf, container, src, dest, meta, expires): - """ Uploads a single object or a folder to Cloud Files Optionally sets an - metadata, TTL value (expires), or Content-Disposition and Content-Encoding - headers. - """ - if not src: - module.fail_json(msg='src must be specified when uploading') - - c = _get_container(module, cf, container) - src = os.path.abspath(os.path.expanduser(src)) - is_dir = os.path.isdir(src) - - if not is_dir and not os.path.isfile(src) or not os.path.exists(src): - module.fail_json(msg='src must be a file or a directory') - if dest and is_dir: - module.fail_json(msg='dest cannot be set when whole ' - 'directories are uploaded') - - cont_obj = None - total_bytes = 0 - try: - if dest and not is_dir: - cont_obj = c.upload_file(src, obj_name=dest, ttl=expires, headers=meta) - elif is_dir: - total_bytes = _upload_folder(cf, src, c, ttl=expires, headers=meta) - else: - cont_obj = c.upload_file(src, ttl=expires, headers=meta) - except Exception as e: - module.fail_json(msg=e.message) - - EXIT_DICT['success'] = True - EXIT_DICT['container'] = c.name - EXIT_DICT['msg'] = "Uploaded %s to container: %s" % (src, c.name) - if cont_obj or total_bytes > 0: - EXIT_DICT['changed'] = True - if meta: - EXIT_DICT['meta'] = dict(updated=True) - - if cont_obj: - EXIT_DICT['bytes'] = cont_obj.total_bytes - EXIT_DICT['etag'] = cont_obj.etag - else: - EXIT_DICT['bytes'] = total_bytes - - module.exit_json(**EXIT_DICT) - - -def download(module, cf, container, src, dest, structure): - """ Download objects from Cloud Files to a local path specified by "dest". - Optionally disable maintaining a directory structure by by passing a - false value to "structure". - """ - # Looking for an explicit destination - if not dest: - module.fail_json(msg='dest is a required argument when ' - 'downloading from Cloud Files') - - # Attempt to fetch the container by name - c = _get_container(module, cf, container) - - # Accept a single object name or a comma-separated list of objs - # If not specified, get the entire container - if src: - objs = map(str.strip, src.split(',')) - else: - objs = c.get_object_names() - - dest = os.path.abspath(os.path.expanduser(dest)) - is_dir = os.path.isdir(dest) - - if not is_dir: - module.fail_json(msg='dest must be a directory') - - try: - results = [c.download_object(obj, dest, structure=structure) for obj in objs] - except Exception as e: - module.fail_json(msg=e.message) - - len_results = len(results) - len_objs = len(objs) - - EXIT_DICT['container'] = c.name - EXIT_DICT['requested_downloaded'] = results - if results: - EXIT_DICT['changed'] = True - if len_results == len_objs: - EXIT_DICT['success'] = True - EXIT_DICT['msg'] = "%s objects downloaded to %s" % (len_results, dest) - else: - EXIT_DICT['msg'] = "Error: only %s of %s objects were " \ - "downloaded" % (len_results, len_objs) - module.exit_json(**EXIT_DICT) - - -def delete(module, cf, container, src, dest): - """ Delete specific objects by proving a single file name or a - comma-separated list to src OR dest (but not both). Omitting file name(s) - assumes the entire container is to be deleted. - """ - if src and dest: - module.fail_json(msg="Error: ambiguous instructions; files to be deleted " - "have been specified on both src and dest args") - - c = _get_container(module, cf, container) - - objs = dest or src - if objs: - objs = map(str.strip, objs.split(',')) - else: - objs = c.get_object_names() - - num_objs = len(objs) - - try: - results = [c.delete_object(obj) for obj in objs] - except Exception as e: - module.fail_json(msg=e.message) - - num_deleted = results.count(True) - - EXIT_DICT['container'] = c.name - EXIT_DICT['deleted'] = num_deleted - EXIT_DICT['requested_deleted'] = objs - - if num_deleted: - EXIT_DICT['changed'] = True - - if num_objs == num_deleted: - EXIT_DICT['success'] = True - EXIT_DICT['msg'] = "%s objects deleted" % num_deleted - else: - EXIT_DICT['msg'] = ("Error: only %s of %s objects " - "deleted" % (num_deleted, num_objs)) - module.exit_json(**EXIT_DICT) - - -def get_meta(module, cf, container, src, dest): - """ Get metadata for a single file, comma-separated list, or entire - container - """ - if src and dest: - module.fail_json(msg="Error: ambiguous instructions; files to be deleted " - "have been specified on both src and dest args") - - c = _get_container(module, cf, container) - - objs = dest or src - if objs: - objs = map(str.strip, objs.split(',')) - else: - objs = c.get_object_names() - - try: - results = dict() - for obj in objs: - meta = c.get_object(obj).get_metadata() - results[obj] = dict((k.split(META_PREFIX)[-1], v) for k, v in meta.items()) - except Exception as e: - module.fail_json(msg=e.message) - - EXIT_DICT['container'] = c.name - if results: - EXIT_DICT['meta_results'] = results - EXIT_DICT['success'] = True - module.exit_json(**EXIT_DICT) - - -def put_meta(module, cf, container, src, dest, meta, clear_meta): - """ Set metadata on a container, single file, or comma-separated list. - Passing a true value to clear_meta clears the metadata stored in Cloud - Files before setting the new metadata to the value of "meta". - """ - if src and dest: - module.fail_json(msg="Error: ambiguous instructions; files to set meta" - " have been specified on both src and dest args") - objs = dest or src - objs = map(str.strip, objs.split(',')) - - c = _get_container(module, cf, container) - - try: - results = [c.get_object(obj).set_metadata(meta, clear=clear_meta) for obj in objs] - except Exception as e: - module.fail_json(msg=e.message) - - EXIT_DICT['container'] = c.name - EXIT_DICT['success'] = True - if results: - EXIT_DICT['changed'] = True - EXIT_DICT['num_changed'] = True - module.exit_json(**EXIT_DICT) - - -def delete_meta(module, cf, container, src, dest, meta): - """ Removes metadata keys and values specified in meta, if any. Deletes on - all objects specified by src or dest (but not both), if any; otherwise it - deletes keys on all objects in the container - """ - if src and dest: - module.fail_json(msg="Error: ambiguous instructions; meta keys to be " - "deleted have been specified on both src and dest" - " args") - objs = dest or src - objs = map(str.strip, objs.split(',')) - - c = _get_container(module, cf, container) - - try: - for obj in objs: - o = c.get_object(obj) - results = [ - o.remove_metadata_key(k) - for k in (meta or o.get_metadata()) - ] - except Exception as e: - module.fail_json(msg=e.message) - - EXIT_DICT['container'] = c.name - EXIT_DICT['success'] = True - if results: - EXIT_DICT['changed'] = True - EXIT_DICT['num_deleted'] = len(results) - module.exit_json(**EXIT_DICT) - - -def cloudfiles(module, container, src, dest, method, typ, meta, clear_meta, - structure, expires): - """ Dispatch from here to work with metadata or file objects """ - cf = pyrax.cloudfiles - - if cf is None: - module.fail_json(msg='Failed to instantiate client. This ' - 'typically indicates an invalid region or an ' - 'incorrectly capitalized region name.') - - if typ == "file": - if method == 'get': - download(module, cf, container, src, dest, structure) - - if method == 'put': - upload(module, cf, container, src, dest, meta, expires) - - if method == 'delete': - delete(module, cf, container, src, dest) - - else: - if method == 'get': - get_meta(module, cf, container, src, dest) - - if method == 'put': - put_meta(module, cf, container, src, dest, meta, clear_meta) - - if method == 'delete': - delete_meta(module, cf, container, src, dest, meta) - - -def main(): - argument_spec = rax_argument_spec() - argument_spec.update( - dict( - container=dict(required=True), - src=dict(), - dest=dict(), - method=dict(default='get', choices=['put', 'get', 'delete']), - type=dict(default='file', choices=['file', 'meta']), - meta=dict(type='dict', default=dict()), - clear_meta=dict(default=False, type='bool'), - structure=dict(default=True, type='bool'), - expires=dict(type='int'), - ) - ) - - module = AnsibleModule( - argument_spec=argument_spec, - required_together=rax_required_together(), - ) - - if not HAS_PYRAX: - module.fail_json(msg='pyrax is required for this module') - - container = module.params.get('container') - src = module.params.get('src') - dest = module.params.get('dest') - method = module.params.get('method') - typ = module.params.get('type') - meta = module.params.get('meta') - clear_meta = module.params.get('clear_meta') - structure = module.params.get('structure') - expires = module.params.get('expires') - - if clear_meta and not typ == 'meta': - module.fail_json(msg='clear_meta can only be used when setting metadata') - - setup_rax_module(module, pyrax) - cloudfiles(module, container, src, dest, method, typ, meta, clear_meta, structure, expires) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/rax_identity.py b/ansible_collections/community/general/plugins/modules/rax_identity.py deleted file mode 100644 index b2eb15627..000000000 --- a/ansible_collections/community/general/plugins/modules/rax_identity.py +++ /dev/null @@ -1,110 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright 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 absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- -module: rax_identity -short_description: Load Rackspace Cloud Identity -description: - - Verifies Rackspace Cloud credentials and returns identity information -attributes: - check_mode: - support: none - diff_mode: - support: none -options: - state: - type: str - description: - - Indicate desired state of the resource - choices: ['present'] - default: present - required: false -author: - - "Christopher H. Laco (@claco)" - - "Matt Martz (@sivel)" -extends_documentation_fragment: - - community.general.rackspace.openstack - - community.general.attributes - -''' - -EXAMPLES = ''' -- name: Load Rackspace Cloud Identity - gather_facts: false - hosts: local - connection: local - tasks: - - name: Load Identity - local_action: - module: rax_identity - credentials: ~/.raxpub - region: DFW - register: rackspace_identity -''' - -try: - import pyrax - HAS_PYRAX = True -except ImportError: - HAS_PYRAX = False - -from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.rax import (rax_argument_spec, rax_required_together, rax_to_dict, - setup_rax_module) - - -def cloud_identity(module, state, identity): - instance = dict( - authenticated=identity.authenticated, - credentials=identity._creds_file - ) - changed = False - - instance.update(rax_to_dict(identity)) - instance['services'] = instance.get('services', {}).keys() - - if state == 'present': - if not identity.authenticated: - module.fail_json(msg='Credentials could not be verified!') - - module.exit_json(changed=changed, identity=instance) - - -def main(): - argument_spec = rax_argument_spec() - argument_spec.update( - dict( - state=dict(default='present', choices=['present']) - ) - ) - - module = AnsibleModule( - argument_spec=argument_spec, - required_together=rax_required_together() - ) - - if not HAS_PYRAX: - module.fail_json(msg='pyrax is required for this module') - - state = module.params.get('state') - - setup_rax_module(module, pyrax) - - if not pyrax.identity: - module.fail_json(msg='Failed to instantiate client. This ' - 'typically indicates an invalid region or an ' - 'incorrectly capitalized region name.') - - cloud_identity(module, state, pyrax.identity) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/rax_keypair.py b/ansible_collections/community/general/plugins/modules/rax_keypair.py deleted file mode 100644 index d7d7a2cc3..000000000 --- a/ansible_collections/community/general/plugins/modules/rax_keypair.py +++ /dev/null @@ -1,179 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright 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 absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- -module: rax_keypair -short_description: Create a keypair for use with Rackspace Cloud Servers -description: - - Create a keypair for use with Rackspace Cloud Servers -attributes: - check_mode: - support: none - diff_mode: - support: none -options: - name: - type: str - description: - - Name of keypair - required: true - public_key: - type: str - description: - - Public Key string to upload. Can be a file path or string - state: - type: str - description: - - Indicate desired state of the resource - choices: - - present - - absent - default: present -author: "Matt Martz (@sivel)" -notes: - - Keypairs cannot be manipulated, only created and deleted. To "update" a - keypair you must first delete and then recreate. - - The ability to specify a file path for the public key was added in 1.7 -extends_documentation_fragment: - - community.general.rackspace.openstack - - community.general.attributes - -''' - -EXAMPLES = ''' -- name: Create a keypair - hosts: localhost - gather_facts: false - tasks: - - name: Keypair request - local_action: - module: rax_keypair - credentials: ~/.raxpub - name: my_keypair - region: DFW - register: keypair - - name: Create local public key - local_action: - module: copy - content: "{{ keypair.keypair.public_key }}" - dest: "{{ inventory_dir }}/{{ keypair.keypair.name }}.pub" - - name: Create local private key - local_action: - module: copy - content: "{{ keypair.keypair.private_key }}" - dest: "{{ inventory_dir }}/{{ keypair.keypair.name }}" - -- name: Create a keypair - hosts: localhost - gather_facts: false - tasks: - - name: Keypair request - local_action: - module: rax_keypair - credentials: ~/.raxpub - name: my_keypair - public_key: "{{ lookup('file', 'authorized_keys/id_rsa.pub') }}" - region: DFW - register: keypair -''' -import os - -try: - import pyrax - HAS_PYRAX = True -except ImportError: - HAS_PYRAX = False - -from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.rax import (rax_argument_spec, - rax_required_together, - rax_to_dict, - setup_rax_module, - ) - - -def rax_keypair(module, name, public_key, state): - changed = False - - cs = pyrax.cloudservers - - if cs is None: - module.fail_json(msg='Failed to instantiate client. This ' - 'typically indicates an invalid region or an ' - 'incorrectly capitalized region name.') - - keypair = {} - - if state == 'present': - if public_key and os.path.isfile(public_key): - try: - f = open(public_key) - public_key = f.read() - f.close() - except Exception as e: - module.fail_json(msg='Failed to load %s' % public_key) - - try: - keypair = cs.keypairs.find(name=name) - except cs.exceptions.NotFound: - try: - keypair = cs.keypairs.create(name, public_key) - changed = True - except Exception as e: - module.fail_json(msg='%s' % e.message) - except Exception as e: - module.fail_json(msg='%s' % e.message) - - elif state == 'absent': - try: - keypair = cs.keypairs.find(name=name) - except Exception: - pass - - if keypair: - try: - keypair.delete() - changed = True - except Exception as e: - module.fail_json(msg='%s' % e.message) - - module.exit_json(changed=changed, keypair=rax_to_dict(keypair)) - - -def main(): - argument_spec = rax_argument_spec() - argument_spec.update( - dict( - name=dict(required=True), - public_key=dict(), - state=dict(default='present', choices=['absent', 'present']), - ) - ) - - module = AnsibleModule( - argument_spec=argument_spec, - required_together=rax_required_together(), - ) - - if not HAS_PYRAX: - module.fail_json(msg='pyrax is required for this module') - - name = module.params.get('name') - public_key = module.params.get('public_key') - state = module.params.get('state') - - setup_rax_module(module, pyrax) - - rax_keypair(module, name, public_key, state) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/rax_meta.py b/ansible_collections/community/general/plugins/modules/rax_meta.py deleted file mode 100644 index 7b52e906f..000000000 --- a/ansible_collections/community/general/plugins/modules/rax_meta.py +++ /dev/null @@ -1,182 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright 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 absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- -module: rax_meta -short_description: Manipulate metadata for Rackspace Cloud Servers -description: - - Manipulate metadata for Rackspace Cloud Servers -attributes: - check_mode: - support: none - diff_mode: - support: none -options: - address: - type: str - description: - - Server IP address to modify metadata for, will match any IP assigned to - the server - id: - type: str - description: - - Server ID to modify metadata for - name: - type: str - description: - - Server name to modify metadata for - meta: - type: dict - default: {} - description: - - A hash of metadata to associate with the instance -author: "Matt Martz (@sivel)" -extends_documentation_fragment: - - community.general.rackspace.openstack - - community.general.attributes - -''' - -EXAMPLES = ''' -- name: Set metadata for a server - hosts: all - gather_facts: false - tasks: - - name: Set metadata - local_action: - module: rax_meta - credentials: ~/.raxpub - name: "{{ inventory_hostname }}" - region: DFW - meta: - group: primary_group - groups: - - group_two - - group_three - app: my_app - - - name: Clear metadata - local_action: - module: rax_meta - credentials: ~/.raxpub - name: "{{ inventory_hostname }}" - region: DFW -''' - -import json - -try: - import pyrax - HAS_PYRAX = True -except ImportError: - HAS_PYRAX = False - -from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.rax import rax_argument_spec, rax_required_together, setup_rax_module -from ansible.module_utils.six import string_types - - -def rax_meta(module, address, name, server_id, meta): - changed = False - - cs = pyrax.cloudservers - - if cs is None: - module.fail_json(msg='Failed to instantiate client. This ' - 'typically indicates an invalid region or an ' - 'incorrectly capitalized region name.') - - search_opts = {} - if name: - search_opts = dict(name='^%s$' % name) - try: - servers = cs.servers.list(search_opts=search_opts) - except Exception as e: - module.fail_json(msg='%s' % e.message) - elif address: - servers = [] - try: - for server in cs.servers.list(): - for addresses in server.networks.values(): - if address in addresses: - servers.append(server) - break - except Exception as e: - module.fail_json(msg='%s' % e.message) - elif server_id: - servers = [] - try: - servers.append(cs.servers.get(server_id)) - except Exception as e: - pass - - if len(servers) > 1: - module.fail_json(msg='Multiple servers found matching provided ' - 'search parameters') - elif not servers: - module.fail_json(msg='Failed to find a server matching provided ' - 'search parameters') - - # Normalize and ensure all metadata values are strings - for k, v in meta.items(): - if isinstance(v, list): - meta[k] = ','.join(['%s' % i for i in v]) - elif isinstance(v, dict): - meta[k] = json.dumps(v) - elif not isinstance(v, string_types): - meta[k] = '%s' % v - - server = servers[0] - if server.metadata == meta: - changed = False - else: - changed = True - removed = set(server.metadata.keys()).difference(meta.keys()) - cs.servers.delete_meta(server, list(removed)) - cs.servers.set_meta(server, meta) - server.get() - - module.exit_json(changed=changed, meta=server.metadata) - - -def main(): - argument_spec = rax_argument_spec() - argument_spec.update( - dict( - address=dict(), - id=dict(), - name=dict(), - meta=dict(type='dict', default=dict()), - ) - ) - - module = AnsibleModule( - argument_spec=argument_spec, - required_together=rax_required_together(), - mutually_exclusive=[['address', 'id', 'name']], - required_one_of=[['address', 'id', 'name']], - ) - - if not HAS_PYRAX: - module.fail_json(msg='pyrax is required for this module') - - address = module.params.get('address') - server_id = module.params.get('id') - name = module.params.get('name') - meta = module.params.get('meta') - - setup_rax_module(module, pyrax) - - rax_meta(module, address, name, server_id, meta) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/rax_mon_alarm.py b/ansible_collections/community/general/plugins/modules/rax_mon_alarm.py deleted file mode 100644 index b66611a90..000000000 --- a/ansible_collections/community/general/plugins/modules/rax_mon_alarm.py +++ /dev/null @@ -1,235 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright 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 absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- -module: rax_mon_alarm -short_description: Create or delete a Rackspace Cloud Monitoring alarm -description: -- Create or delete a Rackspace Cloud Monitoring alarm that associates an - existing rax_mon_entity, rax_mon_check, and rax_mon_notification_plan with - criteria that specify what conditions will trigger which levels of - notifications. Rackspace monitoring module flow | rax_mon_entity -> - rax_mon_check -> rax_mon_notification -> rax_mon_notification_plan -> - *rax_mon_alarm* -attributes: - check_mode: - support: none - diff_mode: - support: none -options: - state: - type: str - description: - - Ensure that the alarm with this O(label) exists or does not exist. - choices: [ "present", "absent" ] - required: false - default: present - label: - type: str - description: - - Friendly name for this alarm, used to achieve idempotence. Must be a String - between 1 and 255 characters long. - required: true - entity_id: - type: str - description: - - ID of the entity this alarm is attached to. May be acquired by registering - the value of a rax_mon_entity task. - required: true - check_id: - type: str - description: - - ID of the check that should be alerted on. May be acquired by registering - the value of a rax_mon_check task. - required: true - notification_plan_id: - type: str - description: - - ID of the notification plan to trigger if this alarm fires. May be acquired - by registering the value of a rax_mon_notification_plan task. - required: true - criteria: - type: str - description: - - Alarm DSL that describes alerting conditions and their output states. Must - be between 1 and 16384 characters long. See - http://docs.rackspace.com/cm/api/v1.0/cm-devguide/content/alerts-language.html - for a reference on the alerting language. - disabled: - description: - - If yes, create this alarm, but leave it in an inactive state. Defaults to - no. - type: bool - default: false - metadata: - type: dict - description: - - Arbitrary key/value pairs to accompany the alarm. Must be a hash of String - keys and values between 1 and 255 characters long. -author: Ash Wilson (@smashwilson) -extends_documentation_fragment: - - community.general.rackspace.openstack - - community.general.attributes - -''' - -EXAMPLES = ''' -- name: Alarm example - gather_facts: false - hosts: local - connection: local - tasks: - - name: Ensure that a specific alarm exists. - community.general.rax_mon_alarm: - credentials: ~/.rax_pub - state: present - label: uhoh - entity_id: "{{ the_entity['entity']['id'] }}" - check_id: "{{ the_check['check']['id'] }}" - notification_plan_id: "{{ defcon1['notification_plan']['id'] }}" - criteria: > - if (rate(metric['average']) > 10) { - return new AlarmStatus(WARNING); - } - return new AlarmStatus(OK); - register: the_alarm -''' - -try: - import pyrax - HAS_PYRAX = True -except ImportError: - HAS_PYRAX = False - -from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.rax import rax_argument_spec, rax_required_together, setup_rax_module - - -def alarm(module, state, label, entity_id, check_id, notification_plan_id, criteria, - disabled, metadata): - - if len(label) < 1 or len(label) > 255: - module.fail_json(msg='label must be between 1 and 255 characters long') - - if criteria and len(criteria) < 1 or len(criteria) > 16384: - module.fail_json(msg='criteria must be between 1 and 16384 characters long') - - # Coerce attributes. - - changed = False - alarm = None - - cm = pyrax.cloud_monitoring - if not cm: - module.fail_json(msg='Failed to instantiate client. This typically ' - 'indicates an invalid region or an incorrectly ' - 'capitalized region name.') - - existing = [a for a in cm.list_alarms(entity_id) if a.label == label] - - if existing: - alarm = existing[0] - - if state == 'present': - should_create = False - should_update = False - should_delete = False - - if len(existing) > 1: - module.fail_json(msg='%s existing alarms have the label %s.' % - (len(existing), label)) - - if alarm: - if check_id != alarm.check_id or notification_plan_id != alarm.notification_plan_id: - should_delete = should_create = True - - should_update = (disabled and disabled != alarm.disabled) or \ - (metadata and metadata != alarm.metadata) or \ - (criteria and criteria != alarm.criteria) - - if should_update and not should_delete: - cm.update_alarm(entity=entity_id, alarm=alarm, - criteria=criteria, disabled=disabled, - label=label, metadata=metadata) - changed = True - - if should_delete: - alarm.delete() - changed = True - else: - should_create = True - - if should_create: - alarm = cm.create_alarm(entity=entity_id, check=check_id, - notification_plan=notification_plan_id, - criteria=criteria, disabled=disabled, label=label, - metadata=metadata) - changed = True - else: - for a in existing: - a.delete() - changed = True - - if alarm: - alarm_dict = { - "id": alarm.id, - "label": alarm.label, - "check_id": alarm.check_id, - "notification_plan_id": alarm.notification_plan_id, - "criteria": alarm.criteria, - "disabled": alarm.disabled, - "metadata": alarm.metadata - } - module.exit_json(changed=changed, alarm=alarm_dict) - else: - module.exit_json(changed=changed) - - -def main(): - argument_spec = rax_argument_spec() - argument_spec.update( - dict( - state=dict(default='present', choices=['present', 'absent']), - label=dict(required=True), - entity_id=dict(required=True), - check_id=dict(required=True), - notification_plan_id=dict(required=True), - criteria=dict(), - disabled=dict(type='bool', default=False), - metadata=dict(type='dict') - ) - ) - - module = AnsibleModule( - argument_spec=argument_spec, - required_together=rax_required_together() - ) - - if not HAS_PYRAX: - module.fail_json(msg='pyrax is required for this module') - - state = module.params.get('state') - label = module.params.get('label') - entity_id = module.params.get('entity_id') - check_id = module.params.get('check_id') - notification_plan_id = module.params.get('notification_plan_id') - criteria = module.params.get('criteria') - disabled = module.boolean(module.params.get('disabled')) - metadata = module.params.get('metadata') - - setup_rax_module(module, pyrax) - - alarm(module, state, label, entity_id, check_id, notification_plan_id, - criteria, disabled, metadata) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/rax_mon_check.py b/ansible_collections/community/general/plugins/modules/rax_mon_check.py deleted file mode 100644 index 253c26dcf..000000000 --- a/ansible_collections/community/general/plugins/modules/rax_mon_check.py +++ /dev/null @@ -1,329 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright 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 absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- -module: rax_mon_check -short_description: Create or delete a Rackspace Cloud Monitoring check for an - existing entity. -description: -- Create or delete a Rackspace Cloud Monitoring check associated with an - existing rax_mon_entity. A check is a specific test or measurement that is - performed, possibly from different monitoring zones, on the systems you - monitor. Rackspace monitoring module flow | rax_mon_entity -> - *rax_mon_check* -> rax_mon_notification -> rax_mon_notification_plan -> - rax_mon_alarm -attributes: - check_mode: - support: none - diff_mode: - support: none -options: - state: - type: str - description: - - Ensure that a check with this O(label) exists or does not exist. - choices: ["present", "absent"] - default: present - entity_id: - type: str - description: - - ID of the rax_mon_entity to target with this check. - required: true - label: - type: str - description: - - Defines a label for this check, between 1 and 64 characters long. - required: true - check_type: - type: str - description: - - The type of check to create. C(remote.) checks may be created on any - rax_mon_entity. C(agent.) checks may only be created on rax_mon_entities - that have a non-null C(agent_id). - - | - Choices for this option are: - - V(remote.dns) - - V(remote.ftp-banner) - - V(remote.http) - - V(remote.imap-banner) - - V(remote.mssql-banner) - - V(remote.mysql-banner) - - V(remote.ping) - - V(remote.pop3-banner) - - V(remote.postgresql-banner) - - V(remote.smtp-banner) - - V(remote.smtp) - - V(remote.ssh) - - V(remote.tcp) - - V(remote.telnet-banner) - - V(agent.filesystem) - - V(agent.memory) - - V(agent.load_average) - - V(agent.cpu) - - V(agent.disk) - - V(agent.network) - - V(agent.plugin) - required: true - monitoring_zones_poll: - type: str - description: - - Comma-separated list of the names of the monitoring zones the check should - run from. Available monitoring zones include mzdfw, mzhkg, mziad, mzlon, - mzord and mzsyd. Required for remote.* checks; prohibited for agent.* checks. - target_hostname: - type: str - description: - - One of O(target_hostname) and O(target_alias) is required for remote.* checks, - but prohibited for agent.* checks. The hostname this check should target. - Must be a valid IPv4, IPv6, or FQDN. - target_alias: - type: str - description: - - One of O(target_alias) and O(target_hostname) is required for remote.* checks, - but prohibited for agent.* checks. Use the corresponding key in the entity's - C(ip_addresses) hash to resolve an IP address to target. - details: - type: dict - default: {} - description: - - Additional details specific to the check type. Must be a hash of strings - between 1 and 255 characters long, or an array or object containing 0 to - 256 items. - disabled: - description: - - If V(true), ensure the check is created, but don't actually use it yet. - type: bool - default: false - metadata: - type: dict - default: {} - description: - - Hash of arbitrary key-value pairs to accompany this check if it fires. - Keys and values must be strings between 1 and 255 characters long. - period: - type: int - description: - - The number of seconds between each time the check is performed. Must be - greater than the minimum period set on your account. - timeout: - type: int - description: - - The number of seconds this check will wait when attempting to collect - results. Must be less than the period. -author: Ash Wilson (@smashwilson) -extends_documentation_fragment: - - community.general.rackspace.openstack - - community.general.attributes - -''' - -EXAMPLES = ''' -- name: Create a monitoring check - gather_facts: false - hosts: local - connection: local - tasks: - - name: Associate a check with an existing entity. - community.general.rax_mon_check: - credentials: ~/.rax_pub - state: present - entity_id: "{{ the_entity['entity']['id'] }}" - label: the_check - check_type: remote.ping - monitoring_zones_poll: mziad,mzord,mzdfw - details: - count: 10 - meta: - hurf: durf - register: the_check -''' - -try: - import pyrax - HAS_PYRAX = True -except ImportError: - HAS_PYRAX = False - -from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.rax import rax_argument_spec, rax_required_together, setup_rax_module - - -def cloud_check(module, state, entity_id, label, check_type, - monitoring_zones_poll, target_hostname, target_alias, details, - disabled, metadata, period, timeout): - - # Coerce attributes. - - if monitoring_zones_poll and not isinstance(monitoring_zones_poll, list): - monitoring_zones_poll = [monitoring_zones_poll] - - if period: - period = int(period) - - if timeout: - timeout = int(timeout) - - changed = False - check = None - - cm = pyrax.cloud_monitoring - if not cm: - module.fail_json(msg='Failed to instantiate client. This typically ' - 'indicates an invalid region or an incorrectly ' - 'capitalized region name.') - - entity = cm.get_entity(entity_id) - if not entity: - module.fail_json(msg='Failed to instantiate entity. "%s" may not be' - ' a valid entity id.' % entity_id) - - existing = [e for e in entity.list_checks() if e.label == label] - - if existing: - check = existing[0] - - if state == 'present': - if len(existing) > 1: - module.fail_json(msg='%s existing checks have a label of %s.' % - (len(existing), label)) - - should_delete = False - should_create = False - should_update = False - - if check: - # Details may include keys set to default values that are not - # included in the initial creation. - # - # Only force a recreation of the check if one of the *specified* - # keys is missing or has a different value. - if details: - for (key, value) in details.items(): - if key not in check.details: - should_delete = should_create = True - elif value != check.details[key]: - should_delete = should_create = True - - should_update = label != check.label or \ - (target_hostname and target_hostname != check.target_hostname) or \ - (target_alias and target_alias != check.target_alias) or \ - (disabled != check.disabled) or \ - (metadata and metadata != check.metadata) or \ - (period and period != check.period) or \ - (timeout and timeout != check.timeout) or \ - (monitoring_zones_poll and monitoring_zones_poll != check.monitoring_zones_poll) - - if should_update and not should_delete: - check.update(label=label, - disabled=disabled, - metadata=metadata, - monitoring_zones_poll=monitoring_zones_poll, - timeout=timeout, - period=period, - target_alias=target_alias, - target_hostname=target_hostname) - changed = True - else: - # The check doesn't exist yet. - should_create = True - - if should_delete: - check.delete() - - if should_create: - check = cm.create_check(entity, - label=label, - check_type=check_type, - target_hostname=target_hostname, - target_alias=target_alias, - monitoring_zones_poll=monitoring_zones_poll, - details=details, - disabled=disabled, - metadata=metadata, - period=period, - timeout=timeout) - changed = True - elif state == 'absent': - if check: - check.delete() - changed = True - else: - module.fail_json(msg='state must be either present or absent.') - - if check: - check_dict = { - "id": check.id, - "label": check.label, - "type": check.type, - "target_hostname": check.target_hostname, - "target_alias": check.target_alias, - "monitoring_zones_poll": check.monitoring_zones_poll, - "details": check.details, - "disabled": check.disabled, - "metadata": check.metadata, - "period": check.period, - "timeout": check.timeout - } - module.exit_json(changed=changed, check=check_dict) - else: - module.exit_json(changed=changed) - - -def main(): - argument_spec = rax_argument_spec() - argument_spec.update( - dict( - entity_id=dict(required=True), - label=dict(required=True), - check_type=dict(required=True), - monitoring_zones_poll=dict(), - target_hostname=dict(), - target_alias=dict(), - details=dict(type='dict', default={}), - disabled=dict(type='bool', default=False), - metadata=dict(type='dict', default={}), - period=dict(type='int'), - timeout=dict(type='int'), - state=dict(default='present', choices=['present', 'absent']) - ) - ) - - module = AnsibleModule( - argument_spec=argument_spec, - required_together=rax_required_together() - ) - - if not HAS_PYRAX: - module.fail_json(msg='pyrax is required for this module') - - entity_id = module.params.get('entity_id') - label = module.params.get('label') - check_type = module.params.get('check_type') - monitoring_zones_poll = module.params.get('monitoring_zones_poll') - target_hostname = module.params.get('target_hostname') - target_alias = module.params.get('target_alias') - details = module.params.get('details') - disabled = module.boolean(module.params.get('disabled')) - metadata = module.params.get('metadata') - period = module.params.get('period') - timeout = module.params.get('timeout') - - state = module.params.get('state') - - setup_rax_module(module, pyrax) - - cloud_check(module, state, entity_id, label, check_type, - monitoring_zones_poll, target_hostname, target_alias, details, - disabled, metadata, period, timeout) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/rax_mon_entity.py b/ansible_collections/community/general/plugins/modules/rax_mon_entity.py deleted file mode 100644 index fbad9f98f..000000000 --- a/ansible_collections/community/general/plugins/modules/rax_mon_entity.py +++ /dev/null @@ -1,201 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright 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 absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- -module: rax_mon_entity -short_description: Create or delete a Rackspace Cloud Monitoring entity -description: -- Create or delete a Rackspace Cloud Monitoring entity, which represents a device - to monitor. Entities associate checks and alarms with a target system and - provide a convenient, centralized place to store IP addresses. Rackspace - monitoring module flow | *rax_mon_entity* -> rax_mon_check -> - rax_mon_notification -> rax_mon_notification_plan -> rax_mon_alarm -attributes: - check_mode: - support: none - diff_mode: - support: none -options: - label: - type: str - description: - - Defines a name for this entity. Must be a non-empty string between 1 and - 255 characters long. - required: true - state: - type: str - description: - - Ensure that an entity with this C(name) exists or does not exist. - choices: ["present", "absent"] - default: present - agent_id: - type: str - description: - - Rackspace monitoring agent on the target device to which this entity is - bound. Necessary to collect C(agent.) rax_mon_checks against this entity. - named_ip_addresses: - type: dict - default: {} - description: - - Hash of IP addresses that may be referenced by name by rax_mon_checks - added to this entity. Must be a dictionary of with keys that are names - between 1 and 64 characters long, and values that are valid IPv4 or IPv6 - addresses. - metadata: - type: dict - default: {} - description: - - Hash of arbitrary C(name), C(value) pairs that are passed to associated - rax_mon_alarms. Names and values must all be between 1 and 255 characters - long. -author: Ash Wilson (@smashwilson) -extends_documentation_fragment: - - community.general.rackspace.openstack - - community.general.attributes - -''' - -EXAMPLES = ''' -- name: Entity example - gather_facts: false - hosts: local - connection: local - tasks: - - name: Ensure an entity exists - community.general.rax_mon_entity: - credentials: ~/.rax_pub - state: present - label: my_entity - named_ip_addresses: - web_box: 192.0.2.4 - db_box: 192.0.2.5 - meta: - hurf: durf - register: the_entity -''' - -try: - import pyrax - HAS_PYRAX = True -except ImportError: - HAS_PYRAX = False - -from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.rax import rax_argument_spec, rax_required_together, setup_rax_module - - -def cloud_monitoring(module, state, label, agent_id, named_ip_addresses, - metadata): - - if len(label) < 1 or len(label) > 255: - module.fail_json(msg='label must be between 1 and 255 characters long') - - changed = False - - cm = pyrax.cloud_monitoring - if not cm: - module.fail_json(msg='Failed to instantiate client. This typically ' - 'indicates an invalid region or an incorrectly ' - 'capitalized region name.') - - existing = [] - for entity in cm.list_entities(): - if label == entity.label: - existing.append(entity) - - entity = None - - if existing: - entity = existing[0] - - if state == 'present': - should_update = False - should_delete = False - should_create = False - - if len(existing) > 1: - module.fail_json(msg='%s existing entities have the label %s.' % - (len(existing), label)) - - if entity: - if named_ip_addresses and named_ip_addresses != entity.ip_addresses: - should_delete = should_create = True - - # Change an existing Entity, unless there's nothing to do. - should_update = agent_id and agent_id != entity.agent_id or \ - (metadata and metadata != entity.metadata) - - if should_update and not should_delete: - entity.update(agent_id, metadata) - changed = True - - if should_delete: - entity.delete() - else: - should_create = True - - if should_create: - # Create a new Entity. - entity = cm.create_entity(label=label, agent=agent_id, - ip_addresses=named_ip_addresses, - metadata=metadata) - changed = True - else: - # Delete the existing Entities. - for e in existing: - e.delete() - changed = True - - if entity: - entity_dict = { - "id": entity.id, - "name": entity.name, - "agent_id": entity.agent_id, - } - module.exit_json(changed=changed, entity=entity_dict) - else: - module.exit_json(changed=changed) - - -def main(): - argument_spec = rax_argument_spec() - argument_spec.update( - dict( - state=dict(default='present', choices=['present', 'absent']), - label=dict(required=True), - agent_id=dict(), - named_ip_addresses=dict(type='dict', default={}), - metadata=dict(type='dict', default={}) - ) - ) - - module = AnsibleModule( - argument_spec=argument_spec, - required_together=rax_required_together() - ) - - if not HAS_PYRAX: - module.fail_json(msg='pyrax is required for this module') - - state = module.params.get('state') - - label = module.params.get('label') - agent_id = module.params.get('agent_id') - named_ip_addresses = module.params.get('named_ip_addresses') - metadata = module.params.get('metadata') - - setup_rax_module(module, pyrax) - - cloud_monitoring(module, state, label, agent_id, named_ip_addresses, metadata) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/rax_mon_notification.py b/ansible_collections/community/general/plugins/modules/rax_mon_notification.py deleted file mode 100644 index 7539f2a37..000000000 --- a/ansible_collections/community/general/plugins/modules/rax_mon_notification.py +++ /dev/null @@ -1,182 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright 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 absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- -module: rax_mon_notification -short_description: Create or delete a Rackspace Cloud Monitoring notification -description: -- Create or delete a Rackspace Cloud Monitoring notification that specifies a - channel that can be used to communicate alarms, such as email, webhooks, or - PagerDuty. Rackspace monitoring module flow | rax_mon_entity -> rax_mon_check -> - *rax_mon_notification* -> rax_mon_notification_plan -> rax_mon_alarm -attributes: - check_mode: - support: none - diff_mode: - support: none -options: - state: - type: str - description: - - Ensure that the notification with this O(label) exists or does not exist. - choices: ['present', 'absent'] - default: present - label: - type: str - description: - - Defines a friendly name for this notification. String between 1 and 255 - characters long. - required: true - notification_type: - type: str - description: - - A supported notification type. - choices: ["webhook", "email", "pagerduty"] - required: true - details: - type: dict - description: - - Dictionary of key-value pairs used to initialize the notification. - Required keys and meanings vary with notification type. See - http://docs.rackspace.com/cm/api/v1.0/cm-devguide/content/ - service-notification-types-crud.html for details. - required: true -author: Ash Wilson (@smashwilson) -extends_documentation_fragment: - - community.general.rackspace.openstack - - community.general.attributes - -''' - -EXAMPLES = ''' -- name: Monitoring notification example - gather_facts: false - hosts: local - connection: local - tasks: - - name: Email me when something goes wrong. - rax_mon_entity: - credentials: ~/.rax_pub - label: omg - type: email - details: - address: me@mailhost.com - register: the_notification -''' - -try: - import pyrax - HAS_PYRAX = True -except ImportError: - HAS_PYRAX = False - -from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.rax import rax_argument_spec, rax_required_together, setup_rax_module - - -def notification(module, state, label, notification_type, details): - - if len(label) < 1 or len(label) > 255: - module.fail_json(msg='label must be between 1 and 255 characters long') - - changed = False - notification = None - - cm = pyrax.cloud_monitoring - if not cm: - module.fail_json(msg='Failed to instantiate client. This typically ' - 'indicates an invalid region or an incorrectly ' - 'capitalized region name.') - - existing = [] - for n in cm.list_notifications(): - if n.label == label: - existing.append(n) - - if existing: - notification = existing[0] - - if state == 'present': - should_update = False - should_delete = False - should_create = False - - if len(existing) > 1: - module.fail_json(msg='%s existing notifications are labelled %s.' % - (len(existing), label)) - - if notification: - should_delete = (notification_type != notification.type) - - should_update = (details != notification.details) - - if should_update and not should_delete: - notification.update(details=notification.details) - changed = True - - if should_delete: - notification.delete() - else: - should_create = True - - if should_create: - notification = cm.create_notification(notification_type, - label=label, details=details) - changed = True - else: - for n in existing: - n.delete() - changed = True - - if notification: - notification_dict = { - "id": notification.id, - "type": notification.type, - "label": notification.label, - "details": notification.details - } - module.exit_json(changed=changed, notification=notification_dict) - else: - module.exit_json(changed=changed) - - -def main(): - argument_spec = rax_argument_spec() - argument_spec.update( - dict( - state=dict(default='present', choices=['present', 'absent']), - label=dict(required=True), - notification_type=dict(required=True, choices=['webhook', 'email', 'pagerduty']), - details=dict(required=True, type='dict') - ) - ) - - module = AnsibleModule( - argument_spec=argument_spec, - required_together=rax_required_together() - ) - - if not HAS_PYRAX: - module.fail_json(msg='pyrax is required for this module') - - state = module.params.get('state') - - label = module.params.get('label') - notification_type = module.params.get('notification_type') - details = module.params.get('details') - - setup_rax_module(module, pyrax) - - notification(module, state, label, notification_type, details) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/rax_mon_notification_plan.py b/ansible_collections/community/general/plugins/modules/rax_mon_notification_plan.py deleted file mode 100644 index 31647304b..000000000 --- a/ansible_collections/community/general/plugins/modules/rax_mon_notification_plan.py +++ /dev/null @@ -1,191 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright 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 absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- -module: rax_mon_notification_plan -short_description: Create or delete a Rackspace Cloud Monitoring notification - plan. -description: -- Create or delete a Rackspace Cloud Monitoring notification plan by - associating existing rax_mon_notifications with severity levels. Rackspace - monitoring module flow | rax_mon_entity -> rax_mon_check -> - rax_mon_notification -> *rax_mon_notification_plan* -> rax_mon_alarm -attributes: - check_mode: - support: none - diff_mode: - support: none -options: - state: - type: str - description: - - Ensure that the notification plan with this O(label) exists or does not - exist. - choices: ['present', 'absent'] - default: present - label: - type: str - description: - - Defines a friendly name for this notification plan. String between 1 and - 255 characters long. - required: true - critical_state: - type: list - elements: str - description: - - Notification list to use when the alarm state is CRITICAL. Must be an - array of valid rax_mon_notification ids. - warning_state: - type: list - elements: str - description: - - Notification list to use when the alarm state is WARNING. Must be an array - of valid rax_mon_notification ids. - ok_state: - type: list - elements: str - description: - - Notification list to use when the alarm state is OK. Must be an array of - valid rax_mon_notification ids. -author: Ash Wilson (@smashwilson) -extends_documentation_fragment: - - community.general.rackspace.openstack - - community.general.attributes - -''' - -EXAMPLES = ''' -- name: Example notification plan - gather_facts: false - hosts: local - connection: local - tasks: - - name: Establish who gets called when. - community.general.rax_mon_notification_plan: - credentials: ~/.rax_pub - state: present - label: defcon1 - critical_state: - - "{{ everyone['notification']['id'] }}" - warning_state: - - "{{ opsfloor['notification']['id'] }}" - register: defcon1 -''' - -try: - import pyrax - HAS_PYRAX = True -except ImportError: - HAS_PYRAX = False - -from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.rax import rax_argument_spec, rax_required_together, setup_rax_module - - -def notification_plan(module, state, label, critical_state, warning_state, ok_state): - - if len(label) < 1 or len(label) > 255: - module.fail_json(msg='label must be between 1 and 255 characters long') - - changed = False - notification_plan = None - - cm = pyrax.cloud_monitoring - if not cm: - module.fail_json(msg='Failed to instantiate client. This typically ' - 'indicates an invalid region or an incorrectly ' - 'capitalized region name.') - - existing = [] - for n in cm.list_notification_plans(): - if n.label == label: - existing.append(n) - - if existing: - notification_plan = existing[0] - - if state == 'present': - should_create = False - should_delete = False - - if len(existing) > 1: - module.fail_json(msg='%s notification plans are labelled %s.' % - (len(existing), label)) - - if notification_plan: - should_delete = (critical_state and critical_state != notification_plan.critical_state) or \ - (warning_state and warning_state != notification_plan.warning_state) or \ - (ok_state and ok_state != notification_plan.ok_state) - - if should_delete: - notification_plan.delete() - should_create = True - else: - should_create = True - - if should_create: - notification_plan = cm.create_notification_plan(label=label, - critical_state=critical_state, - warning_state=warning_state, - ok_state=ok_state) - changed = True - else: - for np in existing: - np.delete() - changed = True - - if notification_plan: - notification_plan_dict = { - "id": notification_plan.id, - "critical_state": notification_plan.critical_state, - "warning_state": notification_plan.warning_state, - "ok_state": notification_plan.ok_state, - "metadata": notification_plan.metadata - } - module.exit_json(changed=changed, notification_plan=notification_plan_dict) - else: - module.exit_json(changed=changed) - - -def main(): - argument_spec = rax_argument_spec() - argument_spec.update( - dict( - state=dict(default='present', choices=['present', 'absent']), - label=dict(required=True), - critical_state=dict(type='list', elements='str'), - warning_state=dict(type='list', elements='str'), - ok_state=dict(type='list', elements='str'), - ) - ) - - module = AnsibleModule( - argument_spec=argument_spec, - required_together=rax_required_together() - ) - - if not HAS_PYRAX: - module.fail_json(msg='pyrax is required for this module') - - state = module.params.get('state') - - label = module.params.get('label') - critical_state = module.params.get('critical_state') - warning_state = module.params.get('warning_state') - ok_state = module.params.get('ok_state') - - setup_rax_module(module, pyrax) - - notification_plan(module, state, label, critical_state, warning_state, ok_state) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/rax_network.py b/ansible_collections/community/general/plugins/modules/rax_network.py deleted file mode 100644 index 22f148366..000000000 --- a/ansible_collections/community/general/plugins/modules/rax_network.py +++ /dev/null @@ -1,146 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright 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 absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- -module: rax_network -short_description: Create / delete an isolated network in Rackspace Public Cloud -description: - - creates / deletes a Rackspace Public Cloud isolated network. -attributes: - check_mode: - support: none - diff_mode: - support: none -options: - state: - type: str - description: - - Indicate desired state of the resource - choices: - - present - - absent - default: present - label: - type: str - description: - - Label (name) to give the network - required: true - cidr: - type: str - description: - - cidr of the network being created -author: - - "Christopher H. Laco (@claco)" - - "Jesse Keating (@omgjlk)" -extends_documentation_fragment: - - community.general.rackspace.openstack - - community.general.attributes - -''' - -EXAMPLES = ''' -- name: Build an Isolated Network - gather_facts: false - - tasks: - - name: Network create request - local_action: - module: rax_network - credentials: ~/.raxpub - label: my-net - cidr: 192.168.3.0/24 - state: present -''' - -try: - import pyrax - HAS_PYRAX = True -except ImportError: - HAS_PYRAX = False - -from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.rax import rax_argument_spec, rax_required_together, setup_rax_module - - -def cloud_network(module, state, label, cidr): - changed = False - network = None - networks = [] - - if not pyrax.cloud_networks: - module.fail_json(msg='Failed to instantiate client. This ' - 'typically indicates an invalid region or an ' - 'incorrectly capitalized region name.') - - if state == 'present': - if not cidr: - module.fail_json(msg='missing required arguments: cidr') - - try: - network = pyrax.cloud_networks.find_network_by_label(label) - except pyrax.exceptions.NetworkNotFound: - try: - network = pyrax.cloud_networks.create(label, cidr=cidr) - changed = True - except Exception as e: - module.fail_json(msg='%s' % e.message) - except Exception as e: - module.fail_json(msg='%s' % e.message) - - elif state == 'absent': - try: - network = pyrax.cloud_networks.find_network_by_label(label) - network.delete() - changed = True - except pyrax.exceptions.NetworkNotFound: - pass - except Exception as e: - module.fail_json(msg='%s' % e.message) - - if network: - instance = dict(id=network.id, - label=network.label, - cidr=network.cidr) - networks.append(instance) - - module.exit_json(changed=changed, networks=networks) - - -def main(): - argument_spec = rax_argument_spec() - argument_spec.update( - dict( - state=dict(default='present', - choices=['present', 'absent']), - label=dict(required=True), - cidr=dict() - ) - ) - - module = AnsibleModule( - argument_spec=argument_spec, - required_together=rax_required_together(), - ) - - if not HAS_PYRAX: - module.fail_json(msg='pyrax is required for this module') - - state = module.params.get('state') - label = module.params.get('label') - cidr = module.params.get('cidr') - - setup_rax_module(module, pyrax) - - cloud_network(module, state, label, cidr) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/rax_queue.py b/ansible_collections/community/general/plugins/modules/rax_queue.py deleted file mode 100644 index 00f730b27..000000000 --- a/ansible_collections/community/general/plugins/modules/rax_queue.py +++ /dev/null @@ -1,147 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright 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 absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- -module: rax_queue -short_description: Create / delete a queue in Rackspace Public Cloud -description: - - creates / deletes a Rackspace Public Cloud queue. -attributes: - check_mode: - support: none - diff_mode: - support: none -options: - name: - type: str - description: - - Name to give the queue - state: - type: str - description: - - Indicate desired state of the resource - choices: - - present - - absent - default: present -author: - - "Christopher H. Laco (@claco)" - - "Matt Martz (@sivel)" -extends_documentation_fragment: - - community.general.rackspace - - community.general.rackspace.openstack - - community.general.attributes - -''' - -EXAMPLES = ''' -- name: Build a Queue - gather_facts: false - hosts: local - connection: local - tasks: - - name: Queue create request - local_action: - module: rax_queue - credentials: ~/.raxpub - name: my-queue - region: DFW - state: present - register: my_queue -''' - -try: - import pyrax - HAS_PYRAX = True -except ImportError: - HAS_PYRAX = False - -from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.rax import rax_argument_spec, rax_required_together, setup_rax_module - - -def cloud_queue(module, state, name): - for arg in (state, name): - if not arg: - module.fail_json(msg='%s is required for rax_queue' % arg) - - changed = False - queues = [] - instance = {} - - cq = pyrax.queues - if not cq: - module.fail_json(msg='Failed to instantiate client. This ' - 'typically indicates an invalid region or an ' - 'incorrectly capitalized region name.') - - for queue in cq.list(): - if name != queue.name: - continue - - queues.append(queue) - - if len(queues) > 1: - module.fail_json(msg='Multiple Queues were matched by name') - - if state == 'present': - if not queues: - try: - queue = cq.create(name) - changed = True - except Exception as e: - module.fail_json(msg='%s' % e.message) - else: - queue = queues[0] - - instance = dict(name=queue.name) - result = dict(changed=changed, queue=instance) - module.exit_json(**result) - - elif state == 'absent': - if queues: - queue = queues[0] - try: - queue.delete() - changed = True - except Exception as e: - module.fail_json(msg='%s' % e.message) - - module.exit_json(changed=changed, queue=instance) - - -def main(): - argument_spec = rax_argument_spec() - argument_spec.update( - dict( - name=dict(), - state=dict(default='present', choices=['present', 'absent']), - ) - ) - - module = AnsibleModule( - argument_spec=argument_spec, - required_together=rax_required_together() - ) - - if not HAS_PYRAX: - module.fail_json(msg='pyrax is required for this module') - - name = module.params.get('name') - state = module.params.get('state') - - setup_rax_module(module, pyrax) - - cloud_queue(module, state, name) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/rax_scaling_group.py b/ansible_collections/community/general/plugins/modules/rax_scaling_group.py deleted file mode 100644 index f4bb79025..000000000 --- a/ansible_collections/community/general/plugins/modules/rax_scaling_group.py +++ /dev/null @@ -1,441 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright 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 absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- -module: rax_scaling_group -short_description: Manipulate Rackspace Cloud Autoscale Groups -description: - - Manipulate Rackspace Cloud Autoscale Groups -attributes: - check_mode: - support: none - diff_mode: - support: none -options: - config_drive: - description: - - Attach read-only configuration drive to server as label config-2 - type: bool - default: false - cooldown: - type: int - description: - - The period of time, in seconds, that must pass before any scaling can - occur after the previous scaling. Must be an integer between 0 and - 86400 (24 hrs). - default: 300 - disk_config: - type: str - description: - - Disk partitioning strategy - - If not specified, it will fallback to V(auto). - choices: - - auto - - manual - files: - type: dict - default: {} - description: - - 'Files to insert into the instance. Hash of C(remotepath: localpath)' - flavor: - type: str - description: - - flavor to use for the instance - required: true - image: - type: str - description: - - image to use for the instance. Can be an C(id), C(human_id) or C(name). - required: true - key_name: - type: str - description: - - key pair to use on the instance - loadbalancers: - type: list - elements: dict - description: - - List of load balancer C(id) and C(port) hashes - max_entities: - type: int - description: - - The maximum number of entities that are allowed in the scaling group. - Must be an integer between 0 and 1000. - required: true - meta: - type: dict - default: {} - description: - - A hash of metadata to associate with the instance - min_entities: - type: int - description: - - The minimum number of entities that are allowed in the scaling group. - Must be an integer between 0 and 1000. - required: true - name: - type: str - description: - - Name to give the scaling group - required: true - networks: - type: list - elements: str - description: - - The network to attach to the instances. If specified, you must include - ALL networks including the public and private interfaces. Can be C(id) - or C(label). - default: - - public - - private - server_name: - type: str - description: - - The base name for servers created by Autoscale - required: true - state: - type: str - description: - - Indicate desired state of the resource - choices: - - present - - absent - default: present - user_data: - type: str - description: - - Data to be uploaded to the servers config drive. This option implies - O(config_drive). Can be a file path or a string - wait: - description: - - wait for the scaling group to finish provisioning the minimum amount of - servers - type: bool - default: false - wait_timeout: - type: int - description: - - how long before wait gives up, in seconds - default: 300 -author: "Matt Martz (@sivel)" -extends_documentation_fragment: - - community.general.rackspace - - community.general.rackspace.openstack - - community.general.attributes - -''' - -EXAMPLES = ''' ---- -- hosts: localhost - gather_facts: false - connection: local - tasks: - - community.general.rax_scaling_group: - credentials: ~/.raxpub - region: ORD - cooldown: 300 - flavor: performance1-1 - image: bb02b1a3-bc77-4d17-ab5b-421d89850fca - min_entities: 5 - max_entities: 10 - name: ASG Test - server_name: asgtest - loadbalancers: - - id: 228385 - port: 80 - register: asg -''' - -import base64 -import json -import os -import time - -try: - import pyrax - HAS_PYRAX = True -except ImportError: - HAS_PYRAX = False - -from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.rax import ( - rax_argument_spec, rax_find_image, rax_find_network, - rax_required_together, rax_to_dict, setup_rax_module, - rax_scaling_group_personality_file, -) -from ansible.module_utils.six import string_types - - -def rax_asg(module, cooldown=300, disk_config=None, files=None, flavor=None, - image=None, key_name=None, loadbalancers=None, meta=None, - min_entities=0, max_entities=0, name=None, networks=None, - server_name=None, state='present', user_data=None, - config_drive=False, wait=True, wait_timeout=300): - files = {} if files is None else files - loadbalancers = [] if loadbalancers is None else loadbalancers - meta = {} if meta is None else meta - networks = [] if networks is None else networks - - changed = False - - au = pyrax.autoscale - if not au: - module.fail_json(msg='Failed to instantiate clients. This ' - 'typically indicates an invalid region or an ' - 'incorrectly capitalized region name.') - - if user_data: - config_drive = True - - if user_data and os.path.isfile(user_data): - try: - f = open(user_data) - user_data = f.read() - f.close() - except Exception as e: - module.fail_json(msg='Failed to load %s' % user_data) - - if state == 'present': - # Normalize and ensure all metadata values are strings - if meta: - for k, v in meta.items(): - if isinstance(v, list): - meta[k] = ','.join(['%s' % i for i in v]) - elif isinstance(v, dict): - meta[k] = json.dumps(v) - elif not isinstance(v, string_types): - meta[k] = '%s' % v - - if image: - image = rax_find_image(module, pyrax, image) - - nics = [] - if networks: - for network in networks: - nics.extend(rax_find_network(module, pyrax, network)) - - for nic in nics: - # pyrax is currently returning net-id, but we need uuid - # this check makes this forward compatible for a time when - # pyrax uses uuid instead - if nic.get('net-id'): - nic.update(uuid=nic['net-id']) - del nic['net-id'] - - # Handle the file contents - personality = rax_scaling_group_personality_file(module, files) - - lbs = [] - if loadbalancers: - for lb in loadbalancers: - try: - lb_id = int(lb.get('id')) - except (ValueError, TypeError): - module.fail_json(msg='Load balancer ID is not an integer: ' - '%s' % lb.get('id')) - try: - port = int(lb.get('port')) - except (ValueError, TypeError): - module.fail_json(msg='Load balancer port is not an ' - 'integer: %s' % lb.get('port')) - if not lb_id or not port: - continue - lbs.append((lb_id, port)) - - try: - sg = au.find(name=name) - except pyrax.exceptions.NoUniqueMatch as e: - module.fail_json(msg='%s' % e.message) - except pyrax.exceptions.NotFound: - try: - sg = au.create(name, cooldown=cooldown, - min_entities=min_entities, - max_entities=max_entities, - launch_config_type='launch_server', - server_name=server_name, image=image, - flavor=flavor, disk_config=disk_config, - metadata=meta, personality=personality, - networks=nics, load_balancers=lbs, - key_name=key_name, config_drive=config_drive, - user_data=user_data) - changed = True - except Exception as e: - module.fail_json(msg='%s' % e.message) - - if not changed: - # Scaling Group Updates - group_args = {} - if cooldown != sg.cooldown: - group_args['cooldown'] = cooldown - - if min_entities != sg.min_entities: - group_args['min_entities'] = min_entities - - if max_entities != sg.max_entities: - group_args['max_entities'] = max_entities - - if group_args: - changed = True - sg.update(**group_args) - - # Launch Configuration Updates - lc = sg.get_launch_config() - lc_args = {} - if server_name != lc.get('name'): - lc_args['server_name'] = server_name - - if image != lc.get('image'): - lc_args['image'] = image - - if flavor != lc.get('flavor'): - lc_args['flavor'] = flavor - - disk_config = disk_config or 'AUTO' - if ((disk_config or lc.get('disk_config')) and - disk_config != lc.get('disk_config', 'AUTO')): - lc_args['disk_config'] = disk_config - - if (meta or lc.get('meta')) and meta != lc.get('metadata'): - lc_args['metadata'] = meta - - test_personality = [] - for p in personality: - test_personality.append({ - 'path': p['path'], - 'contents': base64.b64encode(p['contents']) - }) - if ((test_personality or lc.get('personality')) and - test_personality != lc.get('personality')): - lc_args['personality'] = personality - - if nics != lc.get('networks'): - lc_args['networks'] = nics - - if lbs != lc.get('load_balancers'): - # Work around for https://github.com/rackspace/pyrax/pull/393 - lc_args['load_balancers'] = sg.manager._resolve_lbs(lbs) - - if key_name != lc.get('key_name'): - lc_args['key_name'] = key_name - - if config_drive != lc.get('config_drive', False): - lc_args['config_drive'] = config_drive - - if (user_data and - base64.b64encode(user_data) != lc.get('user_data')): - lc_args['user_data'] = user_data - - if lc_args: - # Work around for https://github.com/rackspace/pyrax/pull/389 - if 'flavor' not in lc_args: - lc_args['flavor'] = lc.get('flavor') - changed = True - sg.update_launch_config(**lc_args) - - sg.get() - - if wait: - end_time = time.time() + wait_timeout - infinite = wait_timeout == 0 - while infinite or time.time() < end_time: - state = sg.get_state() - if state["pending_capacity"] == 0: - break - - time.sleep(5) - - module.exit_json(changed=changed, autoscale_group=rax_to_dict(sg)) - - else: - try: - sg = au.find(name=name) - sg.delete() - changed = True - except pyrax.exceptions.NotFound as e: - sg = {} - except Exception as e: - module.fail_json(msg='%s' % e.message) - - module.exit_json(changed=changed, autoscale_group=rax_to_dict(sg)) - - -def main(): - argument_spec = rax_argument_spec() - argument_spec.update( - dict( - config_drive=dict(default=False, type='bool'), - cooldown=dict(type='int', default=300), - disk_config=dict(choices=['auto', 'manual']), - files=dict(type='dict', default={}), - flavor=dict(required=True), - image=dict(required=True), - key_name=dict(), - loadbalancers=dict(type='list', elements='dict'), - meta=dict(type='dict', default={}), - min_entities=dict(type='int', required=True), - max_entities=dict(type='int', required=True), - name=dict(required=True), - networks=dict(type='list', elements='str', default=['public', 'private']), - server_name=dict(required=True), - state=dict(default='present', choices=['present', 'absent']), - user_data=dict(no_log=True), - wait=dict(default=False, type='bool'), - wait_timeout=dict(default=300, type='int'), - ) - ) - - module = AnsibleModule( - argument_spec=argument_spec, - required_together=rax_required_together(), - ) - - if not HAS_PYRAX: - module.fail_json(msg='pyrax is required for this module') - - config_drive = module.params.get('config_drive') - cooldown = module.params.get('cooldown') - disk_config = module.params.get('disk_config') - if disk_config: - disk_config = disk_config.upper() - files = module.params.get('files') - flavor = module.params.get('flavor') - image = module.params.get('image') - key_name = module.params.get('key_name') - loadbalancers = module.params.get('loadbalancers') - meta = module.params.get('meta') - min_entities = module.params.get('min_entities') - max_entities = module.params.get('max_entities') - name = module.params.get('name') - networks = module.params.get('networks') - server_name = module.params.get('server_name') - state = module.params.get('state') - user_data = module.params.get('user_data') - - if not 0 <= min_entities <= 1000 or not 0 <= max_entities <= 1000: - module.fail_json(msg='min_entities and max_entities must be an ' - 'integer between 0 and 1000') - - if not 0 <= cooldown <= 86400: - module.fail_json(msg='cooldown must be an integer between 0 and 86400') - - setup_rax_module(module, pyrax) - - rax_asg(module, cooldown=cooldown, disk_config=disk_config, - files=files, flavor=flavor, image=image, meta=meta, - key_name=key_name, loadbalancers=loadbalancers, - min_entities=min_entities, max_entities=max_entities, - name=name, networks=networks, server_name=server_name, - state=state, config_drive=config_drive, user_data=user_data) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/rax_scaling_policy.py b/ansible_collections/community/general/plugins/modules/rax_scaling_policy.py deleted file mode 100644 index 2869a6910..000000000 --- a/ansible_collections/community/general/plugins/modules/rax_scaling_policy.py +++ /dev/null @@ -1,294 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright 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 absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- -module: rax_scaling_policy -short_description: Manipulate Rackspace Cloud Autoscale Scaling Policy -description: - - Manipulate Rackspace Cloud Autoscale Scaling Policy -attributes: - check_mode: - support: none - diff_mode: - support: none -options: - at: - type: str - description: - - The UTC time when this policy will be executed. The time must be - formatted according to C(yyyy-MM-dd'T'HH:mm:ss.SSS) such as - V(2013-05-19T08:07:08Z) - change: - type: int - description: - - The change, either as a number of servers or as a percentage, to make - in the scaling group. If this is a percentage, you must set - O(is_percent) to V(true) also. - cron: - type: str - description: - - The time when the policy will be executed, as a cron entry. For - example, if this is parameter is set to V(1 0 * * *). - cooldown: - type: int - description: - - The period of time, in seconds, that must pass before any scaling can - occur after the previous scaling. Must be an integer between 0 and - 86400 (24 hrs). - default: 300 - desired_capacity: - type: int - description: - - The desired server capacity of the scaling the group; that is, how - many servers should be in the scaling group. - is_percent: - description: - - Whether the value in O(change) is a percent value - default: false - type: bool - name: - type: str - description: - - Name to give the policy - required: true - policy_type: - type: str - description: - - The type of policy that will be executed for the current release. - choices: - - webhook - - schedule - required: true - scaling_group: - type: str - description: - - Name of the scaling group that this policy will be added to - required: true - state: - type: str - description: - - Indicate desired state of the resource - choices: - - present - - absent - default: present -author: "Matt Martz (@sivel)" -extends_documentation_fragment: - - community.general.rackspace - - community.general.rackspace.openstack - - community.general.attributes - -''' - -EXAMPLES = ''' ---- -- hosts: localhost - gather_facts: false - connection: local - tasks: - - community.general.rax_scaling_policy: - credentials: ~/.raxpub - region: ORD - at: '2013-05-19T08:07:08Z' - change: 25 - cooldown: 300 - is_percent: true - name: ASG Test Policy - at - policy_type: schedule - scaling_group: ASG Test - register: asps_at - - - community.general.rax_scaling_policy: - credentials: ~/.raxpub - region: ORD - cron: '1 0 * * *' - change: 25 - cooldown: 300 - is_percent: true - name: ASG Test Policy - cron - policy_type: schedule - scaling_group: ASG Test - register: asp_cron - - - community.general.rax_scaling_policy: - credentials: ~/.raxpub - region: ORD - cooldown: 300 - desired_capacity: 5 - name: ASG Test Policy - webhook - policy_type: webhook - scaling_group: ASG Test - register: asp_webhook -''' - -try: - import pyrax - HAS_PYRAX = True -except ImportError: - HAS_PYRAX = False - -from ansible.module_utils.basic import AnsibleModule -from ansible_collections.community.general.plugins.module_utils.rax import (UUID, rax_argument_spec, rax_required_together, rax_to_dict, - setup_rax_module) - - -def rax_asp(module, at=None, change=0, cron=None, cooldown=300, - desired_capacity=0, is_percent=False, name=None, - policy_type=None, scaling_group=None, state='present'): - changed = False - - au = pyrax.autoscale - if not au: - module.fail_json(msg='Failed to instantiate client. This ' - 'typically indicates an invalid region or an ' - 'incorrectly capitalized region name.') - - try: - UUID(scaling_group) - except ValueError: - try: - sg = au.find(name=scaling_group) - except Exception as e: - module.fail_json(msg='%s' % e.message) - else: - try: - sg = au.get(scaling_group) - except Exception as e: - module.fail_json(msg='%s' % e.message) - - if state == 'present': - policies = filter(lambda p: name == p.name, sg.list_policies()) - if len(policies) > 1: - module.fail_json(msg='No unique policy match found by name') - if at: - args = dict(at=at) - elif cron: - args = dict(cron=cron) - else: - args = None - - if not policies: - try: - policy = sg.add_policy(name, policy_type=policy_type, - cooldown=cooldown, change=change, - is_percent=is_percent, - desired_capacity=desired_capacity, - args=args) - changed = True - except Exception as e: - module.fail_json(msg='%s' % e.message) - - else: - policy = policies[0] - kwargs = {} - if policy_type != policy.type: - kwargs['policy_type'] = policy_type - - if cooldown != policy.cooldown: - kwargs['cooldown'] = cooldown - - if hasattr(policy, 'change') and change != policy.change: - kwargs['change'] = change - - if hasattr(policy, 'changePercent') and is_percent is False: - kwargs['change'] = change - kwargs['is_percent'] = False - elif hasattr(policy, 'change') and is_percent is True: - kwargs['change'] = change - kwargs['is_percent'] = True - - if hasattr(policy, 'desiredCapacity') and change: - kwargs['change'] = change - elif ((hasattr(policy, 'change') or - hasattr(policy, 'changePercent')) and desired_capacity): - kwargs['desired_capacity'] = desired_capacity - - if hasattr(policy, 'args') and args != policy.args: - kwargs['args'] = args - - if kwargs: - policy.update(**kwargs) - changed = True - - policy.get() - - module.exit_json(changed=changed, autoscale_policy=rax_to_dict(policy)) - - else: - try: - policies = filter(lambda p: name == p.name, sg.list_policies()) - if len(policies) > 1: - module.fail_json(msg='No unique policy match found by name') - elif not policies: - policy = {} - else: - policy.delete() - changed = True - except Exception as e: - module.fail_json(msg='%s' % e.message) - - module.exit_json(changed=changed, autoscale_policy=rax_to_dict(policy)) - - -def main(): - argument_spec = rax_argument_spec() - argument_spec.update( - dict( - at=dict(), - change=dict(type='int'), - cron=dict(), - cooldown=dict(type='int', default=300), - desired_capacity=dict(type='int'), - is_percent=dict(type='bool', default=False), - name=dict(required=True), - policy_type=dict(required=True, choices=['webhook', 'schedule']), - scaling_group=dict(required=True), - state=dict(default='present', choices=['present', 'absent']), - ) - ) - - module = AnsibleModule( - argument_spec=argument_spec, - required_together=rax_required_together(), - mutually_exclusive=[ - ['cron', 'at'], - ['change', 'desired_capacity'], - ] - ) - - if not HAS_PYRAX: - module.fail_json(msg='pyrax is required for this module') - - at = module.params.get('at') - change = module.params.get('change') - cron = module.params.get('cron') - cooldown = module.params.get('cooldown') - desired_capacity = module.params.get('desired_capacity') - is_percent = module.params.get('is_percent') - name = module.params.get('name') - policy_type = module.params.get('policy_type') - scaling_group = module.params.get('scaling_group') - state = module.params.get('state') - - if (at or cron) and policy_type == 'webhook': - module.fail_json(msg='policy_type=schedule is required for a time ' - 'based policy') - - setup_rax_module(module, pyrax) - - rax_asp(module, at=at, change=change, cron=cron, cooldown=cooldown, - desired_capacity=desired_capacity, is_percent=is_percent, - name=name, policy_type=policy_type, scaling_group=scaling_group, - state=state) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/redfish_command.py b/ansible_collections/community/general/plugins/modules/redfish_command.py index 06224235a..d351e7c1d 100644 --- a/ansible_collections/community/general/plugins/modules/redfish_command.py +++ b/ansible_collections/community/general/plugins/modules/redfish_command.py @@ -109,9 +109,10 @@ options: timeout: description: - Timeout in seconds for HTTP requests to OOB controller. - - The default value for this param is C(10) but that is being deprecated - and it will be replaced with C(60) in community.general 9.0.0. + - The default value for this parameter changed from V(10) to V(60) + in community.general 9.0.0. type: int + default: 60 boot_override_mode: description: - Boot mode when using an override. @@ -805,7 +806,7 @@ def main(): update_username=dict(type='str', aliases=["account_updatename"]), account_properties=dict(type='dict', default={}), bootdevice=dict(), - timeout=dict(type='int'), + timeout=dict(type='int', default=60), uefi_target=dict(), boot_next=dict(), boot_override_mode=dict(choices=['Legacy', 'UEFI']), @@ -854,16 +855,6 @@ def main(): supports_check_mode=False ) - if module.params['timeout'] is None: - timeout = 10 - module.deprecate( - 'The default value {0} for parameter param1 is being deprecated and it will be replaced by {1}'.format( - 10, 60 - ), - version='9.0.0', - collection_name='community.general' - ) - category = module.params['category'] command_list = module.params['command'] diff --git a/ansible_collections/community/general/plugins/modules/redfish_config.py b/ansible_collections/community/general/plugins/modules/redfish_config.py index 1fea9e7cd..129b33b2e 100644 --- a/ansible_collections/community/general/plugins/modules/redfish_config.py +++ b/ansible_collections/community/general/plugins/modules/redfish_config.py @@ -64,9 +64,10 @@ options: timeout: description: - Timeout in seconds for HTTP requests to OOB controller. - - The default value for this param is C(10) but that is being deprecated - and it will be replaced with C(60) in community.general 9.0.0. + - The default value for this parameter changed from V(10) to V(60) + in community.general 9.0.0. type: int + default: 60 boot_order: required: false description: @@ -384,7 +385,7 @@ def main(): password=dict(no_log=True), auth_token=dict(no_log=True), bios_attributes=dict(type='dict', default={}), - timeout=dict(type='int'), + timeout=dict(type='int', default=60), boot_order=dict(type='list', elements='str', default=[]), network_protocols=dict( type='dict', @@ -418,16 +419,6 @@ def main(): supports_check_mode=False ) - if module.params['timeout'] is None: - timeout = 10 - module.deprecate( - 'The default value {0} for parameter param1 is being deprecated and it will be replaced by {1}'.format( - 10, 60 - ), - version='9.0.0', - collection_name='community.general' - ) - category = module.params['category'] command_list = module.params['command'] diff --git a/ansible_collections/community/general/plugins/modules/redfish_info.py b/ansible_collections/community/general/plugins/modules/redfish_info.py index 0b39bb6fa..3b594b7a2 100644 --- a/ansible_collections/community/general/plugins/modules/redfish_info.py +++ b/ansible_collections/community/general/plugins/modules/redfish_info.py @@ -63,9 +63,10 @@ options: timeout: description: - Timeout in seconds for HTTP requests to OOB controller. - - The default value for this param is C(10) but that is being deprecated - and it will be replaced with C(60) in community.general 9.0.0. + - The default value for this parameter changed from V(10) to V(60) + in community.general 9.0.0. type: int + default: 60 update_handle: required: false description: @@ -407,7 +408,7 @@ def main(): username=dict(), password=dict(no_log=True), auth_token=dict(no_log=True), - timeout=dict(type='int'), + timeout=dict(type='int', default=60), update_handle=dict(), manager=dict(), ), @@ -423,16 +424,6 @@ def main(): supports_check_mode=True, ) - if module.params['timeout'] is None: - timeout = 10 - module.deprecate( - 'The default value {0} for parameter param1 is being deprecated and it will be replaced by {1}'.format( - 10, 60 - ), - version='9.0.0', - collection_name='community.general' - ) - # admin credentials used for authentication creds = {'user': module.params['username'], 'pswd': module.params['password'], diff --git a/ansible_collections/community/general/plugins/modules/redhat_subscription.py b/ansible_collections/community/general/plugins/modules/redhat_subscription.py index d4b47d5d5..4a7aac483 100644 --- a/ansible_collections/community/general/plugins/modules/redhat_subscription.py +++ b/ansible_collections/community/general/plugins/modules/redhat_subscription.py @@ -123,10 +123,9 @@ options: description: - Upon successful registration, auto-consume available subscriptions - | - Please note that the alias O(autosubscribe) will be removed in + Please note that the alias O(ignore:autosubscribe) was removed in community.general 9.0.0. type: bool - aliases: [autosubscribe] activationkey: description: - supply an activation key for use with registration @@ -1106,17 +1105,7 @@ def main(): 'server_port': {}, 'rhsm_baseurl': {}, 'rhsm_repo_ca_cert': {}, - 'auto_attach': { - 'type': 'bool', - 'aliases': ['autosubscribe'], - 'deprecated_aliases': [ - { - 'name': 'autosubscribe', - 'version': '9.0.0', - 'collection_name': 'community.general', - }, - ], - }, + 'auto_attach': {'type': 'bool'}, 'activationkey': {'no_log': True}, 'org_id': {}, 'environment': {}, diff --git a/ansible_collections/community/general/plugins/modules/slackpkg.py b/ansible_collections/community/general/plugins/modules/slackpkg.py index e3d7a1542..9347db159 100644 --- a/ansible_collections/community/general/plugins/modules/slackpkg.py +++ b/ansible_collections/community/general/plugins/modules/slackpkg.py @@ -106,9 +106,8 @@ def remove_packages(module, slackpkg_path, packages): continue if not module.check_mode: - rc, out, err = module.run_command("%s -default_answer=y -batch=on \ - remove %s" % (slackpkg_path, - package)) + rc, out, err = module.run_command( + [slackpkg_path, "-default_answer=y", "-batch=on", "remove", package]) if not module.check_mode and query_package(module, slackpkg_path, package): @@ -132,9 +131,8 @@ def install_packages(module, slackpkg_path, packages): continue if not module.check_mode: - rc, out, err = module.run_command("%s -default_answer=y -batch=on \ - install %s" % (slackpkg_path, - package)) + rc, out, err = module.run_command( + [slackpkg_path, "-default_answer=y", "-batch=on", "install", package]) if not module.check_mode and not query_package(module, slackpkg_path, package): @@ -155,9 +153,8 @@ def upgrade_packages(module, slackpkg_path, packages): for package in packages: if not module.check_mode: - rc, out, err = module.run_command("%s -default_answer=y -batch=on \ - upgrade %s" % (slackpkg_path, - package)) + rc, out, err = module.run_command( + [slackpkg_path, "-default_answer=y", "-batch=on", "upgrade", package]) if not module.check_mode and not query_package(module, slackpkg_path, package): @@ -174,7 +171,8 @@ def upgrade_packages(module, slackpkg_path, packages): def update_cache(module, slackpkg_path): - rc, out, err = module.run_command("%s -batch=on update" % (slackpkg_path)) + rc, out, err = module.run_command( + [slackpkg_path, "-batch=on", "update"]) if rc != 0: module.fail_json(msg="Could not update package cache") diff --git a/ansible_collections/community/general/plugins/modules/snap.py b/ansible_collections/community/general/plugins/modules/snap.py index fd1676480..16c3aec48 100644 --- a/ansible_collections/community/general/plugins/modules/snap.py +++ b/ansible_collections/community/general/plugins/modules/snap.py @@ -194,6 +194,7 @@ class Snap(StateModuleHelper): }, supports_check_mode=True, ) + use_old_vardict = False @staticmethod def _first_non_zero(a): @@ -405,8 +406,8 @@ class Snap(StateModuleHelper): def state_present(self): - self.vars.meta('classic').set(output=True) - self.vars.meta('channel').set(output=True) + self.vars.set_meta('classic', output=True) + self.vars.set_meta('channel', output=True) actionable_refresh = [snap for snap in self.vars.name if self.vars.snap_status_map[snap] == Snap.CHANNEL_MISMATCH] if actionable_refresh: diff --git a/ansible_collections/community/general/plugins/modules/snap_alias.py b/ansible_collections/community/general/plugins/modules/snap_alias.py index 54448c6f3..ba54a9e15 100644 --- a/ansible_collections/community/general/plugins/modules/snap_alias.py +++ b/ansible_collections/community/general/plugins/modules/snap_alias.py @@ -105,6 +105,7 @@ class SnapAlias(StateModuleHelper): ], supports_check_mode=True, ) + use_old_vardict = False def _aliases(self): n = self.vars.name diff --git a/ansible_collections/community/general/plugins/modules/stackdriver.py b/ansible_collections/community/general/plugins/modules/stackdriver.py deleted file mode 100644 index 35b2b0dc1..000000000 --- a/ansible_collections/community/general/plugins/modules/stackdriver.py +++ /dev/null @@ -1,228 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright 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 absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' - -deprecated: - removed_in: 9.0.0 - why: the endpoints this module relies on do not exist any more and do not resolve to IPs in DNS. - alternative: no known alternative at this point - -module: stackdriver -short_description: Send code deploy and annotation events to stackdriver -description: - - Send code deploy and annotation events to Stackdriver -author: "Ben Whaley (@bwhaley)" -extends_documentation_fragment: - - community.general.attributes -attributes: - check_mode: - support: full - diff_mode: - support: none -options: - key: - type: str - description: - - API key. - required: true - event: - type: str - description: - - The type of event to send, either annotation or deploy - choices: ['annotation', 'deploy'] - required: true - revision_id: - type: str - description: - - The revision of the code that was deployed. Required for deploy events - deployed_by: - type: str - description: - - The person or robot responsible for deploying the code - default: "Ansible" - deployed_to: - type: str - description: - - "The environment code was deployed to. (ie: development, staging, production)" - repository: - type: str - description: - - The repository (or project) deployed - msg: - type: str - description: - - The contents of the annotation message, in plain text. Limited to 256 characters. Required for annotation. - annotated_by: - type: str - description: - - The person or robot who the annotation should be attributed to. - default: "Ansible" - level: - type: str - description: - - one of INFO/WARN/ERROR, defaults to INFO if not supplied. May affect display. - choices: ['INFO', 'WARN', 'ERROR'] - default: 'INFO' - instance_id: - type: str - description: - - id of an EC2 instance that this event should be attached to, which will limit the contexts where this event is shown - event_epoch: - type: str - description: - - "Unix timestamp of where the event should appear in the timeline, defaults to now. Be careful with this." -''' - -EXAMPLES = ''' -- name: Send a code deploy event to stackdriver - community.general.stackdriver: - key: AAAAAA - event: deploy - deployed_to: production - deployed_by: leeroyjenkins - repository: MyWebApp - revision_id: abcd123 - -- name: Send an annotation event to stackdriver - community.general.stackdriver: - key: AAAAAA - event: annotation - msg: Greetings from Ansible - annotated_by: leeroyjenkins - level: WARN - instance_id: i-abcd1234 -''' - -# =========================================== -# Stackdriver module specific support methods. -# - -import json -import traceback - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.common.text.converters import to_native -from ansible.module_utils.urls import fetch_url - - -def send_deploy_event(module, key, revision_id, deployed_by='Ansible', deployed_to=None, repository=None): - """Send a deploy event to Stackdriver""" - deploy_api = "https://event-gateway.stackdriver.com/v1/deployevent" - - params = {} - params['revision_id'] = revision_id - params['deployed_by'] = deployed_by - if deployed_to: - params['deployed_to'] = deployed_to - if repository: - params['repository'] = repository - - return do_send_request(module, deploy_api, params, key) - - -def send_annotation_event(module, key, msg, annotated_by='Ansible', level=None, instance_id=None, event_epoch=None): - """Send an annotation event to Stackdriver""" - annotation_api = "https://event-gateway.stackdriver.com/v1/annotationevent" - - params = {} - params['message'] = msg - if annotated_by: - params['annotated_by'] = annotated_by - if level: - params['level'] = level - if instance_id: - params['instance_id'] = instance_id - if event_epoch: - params['event_epoch'] = event_epoch - - return do_send_request(module, annotation_api, params, key) - - -def do_send_request(module, url, params, key): - data = json.dumps(params) - headers = { - 'Content-Type': 'application/json', - 'x-stackdriver-apikey': key - } - response, info = fetch_url(module, url, headers=headers, data=data, method='POST') - if info['status'] != 200: - module.fail_json(msg="Unable to send msg: %s" % info['msg']) - - -# =========================================== -# Module execution. -# - -def main(): - - module = AnsibleModule( - argument_spec=dict( # @TODO add types - key=dict(required=True, no_log=True), - event=dict(required=True, choices=['deploy', 'annotation']), - msg=dict(), - revision_id=dict(), - annotated_by=dict(default='Ansible'), - level=dict(default='INFO', choices=['INFO', 'WARN', 'ERROR']), - instance_id=dict(), - event_epoch=dict(), # @TODO int? - deployed_by=dict(default='Ansible'), - deployed_to=dict(), - repository=dict(), - ), - supports_check_mode=True - ) - - key = module.params["key"] - event = module.params["event"] - - # Annotation params - msg = module.params["msg"] - annotated_by = module.params["annotated_by"] - level = module.params["level"] - instance_id = module.params["instance_id"] - event_epoch = module.params["event_epoch"] - - # Deploy params - revision_id = module.params["revision_id"] - deployed_by = module.params["deployed_by"] - deployed_to = module.params["deployed_to"] - repository = module.params["repository"] - - ################################################################## - # deploy requires revision_id - # annotation requires msg - # We verify these manually - ################################################################## - - if event == 'deploy': - if not revision_id: - module.fail_json(msg="revision_id required for deploy events") - try: - send_deploy_event(module, key, revision_id, deployed_by, deployed_to, repository) - except Exception as e: - module.fail_json(msg="unable to sent deploy event: %s" % to_native(e), - exception=traceback.format_exc()) - - if event == 'annotation': - if not msg: - module.fail_json(msg="msg required for annotation events") - try: - send_annotation_event(module, key, msg, annotated_by, level, instance_id, event_epoch) - except Exception as e: - module.fail_json(msg="unable to sent annotation event: %s" % to_native(e), - exception=traceback.format_exc()) - - changed = True - module.exit_json(changed=changed, deployed_by=deployed_by) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/svr4pkg.py b/ansible_collections/community/general/plugins/modules/svr4pkg.py index db9902c77..56ded66e6 100644 --- a/ansible_collections/community/general/plugins/modules/svr4pkg.py +++ b/ansible_collections/community/general/plugins/modules/svr4pkg.py @@ -120,7 +120,7 @@ def package_installed(module, name, category): if category: cmd.append('-c') cmd.append(name) - rc, out, err = module.run_command(' '.join(cmd)) + rc, out, err = module.run_command(cmd) if rc == 0: return True else: diff --git a/ansible_collections/community/general/plugins/modules/swdepot.py b/ansible_collections/community/general/plugins/modules/swdepot.py index 28a8ce314..9ba1b02b3 100644 --- a/ansible_collections/community/general/plugins/modules/swdepot.py +++ b/ansible_collections/community/general/plugins/modules/swdepot.py @@ -68,7 +68,6 @@ EXAMPLES = ''' import re from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.six.moves import shlex_quote def compare_package(version1, version2): @@ -94,13 +93,13 @@ def compare_package(version1, version2): def query_package(module, name, depot=None): """ Returns whether a package is installed or not and version. """ - cmd_list = '/usr/sbin/swlist -a revision -l product' + cmd_list = ['/usr/sbin/swlist', '-a', 'revision', '-l', 'product'] if depot: - rc, stdout, stderr = module.run_command("%s -s %s %s | grep %s" % (cmd_list, shlex_quote(depot), shlex_quote(name), shlex_quote(name)), - use_unsafe_shell=True) - else: - rc, stdout, stderr = module.run_command("%s %s | grep %s" % (cmd_list, shlex_quote(name), shlex_quote(name)), use_unsafe_shell=True) + cmd_list.extend(['-s', depot]) + cmd_list.append(name) + rc, stdout, stderr = module.run_command(cmd_list) if rc == 0: + stdout = ''.join(line for line in stdout.splitlines(True) if name in line) version = re.sub(r"\s\s+|\t", " ", stdout).strip().split()[1] else: version = None @@ -112,7 +111,7 @@ def remove_package(module, name): """ Uninstall package if installed. """ cmd_remove = '/usr/sbin/swremove' - rc, stdout, stderr = module.run_command("%s %s" % (cmd_remove, name)) + rc, stdout, stderr = module.run_command([cmd_remove, name]) if rc == 0: return rc, stdout @@ -123,8 +122,8 @@ def remove_package(module, name): def install_package(module, depot, name): """ Install package if not already installed """ - cmd_install = '/usr/sbin/swinstall -x mount_all_filesystems=false' - rc, stdout, stderr = module.run_command("%s -s %s %s" % (cmd_install, depot, name)) + cmd_install = ['/usr/sbin/swinstall', '-x', 'mount_all_filesystems=false'] + rc, stdout, stderr = module.run_command(cmd_install + ["-s", depot, name]) if rc == 0: return rc, stdout else: diff --git a/ansible_collections/community/general/plugins/modules/webfaction_app.py b/ansible_collections/community/general/plugins/modules/webfaction_app.py deleted file mode 100644 index 81bfc8b68..000000000 --- a/ansible_collections/community/general/plugins/modules/webfaction_app.py +++ /dev/null @@ -1,213 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Copyright (c) 2015, Quentin Stafford-Fraser, with contributions gratefully acknowledged from: -# * Andy Baker -# * Federico Tarantini -# -# 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 - -# Create a Webfaction application using Ansible and the Webfaction API -# -# Valid application types can be found by looking here: -# https://docs.webfaction.com/xmlrpc-api/apps.html#application-types - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- - -deprecated: - removed_in: 9.0.0 - why: the endpoints this module relies on do not exist any more and do not resolve to IPs in DNS. - alternative: no known alternative at this point - -module: webfaction_app -short_description: Add or remove applications on a Webfaction host -description: - - Add or remove applications on a Webfaction host. Further documentation at U(https://github.com/quentinsf/ansible-webfaction). -author: Quentin Stafford-Fraser (@quentinsf) -notes: - - > - You can run playbooks that use this on a local machine, or on a Webfaction host, or elsewhere, since the scripts use the remote webfaction API. - The location is not important. However, running them on multiple hosts I(simultaneously) is best avoided. If you do not specify C(localhost) as - your host, you may want to add C(serial=1) to the plays. - - See L(the webfaction API, https://docs.webfaction.com/xmlrpc-api/) for more info. - -extends_documentation_fragment: - - community.general.attributes - -attributes: - check_mode: - support: full - diff_mode: - support: none - -options: - name: - description: - - The name of the application - required: true - type: str - - state: - description: - - Whether the application should exist - choices: ['present', 'absent'] - default: "present" - type: str - - type: - description: - - The type of application to create. See the Webfaction docs at U(https://docs.webfaction.com/xmlrpc-api/apps.html) for a list. - required: true - type: str - - autostart: - description: - - Whether the app should restart with an C(autostart.cgi) script - type: bool - default: false - - extra_info: - description: - - Any extra parameters required by the app - default: '' - type: str - - port_open: - description: - - IF the port should be opened - type: bool - default: false - - login_name: - description: - - The webfaction account to use - required: true - type: str - - login_password: - description: - - The webfaction password to use - required: true - type: str - - machine: - description: - - The machine name to use (optional for accounts with only one machine) - type: str - -''' - -EXAMPLES = ''' - - name: Create a test app - community.general.webfaction_app: - name: "my_wsgi_app1" - state: present - type: mod_wsgi35-python27 - login_name: "{{webfaction_user}}" - login_password: "{{webfaction_passwd}}" - machine: "{{webfaction_machine}}" -''' - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.six.moves import xmlrpc_client - - -webfaction = xmlrpc_client.ServerProxy('https://api.webfaction.com/') - - -def main(): - - module = AnsibleModule( - argument_spec=dict( - name=dict(required=True), - state=dict(choices=['present', 'absent'], default='present'), - type=dict(required=True), - autostart=dict(type='bool', default=False), - extra_info=dict(default=""), - port_open=dict(type='bool', default=False), - login_name=dict(required=True), - login_password=dict(required=True, no_log=True), - machine=dict(), - ), - supports_check_mode=True - ) - app_name = module.params['name'] - app_type = module.params['type'] - app_state = module.params['state'] - - if module.params['machine']: - session_id, account = webfaction.login( - module.params['login_name'], - module.params['login_password'], - module.params['machine'] - ) - else: - session_id, account = webfaction.login( - module.params['login_name'], - module.params['login_password'] - ) - - app_list = webfaction.list_apps(session_id) - app_map = dict([(i['name'], i) for i in app_list]) - existing_app = app_map.get(app_name) - - result = {} - - # Here's where the real stuff happens - - if app_state == 'present': - - # Does an app with this name already exist? - if existing_app: - if existing_app['type'] != app_type: - module.fail_json(msg="App already exists with different type. Please fix by hand.") - - # If it exists with the right type, we don't change it - # Should check other parameters. - module.exit_json( - changed=False, - result=existing_app, - ) - - if not module.check_mode: - # If this isn't a dry run, create the app - result.update( - webfaction.create_app( - session_id, app_name, app_type, - module.boolean(module.params['autostart']), - module.params['extra_info'], - module.boolean(module.params['port_open']) - ) - ) - - elif app_state == 'absent': - - # If the app's already not there, nothing changed. - if not existing_app: - module.exit_json( - changed=False, - ) - - if not module.check_mode: - # If this isn't a dry run, delete the app - result.update( - webfaction.delete_app(session_id, app_name) - ) - - else: - module.fail_json(msg="Unknown state specified: {0}".format(app_state)) - - module.exit_json( - changed=True, - result=result - ) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/webfaction_db.py b/ansible_collections/community/general/plugins/modules/webfaction_db.py deleted file mode 100644 index 5428de5b6..000000000 --- a/ansible_collections/community/general/plugins/modules/webfaction_db.py +++ /dev/null @@ -1,209 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Copyright (c) 2015, Quentin Stafford-Fraser, with contributions gratefully acknowledged from: -# * Andy Baker -# * Federico Tarantini -# -# 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 - -# Create a webfaction database using Ansible and the Webfaction API - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- - -deprecated: - removed_in: 9.0.0 - why: the endpoints this module relies on do not exist any more and do not resolve to IPs in DNS. - alternative: no known alternative at this point - -module: webfaction_db -short_description: Add or remove a database on Webfaction -description: - - Add or remove a database on a Webfaction host. Further documentation at https://github.com/quentinsf/ansible-webfaction. -author: Quentin Stafford-Fraser (@quentinsf) -notes: - - > - You can run playbooks that use this on a local machine, or on a Webfaction host, or elsewhere, since the scripts use the remote webfaction API. - The location is not important. However, running them on multiple hosts I(simultaneously) is best avoided. If you do not specify C(localhost) as - your host, you may want to add C(serial=1) to the plays. - - See L(the webfaction API, https://docs.webfaction.com/xmlrpc-api/) for more info. -extends_documentation_fragment: - - community.general.attributes -attributes: - check_mode: - support: full - diff_mode: - support: none -options: - - name: - description: - - The name of the database - required: true - type: str - - state: - description: - - Whether the database should exist - choices: ['present', 'absent'] - default: "present" - type: str - - type: - description: - - The type of database to create. - required: true - choices: ['mysql', 'postgresql'] - type: str - - password: - description: - - The password for the new database user. - type: str - - login_name: - description: - - The webfaction account to use - required: true - type: str - - login_password: - description: - - The webfaction password to use - required: true - type: str - - machine: - description: - - The machine name to use (optional for accounts with only one machine) - type: str -''' - -EXAMPLES = ''' - # This will also create a default DB user with the same - # name as the database, and the specified password. - - - name: Create a database - community.general.webfaction_db: - name: "{{webfaction_user}}_db1" - password: mytestsql - type: mysql - login_name: "{{webfaction_user}}" - login_password: "{{webfaction_passwd}}" - machine: "{{webfaction_machine}}" - - # Note that, for symmetry's sake, deleting a database using - # 'state: absent' will also delete the matching user. - -''' - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.six.moves import xmlrpc_client - - -webfaction = xmlrpc_client.ServerProxy('https://api.webfaction.com/') - - -def main(): - - module = AnsibleModule( - argument_spec=dict( - name=dict(required=True), - state=dict(choices=['present', 'absent'], default='present'), - # You can specify an IP address or hostname. - type=dict(required=True, choices=['mysql', 'postgresql']), - password=dict(no_log=True), - login_name=dict(required=True), - login_password=dict(required=True, no_log=True), - machine=dict(), - ), - supports_check_mode=True - ) - db_name = module.params['name'] - db_state = module.params['state'] - db_type = module.params['type'] - db_passwd = module.params['password'] - - if module.params['machine']: - session_id, account = webfaction.login( - module.params['login_name'], - module.params['login_password'], - module.params['machine'] - ) - else: - session_id, account = webfaction.login( - module.params['login_name'], - module.params['login_password'] - ) - - db_list = webfaction.list_dbs(session_id) - db_map = dict([(i['name'], i) for i in db_list]) - existing_db = db_map.get(db_name) - - user_list = webfaction.list_db_users(session_id) - user_map = dict([(i['username'], i) for i in user_list]) - existing_user = user_map.get(db_name) - - result = {} - - # Here's where the real stuff happens - - if db_state == 'present': - - # Does a database with this name already exist? - if existing_db: - # Yes, but of a different type - fail - if existing_db['db_type'] != db_type: - module.fail_json(msg="Database already exists but is a different type. Please fix by hand.") - - # If it exists with the right type, we don't change anything. - module.exit_json( - changed=False, - ) - - if not module.check_mode: - # If this isn't a dry run, create the db - # and default user. - result.update( - webfaction.create_db( - session_id, db_name, db_type, db_passwd - ) - ) - - elif db_state == 'absent': - - # If this isn't a dry run... - if not module.check_mode: - - if not (existing_db or existing_user): - module.exit_json(changed=False,) - - if existing_db: - # Delete the db if it exists - result.update( - webfaction.delete_db(session_id, db_name, db_type) - ) - - if existing_user: - # Delete the default db user if it exists - result.update( - webfaction.delete_db_user(session_id, db_name, db_type) - ) - - else: - module.fail_json(msg="Unknown state specified: {0}".format(db_state)) - - module.exit_json( - changed=True, - result=result - ) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/webfaction_domain.py b/ansible_collections/community/general/plugins/modules/webfaction_domain.py deleted file mode 100644 index 4c87a539a..000000000 --- a/ansible_collections/community/general/plugins/modules/webfaction_domain.py +++ /dev/null @@ -1,184 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Copyright (c) 2015, Quentin Stafford-Fraser -# 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 - -# Create Webfaction domains and subdomains using Ansible and the Webfaction API - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- - -deprecated: - removed_in: 9.0.0 - why: the endpoints this module relies on do not exist any more and do not resolve to IPs in DNS. - alternative: no known alternative at this point - -module: webfaction_domain -short_description: Add or remove domains and subdomains on Webfaction -description: - - Add or remove domains or subdomains on a Webfaction host. Further documentation at https://github.com/quentinsf/ansible-webfaction. -author: Quentin Stafford-Fraser (@quentinsf) -notes: - - If you are I(deleting) domains by using O(state=absent), then note that if you specify subdomains, just those particular subdomains will be deleted. - If you do not specify subdomains, the domain will be deleted. - - > - You can run playbooks that use this on a local machine, or on a Webfaction host, or elsewhere, since the scripts use the remote webfaction API. - The location is not important. However, running them on multiple hosts I(simultaneously) is best avoided. If you do not specify C(localhost) as - your host, you may want to add C(serial=1) to the plays. - - See L(the webfaction API, https://docs.webfaction.com/xmlrpc-api/) for more info. - -extends_documentation_fragment: - - community.general.attributes - -attributes: - check_mode: - support: full - diff_mode: - support: none - -options: - - name: - description: - - The name of the domain - required: true - type: str - - state: - description: - - Whether the domain should exist - choices: ['present', 'absent'] - default: "present" - type: str - - subdomains: - description: - - Any subdomains to create. - default: [] - type: list - elements: str - - login_name: - description: - - The webfaction account to use - required: true - type: str - - login_password: - description: - - The webfaction password to use - required: true - type: str -''' - -EXAMPLES = ''' - - name: Create a test domain - community.general.webfaction_domain: - name: mydomain.com - state: present - subdomains: - - www - - blog - login_name: "{{webfaction_user}}" - login_password: "{{webfaction_passwd}}" - - - name: Delete test domain and any subdomains - community.general.webfaction_domain: - name: mydomain.com - state: absent - login_name: "{{webfaction_user}}" - login_password: "{{webfaction_passwd}}" - -''' - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.six.moves import xmlrpc_client - - -webfaction = xmlrpc_client.ServerProxy('https://api.webfaction.com/') - - -def main(): - - module = AnsibleModule( - argument_spec=dict( - name=dict(required=True), - state=dict(choices=['present', 'absent'], default='present'), - subdomains=dict(default=[], type='list', elements='str'), - login_name=dict(required=True), - login_password=dict(required=True, no_log=True), - ), - supports_check_mode=True - ) - domain_name = module.params['name'] - domain_state = module.params['state'] - domain_subdomains = module.params['subdomains'] - - session_id, account = webfaction.login( - module.params['login_name'], - module.params['login_password'] - ) - - domain_list = webfaction.list_domains(session_id) - domain_map = dict([(i['domain'], i) for i in domain_list]) - existing_domain = domain_map.get(domain_name) - - result = {} - - # Here's where the real stuff happens - - if domain_state == 'present': - - # Does an app with this name already exist? - if existing_domain: - - if set(existing_domain['subdomains']) >= set(domain_subdomains): - # If it exists with the right subdomains, we don't change anything. - module.exit_json( - changed=False, - ) - - positional_args = [session_id, domain_name] + domain_subdomains - - if not module.check_mode: - # If this isn't a dry run, create the app - # print positional_args - result.update( - webfaction.create_domain( - *positional_args - ) - ) - - elif domain_state == 'absent': - - # If the app's already not there, nothing changed. - if not existing_domain: - module.exit_json( - changed=False, - ) - - positional_args = [session_id, domain_name] + domain_subdomains - - if not module.check_mode: - # If this isn't a dry run, delete the app - result.update( - webfaction.delete_domain(*positional_args) - ) - - else: - module.fail_json(msg="Unknown state specified: {0}".format(domain_state)) - - module.exit_json( - changed=True, - result=result - ) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/webfaction_mailbox.py b/ansible_collections/community/general/plugins/modules/webfaction_mailbox.py deleted file mode 100644 index 119dfd283..000000000 --- a/ansible_collections/community/general/plugins/modules/webfaction_mailbox.py +++ /dev/null @@ -1,152 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Copyright (c) 2015, Quentin Stafford-Fraser and Andy Baker -# 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 - -# Create webfaction mailbox using Ansible and the Webfaction API - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- - -deprecated: - removed_in: 9.0.0 - why: the endpoints this module relies on do not exist any more and do not resolve to IPs in DNS. - alternative: no known alternative at this point - -module: webfaction_mailbox -short_description: Add or remove mailboxes on Webfaction -description: - - Add or remove mailboxes on a Webfaction account. Further documentation at https://github.com/quentinsf/ansible-webfaction. -author: Quentin Stafford-Fraser (@quentinsf) -notes: - - > - You can run playbooks that use this on a local machine, or on a Webfaction host, or elsewhere, since the scripts use the remote webfaction API. - The location is not important. However, running them on multiple hosts I(simultaneously) is best avoided. If you do not specify C(localhost) as - your host, you may want to add C(serial=1) to the plays. - - See L(the webfaction API, https://docs.webfaction.com/xmlrpc-api/) for more info. - -extends_documentation_fragment: - - community.general.attributes - -attributes: - check_mode: - support: full - diff_mode: - support: none - -options: - - mailbox_name: - description: - - The name of the mailbox - required: true - type: str - - mailbox_password: - description: - - The password for the mailbox - required: true - type: str - - state: - description: - - Whether the mailbox should exist - choices: ['present', 'absent'] - default: "present" - type: str - - login_name: - description: - - The webfaction account to use - required: true - type: str - - login_password: - description: - - The webfaction password to use - required: true - type: str -''' - -EXAMPLES = ''' - - name: Create a mailbox - community.general.webfaction_mailbox: - mailbox_name="mybox" - mailbox_password="myboxpw" - state=present - login_name={{webfaction_user}} - login_password={{webfaction_passwd}} -''' - - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.six.moves import xmlrpc_client - - -webfaction = xmlrpc_client.ServerProxy('https://api.webfaction.com/') - - -def main(): - - module = AnsibleModule( - argument_spec=dict( - mailbox_name=dict(required=True), - mailbox_password=dict(required=True, no_log=True), - state=dict(required=False, choices=['present', 'absent'], default='present'), - login_name=dict(required=True), - login_password=dict(required=True, no_log=True), - ), - supports_check_mode=True - ) - - mailbox_name = module.params['mailbox_name'] - site_state = module.params['state'] - - session_id, account = webfaction.login( - module.params['login_name'], - module.params['login_password'] - ) - - mailbox_list = [x['mailbox'] for x in webfaction.list_mailboxes(session_id)] - existing_mailbox = mailbox_name in mailbox_list - - result = {} - - # Here's where the real stuff happens - - if site_state == 'present': - - # Does a mailbox with this name already exist? - if existing_mailbox: - module.exit_json(changed=False,) - - positional_args = [session_id, mailbox_name] - - if not module.check_mode: - # If this isn't a dry run, create the mailbox - result.update(webfaction.create_mailbox(*positional_args)) - - elif site_state == 'absent': - - # If the mailbox is already not there, nothing changed. - if not existing_mailbox: - module.exit_json(changed=False) - - if not module.check_mode: - # If this isn't a dry run, delete the mailbox - result.update(webfaction.delete_mailbox(session_id, mailbox_name)) - - else: - module.fail_json(msg="Unknown state specified: {0}".format(site_state)) - - module.exit_json(changed=True, result=result) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/webfaction_site.py b/ansible_collections/community/general/plugins/modules/webfaction_site.py deleted file mode 100644 index 7795c45fe..000000000 --- a/ansible_collections/community/general/plugins/modules/webfaction_site.py +++ /dev/null @@ -1,223 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -# Copyright (c) 2015, Quentin Stafford-Fraser -# 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 - -# Create Webfaction website using Ansible and the Webfaction API - -from __future__ import absolute_import, division, print_function -__metaclass__ = type - - -DOCUMENTATION = ''' ---- - -deprecated: - removed_in: 9.0.0 - why: the endpoints this module relies on do not exist any more and do not resolve to IPs in DNS. - alternative: no known alternative at this point - -module: webfaction_site -short_description: Add or remove a website on a Webfaction host -description: - - Add or remove a website on a Webfaction host. Further documentation at https://github.com/quentinsf/ansible-webfaction. -author: Quentin Stafford-Fraser (@quentinsf) -notes: - - Sadly, you I(do) need to know your webfaction hostname for the C(host) parameter. But at least, unlike the API, you do not need to know the IP - address. You can use a DNS name. - - If a site of the same name exists in the account but on a different host, the operation will exit. - - > - You can run playbooks that use this on a local machine, or on a Webfaction host, or elsewhere, since the scripts use the remote webfaction API. - The location is not important. However, running them on multiple hosts I(simultaneously) is best avoided. If you do not specify C(localhost) as - your host, you may want to add C(serial=1) to the plays. - - See L(the webfaction API, https://docs.webfaction.com/xmlrpc-api/) for more info. - -extends_documentation_fragment: - - community.general.attributes - -attributes: - check_mode: - support: full - diff_mode: - support: none - -options: - - name: - description: - - The name of the website - required: true - type: str - - state: - description: - - Whether the website should exist - choices: ['present', 'absent'] - default: "present" - type: str - - host: - description: - - The webfaction host on which the site should be created. - required: true - type: str - - https: - description: - - Whether or not to use HTTPS - type: bool - default: false - - site_apps: - description: - - A mapping of URLs to apps - default: [] - type: list - elements: list - - subdomains: - description: - - A list of subdomains associated with this site. - default: [] - type: list - elements: str - - login_name: - description: - - The webfaction account to use - required: true - type: str - - login_password: - description: - - The webfaction password to use - required: true - type: str -''' - -EXAMPLES = ''' - - name: Create website - community.general.webfaction_site: - name: testsite1 - state: present - host: myhost.webfaction.com - subdomains: - - 'testsite1.my_domain.org' - site_apps: - - ['testapp1', '/'] - https: false - login_name: "{{webfaction_user}}" - login_password: "{{webfaction_passwd}}" -''' - -import socket - -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.six.moves import xmlrpc_client - - -webfaction = xmlrpc_client.ServerProxy('https://api.webfaction.com/') - - -def main(): - - module = AnsibleModule( - argument_spec=dict( - name=dict(required=True), - state=dict(choices=['present', 'absent'], default='present'), - # You can specify an IP address or hostname. - host=dict(required=True), - https=dict(required=False, type='bool', default=False), - subdomains=dict(type='list', elements='str', default=[]), - site_apps=dict(type='list', elements='list', default=[]), - login_name=dict(required=True), - login_password=dict(required=True, no_log=True), - ), - supports_check_mode=True - ) - site_name = module.params['name'] - site_state = module.params['state'] - site_host = module.params['host'] - site_ip = socket.gethostbyname(site_host) - - session_id, account = webfaction.login( - module.params['login_name'], - module.params['login_password'] - ) - - site_list = webfaction.list_websites(session_id) - site_map = dict([(i['name'], i) for i in site_list]) - existing_site = site_map.get(site_name) - - result = {} - - # Here's where the real stuff happens - - if site_state == 'present': - - # Does a site with this name already exist? - if existing_site: - - # If yes, but it's on a different IP address, then fail. - # If we wanted to allow relocation, we could add a 'relocate=true' option - # which would get the existing IP address, delete the site there, and create it - # at the new address. A bit dangerous, perhaps, so for now we'll require manual - # deletion if it's on another host. - - if existing_site['ip'] != site_ip: - module.fail_json(msg="Website already exists with a different IP address. Please fix by hand.") - - # If it's on this host and the key parameters are the same, nothing needs to be done. - - if (existing_site['https'] == module.boolean(module.params['https'])) and \ - (set(existing_site['subdomains']) == set(module.params['subdomains'])) and \ - (dict(existing_site['website_apps']) == dict(module.params['site_apps'])): - module.exit_json( - changed=False - ) - - positional_args = [ - session_id, site_name, site_ip, - module.boolean(module.params['https']), - module.params['subdomains'], - ] - for a in module.params['site_apps']: - positional_args.append((a[0], a[1])) - - if not module.check_mode: - # If this isn't a dry run, create or modify the site - result.update( - webfaction.create_website( - *positional_args - ) if not existing_site else webfaction.update_website( - *positional_args - ) - ) - - elif site_state == 'absent': - - # If the site's already not there, nothing changed. - if not existing_site: - module.exit_json( - changed=False, - ) - - if not module.check_mode: - # If this isn't a dry run, delete the site - result.update( - webfaction.delete_website(session_id, site_name, site_ip) - ) - - else: - module.fail_json(msg="Unknown state specified: {0}".format(site_state)) - - module.exit_json( - changed=True, - result=result - ) - - -if __name__ == '__main__': - main() diff --git a/ansible_collections/community/general/plugins/modules/xfconf.py b/ansible_collections/community/general/plugins/modules/xfconf.py index 8ed44c675..15943ae59 100644 --- a/ansible_collections/community/general/plugins/modules/xfconf.py +++ b/ansible_collections/community/general/plugins/modules/xfconf.py @@ -187,6 +187,7 @@ class XFConfProperty(StateModuleHelper): required_together=[('value', 'value_type')], supports_check_mode=True, ) + use_old_vardict = False default_state = 'present' @@ -196,7 +197,7 @@ class XFConfProperty(StateModuleHelper): self.vars.channel) self.vars.set('previous_value', self._get()) self.vars.set('type', self.vars.value_type) - self.vars.meta('value').set(initial_value=self.vars.previous_value) + self.vars.set_meta('value', initial_value=self.vars.previous_value) def process_command_output(self, rc, out, err): if err.rstrip() == self.does_not: diff --git a/ansible_collections/community/general/plugins/modules/xfconf_info.py b/ansible_collections/community/general/plugins/modules/xfconf_info.py index 844ef3c11..3d56a70cb 100644 --- a/ansible_collections/community/general/plugins/modules/xfconf_info.py +++ b/ansible_collections/community/general/plugins/modules/xfconf_info.py @@ -139,6 +139,7 @@ class XFConfInfo(ModuleHelper): ), supports_check_mode=True, ) + use_old_vardict = False def __init_module__(self): self.runner = xfconf_runner(self.module, check_rc=True) @@ -176,7 +177,7 @@ class XFConfInfo(ModuleHelper): proc = self._process_list_properties with self.runner.context('list_arg channel property', output_process=proc) as ctx: - result = ctx.run(**self.vars) + result = ctx.run(**self.vars.as_dict()) if not self.vars.list_arg and self.vars.is_array: output = "value_array" diff --git a/ansible_collections/community/general/tests/integration/targets/callback_timestamp/aliases b/ansible_collections/community/general/tests/integration/targets/callback_timestamp/aliases new file mode 100644 index 000000000..124adcfb8 --- /dev/null +++ b/ansible_collections/community/general/tests/integration/targets/callback_timestamp/aliases @@ -0,0 +1,6 @@ +# Copyright (c) 2024, kurokobo <kurokobo@protonmail.com> +# 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/1 +needs/target/callback diff --git a/ansible_collections/community/general/tests/integration/targets/callback_timestamp/tasks/main.yml b/ansible_collections/community/general/tests/integration/targets/callback_timestamp/tasks/main.yml new file mode 100644 index 000000000..5e0acc15f --- /dev/null +++ b/ansible_collections/community/general/tests/integration/targets/callback_timestamp/tasks/main.yml @@ -0,0 +1,66 @@ +--- +#################################################################### +# WARNING: These are designed specifically for Ansible tests # +# and should not be used as examples of how to write Ansible roles # +#################################################################### + +# Copyright (c) 2024, kurokobo <kurokobo@protonmail.com> +# 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: Run tests + include_role: + name: callback + vars: + tests: + - name: Enable timestamp in the default length + environment: + ANSIBLE_NOCOLOR: 'true' + ANSIBLE_FORCE_COLOR: 'false' + ANSIBLE_STDOUT_CALLBACK: community.general.timestamp + ANSIBLE_CALLBACK_TIMESTAMP_FORMAT_STRING: "15:04:05" + playbook: | + - hosts: testhost + gather_facts: false + tasks: + - name: Sample task name + debug: + msg: sample debug msg + expected_output: [ + "", + "PLAY [testhost] ******************************************************* 15:04:05", + "", + "TASK [Sample task name] *********************************************** 15:04:05", + "ok: [testhost] => {", + " \"msg\": \"sample debug msg\"", + "}", + "", + "PLAY RECAP ************************************************************ 15:04:05", + "testhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 " + ] + + - name: Enable timestamp in the longer length + environment: + ANSIBLE_NOCOLOR: 'true' + ANSIBLE_FORCE_COLOR: 'false' + ANSIBLE_STDOUT_CALLBACK: community.general.timestamp + ANSIBLE_CALLBACK_TIMESTAMP_FORMAT_STRING: "2006-01-02T15:04:05" + playbook: | + - hosts: testhost + gather_facts: false + tasks: + - name: Sample task name + debug: + msg: sample debug msg + expected_output: [ + "", + "PLAY [testhost] ******************************************** 2006-01-02T15:04:05", + "", + "TASK [Sample task name] ************************************ 2006-01-02T15:04:05", + "ok: [testhost] => {", + " \"msg\": \"sample debug msg\"", + "}", + "", + "PLAY RECAP ************************************************* 2006-01-02T15:04:05", + "testhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 " + ] diff --git a/ansible_collections/community/general/tests/integration/targets/cpanm/tasks/main.yml b/ansible_collections/community/general/tests/integration/targets/cpanm/tasks/main.yml index c9adc1ca6..89650154f 100644 --- a/ansible_collections/community/general/tests/integration/targets/cpanm/tasks/main.yml +++ b/ansible_collections/community/general/tests/integration/targets/cpanm/tasks/main.yml @@ -6,7 +6,8 @@ - name: bail out for non-supported platforms meta: end_play when: - - (ansible_os_family != "RedHat" or ansible_distribution_major_version|int < 7) + - (ansible_os_family != "RedHat" or ansible_distribution_major_version|int < 8) # TODO: bump back to 7 + - (ansible_distribution != 'CentOS' or ansible_distribution_major_version|int < 8) # TODO: remove - ansible_os_family != "Debian" - name: install perl development package for Red Hat family diff --git a/ansible_collections/community/general/tests/integration/targets/django_manage/tasks/main.yaml b/ansible_collections/community/general/tests/integration/targets/django_manage/tasks/main.yaml index c07b53893..5307fb664 100644 --- a/ansible_collections/community/general/tests/integration/targets/django_manage/tasks/main.yaml +++ b/ansible_collections/community/general/tests/integration/targets/django_manage/tasks/main.yaml @@ -43,6 +43,11 @@ chdir: "{{ tmp_django_root.path }}/startproj" cmd: "{{ tmp_django_root.path }}/venv/bin/django-admin startapp app1" +- name: Make manage.py executable + file: + path: "{{ tmp_django_root.path }}/startproj/test_django_manage_1/manage.py" + mode: "0755" + - name: Check community.general.django_manage: project_path: "{{ tmp_django_root.path }}/startproj/test_django_manage_1" diff --git a/ansible_collections/community/general/tests/integration/targets/ejabberd_user/tasks/main.yml b/ansible_collections/community/general/tests/integration/targets/ejabberd_user/tasks/main.yml index 33e07b785..349b3f952 100644 --- a/ansible_collections/community/general/tests/integration/targets/ejabberd_user/tasks/main.yml +++ b/ansible_collections/community/general/tests/integration/targets/ejabberd_user/tasks/main.yml @@ -10,7 +10,8 @@ - name: Bail out if not supported ansible.builtin.meta: end_play - when: ansible_distribution in ('Alpine', 'openSUSE Leap', 'CentOS', 'Fedora') + # TODO: remove Archlinux from the list + when: ansible_distribution in ('Alpine', 'openSUSE Leap', 'CentOS', 'Fedora', 'Archlinux') - name: Remove ejabberd diff --git a/ansible_collections/community/general/tests/integration/targets/gandi_livedns/tasks/create_record.yml b/ansible_collections/community/general/tests/integration/targets/gandi_livedns/tasks/create_record.yml index c3f1c1798..87056aa86 100644 --- a/ansible_collections/community/general/tests/integration/targets/gandi_livedns/tasks/create_record.yml +++ b/ansible_collections/community/general/tests/integration/targets/gandi_livedns/tasks/create_record.yml @@ -45,10 +45,10 @@ assert: that: - result is changed - - result.record['values'] == {{ item['values'] }} - - result.record.record == "{{ item.record }}" - - result.record.type == "{{ item.type }}" - - result.record.ttl == {{ item.ttl }} + - result.record['values'] == item['values'] + - result.record.record == item.record + - result.record.type == item.type + - result.record.ttl == item.ttl - name: test create a dns record idempotence community.general.gandi_livedns: @@ -63,7 +63,16 @@ assert: that: - result is not changed - - result.record['values'] == {{ item['values'] }} - - result.record.record == "{{ item.record }}" - - result.record.type == "{{ item.type }}" - - result.record.ttl == {{ item.ttl }} + - result.record['values'] == item['values'] + - result.record.record == item.record + - result.record.type == item.type + - result.record.ttl == item.ttl + +- name: test create a DNS record with personal access token + community.general.gandi_livedns: + personal_access_token: "{{ gandi_personal_access_token }}" + record: "{{ item.record }}" + domain: "{{ gandi_livedns_domain_name }}" + values: "{{ item['values'] }}" + ttl: "{{ item.ttl }}" + type: "{{ item.type }}" diff --git a/ansible_collections/community/general/tests/integration/targets/gandi_livedns/tasks/update_record.yml b/ansible_collections/community/general/tests/integration/targets/gandi_livedns/tasks/update_record.yml index a080560a7..5f19bfa24 100644 --- a/ansible_collections/community/general/tests/integration/targets/gandi_livedns/tasks/update_record.yml +++ b/ansible_collections/community/general/tests/integration/targets/gandi_livedns/tasks/update_record.yml @@ -17,10 +17,10 @@ assert: that: - result is changed - - result.record['values'] == {{ item.update_values | default(item['values']) }} - - result.record.record == "{{ item.record }}" - - result.record.type == "{{ item.type }}" - - result.record.ttl == {{ item.update_ttl | default(item.ttl) }} + - result.record['values'] == (item.update_values | default(item['values'])) + - result.record.record == item.record + - result.record.type == item.type + - result.record.ttl == (item.update_ttl | default(item.ttl)) - name: test update or add another dns record community.general.gandi_livedns: @@ -35,10 +35,10 @@ assert: that: - result is changed - - result.record['values'] == {{ item.update_values | default(item['values']) }} - - result.record.record == "{{ item.record }}" - - result.record.ttl == {{ item.update_ttl | default(item.ttl) }} - - result.record.type == "{{ item.type }}" + - result.record['values'] == (item.update_values | default(item['values'])) + - result.record.record == item.record + - result.record.ttl == (item.update_ttl | default(item.ttl)) + - result.record.type == item.type - name: test update or add another dns record idempotence community.general.gandi_livedns: @@ -53,7 +53,7 @@ assert: that: - result is not changed - - result.record['values'] == {{ item.update_values | default(item['values']) }} - - result.record.record == "{{ item.record }}" - - result.record.ttl == {{ item.update_ttl | default(item.ttl) }} - - result.record.type == "{{ item.type }}" + - result.record['values'] == (item.update_values | default(item['values'])) + - result.record.record == item.record + - result.record.ttl == (item.update_ttl | default(item.ttl)) + - result.record.type == item.type diff --git a/ansible_collections/community/general/tests/integration/targets/homebrew/handlers/main.yml b/ansible_collections/community/general/tests/integration/targets/homebrew/handlers/main.yml new file mode 100644 index 000000000..90a2e8017 --- /dev/null +++ b/ansible_collections/community/general/tests/integration/targets/homebrew/handlers/main.yml @@ -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 + +- name: uninstall docker + community.general.homebrew: + name: docker + state: absent + become: true + become_user: "{{ brew_stat.stat.pw_name }}" diff --git a/ansible_collections/community/general/tests/integration/targets/homebrew/tasks/casks.yml b/ansible_collections/community/general/tests/integration/targets/homebrew/tasks/casks.yml index 42d3515bf..ffbe67d15 100644 --- a/ansible_collections/community/general/tests/integration/targets/homebrew/tasks/casks.yml +++ b/ansible_collections/community/general/tests/integration/targets/homebrew/tasks/casks.yml @@ -12,13 +12,11 @@ - name: Find brew binary command: which brew register: brew_which - when: ansible_distribution in ['MacOSX'] - name: Get owner of brew binary stat: path: "{{ brew_which.stdout }}" register: brew_stat - when: ansible_distribution in ['MacOSX'] #- name: Use ignored-pinned option while upgrading all # homebrew: diff --git a/ansible_collections/community/general/tests/integration/targets/homebrew/tasks/docker.yml b/ansible_collections/community/general/tests/integration/targets/homebrew/tasks/docker.yml new file mode 100644 index 000000000..c7f282ba2 --- /dev/null +++ b/ansible_collections/community/general/tests/integration/targets/homebrew/tasks/docker.yml @@ -0,0 +1,23 @@ +--- +# 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: MACOS | Find brew binary + command: which brew + register: brew_which + +- name: MACOS | Get owner of brew binary + stat: + path: "{{ brew_which.stdout }}" + register: brew_stat + +- name: MACOS | Install docker + community.general.homebrew: + name: docker + state: present + force_formula: true + become: true + become_user: "{{ brew_stat.stat.pw_name }}" + notify: + - uninstall docker diff --git a/ansible_collections/community/general/tests/integration/targets/homebrew/tasks/formulae.yml b/ansible_collections/community/general/tests/integration/targets/homebrew/tasks/formulae.yml index 1db3ef1a6..1ca8d753e 100644 --- a/ansible_collections/community/general/tests/integration/targets/homebrew/tasks/formulae.yml +++ b/ansible_collections/community/general/tests/integration/targets/homebrew/tasks/formulae.yml @@ -12,13 +12,11 @@ - name: Find brew binary command: which brew register: brew_which - when: ansible_distribution in ['MacOSX'] - name: Get owner of brew binary stat: path: "{{ brew_which.stdout }}" register: brew_stat - when: ansible_distribution in ['MacOSX'] #- name: Use ignored-pinned option while upgrading all # homebrew: diff --git a/ansible_collections/community/general/tests/integration/targets/homebrew/tasks/main.yml b/ansible_collections/community/general/tests/integration/targets/homebrew/tasks/main.yml index f5479917e..00d0bcf31 100644 --- a/ansible_collections/community/general/tests/integration/targets/homebrew/tasks/main.yml +++ b/ansible_collections/community/general/tests/integration/targets/homebrew/tasks/main.yml @@ -9,9 +9,8 @@ # 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: - - include_tasks: 'formulae.yml' - - when: ansible_distribution in ['MacOSX'] block: + - include_tasks: 'formulae.yml' - include_tasks: 'casks.yml' + - include_tasks: 'docker.yml' diff --git a/ansible_collections/community/general/tests/integration/targets/keycloak_identity_provider/tasks/main.yml b/ansible_collections/community/general/tests/integration/targets/keycloak_identity_provider/tasks/main.yml index afad9740e..fa118ed1d 100644 --- a/ansible_collections/community/general/tests/integration/targets/keycloak_identity_provider/tasks/main.yml +++ b/ansible_collections/community/general/tests/integration/targets/keycloak_identity_provider/tasks/main.yml @@ -62,6 +62,7 @@ - result.existing == {} - result.end_state.alias == "{{ idp }}" - result.end_state.mappers != [] + - result.end_state.config.client_secret = "**********" - name: Update existing identity provider (no change) community.general.keycloak_identity_provider: diff --git a/ansible_collections/community/general/tests/integration/targets/lookup_merge_variables/runme.sh b/ansible_collections/community/general/tests/integration/targets/lookup_merge_variables/runme.sh index 4e66476be..ada6908dd 100755 --- a/ansible_collections/community/general/tests/integration/targets/lookup_merge_variables/runme.sh +++ b/ansible_collections/community/general/tests/integration/targets/lookup_merge_variables/runme.sh @@ -14,3 +14,6 @@ ANSIBLE_MERGE_VARIABLES_PATTERN_TYPE=suffix \ ANSIBLE_LOG_PATH=/tmp/ansible-test-merge-variables \ ansible-playbook -i test_inventory_all_hosts.yml test_all_hosts.yml "$@" + +ANSIBLE_LOG_PATH=/tmp/ansible-test-merge-variables \ + ansible-playbook -i test_cross_host_merge_inventory.yml test_cross_host_merge_play.yml "$@" diff --git a/ansible_collections/community/general/tests/integration/targets/lookup_merge_variables/test_cross_host_merge_inventory.yml b/ansible_collections/community/general/tests/integration/targets/lookup_merge_variables/test_cross_host_merge_inventory.yml new file mode 100644 index 000000000..938457023 --- /dev/null +++ b/ansible_collections/community/general/tests/integration/targets/lookup_merge_variables/test_cross_host_merge_inventory.yml @@ -0,0 +1,33 @@ +--- +# Copyright (c) 2020, Thales Netherlands +# Copyright (c) 2021, 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 + +common: + vars: + provider_instances: + servicedata1: + host: "{{ hostvars[groups['provider'] | first].inventory_hostname }}" + user: usr + pass: pwd + servicedata2: + host: down + user: usr2 + pass: pwd2 + hosts: + host1: + host2: + +consumer: + vars: + service_data: "{{ provider_instances.servicedata1 }}" + merge2__1: "{{ service_data }}" # service_data is a variable only known to host2, so normally it´s not available for host1 that is performing the merge + hosts: + host2: + +provider: + vars: + merge_result: "{{ lookup('community.general.merge_variables', 'merge2__', pattern_type='prefix', groups=['consumer']) }}" + hosts: + host1: diff --git a/ansible_collections/community/general/tests/integration/targets/lookup_merge_variables/test_cross_host_merge_play.yml b/ansible_collections/community/general/tests/integration/targets/lookup_merge_variables/test_cross_host_merge_play.yml new file mode 100644 index 000000000..51cd6f1ba --- /dev/null +++ b/ansible_collections/community/general/tests/integration/targets/lookup_merge_variables/test_cross_host_merge_play.yml @@ -0,0 +1,21 @@ +--- +# Copyright (c) 2020, Thales Netherlands +# Copyright (c) 2021, 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: Test merge_variables lookup plugin (merging host reference variables) + hosts: host1 + connection: local + gather_facts: false + tasks: + - name: Print merge result + ansible.builtin.debug: + msg: "{{ merge_result }}" + - name: Validate merge result + ansible.builtin.assert: + that: + - "merge_result | length == 3" + - "merge_result.host == 'host1'" + - "merge_result.user == 'usr'" + - "merge_result.pass == 'pwd'" diff --git a/ansible_collections/community/general/tests/integration/targets/module_helper/library/mdepfail.py b/ansible_collections/community/general/tests/integration/targets/module_helper/library/mdepfail.py index 92ebbde6e..b61c32a4d 100644 --- a/ansible_collections/community/general/tests/integration/targets/module_helper/library/mdepfail.py +++ b/ansible_collections/community/general/tests/integration/targets/module_helper/library/mdepfail.py @@ -30,10 +30,10 @@ EXAMPLES = "" RETURN = "" +from ansible_collections.community.general.plugins.module_utils import deps from ansible_collections.community.general.plugins.module_utils.module_helper import ModuleHelper -from ansible.module_utils.basic import missing_required_lib -with ModuleHelper.dependency("nopackagewiththisname", missing_required_lib("nopackagewiththisname")): +with deps.declare("nopackagewiththisname"): import nopackagewiththisname # noqa: F401, pylint: disable=unused-import @@ -50,6 +50,7 @@ class MSimple(ModuleHelper): def __init_module__(self): self.vars.set('value', None) self.vars.set('abc', "abc", diff=True) + deps.validate(self.module) def __run__(self): if (0 if self.vars.a is None else self.vars.a) >= 100: diff --git a/ansible_collections/community/general/tests/integration/targets/module_helper/library/mstate.py b/ansible_collections/community/general/tests/integration/targets/module_helper/library/mstate.py index bfaab0375..b3b4ed5e6 100644 --- a/ansible_collections/community/general/tests/integration/targets/module_helper/library/mstate.py +++ b/ansible_collections/community/general/tests/integration/targets/module_helper/library/mstate.py @@ -49,6 +49,7 @@ class MState(StateModuleHelper): state=dict(type='str', choices=['join', 'b_x_a', 'c_x_a', 'both_x_a', 'nop'], default='join'), ), ) + use_old_vardict = False def __init_module__(self): self.vars.set('result', "abc", diff=True) diff --git a/ansible_collections/community/general/tests/integration/targets/snap/tasks/main.yml b/ansible_collections/community/general/tests/integration/targets/snap/tasks/main.yml index 2a683617a..a2d8698d0 100644 --- a/ansible_collections/community/general/tests/integration/targets/snap/tasks/main.yml +++ b/ansible_collections/community/general/tests/integration/targets/snap/tasks/main.yml @@ -13,10 +13,9 @@ block: - name: Include test ansible.builtin.include_tasks: test.yml - # TODO: Find better package to install from a channel - microk8s installation takes multiple minutes, and even removal takes one minute! - # - name: Include test_channel - # ansible.builtin.include_tasks: test_channel.yml - # TODO: Find bettter package to download and install from sources - cider 1.6.0 takes over 35 seconds to install + - name: Include test_channel + ansible.builtin.include_tasks: test_channel.yml + # TODO: Find better package to download and install from sources - cider 1.6.0 takes over 35 seconds to install # - name: Include test_dangerous # ansible.builtin.include_tasks: test_dangerous.yml - name: Include test_3dash diff --git a/ansible_collections/community/general/tests/integration/targets/snap/tasks/test_channel.yml b/ansible_collections/community/general/tests/integration/targets/snap/tasks/test_channel.yml index e9eb19c89..353735761 100644 --- a/ansible_collections/community/general/tests/integration/targets/snap/tasks/test_channel.yml +++ b/ansible_collections/community/general/tests/integration/targets/snap/tasks/test_channel.yml @@ -5,47 +5,44 @@ # NOTE This is currently disabled for performance reasons! -- name: Make sure package is not installed (microk8s) +- name: Make sure package is not installed (wisdom) community.general.snap: - name: microk8s + name: wisdom state: absent # Test for https://github.com/ansible-collections/community.general/issues/1606 -- name: Install package (microk8s) +- name: Install package (wisdom) community.general.snap: - name: microk8s - classic: true + name: wisdom state: present - register: install_microk8s + register: install_wisdom -- name: Install package with channel (microk8s) +- name: Install package with channel (wisdom) community.general.snap: - name: microk8s - classic: true - channel: 1.20/stable + name: wisdom state: present - register: install_microk8s_chan + channel: latest/edge + register: install_wisdom_chan -- name: Install package with channel (microk8s) again +- name: Install package with channel (wisdom) again community.general.snap: - name: microk8s - classic: true - channel: 1.20/stable + name: wisdom state: present - register: install_microk8s_chan_again + channel: latest/edge + register: install_wisdom_chan_again -- name: Remove package (microk8s) +- name: Remove package (wisdom) community.general.snap: - name: microk8s + name: wisdom state: absent - register: remove_microk8s + register: remove_wisdom - assert: that: - - install_microk8s is changed - - install_microk8s_chan is changed - - install_microk8s_chan_again is not changed - - remove_microk8s is changed + - install_wisdom is changed + - install_wisdom_chan is changed + - install_wisdom_chan_again is not changed + - remove_wisdom is changed - name: Install package (shellcheck) community.general.snap: diff --git a/ansible_collections/community/general/tests/sanity/ignore-2.13.txt b/ansible_collections/community/general/tests/sanity/ignore-2.13.txt index 0665ddc1a..6f6495dd1 100644 --- a/ansible_collections/community/general/tests/sanity/ignore-2.13.txt +++ b/ansible_collections/community/general/tests/sanity/ignore-2.13.txt @@ -1,4 +1,6 @@ .azure-pipelines/scripts/publish-codecov.py replace-urlopen +plugins/callback/timestamp.py validate-modules:invalid-documentation +plugins/callback/yaml.py validate-modules:invalid-documentation plugins/lookup/etcd.py validate-modules:invalid-documentation plugins/lookup/etcd3.py validate-modules:invalid-documentation plugins/modules/consul_session.py validate-modules:parameter-state-invalid-choice @@ -6,9 +8,6 @@ plugins/modules/iptables_state.py validate-modules:undocumented-parameter plugins/modules/lxc_container.py validate-modules:use-run-command-not-popen plugins/modules/osx_defaults.py validate-modules:parameter-state-invalid-choice plugins/modules/parted.py validate-modules:parameter-state-invalid-choice -plugins/modules/rax_files_objects.py use-argspec-type-path # module deprecated - removed in 9.0.0 -plugins/modules/rax_files.py validate-modules:parameter-state-invalid-choice # module deprecated - removed in 9.0.0 -plugins/modules/rax.py use-argspec-type-path # module deprecated - removed in 9.0.0 plugins/modules/read_csv.py validate-modules:invalid-documentation plugins/modules/rhevm.py validate-modules:parameter-state-invalid-choice plugins/modules/xfconf.py validate-modules:return-syntax-error diff --git a/ansible_collections/community/general/tests/sanity/ignore-2.14.txt b/ansible_collections/community/general/tests/sanity/ignore-2.14.txt index fed147e44..24d752103 100644 --- a/ansible_collections/community/general/tests/sanity/ignore-2.14.txt +++ b/ansible_collections/community/general/tests/sanity/ignore-2.14.txt @@ -1,4 +1,6 @@ .azure-pipelines/scripts/publish-codecov.py replace-urlopen +plugins/callback/timestamp.py validate-modules:invalid-documentation +plugins/callback/yaml.py validate-modules:invalid-documentation plugins/lookup/etcd.py validate-modules:invalid-documentation plugins/lookup/etcd3.py validate-modules:invalid-documentation plugins/modules/consul_session.py validate-modules:parameter-state-invalid-choice @@ -7,9 +9,6 @@ plugins/modules/iptables_state.py validate-modules:undocumented-parameter plugins/modules/lxc_container.py validate-modules:use-run-command-not-popen plugins/modules/osx_defaults.py validate-modules:parameter-state-invalid-choice plugins/modules/parted.py validate-modules:parameter-state-invalid-choice -plugins/modules/rax_files_objects.py use-argspec-type-path # module deprecated - removed in 9.0.0 -plugins/modules/rax_files.py validate-modules:parameter-state-invalid-choice # module deprecated - removed in 9.0.0 -plugins/modules/rax.py use-argspec-type-path # module deprecated - removed in 9.0.0 plugins/modules/read_csv.py validate-modules:invalid-documentation plugins/modules/rhevm.py validate-modules:parameter-state-invalid-choice plugins/modules/udm_user.py import-3.11 # Uses deprecated stdlib library 'crypt' diff --git a/ansible_collections/community/general/tests/sanity/ignore-2.15.txt b/ansible_collections/community/general/tests/sanity/ignore-2.15.txt index d4c92c4d9..667c6cee4 100644 --- a/ansible_collections/community/general/tests/sanity/ignore-2.15.txt +++ b/ansible_collections/community/general/tests/sanity/ignore-2.15.txt @@ -5,9 +5,6 @@ plugins/modules/iptables_state.py validate-modules:undocumented-parameter plugins/modules/lxc_container.py validate-modules:use-run-command-not-popen plugins/modules/osx_defaults.py validate-modules:parameter-state-invalid-choice plugins/modules/parted.py validate-modules:parameter-state-invalid-choice -plugins/modules/rax_files_objects.py use-argspec-type-path # module deprecated - removed in 9.0.0 -plugins/modules/rax_files.py validate-modules:parameter-state-invalid-choice # module deprecated - removed in 9.0.0 -plugins/modules/rax.py use-argspec-type-path # module deprecated - removed in 9.0.0 plugins/modules/rhevm.py validate-modules:parameter-state-invalid-choice plugins/modules/udm_user.py import-3.11 # Uses deprecated stdlib library 'crypt' plugins/modules/xfconf.py validate-modules:return-syntax-error diff --git a/ansible_collections/community/general/tests/sanity/ignore-2.16.txt b/ansible_collections/community/general/tests/sanity/ignore-2.16.txt index 397c6d986..f6b058ec6 100644 --- a/ansible_collections/community/general/tests/sanity/ignore-2.16.txt +++ b/ansible_collections/community/general/tests/sanity/ignore-2.16.txt @@ -5,9 +5,6 @@ plugins/modules/iptables_state.py validate-modules:undocumented-parameter plugins/modules/lxc_container.py validate-modules:use-run-command-not-popen plugins/modules/osx_defaults.py validate-modules:parameter-state-invalid-choice plugins/modules/parted.py validate-modules:parameter-state-invalid-choice -plugins/modules/rax_files_objects.py use-argspec-type-path # module deprecated - removed in 9.0.0 -plugins/modules/rax_files.py validate-modules:parameter-state-invalid-choice # module deprecated - removed in 9.0.0 -plugins/modules/rax.py use-argspec-type-path # module deprecated - removed in 9.0.0 plugins/modules/rhevm.py validate-modules:parameter-state-invalid-choice plugins/modules/udm_user.py import-3.11 # Uses deprecated stdlib library 'crypt' plugins/modules/udm_user.py import-3.12 # Uses deprecated stdlib library 'crypt' diff --git a/ansible_collections/community/general/tests/sanity/ignore-2.17.txt b/ansible_collections/community/general/tests/sanity/ignore-2.17.txt index d75aaeac2..806c4c5fc 100644 --- a/ansible_collections/community/general/tests/sanity/ignore-2.17.txt +++ b/ansible_collections/community/general/tests/sanity/ignore-2.17.txt @@ -5,13 +5,11 @@ plugins/modules/iptables_state.py validate-modules:undocumented-parameter plugins/modules/lxc_container.py validate-modules:use-run-command-not-popen plugins/modules/osx_defaults.py validate-modules:parameter-state-invalid-choice plugins/modules/parted.py validate-modules:parameter-state-invalid-choice -plugins/modules/rax_files_objects.py use-argspec-type-path # module deprecated - removed in 9.0.0 -plugins/modules/rax_files.py validate-modules:parameter-state-invalid-choice # module deprecated - removed in 9.0.0 -plugins/modules/rax.py use-argspec-type-path # module deprecated - removed in 9.0.0 plugins/modules/rhevm.py validate-modules:parameter-state-invalid-choice plugins/modules/udm_user.py import-3.11 # Uses deprecated stdlib library 'crypt' plugins/modules/udm_user.py import-3.12 # Uses deprecated stdlib library 'crypt' plugins/modules/xfconf.py validate-modules:return-syntax-error plugins/module_utils/univention_umc.py pylint:use-yield-from # suggested construct does not work with Python 2 tests/unit/compat/mock.py pylint:use-yield-from # suggested construct does not work with Python 2 +tests/unit/plugins/modules/helper.py pylint:use-yield-from # suggested construct does not work with Python 2 tests/unit/plugins/modules/test_gio_mime.yaml no-smart-quotes diff --git a/ansible_collections/community/general/tests/sanity/ignore-2.18.txt b/ansible_collections/community/general/tests/sanity/ignore-2.18.txt index d75aaeac2..806c4c5fc 100644 --- a/ansible_collections/community/general/tests/sanity/ignore-2.18.txt +++ b/ansible_collections/community/general/tests/sanity/ignore-2.18.txt @@ -5,13 +5,11 @@ plugins/modules/iptables_state.py validate-modules:undocumented-parameter plugins/modules/lxc_container.py validate-modules:use-run-command-not-popen plugins/modules/osx_defaults.py validate-modules:parameter-state-invalid-choice plugins/modules/parted.py validate-modules:parameter-state-invalid-choice -plugins/modules/rax_files_objects.py use-argspec-type-path # module deprecated - removed in 9.0.0 -plugins/modules/rax_files.py validate-modules:parameter-state-invalid-choice # module deprecated - removed in 9.0.0 -plugins/modules/rax.py use-argspec-type-path # module deprecated - removed in 9.0.0 plugins/modules/rhevm.py validate-modules:parameter-state-invalid-choice plugins/modules/udm_user.py import-3.11 # Uses deprecated stdlib library 'crypt' plugins/modules/udm_user.py import-3.12 # Uses deprecated stdlib library 'crypt' plugins/modules/xfconf.py validate-modules:return-syntax-error plugins/module_utils/univention_umc.py pylint:use-yield-from # suggested construct does not work with Python 2 tests/unit/compat/mock.py pylint:use-yield-from # suggested construct does not work with Python 2 +tests/unit/plugins/modules/helper.py pylint:use-yield-from # suggested construct does not work with Python 2 tests/unit/plugins/modules/test_gio_mime.yaml no-smart-quotes diff --git a/ansible_collections/community/general/tests/unit/plugins/become/test_run0.py b/ansible_collections/community/general/tests/unit/plugins/become/test_run0.py new file mode 100644 index 000000000..7507c556e --- /dev/null +++ b/ansible_collections/community/general/tests/unit/plugins/become/test_run0.py @@ -0,0 +1,64 @@ +# Copyright (c) 2024 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 absolute_import, division, print_function + +__metaclass__ = type + +import re + +from ansible import context + +from .helper import call_become_plugin + + +def test_run0_basic(mocker, parser, reset_cli_args): + options = parser.parse_args([]) + context._init_global_context(options) + + default_cmd = "/bin/foo" + default_exe = "/bin/sh" + run0_exe = "run0" + + success = "BECOME-SUCCESS-.+?" + + task = { + "become_method": "community.general.run0", + } + var_options = {} + cmd = call_become_plugin(task, var_options, cmd=default_cmd, executable=default_exe) + assert ( + re.match( + f"{run0_exe} --user=root {default_exe} -c 'echo {success}; {default_cmd}'", + cmd, + ) + is not None + ) + + +def test_run0_flags(mocker, parser, reset_cli_args): + options = parser.parse_args([]) + context._init_global_context(options) + + default_cmd = "/bin/foo" + default_exe = "/bin/sh" + run0_exe = "run0" + run0_flags = "--nice=15" + + success = "BECOME-SUCCESS-.+?" + + task = { + "become_method": "community.general.run0", + "become_flags": run0_flags, + } + var_options = {} + cmd = call_become_plugin(task, var_options, cmd=default_cmd, executable=default_exe) + assert ( + re.match( + f"{run0_exe} --user=root --nice=15 {default_exe} -c 'echo {success}; {default_cmd}'", + cmd, + ) + is not None + ) diff --git a/ansible_collections/community/general/tests/unit/plugins/lookup/test_merge_variables.py b/ansible_collections/community/general/tests/unit/plugins/lookup/test_merge_variables.py index 66cb2f08b..ba8209439 100644 --- a/ansible_collections/community/general/tests/unit/plugins/lookup/test_merge_variables.py +++ b/ansible_collections/community/general/tests/unit/plugins/lookup/test_merge_variables.py @@ -18,6 +18,17 @@ from ansible_collections.community.general.plugins.lookup import merge_variables class TestMergeVariablesLookup(unittest.TestCase): + class HostVarsMock(dict): + + def __getattr__(self, item): + return super().__getitem__(item) + + def __setattr__(self, item, value): + return super().__setitem__(item, value) + + def raw_get(self, host): + return super().__getitem__(host) + def setUp(self): self.loader = DictDataLoader({}) self.templar = Templar(loader=self.loader, variables={}) @@ -141,25 +152,28 @@ class TestMergeVariablesLookup(unittest.TestCase): {'var': [{'item5': 'value5', 'item6': 'value6'}]}, ]) def test_merge_dict_group_all(self, mock_set_options, mock_get_option, mock_template): - results = self.merge_vars_lookup.run(['__merge_var'], { - 'inventory_hostname': 'host1', - 'hostvars': { - 'host1': { - 'group_names': ['dummy1'], - 'inventory_hostname': 'host1', - '1testlist__merge_var': { - 'var': [{'item1': 'value1', 'item2': 'value2'}] - } - }, - 'host2': { - 'group_names': ['dummy1'], - 'inventory_hostname': 'host2', - '2otherlist__merge_var': { - 'var': [{'item5': 'value5', 'item6': 'value6'}] - } + hostvars = self.HostVarsMock({ + 'host1': { + 'group_names': ['dummy1'], + 'inventory_hostname': 'host1', + '1testlist__merge_var': { + 'var': [{'item1': 'value1', 'item2': 'value2'}] + } + }, + 'host2': { + 'group_names': ['dummy1'], + 'inventory_hostname': 'host2', + '2otherlist__merge_var': { + 'var': [{'item5': 'value5', 'item6': 'value6'}] } } }) + variables = { + 'inventory_hostname': 'host1', + 'hostvars': hostvars + } + + results = self.merge_vars_lookup.run(['__merge_var'], variables) self.assertEqual(results, [ {'var': [ @@ -175,32 +189,35 @@ class TestMergeVariablesLookup(unittest.TestCase): {'var': [{'item5': 'value5', 'item6': 'value6'}]}, ]) def test_merge_dict_group_single(self, mock_set_options, mock_get_option, mock_template): - results = self.merge_vars_lookup.run(['__merge_var'], { - 'inventory_hostname': 'host1', - 'hostvars': { - 'host1': { - 'group_names': ['dummy1'], - 'inventory_hostname': 'host1', - '1testlist__merge_var': { - 'var': [{'item1': 'value1', 'item2': 'value2'}] - } - }, - 'host2': { - 'group_names': ['dummy1'], - 'inventory_hostname': 'host2', - '2otherlist__merge_var': { - 'var': [{'item5': 'value5', 'item6': 'value6'}] - } - }, - 'host3': { - 'group_names': ['dummy2'], - 'inventory_hostname': 'host3', - '3otherlist__merge_var': { - 'var': [{'item3': 'value3', 'item4': 'value4'}] - } + hostvars = self.HostVarsMock({ + 'host1': { + 'group_names': ['dummy1'], + 'inventory_hostname': 'host1', + '1testlist__merge_var': { + 'var': [{'item1': 'value1', 'item2': 'value2'}] + } + }, + 'host2': { + 'group_names': ['dummy1'], + 'inventory_hostname': 'host2', + '2otherlist__merge_var': { + 'var': [{'item5': 'value5', 'item6': 'value6'}] + } + }, + 'host3': { + 'group_names': ['dummy2'], + 'inventory_hostname': 'host3', + '3otherlist__merge_var': { + 'var': [{'item3': 'value3', 'item4': 'value4'}] } } }) + variables = { + 'inventory_hostname': 'host1', + 'hostvars': hostvars + } + + results = self.merge_vars_lookup.run(['__merge_var'], variables) self.assertEqual(results, [ {'var': [ @@ -216,32 +233,34 @@ class TestMergeVariablesLookup(unittest.TestCase): {'var': [{'item5': 'value5', 'item6': 'value6'}]}, ]) def test_merge_dict_group_multiple(self, mock_set_options, mock_get_option, mock_template): - results = self.merge_vars_lookup.run(['__merge_var'], { - 'inventory_hostname': 'host1', - 'hostvars': { - 'host1': { - 'group_names': ['dummy1'], - 'inventory_hostname': 'host1', - '1testlist__merge_var': { - 'var': [{'item1': 'value1', 'item2': 'value2'}] - } - }, - 'host2': { - 'group_names': ['dummy2'], - 'inventory_hostname': 'host2', - '2otherlist__merge_var': { - 'var': [{'item5': 'value5', 'item6': 'value6'}] - } - }, - 'host3': { - 'group_names': ['dummy3'], - 'inventory_hostname': 'host3', - '3otherlist__merge_var': { - 'var': [{'item3': 'value3', 'item4': 'value4'}] - } + hostvars = self.HostVarsMock({ + 'host1': { + 'group_names': ['dummy1'], + 'inventory_hostname': 'host1', + '1testlist__merge_var': { + 'var': [{'item1': 'value1', 'item2': 'value2'}] + } + }, + 'host2': { + 'group_names': ['dummy2'], + 'inventory_hostname': 'host2', + '2otherlist__merge_var': { + 'var': [{'item5': 'value5', 'item6': 'value6'}] + } + }, + 'host3': { + 'group_names': ['dummy3'], + 'inventory_hostname': 'host3', + '3otherlist__merge_var': { + 'var': [{'item3': 'value3', 'item4': 'value4'}] } } }) + variables = { + 'inventory_hostname': 'host1', + 'hostvars': hostvars + } + results = self.merge_vars_lookup.run(['__merge_var'], variables) self.assertEqual(results, [ {'var': [ @@ -257,26 +276,27 @@ class TestMergeVariablesLookup(unittest.TestCase): ['item5'], ]) def test_merge_list_group_multiple(self, mock_set_options, mock_get_option, mock_template): - print() - results = self.merge_vars_lookup.run(['__merge_var'], { - 'inventory_hostname': 'host1', - 'hostvars': { - 'host1': { - 'group_names': ['dummy1'], - 'inventory_hostname': 'host1', - '1testlist__merge_var': ['item1'] - }, - 'host2': { - 'group_names': ['dummy2'], - 'inventory_hostname': 'host2', - '2otherlist__merge_var': ['item5'] - }, - 'host3': { - 'group_names': ['dummy3'], - 'inventory_hostname': 'host3', - '3otherlist__merge_var': ['item3'] - } + hostvars = self.HostVarsMock({ + 'host1': { + 'group_names': ['dummy1'], + 'inventory_hostname': 'host1', + '1testlist__merge_var': ['item1'] + }, + 'host2': { + 'group_names': ['dummy2'], + 'inventory_hostname': 'host2', + '2otherlist__merge_var': ['item5'] + }, + 'host3': { + 'group_names': ['dummy3'], + 'inventory_hostname': 'host3', + '3otherlist__merge_var': ['item3'] } }) + variables = { + 'inventory_hostname': 'host1', + 'hostvars': hostvars + } + results = self.merge_vars_lookup.run(['__merge_var'], variables) self.assertEqual(results, [['item1', 'item5']]) diff --git a/ansible_collections/community/general/tests/unit/plugins/module_utils/test_cmd_runner.py b/ansible_collections/community/general/tests/unit/plugins/module_utils/test_cmd_runner.py index 86576e8ce..6816afb34 100644 --- a/ansible_collections/community/general/tests/unit/plugins/module_utils/test_cmd_runner.py +++ b/ansible_collections/community/general/tests/unit/plugins/module_utils/test_cmd_runner.py @@ -7,6 +7,7 @@ from __future__ import (absolute_import, division, print_function) __metaclass__ = type from sys import version_info +from functools import partial import pytest @@ -15,55 +16,64 @@ from ansible_collections.community.general.plugins.module_utils.cmd_runner impor TC_FORMATS = dict( - simple_boolean__true=(cmd_runner_fmt.as_bool, ("--superflag",), True, ["--superflag"]), - simple_boolean__false=(cmd_runner_fmt.as_bool, ("--superflag",), False, []), - simple_boolean__none=(cmd_runner_fmt.as_bool, ("--superflag",), None, []), - simple_boolean_both__true=(cmd_runner_fmt.as_bool, ("--superflag", "--falseflag"), True, ["--superflag"]), - simple_boolean_both__false=(cmd_runner_fmt.as_bool, ("--superflag", "--falseflag"), False, ["--falseflag"]), - simple_boolean_both__none=(cmd_runner_fmt.as_bool, ("--superflag", "--falseflag"), None, ["--falseflag"]), - simple_boolean_both__none_ig=(cmd_runner_fmt.as_bool, ("--superflag", "--falseflag", True), None, []), - simple_boolean_not__true=(cmd_runner_fmt.as_bool_not, ("--superflag",), True, []), - simple_boolean_not__false=(cmd_runner_fmt.as_bool_not, ("--superflag",), False, ["--superflag"]), - simple_boolean_not__none=(cmd_runner_fmt.as_bool_not, ("--superflag",), None, ["--superflag"]), - simple_optval__str=(cmd_runner_fmt.as_optval, ("-t",), "potatoes", ["-tpotatoes"]), - simple_optval__int=(cmd_runner_fmt.as_optval, ("-t",), 42, ["-t42"]), - simple_opt_val__str=(cmd_runner_fmt.as_opt_val, ("-t",), "potatoes", ["-t", "potatoes"]), - simple_opt_val__int=(cmd_runner_fmt.as_opt_val, ("-t",), 42, ["-t", "42"]), - simple_opt_eq_val__str=(cmd_runner_fmt.as_opt_eq_val, ("--food",), "potatoes", ["--food=potatoes"]), - simple_opt_eq_val__int=(cmd_runner_fmt.as_opt_eq_val, ("--answer",), 42, ["--answer=42"]), - simple_list_potato=(cmd_runner_fmt.as_list, (), "literal_potato", ["literal_potato"]), - simple_list_42=(cmd_runner_fmt.as_list, (), 42, ["42"]), - simple_map=(cmd_runner_fmt.as_map, ({'a': 1, 'b': 2, 'c': 3},), 'b', ["2"]), - simple_default_type__list=(cmd_runner_fmt.as_default_type, ("list",), [1, 2, 3, 5, 8], ["--1", "--2", "--3", "--5", "--8"]), - simple_default_type__bool_true=(cmd_runner_fmt.as_default_type, ("bool", "what"), True, ["--what"]), - simple_default_type__bool_false=(cmd_runner_fmt.as_default_type, ("bool", "what"), False, []), - simple_default_type__potato=(cmd_runner_fmt.as_default_type, ("any-other-type", "potato"), "42", ["--potato", "42"]), - simple_fixed_true=(cmd_runner_fmt.as_fixed, [("--always-here", "--forever")], True, ["--always-here", "--forever"]), - simple_fixed_false=(cmd_runner_fmt.as_fixed, [("--always-here", "--forever")], False, ["--always-here", "--forever"]), - simple_fixed_none=(cmd_runner_fmt.as_fixed, [("--always-here", "--forever")], None, ["--always-here", "--forever"]), - simple_fixed_str=(cmd_runner_fmt.as_fixed, [("--always-here", "--forever")], "something", ["--always-here", "--forever"]), + simple_boolean__true=(partial(cmd_runner_fmt.as_bool, "--superflag"), True, ["--superflag"], None), + simple_boolean__false=(partial(cmd_runner_fmt.as_bool, "--superflag"), False, [], None), + simple_boolean__none=(partial(cmd_runner_fmt.as_bool, "--superflag"), None, [], None), + simple_boolean_both__true=(partial(cmd_runner_fmt.as_bool, "--superflag", "--falseflag"), True, ["--superflag"], None), + simple_boolean_both__false=(partial(cmd_runner_fmt.as_bool, "--superflag", "--falseflag"), False, ["--falseflag"], None), + simple_boolean_both__none=(partial(cmd_runner_fmt.as_bool, "--superflag", "--falseflag"), None, ["--falseflag"], None), + simple_boolean_both__none_ig=(partial(cmd_runner_fmt.as_bool, "--superflag", "--falseflag", True), None, [], None), + simple_boolean_not__true=(partial(cmd_runner_fmt.as_bool_not, "--superflag"), True, [], None), + simple_boolean_not__false=(partial(cmd_runner_fmt.as_bool_not, "--superflag"), False, ["--superflag"], None), + simple_boolean_not__none=(partial(cmd_runner_fmt.as_bool_not, "--superflag"), None, ["--superflag"], None), + simple_optval__str=(partial(cmd_runner_fmt.as_optval, "-t"), "potatoes", ["-tpotatoes"], None), + simple_optval__int=(partial(cmd_runner_fmt.as_optval, "-t"), 42, ["-t42"], None), + simple_opt_val__str=(partial(cmd_runner_fmt.as_opt_val, "-t"), "potatoes", ["-t", "potatoes"], None), + simple_opt_val__int=(partial(cmd_runner_fmt.as_opt_val, "-t"), 42, ["-t", "42"], None), + simple_opt_eq_val__str=(partial(cmd_runner_fmt.as_opt_eq_val, "--food"), "potatoes", ["--food=potatoes"], None), + simple_opt_eq_val__int=(partial(cmd_runner_fmt.as_opt_eq_val, "--answer"), 42, ["--answer=42"], None), + simple_list_potato=(cmd_runner_fmt.as_list, "literal_potato", ["literal_potato"], None), + simple_list_42=(cmd_runner_fmt.as_list, 42, ["42"], None), + simple_list_min_len_ok=(partial(cmd_runner_fmt.as_list, min_len=1), 42, ["42"], None), + simple_list_min_len_fail=(partial(cmd_runner_fmt.as_list, min_len=10), 42, None, ValueError), + simple_list_max_len_ok=(partial(cmd_runner_fmt.as_list, max_len=1), 42, ["42"], None), + simple_list_max_len_fail=(partial(cmd_runner_fmt.as_list, max_len=2), [42, 42, 42], None, ValueError), + simple_map=(partial(cmd_runner_fmt.as_map, {'a': 1, 'b': 2, 'c': 3}), 'b', ["2"], None), + simple_default_type__list=(partial(cmd_runner_fmt.as_default_type, "list"), [1, 2, 3, 5, 8], ["--1", "--2", "--3", "--5", "--8"], None), + simple_default_type__bool_true=(partial(cmd_runner_fmt.as_default_type, "bool", "what"), True, ["--what"], None), + simple_default_type__bool_false=(partial(cmd_runner_fmt.as_default_type, "bool", "what"), False, [], None), + simple_default_type__potato=(partial(cmd_runner_fmt.as_default_type, "any-other-type", "potato"), "42", ["--potato", "42"], None), + simple_fixed_true=(partial(cmd_runner_fmt.as_fixed, ["--always-here", "--forever"]), True, ["--always-here", "--forever"], None), + simple_fixed_false=(partial(cmd_runner_fmt.as_fixed, ["--always-here", "--forever"]), False, ["--always-here", "--forever"], None), + simple_fixed_none=(partial(cmd_runner_fmt.as_fixed, ["--always-here", "--forever"]), None, ["--always-here", "--forever"], None), + simple_fixed_str=(partial(cmd_runner_fmt.as_fixed, ["--always-here", "--forever"]), "something", ["--always-here", "--forever"], None), ) if tuple(version_info) >= (3, 1): from collections import OrderedDict # needs OrderedDict to provide a consistent key order TC_FORMATS["simple_default_type__dict"] = ( # type: ignore - cmd_runner_fmt.as_default_type, - ("dict",), + partial(cmd_runner_fmt.as_default_type, "dict"), OrderedDict((('a', 1), ('b', 2))), - ["--a=1", "--b=2"] + ["--a=1", "--b=2"], + None ) TC_FORMATS_IDS = sorted(TC_FORMATS.keys()) -@pytest.mark.parametrize('func, fmt_opt, value, expected', +@pytest.mark.parametrize('func, value, expected, exception', (TC_FORMATS[tc] for tc in TC_FORMATS_IDS), ids=TC_FORMATS_IDS) -def test_arg_format(func, fmt_opt, value, expected): - fmt_func = func(*fmt_opt) - actual = fmt_func(value, ctx_ignore_none=True) - print("formatted string = {0}".format(actual)) - assert actual == expected, "actual = {0}".format(actual) +def test_arg_format(func, value, expected, exception): + fmt_func = func() + try: + actual = fmt_func(value, ctx_ignore_none=True) + print("formatted string = {0}".format(actual)) + assert actual == expected, "actual = {0}".format(actual) + except Exception as e: + if exception is None: + raise + assert isinstance(e, exception) TC_RUNNER = dict( diff --git a/ansible_collections/community/general/tests/unit/plugins/module_utils/test_python_runner.py b/ansible_collections/community/general/tests/unit/plugins/module_utils/test_python_runner.py new file mode 100644 index 000000000..015065bdd --- /dev/null +++ b/ansible_collections/community/general/tests/unit/plugins/module_utils/test_python_runner.py @@ -0,0 +1,223 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2024, Alexei Znamensky <russoz@gmail.com> +# 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 + +import os + +import pytest + +from ansible_collections.community.general.tests.unit.compat.mock import MagicMock, PropertyMock +from ansible_collections.community.general.plugins.module_utils.cmd_runner import cmd_runner_fmt +from ansible_collections.community.general.plugins.module_utils.python_runner import PythonRunner + + +TC_RUNNER = dict( + # SAMPLE: This shows all possible elements of a test case. It does not actually run. + # + # testcase_name=( + # # input + # dict( + # args_bundle = dict( + # param1=dict( + # type="int", + # value=11, + # fmt_func=cmd_runner_fmt.as_opt_eq_val, + # fmt_arg="--answer", + # ), + # param2=dict( + # fmt_func=cmd_runner_fmt.as_bool, + # fmt_arg="--bb-here", + # ) + # ), + # runner_init_args = dict( + # command="testing", + # default_args_order=(), + # check_rc=False, + # force_lang="C", + # path_prefix=None, + # environ_update=None, + # ), + # runner_ctx_args = dict( + # args_order=['aa', 'bb'], + # output_process=None, + # ignore_value_none=True, + # ), + # ), + # # command execution + # dict( + # runner_ctx_run_args = dict(bb=True), + # rc = 0, + # out = "", + # err = "", + # ), + # # expected + # dict( + # results=(), + # run_info=dict( + # cmd=['/mock/bin/testing', '--answer=11', '--bb-here'], + # environ_update={'LANGUAGE': 'C', 'LC_ALL': 'C'}, + # ), + # exc=None, + # ), + # ), + # + aa_bb=( + dict( + args_bundle=dict( + aa=dict(type="int", value=11, fmt_func=cmd_runner_fmt.as_opt_eq_val, fmt_arg="--answer"), + bb=dict(fmt_func=cmd_runner_fmt.as_bool, fmt_arg="--bb-here"), + ), + runner_init_args=dict(command="testing"), + runner_ctx_args=dict(args_order=['aa', 'bb']), + ), + dict(runner_ctx_run_args=dict(bb=True), rc=0, out="", err=""), + dict( + run_info=dict( + cmd=['/mock/bin/python', 'testing', '--answer=11', '--bb-here'], + environ_update={'LANGUAGE': 'C', 'LC_ALL': 'C'}, + args_order=('aa', 'bb'), + ), + ), + ), + aa_bb_py3=( + dict( + args_bundle=dict( + aa=dict(type="int", value=11, fmt_func=cmd_runner_fmt.as_opt_eq_val, fmt_arg="--answer"), + bb=dict(fmt_func=cmd_runner_fmt.as_bool, fmt_arg="--bb-here"), + ), + runner_init_args=dict(command="toasting", python="python3"), + runner_ctx_args=dict(args_order=['aa', 'bb']), + ), + dict(runner_ctx_run_args=dict(bb=True), rc=0, out="", err=""), + dict( + run_info=dict( + cmd=['/mock/bin/python3', 'toasting', '--answer=11', '--bb-here'], + environ_update={'LANGUAGE': 'C', 'LC_ALL': 'C'}, + args_order=('aa', 'bb'), + ), + ), + ), + aa_bb_abspath=( + dict( + args_bundle=dict( + aa=dict(type="int", value=11, fmt_func=cmd_runner_fmt.as_opt_eq_val, fmt_arg="--answer"), + bb=dict(fmt_func=cmd_runner_fmt.as_bool, fmt_arg="--bb-here"), + ), + runner_init_args=dict(command="toasting", python="/crazy/local/bin/python3"), + runner_ctx_args=dict(args_order=['aa', 'bb']), + ), + dict(runner_ctx_run_args=dict(bb=True), rc=0, out="", err=""), + dict( + run_info=dict( + cmd=['/crazy/local/bin/python3', 'toasting', '--answer=11', '--bb-here'], + environ_update={'LANGUAGE': 'C', 'LC_ALL': 'C'}, + args_order=('aa', 'bb'), + ), + ), + ), + aa_bb_venv=( + dict( + args_bundle=dict( + aa=dict(type="int", value=11, fmt_func=cmd_runner_fmt.as_opt_eq_val, fmt_arg="--answer"), + bb=dict(fmt_func=cmd_runner_fmt.as_bool, fmt_arg="--bb-here"), + ), + runner_init_args=dict(command="toasting", venv="/venv"), + runner_ctx_args=dict(args_order=['aa', 'bb']), + ), + dict(runner_ctx_run_args=dict(bb=True), rc=0, out="", err=""), + dict( + run_info=dict( + cmd=['/venv/bin/python', 'toasting', '--answer=11', '--bb-here'], + environ_update={'LANGUAGE': 'C', 'LC_ALL': 'C', 'VIRTUAL_ENV': '/venv', 'PATH': '/venv/bin'}, + args_order=('aa', 'bb'), + ), + ), + ), +) +TC_RUNNER_IDS = sorted(TC_RUNNER.keys()) + + +@pytest.mark.parametrize('runner_input, cmd_execution, expected', + (TC_RUNNER[tc] for tc in TC_RUNNER_IDS), + ids=TC_RUNNER_IDS) +def test_runner_context(runner_input, cmd_execution, expected): + arg_spec = {} + params = {} + arg_formats = {} + for k, v in runner_input['args_bundle'].items(): + try: + arg_spec[k] = {'type': v['type']} + except KeyError: + pass + try: + params[k] = v['value'] + except KeyError: + pass + try: + arg_formats[k] = v['fmt_func'](v['fmt_arg']) + except KeyError: + pass + + orig_results = tuple(cmd_execution[x] for x in ('rc', 'out', 'err')) + + print("arg_spec={0}\nparams={1}\narg_formats={2}\n".format( + arg_spec, + params, + arg_formats, + )) + + module = MagicMock() + type(module).argument_spec = PropertyMock(return_value=arg_spec) + type(module).params = PropertyMock(return_value=params) + module.get_bin_path.return_value = os.path.join( + runner_input["runner_init_args"].get("venv", "/mock"), + "bin", + runner_input["runner_init_args"].get("python", "python") + ) + module.run_command.return_value = orig_results + + runner = PythonRunner( + module=module, + arg_formats=arg_formats, + **runner_input['runner_init_args'] + ) + + def _extract_path(run_info): + path = run_info.get("environ_update", {}).get("PATH") + if path is not None: + run_info["environ_update"] = dict((k, v) + for k, v in run_info["environ_update"].items() + if k != "PATH") + return run_info, path + + def _assert_run_info_env_path(actual, expected): + actual2 = set(actual.split(":")) + assert expected in actual2, "Missing expected path {0} in output PATH: {1}".format(expected, actual) + + def _assert_run_info(actual, expected): + reduced = dict((k, actual[k]) for k in expected.keys()) + reduced, act_path = _extract_path(reduced) + expected, exp_path = _extract_path(expected) + if exp_path is not None: + _assert_run_info_env_path(act_path, exp_path) + assert reduced == expected, "{0}".format(reduced) + + def _assert_run(expected, ctx, results): + _assert_run_info(ctx.run_info, expected['run_info']) + assert results == expected.get('results', orig_results) + + exc = expected.get("exc") + if exc: + with pytest.raises(exc): + with runner.context(**runner_input['runner_ctx_args']) as ctx: + results = ctx.run(**cmd_execution['runner_ctx_run_args']) + _assert_run(expected, ctx, results) + + else: + with runner.context(**runner_input['runner_ctx_args']) as ctx: + results = ctx.run(**cmd_execution['runner_ctx_run_args']) + _assert_run(expected, ctx, results) diff --git a/ansible_collections/community/general/tests/unit/plugins/modules/helper.py b/ansible_collections/community/general/tests/unit/plugins/modules/helper.py index a7322bf4d..e012980af 100644 --- a/ansible_collections/community/general/tests/unit/plugins/modules/helper.py +++ b/ansible_collections/community/general/tests/unit/plugins/modules/helper.py @@ -9,7 +9,6 @@ __metaclass__ = type import sys import json from collections import namedtuple -from itertools import chain, repeat import pytest import yaml @@ -52,9 +51,9 @@ class _BaseContext(object): test_flags = self.test_flags() if test_flags.get("skip"): - pytest.skip() + pytest.skip(test_flags.get("skip")) if test_flags.get("xfail"): - pytest.xfail() + pytest.xfail(test_flags.get("xfail")) func() @@ -76,12 +75,21 @@ class _RunCmdContext(_BaseContext): self.mock_run_cmd = self._make_mock_run_cmd() def _make_mock_run_cmd(self): - call_results = [(x.rc, x.out, x.err) for x in self.run_cmd_calls] - error_call_results = (123, - "OUT: testcase has not enough run_command calls", - "ERR: testcase has not enough run_command calls") + def _results(): + for result in [(x.rc, x.out, x.err) for x in self.run_cmd_calls]: + yield result + raise Exception("testcase has not enough run_command calls") + + results = _results() + + def side_effect(self_, **kwargs): + result = next(results) + if kwargs.get("check_rc", False) and result[0] != 0: + raise Exception("rc = {0}".format(result[0])) + return result + mock_run_command = self.mocker.patch('ansible.module_utils.basic.AnsibleModule.run_command', - side_effect=chain(call_results, repeat(error_call_results))) + side_effect=side_effect) return mock_run_command def check_results(self, results): diff --git a/ansible_collections/community/general/tests/unit/plugins/modules/test_cpanm.yaml b/ansible_collections/community/general/tests/unit/plugins/modules/test_cpanm.yaml index 3ed718d48..4eed95720 100644 --- a/ansible_collections/community/general/tests/unit/plugins/modules/test_cpanm.yaml +++ b/ansible_collections/community/general/tests/unit/plugins/modules/test_cpanm.yaml @@ -7,6 +7,7 @@ - id: install_dancer_compatibility input: name: Dancer + mode: compatibility output: changed: true run_command_calls: @@ -23,6 +24,7 @@ - id: install_dancer_already_installed_compatibility input: name: Dancer + mode: compatibility output: changed: false run_command_calls: @@ -34,7 +36,6 @@ - id: install_dancer input: name: Dancer - mode: new output: changed: true run_command_calls: @@ -46,6 +47,7 @@ - id: install_distribution_file_compatibility input: name: MIYAGAWA/Plack-0.99_05.tar.gz + mode: compatibility output: changed: true run_command_calls: @@ -57,7 +59,6 @@ - id: install_distribution_file input: name: MIYAGAWA/Plack-0.99_05.tar.gz - mode: new output: changed: true run_command_calls: diff --git a/ansible_collections/community/general/tests/unit/plugins/modules/test_django_command.py b/ansible_collections/community/general/tests/unit/plugins/modules/test_django_command.py new file mode 100644 index 000000000..ffa9feb39 --- /dev/null +++ b/ansible_collections/community/general/tests/unit/plugins/modules/test_django_command.py @@ -0,0 +1,13 @@ +# Copyright (c) Alexei Znamensky (russoz@gmail.com) +# 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 + + +from ansible_collections.community.general.plugins.modules import django_command +from .helper import Helper + + +Helper.from_module(django_command, __name__) diff --git a/ansible_collections/community/general/tests/unit/plugins/modules/test_django_command.yaml b/ansible_collections/community/general/tests/unit/plugins/modules/test_django_command.yaml new file mode 100644 index 000000000..046dd87f0 --- /dev/null +++ b/ansible_collections/community/general/tests/unit/plugins/modules/test_django_command.yaml @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Alexei Znamensky (russoz@gmail.com) +# 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 + +--- +- id: command_success + input: + command: check + extra_args: + - babaloo + - yaba + - daba + - doo + settings: whatever.settings + run_command_calls: + - command: [/testbin/python, -m, django, check, --no-color, --settings=whatever.settings, babaloo, yaba, daba, doo] + environ: &env-def {environ_update: {LANGUAGE: C, LC_ALL: C}, check_rc: true} + rc: 0 + out: "whatever\n" + err: "" +- id: command_fail + input: + command: check + extra_args: + - babaloo + - yaba + - daba + - doo + settings: whatever.settings + output: + failed: true + run_command_calls: + - command: [/testbin/python, -m, django, check, --no-color, --settings=whatever.settings, babaloo, yaba, daba, doo] + environ: *env-def + rc: 1 + out: "whatever\n" + err: "" diff --git a/ansible_collections/community/general/tests/unit/plugins/modules/test_homebrew.py b/ansible_collections/community/general/tests/unit/plugins/modules/test_homebrew.py index f849b433d..d04ca4de5 100644 --- a/ansible_collections/community/general/tests/unit/plugins/modules/test_homebrew.py +++ b/ansible_collections/community/general/tests/unit/plugins/modules/test_homebrew.py @@ -2,23 +2,28 @@ # 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) +from __future__ import absolute_import, division, print_function __metaclass__ = type from ansible_collections.community.general.tests.unit.compat import unittest -from ansible_collections.community.general.plugins.modules.homebrew import Homebrew +from ansible_collections.community.general.plugins.module_utils.homebrew import HomebrewValidate class TestHomebrewModule(unittest.TestCase): def setUp(self): - self.brew_app_names = [ - 'git-ssh', - 'awscli@1', - 'bash' + self.brew_app_names = ["git-ssh", "awscli@1", "bash"] + + self.invalid_names = [ + "git ssh", + "git*", ] def test_valid_package_names(self): for name in self.brew_app_names: - self.assertTrue(Homebrew.valid_package(name)) + self.assertTrue(HomebrewValidate.valid_package(name)) + + def test_invalid_package_names(self): + for name in self.invalid_names: + self.assertFalse(HomebrewValidate.valid_package(name)) diff --git a/ansible_collections/community/general/tests/unit/plugins/modules/test_puppet.yaml b/ansible_collections/community/general/tests/unit/plugins/modules/test_puppet.yaml index 308be9797..7909403cf 100644 --- a/ansible_collections/community/general/tests/unit/plugins/modules/test_puppet.yaml +++ b/ansible_collections/community/general/tests/unit/plugins/modules/test_puppet.yaml @@ -190,3 +190,35 @@ rc: 0 out: "" err: "" +- id: puppet_agent_waitforlock + input: + waitforlock: 30 + output: + changed: false + run_command_calls: + - command: [/testbin/puppet, config, print, agent_disabled_lockfile] + environ: *env-def + rc: 0 + out: "blah, anything" + err: "" + - command: + - /testbin/timeout + - -s + - "9" + - 30m + - /testbin/puppet + - agent + - --onetime + - --no-daemonize + - --no-usecacheonfailure + - --no-splay + - --detailed-exitcodes + - --verbose + - --color + - "0" + - --waitforlock + - "30" + environ: *env-def + rc: 0 + out: "" + err: "" diff --git a/ansible_collections/community/general/tests/unit/plugins/plugin_utils/test_unsafe.py b/ansible_collections/community/general/tests/unit/plugins/plugin_utils/test_unsafe.py new file mode 100644 index 000000000..3f35ee933 --- /dev/null +++ b/ansible_collections/community/general/tests/unit/plugins/plugin_utils/test_unsafe.py @@ -0,0 +1,133 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2024, Felix Fontein <felix@fontein.de> +# 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 coding more python3-ish +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + + +import pytest + +from ansible.utils.unsafe_proxy import AnsibleUnsafe + +from ansible_collections.community.general.plugins.plugin_utils.unsafe import ( + make_unsafe, +) + + +TEST_MAKE_UNSAFE = [ + ( + u'text', + [], + [ + (), + ], + ), + ( + u'{{text}}', + [ + (), + ], + [], + ), + ( + b'text', + [], + [ + (), + ], + ), + ( + b'{{text}}', + [ + (), + ], + [], + ), + ( + { + 'skey': 'value', + 'ukey': '{{value}}', + 1: [ + 'value', + '{{value}}', + { + 1.0: '{{value}}', + 2.0: 'value', + }, + ], + }, + [ + ('ukey', ), + (1, 1), + (1, 2, 1.0), + ], + [ + ('skey', ), + (1, 0), + (1, 2, 2.0), + ], + ), + ( + ['value', '{{value}}'], + [ + (1, ), + ], + [ + (0, ), + ], + ), +] + + +@pytest.mark.parametrize("value, check_unsafe_paths, check_safe_paths", TEST_MAKE_UNSAFE) +def test_make_unsafe(value, check_unsafe_paths, check_safe_paths): + unsafe_value = make_unsafe(value) + assert unsafe_value == value + for check_path in check_unsafe_paths: + obj = unsafe_value + for elt in check_path: + obj = obj[elt] + assert isinstance(obj, AnsibleUnsafe) + for check_path in check_safe_paths: + obj = unsafe_value + for elt in check_path: + obj = obj[elt] + assert not isinstance(obj, AnsibleUnsafe) + + +def test_make_unsafe_dict_key(): + value = { + b'test': 1, + u'test': 2, + } + unsafe_value = make_unsafe(value) + assert unsafe_value == value + for obj in unsafe_value: + assert not isinstance(obj, AnsibleUnsafe) + + value = { + b'{{test}}': 1, + u'{{test}}': 2, + } + unsafe_value = make_unsafe(value) + assert unsafe_value == value + for obj in unsafe_value: + assert isinstance(obj, AnsibleUnsafe) + + +def test_make_unsafe_set(): + value = set([b'test', u'test']) + unsafe_value = make_unsafe(value) + assert unsafe_value == value + for obj in unsafe_value: + assert not isinstance(obj, AnsibleUnsafe) + + value = set([b'{{test}}', u'{{test}}']) + unsafe_value = make_unsafe(value) + assert unsafe_value == value + for obj in unsafe_value: + assert isinstance(obj, AnsibleUnsafe) |