Compare commits

...

69 Commits
9.2.0 ... 9.4.0

Author SHA1 Message Date
Felix Fontein
057f7196c7 Release 9.4.0. 2024-09-09 19:14:09 +02:00
patchback[bot]
8d8fc3d3ba [PR #8831/2ae41fa8 backport][stable-9] keycloak_user_federation: get the before mappers from before_comp to fix UnboundLocalError (#8850)
keycloak_user_federation: get the before mappers from `before_comp` to fix `UnboundLocalError` (#8831)

* fix: get the before mappers from `before_comp`

* add changelog fragment

* Adjust changelog fragment.

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit 2ae41fa83f)

Co-authored-by: fgruenbauer <gruenbauer@b1-systems.de>
2024-09-09 12:17:13 +00:00
patchback[bot]
5f7a3ac896 [PR #8651/529af498 backport][stable-9] keycloak_userprofile: new module (#8848)
keycloak_userprofile: new module (#8651)

keycloak_userprofile: new keycloak module to manage user profiles (#8651)

(cherry picked from commit 529af4984c)

Co-authored-by: Eike Waldt <waldt@b1-systems.de>
2024-09-09 14:06:42 +02:00
patchback[bot]
23ac1b62c3 [PR #8843/d73f977b backport][stable-9] Remove link to Google Groups mailing list (#8846)
Remove link to Google Groups mailing list (#8843)

Remove link to Google Groups mailing list.

Ref: https://groups.google.com/g/ansible-project/c/B0oKR0aQqXs
(cherry picked from commit d73f977b7a)

Co-authored-by: Felix Fontein <felix@fontein.de>
2024-09-08 16:52:09 +02:00
patchback[bot]
186d410f63 [PR #8833/26df6c76 backport][stable-9] use dict comprehension in plugins, part 3 (#8835)
use dict comprehension in plugins, part 3 (#8833)

* use dict comprehension in plugins, part 3

* add changelog frag

(cherry picked from commit 26df6c7657)

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
2024-09-08 14:46:13 +02:00
patchback[bot]
1978100d25 [PR #8827/afd754e3 backport][stable-9] (doc) random_string lookup: fix examples (#8842)
(doc) random_string lookup: fix examples (#8827)

(cherry picked from commit afd754e384)

Co-authored-by: Samuel-BF <36996277+Samuel-BF@users.noreply.github.com>
2024-09-08 14:45:59 +02:00
patchback[bot]
6fec5a7005 [PR #8823/ea389e70 backport][stable-9] bugfix(keycloak): fix parameters for realm key creation (#8840)
bugfix(keycloak): fix parameters for realm key creation (#8823)

* bugfix(keycloak): fix parameters for realm key creation

* supply changelog fragment

* fix formatting

* fix formatting

* Update changelogs/fragments/8823-keycloak-realm-key.yml

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

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit ea389e7045)

Co-authored-by: Björn Bösel <bjoernboesel@gmail.com>
2024-09-08 14:45:47 +02:00
patchback[bot]
aca2afc6f8 [PR #8761/982b8d89 backport][stable-9] keycloak_user_federation: sort desired and after mappers by name (#8837)
keycloak_user_federation: sort desired and after mappers by name (#8761)

* sort desired mappers by name

* sort mappers fetched after update by name

* only sort mapper list if there are desired mappers specified

* add fallback `''` in case `name` is not a key or `None` when sorting mappers

* add changelog fragment

(cherry picked from commit 982b8d89b7)

Co-authored-by: fgruenbauer <gruenbauer@b1-systems.de>
2024-09-08 14:45:31 +02:00
patchback[bot]
adda8d3113 [PR #8769/d9b0c42f backport][stable-9] Add one_vnet module (#8838)
Add one_vnet module (#8769)

* Add one_vnet module

* Add one_vnet integration tests

* Update BOTMETA.yml

* Update aliases

---------

Co-authored-by: Александр Бакановский <abakanovskii@astralinux.ru>
(cherry picked from commit d9b0c42f5f)

Co-authored-by: alexander <79072457+abakanovskii@users.noreply.github.com>
2024-09-08 14:45:18 +02:00
Felix Fontein
21ed66a097 Prepare 9.4.0. 2024-09-07 09:51:04 +02:00
patchback[bot]
73a1ac2f1c [PR #8809/43f8adf1 backport][stable-9] pipx: add new states (#8834)
pipx: add new states (#8809)

* ensure minimum version of pip

* ensure pipx 1.7.0 is installed

* pipx: add new states/params

* add tests

* add license to json file

* Update plugins/modules/pipx.py

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

* fix uninject tests

* add changelog frag

* fix doc per review

* refactor license out of pipx spec file

* Update plugins/modules/pipx.py

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

* Update tests/integration/targets/pipx/files/spec.json.license

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

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit 43f8adf1a5)

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
2024-09-07 09:37:47 +02:00
patchback[bot]
7c3b441246 [PR #8822/7e978c77 backport][stable-9] use dict comprehension in plugins, part 2 (#8832)
use dict comprehension in plugins, part 2 (#8822)

* use dict comprehension in plugins

* add changelog frag

(cherry picked from commit 7e978c77b4)

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
2024-09-05 22:01:56 +02:00
patchback[bot]
19613ce111 [PR #8794/249126f4 backport][stable-9] proxmox inventory: fixing possible concatenation error (#8818)
proxmox inventory: fixing possible concatenation error (#8794)

* Fixing possible concatination error

* Create 8794-Fixing-possible-concatination-error.yaml

* Update 8794-Fixing-possible-concatination-error.yaml

Updating changelog

(cherry picked from commit 249126f429)

Co-authored-by: Simon Siebert <Mail@simonsiebert.de>
2024-09-01 20:55:19 +02:00
patchback[bot]
594ca4f983 [PR #8815/593d302f backport][stable-9] Fix and enable test for datadog_downtime (#8821)
Fix and enable test for datadog_downtime (#8815)

The test has been disabled because it started to fail after an update of
the Datadog API client. The issue itself (id cannot be set in
constructor) and other issues (module name, additional attribute in API
responses) are now fixed. The test is now working fine again.

Fixes #3219.

(cherry picked from commit 593d302f0b)

Co-authored-by: Stefan Birkner <github@stefan-birkner.de>
2024-09-01 20:55:10 +02:00
patchback[bot]
af08ea33b1 [PR #8814/ecc048bc backport][stable-9] Use dict comprehension in plugins (#8819)
Use dict comprehension in plugins (#8814)

* use dict comprehension in plugins

* Apply suggestions from code review

* add changelog frag

* fix references in changelog frag

(cherry picked from commit ecc048bc12)

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
2024-09-01 20:55:02 +02:00
patchback[bot]
7f729d99a2 [PR #8779/96d5e6e5 backport][stable-9] copr: add includepkgs functionality (#8808)
copr: add includepkgs functionality (#8779)

* Limit package for Copr using includepkgs

* Limit package for Copr using includepkgs

* Limit package for Copr using includepkgs

* Limit package for Copr using includepkgs

* Limit package for Copr using includepkgs

* Added changes in copr module

* Excludepkgs parameter add

* Update module and params to handle a list + Docs updated

* Update module and params to handle a list + Docs updated

(cherry picked from commit 96d5e6e50e)

Co-authored-by: Shubham Singh Sugara <37795429+shubhamsugara22@users.noreply.github.com>
2024-08-27 09:02:00 +02:00
patchback[bot]
5b62e0edd6 [PR #8791/45987584 backport][stable-9] MH cause_changes: deprecate params (#8806)
MH cause_changes: deprecate params (#8791)

* MH cause_changes: deprecate params

* add changelog frag

* Update changelogs/fragments/8791-mh-cause-changes-param-depr.yml

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

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit 4598758419)

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
2024-08-26 20:10:04 +02:00
patchback[bot]
b935dcedd8 [PR #8793/9c9c4cbc backport][stable-9] pipx/pipx_info: add parameter global (#8807)
pipx/pipx_info: add parameter `global` (#8793)

* pipx/pipx_info: add new parameters

* add test for --global, refactor int test main file

* ensure initial state of test

* ensure PATH includes /usr/local/bin

* ensure PATH includes /usr/local/bin for entire block

* ensure minimum version of pip

* ensure pipx 1.6.0 is installed

* push recommendation for pipx 1.7.0 instead of 1.6.0

* add changelog frag

* add deprecatons to changelog frag

* add deprecatons to changelog frag, better

* Update changelogs/fragments/8793-pipx-global.yml

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

* Update changelogs/fragments/8793-pipx-global.yml

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

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit 9c9c4cbc3e)

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
2024-08-26 11:35:39 +02:00
patchback[bot]
c58181bdc9 [PR #8760/5192ffe5 backport][stable-9] gitlab_project: add param "issues_access_level" (#8805)
gitlab_project: add param "issues_access_level" (#8760)

gitlab_project: add option `issues_access_level` to enable/disable project

(cherry picked from commit 5192ffe5b3)

Co-authored-by: Julien Lecomte <julien-lecomte@users.noreply.github.com>
2024-08-26 11:35:32 +02:00
patchback[bot]
f71af21287 [PR #8764/7dc4429c backport][stable-9] keycloak_user_federation: add module arg to make mapper removal optout (#8804)
keycloak_user_federation: add module arg to make mapper removal optout (#8764)

* add module arg to make mapper removal optout

* change parameter name to snake case: remove_unspecified_mappers

* add period to parameter description

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

* use dict indexing to get parameter instead of `.get()`

* add changelog fragment

* Update changelogs/fragments/8764-keycloak_user_federation-make-mapper-removal-optout.yml

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

* add `version_added` to argument description

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

* Update plugins/modules/keycloak_user_federation.py

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

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit 7dc4429c9c)

Co-authored-by: fgruenbauer <gruenbauer@b1-systems.de>
2024-08-26 11:35:25 +02:00
patchback[bot]
1a48ebd699 [PR #8792/3607e3d0 backport][stable-9] pipx: add doc example (#8799)
pipx: add doc example (#8792)

(cherry picked from commit 3607e3d012)

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
2024-08-26 11:35:18 +02:00
patchback[bot]
5e1be68b01 [PR #8790/573a7b97 backport][stable-9] Fix gitlab_project container_expiration_policy for project create (#8801)
Fix gitlab_project container_expiration_policy for project create (#8790)

* Fix gitlab_project container_expiration_policy for project create

* Check for container_expiration_policy presence before renaming it

* Add missing links to changelog fragment

* Fix changelog grammar

(cherry picked from commit 573a7b97c6)

Co-authored-by: Veikko Virrankoski <71337077+vvirrank@users.noreply.github.com>
2024-08-26 11:35:05 +02:00
patchback[bot]
812431e7fe [PR #8796/e9071e98 backport][stable-9] Fix gitlab access token crash in check mode for new tokens (#8802)
Fix gitlab access token crash in check mode for new tokens (#8796)

Fix crash in check mode when attempting to create a new gitlab access token

(cherry picked from commit e9071e9871)

Co-authored-by: Veikko Virrankoski <71337077+vvirrank@users.noreply.github.com>
2024-08-26 11:34:53 +02:00
patchback[bot]
04f36f0bac [PR #8771/e3a3c6d5 backport][stable-9] ModuleHelper guide (#8786)
ModuleHelper guide (#8771)

* initial commit

* fix initial version

* add quickstart and high-level outline

* MH guide progress

* MH guide progress (up to params,vars,output)

* adjustments

* MH guide progress (up to handling changes)

* MH guide progress (up to Exceptions)

* typo

* change section from note to important

* MH guide progress (added StateModuleHelper)

* minor improvement

* MH guide progress (added decorators)

* typo

* minor adjustments

* remove line

* complete MH guide

* adjustments

* adjustments

* change paragraph into seealso

* rearrange sections, plus wordsmithing

* adjustments

* wordsmithing

* fix references

(cherry picked from commit e3a3c6d58f)

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
2024-08-21 16:10:32 +00:00
patchback[bot]
2f3d3aaf76 [PR #8762/b79ac4f0 backport][stable-9] keycloak_user_federation: fix key error when removing mappers in update (#8781)
keycloak_user_federation: fix key error when removing mappers in update (#8762)

* remove new mappers without an id from list comprehension

* add changelog fragment

* Update changelogs/fragments/8762-keycloac_user_federation-fix-key-error-when-updating.yml

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

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit b79ac4f0ac)

Co-authored-by: fgruenbauer <gruenbauer@b1-systems.de>
2024-08-20 09:11:52 +02:00
patchback[bot]
e7024c3f97 [PR #8776/e5bc38d8 backport][stable-9] MH: use mute_vardict_deprecation (#8782)
MH: use mute_vardict_deprecation (#8776)

* use mute_vardict_deprecation

* add changelog frag

(cherry picked from commit e5bc38d856)

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
2024-08-20 09:11:36 +02:00
patchback[bot]
0c2642aa2e [PR #8766/c84fb557 backport][stable-9] MH deco: minor refactor (#8775)
MH deco: minor refactor (#8766)

* MH deco: minor refactor

* adjustments and improvement in test

* sanity fix

* use func.__self__

* simplify use of self

* add changelog frag

(cherry picked from commit c84fb5577b)

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
2024-08-17 18:12:16 +02:00
patchback[bot]
2f62b6bbc6 [PR #8770/14e86bde backport][stable-9] one_template: update name in copyright (#8774)
one_template: update name in copyright (#8770)

finally got it changed this year :)

(cherry picked from commit 14e86bde07)

Co-authored-by: Jyrki Gadinger <nilsding@nilsding.org>
2024-08-17 18:12:08 +02:00
Felix Fontein
5c10ed5f5c Improve communication link description.
(cherry picked from commit 9571ec7c72)
2024-08-15 21:42:28 +02:00
patchback[bot]
a4bac47520 [PR #8759/e1b5ddb0 backport][stable-9] gitlab_project: sort parameters in order to avoid futur merge conflicts (#8763)
gitlab_project: sort parameters in order to avoid futur merge conflicts (#8759)

(cherry picked from commit e1b5ddb050)

Co-authored-by: Julien Lecomte <julien-lecomte@users.noreply.github.com>
2024-08-14 19:57:38 +02:00
Felix Fontein
b396ceb6c3 Next expected release is 9.4.0. 2024-08-12 18:30:01 +02:00
Felix Fontein
e4911a0278 Release 9.3.0. 2024-08-12 17:27:14 +02:00
patchback[bot]
1b3e9d8e99 [PR #8756/34519a5e backport][stable-9] Improve communication info (#8758)
Improve communication info (#8756)

Improve communication info.

(cherry picked from commit 34519a5ecb)

Co-authored-by: Felix Fontein <felix@fontein.de>
2024-08-12 17:23:17 +02:00
patchback[bot]
6243112067 [PR #8732/4cb4c608 backport][stable-9] README: Add Communication section with Forum information (#8755)
README: Add Communication section with Forum information (#8732)

* README: Add Communication section with Forum information

* Changelog fragment isn't needed for README change.

* Distinguish between Get Help and the community-general tag.

* Update links.

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit 4cb4c608d0)

Co-authored-by: Andrew Klychkov <aklychko@redhat.com>
2024-08-12 12:44:25 +02:00
patchback[bot]
7d23c90c6e [PR #8713/0f59bb7a backport][stable-9] Get interfaces for Proxmox LXC containers (#8750)
Get interfaces for Proxmox LXC containers (#8713)

* Get interfaces for Proxmox LXC containers

* Add changelog

* Don't use bare except

* Update changelog from suggestion

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

* Only lookup interfaces for running containers

* Ignore not implemented status

* Check that key exists in properties dict

* define ignore errors in mock

* Use not in

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit 0f59bb7a99)

Co-authored-by: Scott Langendyk <scott@langendyk.com>
2024-08-12 08:07:31 +02:00
patchback[bot]
825bd81e44 [PR #8688/e7480ad2 backport][stable-9] gitlab_project: Add some missing params (#8742)
gitlab_project: Add some missing params (#8688)

(cherry picked from commit e7480ad29e)

Co-authored-by: Julien Lecomte <julien-lecomte@users.noreply.github.com>
2024-08-12 08:07:18 +02:00
patchback[bot]
e10f95836e [PR #8735/57e28e5a backport][stable-9] keycloak_identity_provider: get cleartext clientsecret (#8744)
keycloak_identity_provider: get cleartext clientsecret (#8735)

* get cleartext `clientSecret` from full realm info

* add mock get_realm call to existing tests; add new no_change_when_present test

* add changelog fragment

* remove blank lines

* Update changelog.

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit 57e28e5a73)

Co-authored-by: fgruenbauer <gruenbauer@b1-systems.de>
2024-08-12 08:07:10 +02:00
patchback[bot]
176f6a62ae [PR #8689/8989b6c4 backport][stable-9] Namespace the passwordstore lockfile (#8746)
Namespace the passwordstore lockfile (#8689)

* Namespace the lockfile

When passwordstore needs to grab a lock, it creates a statically file (within /tmp, typically). This is unfortunate, when there might be more than one user using the passwordstore functionality on that machine. Prepend the user to the filename, to bypass further issues.

* Update plugins/lookup/passwordstore.py

specifically reference the argument number in the format string.

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

* Add changelog fragment for PR#8689

* Update 8689-passwordstore-lock-naming.yml

I was sure that was a copy/paste.

* Update changelogs/fragments/8689-passwordstore-lock-naming.yml

specify the type of plugin

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

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit 8989b6c4d4)

Co-authored-by: Adam Tygart <adam.tygart@gmail.com>
2024-08-12 08:06:57 +02:00
patchback[bot]
b1b6134f69 [PR #8682/158947f5 backport][stable-9] Add support for multiple locales in locale_gen (#8747)
Add support for multiple locales in locale_gen (#8682)

* Add support for multiple locales in locale_gen

* Add changelog fragment

* Remove extraneous newlines

* Remove typehints

* Add 'before version' to names documentation

* Remove extraneous comment

* Replace fstring with .format

* Refer to issue in changelog fragment

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

* Clarify version

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

* Add newline between examples

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

* Use semantic markup for locale value

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

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit 158947f5e5)

Co-authored-by: Matthias Kunnen <matthias.kunnen@gmail.com>
2024-08-12 08:06:47 +02:00
patchback[bot]
5103c3cea0 [PR #8708/76d0222a backport][stable-9] homebrew_cask: fix upgrade_all changed when nothing upgraded (#8749)
homebrew_cask: fix upgrade_all changed when nothing upgraded (#8708)

* homebrew_cask: fix upgrade_all changed when nothing upgraded

* Add changelog fragment

* Update changelogs/fragments/8708-homebrew_cask-fix-upgrade-all.yml

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

* Add .strip() to upgrade output check

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

---------

Co-authored-by: John Byrne <john@jobytech.net>
Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit 76d0222a83)

Co-authored-by: John Byrne <6145795+johnbyrneio@users.noreply.github.com>
2024-08-12 08:06:35 +02:00
patchback[bot]
8444902289 [PR #8741/73b54139 backport][stable-9] fix(opentelemetry): adjust default value for store_spans_in_file causing traces to be produced to a file named None (#8751)
fix(opentelemetry): adjust default value for `store_spans_in_file` causing traces to be produced to a file named `None` (#8741)

* fix(opentelemetry): adjust default value for `store_spans_in_file` causing traces to be produced to a file named `None`

The commit 5f481939d introduced `store_spans_in_file` with the default
value `None` as a string. This causes the value of `store_spans_in_file`
to be a not empty string, value=None as a string and not a null value.
The rest of the code check if the store_spans_in_file is not null which
squeezes the rest of the code. The following commit set the default
value as an empty string.

Signed-off-by: Wilfried Roset <wilfriedroset@users.noreply.github.com>

* fix(opentelemetry): No default value is better, reword changelog

Signed-off-by: Wilfried Roset <wilfriedroset@users.noreply.github.com>

---------

Signed-off-by: Wilfried Roset <wilfriedroset@users.noreply.github.com>
(cherry picked from commit 73b54139d6)

Co-authored-by: Wilfried ROSET <wilfriedroset@users.noreply.github.com>
2024-08-12 08:06:22 +02:00
patchback[bot]
2e1040bfa5 [PR #8695/2942eda8 backport][stable-9] keycloak_user_federation: add mapper removal (#8753)
keycloak_user_federation: add mapper removal (#8695)

* add unwanted mapper removal

* check for mapper updates in already fetched data to remove unnecessary API calls

* added mock answers and updated request count to match the added delete and fetch after_comp calls

* fix sanity issues

* add changelog fragment

* removed automatic field numbering from format

* replace filter expression with list comprehension

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

* add module name, link to issue and link to PR to changelog

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

* Use list comprehension.

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit 2942eda8e0)

Co-authored-by: fgruenbauer <gruenbauer@b1-systems.de>
2024-08-12 08:06:13 +02:00
patchback[bot]
5c5ae113c9 [PR #8674/b9244130 backport][stable-9] Gitlab_project: add options for repository_access_level and container_expiration_policy (#8740)
Gitlab_project: add options for repository_access_level and container_expiration_policy (#8674)

* gitlab_project: add option repository_access_level to disable repository

* gitlab_project: add option container_expiration_policy to schedule registry cleanup

* add chnagelog fragment

* Fix changelog fragment PR id

* Fix formatting

* Add required suboptions for container_expiration_policy

* Handle setting only a subset of policy attributes

* Fix changed indicator when policy attribute has null value

* Add descriptions to field clearing options in gitlab container_expiration_policy

(cherry picked from commit b9244130ef)

Co-authored-by: Veikko Virrankoski <71337077+vvirrank@users.noreply.github.com>
2024-08-11 20:21:49 +02:00
patchback[bot]
1d7843465d [PR #8644/9f340861 backport][stable-9] django_manage: rely on package idempotency to install virtualenv (#8737)
django_manage: rely on package idempotency to install virtualenv (#8644)

* rely on package idempotency to install virtualenv

* improve os package name logic in integration tests

* add os families debian, redhat

* add os families archlinux

* fix pkg name in archlinux

* improvement from PR

* typo

* Update tests/integration/targets/setup_os_pkg_name/tasks/debian.yml

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

* Update tests/integration/targets/setup_os_pkg_name/tasks/redhat.yml

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

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit 9f340861ad)

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
2024-08-10 13:16:07 +00:00
patchback[bot]
b79f286a66 [PR #8718/b16263eb backport][stable-9] Clarify contribution guide on integration tests (#8734)
Clarify contribution guide on integration tests (#8718)

* Clarify contribution guide on integration tests

* Improve test guide in CONTRIBUTING.md

* Uppercase Docker

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

* Improve test_name documentation

* Use working example in ansible-test integration docs

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

* Fix test_name in ansible-test integration being documented as required

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit b16263ebd7)

Co-authored-by: Matthias Kunnen <matthias.kunnen@gmail.com>
2024-08-08 11:32:48 +02:00
patchback[bot]
45e1d0a01a [PR #8725/5322dd94 backport][stable-9] Remove invalid cloud/gandi entry (#8728)
Remove invalid cloud/gandi entry (#8725)

Remove invalid cloud/gandi entry.

(cherry picked from commit 5322dd942e)

Co-authored-by: Felix Fontein <felix@fontein.de>
2024-08-08 10:16:37 +02:00
patchback[bot]
c7213ec1b5 [PR #8720/9a16eaf9 backport][stable-9] Fix pylint and pep8 issues exposed by latest ansible-core's ansible-test sanity checks (#8722)
Fix pylint and pep8 issues exposed by latest ansible-core's ansible-test sanity checks (#8720)

* Remove bad whitespace.

* 'Fixing' various used-before-assignment issues that pylint flagged.

(cherry picked from commit 9a16eaf9ba)

Co-authored-by: Felix Fontein <felix@fontein.de>
2024-08-07 15:49:06 +02:00
patchback[bot]
7c9dd8d8ad [PR #8675/5b2711bb backport][stable-9] pipx - add suffix parameter (#8721)
pipx - add suffix parameter (#8675)

* initial commit

* add changelog frag

* Add idempotency when using suffix

(cherry picked from commit 5b2711bbd3)

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
2024-08-07 15:12:40 +02:00
patchback[bot]
9842b057b0 [PR #8710/c517f1c4 backport][stable-9] ensure util-linux-extra is installed in Ubuntu 24.04 (#8715)
ensure util-linux-extra is installed in Ubuntu 24.04 (#8710)

(cherry picked from commit c517f1c483)

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
2024-08-05 22:16:24 +02:00
patchback[bot]
63eca8e68c [PR #8711/132faeae backport][stable-9] gconftool2: minor refactor (#8717)
gconftool2: minor refactor (#8711)

* gconftool2: minor refactor

* add changelog frag

(cherry picked from commit 132faeae34)

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
2024-08-05 22:16:15 +02:00
patchback[bot]
569bd30148 [PR #8605/229ed6da backport][stable-9] Add a keycloak module to query keys metadata (#8696)
Add a keycloak module to query keys metadata (#8605)

* feat(keycloak): module to query keys metadata

* chore: add thomasbach-dev as maintainer in team_keycloak

* test: adding a unit test for keycloak_real_keys_metadata_info module

* fixup! feat(keycloak): module to query keys metadata

(cherry picked from commit 229ed6dad9)

Co-authored-by: Thomas Bach <63091663+thomasbach-dev@users.noreply.github.com>
2024-08-01 17:33:43 +02:00
patchback[bot]
70acdf1f6d [PR #8329/29630049 backport][stable-9] homebrew: Add support for services functions (#8697)
homebrew: Add support for services functions (#8329)

* Homebrew: Add support for services functions

Fixes #8286.
Add a homebrew.services module for starting and stopping services
that are attached to homebrew packages.

* Address python version compatibility

* Addressing reviewer comments

* Addressing sanity logs

* Address str format issues

* Fixing Python 2.7 syntax issues

* Test alias, BOTMETA, grammar

* Attempt to fix brew in tests

* Address comments by russoz

* Fixing more dumb typos

* Actually uninstall black

* Update version_added in plugins/modules/homebrew_services.py

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

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit 2963004991)

Co-authored-by: Kit Ham <kitizz.devside@gmail.com>
2024-08-01 17:33:36 +02:00
patchback[bot]
86caa19f78 [PR #8657/7bbf32dc backport][stable-9] Update proxmox.py (#8699)
Update proxmox.py (#8657)

* Update proxmox.py

Added an example to create a new container with more network options (with ipv6 static configuration)

* Update proxmox.py

Made the linter happy.

* cleaned up dictionaries

Changed dictionaries from this format:
netif: '{"net0":"name=eth0,g...
to this:
netif:
  net0: "name=eth0,g...

* Update proxmox.py

false intendation and trailing whitespaces

(cherry picked from commit 7bbf32dc0e)

Co-authored-by: inDane <inDane@users.noreply.github.com>
2024-08-01 17:33:27 +02:00
patchback[bot]
f9acef140f [PR #8648/b6c6253b backport][stable-9] fix(modules/gitlab_runners): pass paused to gitlab (#8701)
fix(modules/gitlab_runners): pass paused to gitlab (#8648)

(cherry picked from commit b6c6253bfc)

Co-authored-by: Andreas Perhab <a.perhab@wtioit.at>
2024-08-01 17:33:11 +02:00
patchback[bot]
31a147f0eb [PR #8692/fd811df4 backport][stable-9] Update timezone.py (#8703)
Update timezone.py (#8692)

in order to set a timezone, root priviliages are needed on most distros, therefore i suggest to change an example to make it plug and play ready.

(cherry picked from commit fd811df414)

Co-authored-by: Mateusz Kiersnowski <82416937+Ganji00@users.noreply.github.com>
2024-08-01 17:33:05 +02:00
patchback[bot]
9b0ebef408 [PR #8624/37c85605 backport][stable-9] Type options of cache plugins (#8686)
Type options of cache plugins (#8624)

* Type options of cache plugins.

* Do not change type of _timeout for now.

(cherry picked from commit 37c8560542)

Co-authored-by: Felix Fontein <felix@fontein.de>
2024-07-28 22:39:07 +02:00
Felix Fontein
4c734ea134 Prepare 9.3.0 release. 2024-07-27 13:57:27 +02:00
patchback[bot]
ccf71fb483 [PR #8606/1a8f1721 backport][stable-9] Introduce bootc functionality (#8685)
Introduce bootc functionality (#8606)

* introduce bootc functionality

Signed-off-by: Ryan Cook <rcook@redhat.com>

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

* fix of test

Signed-off-by: Ryan Cook <rcook@redhat.com>

* switch stdout var

Signed-off-by: Ryan Cook <rcook@redhat.com>

* Feedback on NOTE format

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

* addition of trailing comma

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

* addition of trailing comma

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

* incorporating feedback from russoz

Signed-off-by: Ryan Cook <rcook@redhat.com>

* error in stdout

Signed-off-by: Ryan Cook <rcook@redhat.com>

* proper rc checking and status

Signed-off-by: Ryan Cook <rcook@redhat.com>

* linting

Signed-off-by: Ryan Cook <rcook@redhat.com>

* Update version

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

---------

Signed-off-by: Ryan Cook <rcook@redhat.com>
Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit 1a8f172186)

Co-authored-by: Ryan Cook <rcook@redhat.com>
2024-07-27 09:57:35 +02:00
patchback[bot]
585d4e8784 [PR #8646/e1148e6b backport][stable-9] Fix new Proxmox Volume handling (#8667)
Fix new Proxmox Volume handling (#8646)

* proxmox(fix): volume string builder

Half of the string was incorrectly discarded

* proxmox(fix): remove string conversion of values

 - Also converted `None` values into strings
 - Clashed with non-`str` values in documentation

* proxmox: add changelog fragment

* proxmox(fix): remove old & unused imports

* proxmox(fix): correctly turn maps into lists

* Update changelogs/fragments/8646-fix-bug-in-proxmox-volumes.yml

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

* Update plugins/modules/proxmox.py

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

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit e1148e6bdc)

Co-authored-by: JL Euler <Lithimlin@users.noreply.github.com>
2024-07-23 22:03:51 +02:00
patchback[bot]
47f235dc68 [PR #8633/e3fb817a backport][stable-9] pkgng - add option use_globs (default=true) (#8668)
pkgng - add option use_globs (default=true) (#8633)

* pkgng - add option use_globs (default=true) #8632

* Fix lint.

* Update changelogs/fragments/8632-pkgng-add-option-use_globs.yml

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

* Update plugins/modules/pkgng.py

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

* Update plugins/modules/pkgng.py

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

* Update tests/integration/targets/pkgng/tasks/install_single_package.yml

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

* Update plugins/modules/pkgng.py

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

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit e3fb817a21)

Co-authored-by: Vladimir Botka <vbotka@gmail.com>
2024-07-23 22:03:42 +02:00
patchback[bot]
08200954e9 [PR #8665/58f9860b backport][stable-9] Fix pipx tests (#8670)
Fix pipx tests (#8665)

* fix pipx tests

* enable pipx int tests

* replace ansible-lint with pylint in pipx test

* install jupyter in freebsd

* replace jupyter with mkdocs in pipx test

* adjust installed dependency for mkdocs

* fix pipx_info tests as well

(cherry picked from commit 58f9860ba7)

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
2024-07-23 22:03:31 +02:00
patchback[bot]
9e66e2c653 [PR #8654/52126b8f backport][stable-9] Add TLS certs params to redis (#8672)
Add TLS certs params to redis (#8654)

* add tls params to redis

* add PR number

* add example

* move doc to redis fragment

* Update changelogs/fragments/8654-add-redis-tls-params.yml

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

* rm aliases and add version_added

---------

Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit 52126b8fae)

Co-authored-by: Matthieu Bourgain <matthieu@bourgain.me>
2024-07-23 22:03:13 +02:00
patchback[bot]
510ad54062 [PR #8664/c0fd10e7 backport][stable-9] Various docs improvements (#8666)
Various docs improvements (#8664)

Various docs improvements.

(cherry picked from commit c0fd10e793)

Co-authored-by: Felix Fontein <felix@fontein.de>
2024-07-23 17:41:11 +02:00
patchback[bot]
a89ca23ecc [PR #8628/cac55beb backport][stable-9] Type options of callback plugins (#8663)
Type options of callback plugins (#8628)

Type options of callback plugins.

(cherry picked from commit cac55beb4f)

Co-authored-by: Felix Fontein <felix@fontein.de>
2024-07-21 22:16:23 +02:00
patchback[bot]
2261bd62de [PR #8627/ce65eb87 backport][stable-9] Type options of connection plugins (#8662)
Type options of connection plugins (#8627)

Type options of connection plugins.

(cherry picked from commit ce65eb8736)

Co-authored-by: Felix Fontein <felix@fontein.de>
2024-07-21 22:16:12 +02:00
patchback[bot]
3726b50a92 [PR #8626/daed4dcc backport][stable-9] Type options of lookup plugins (#8660)
Type options of lookup plugins (#8626)

Type options of lookup plugins.

(cherry picked from commit daed4dcc94)

Co-authored-by: Felix Fontein <felix@fontein.de>
2024-07-21 22:16:02 +02:00
patchback[bot]
037948fde9 [PR #8625/f9a56b9a backport][stable-9] Type options of inventory plugins (#8661)
Type options of inventory plugins (#8625)

Type options of inventory plugins.

(cherry picked from commit f9a56b9a9b)

Co-authored-by: Felix Fontein <felix@fontein.de>
2024-07-21 22:15:49 +02:00
patchback[bot]
9597b7c110 [PR #8623/a24ee93f backport][stable-9] Type options of become plugins (#8659)
Type options of become plugins (#8623)

Type options of become plugins.

(cherry picked from commit a24ee93f23)

Co-authored-by: Felix Fontein <felix@fontein.de>
2024-07-21 22:15:40 +02:00
patchback[bot]
780a7c6a38 [PR #8641/3a24aa5b backport][stable-9] Bump next expected version after release (#8642)
Bump next expected version after release (#8641)

(cherry picked from commit 3a24aa5b6d)

Co-authored-by: Andrew Klychkov <aklychko@redhat.com>
2024-07-15 10:50:06 +02:00
209 changed files with 7633 additions and 970 deletions

15
.github/BOTMETA.yml vendored
View File

@@ -448,6 +448,8 @@ files:
maintainers: hkariti
$modules/bitbucket_:
maintainers: catcombo
$modules/bootc_manage.py:
maintainers: cooktheryan
$modules/bower.py:
maintainers: mwarkentin
$modules/btrfs_:
@@ -646,6 +648,11 @@ files:
labels: homebrew_ macos
maintainers: $team_macos
notify: chris-short
$modules/homebrew_services.py:
ignore: ryansb
keywords: brew cask services darwin homebrew macosx macports osx
labels: homebrew_ macos
maintainers: $team_macos kitizz
$modules/homectl.py:
maintainers: jameslivulpi
$modules/honeybadger_deployment.py:
@@ -802,6 +809,8 @@ files:
maintainers: elfelip
$modules/keycloak_user_federation.py:
maintainers: laurpaum
$modules/keycloak_userprofile.py:
maintainers: yeoldegrove
$modules/keycloak_component_info.py:
maintainers: desand01
$modules/keycloak_client_rolescope.py:
@@ -967,6 +976,8 @@ files:
maintainers: $team_opennebula
$modules/one_host.py:
maintainers: rvalle
$modules/one_vnet.py:
maintainers: abakanovskii
$modules/oneandone_:
maintainers: aajdinov edevenport
$modules/onepassword_info.py:
@@ -1478,6 +1489,8 @@ files:
maintainers: russoz
docs/docsite/rst/guide_deps.rst:
maintainers: russoz
docs/docsite/rst/guide_modulehelper.rst:
maintainers: russoz
docs/docsite/rst/guide_online.rst:
maintainers: remyleone
docs/docsite/rst/guide_packet.rst:
@@ -1526,7 +1539,7 @@ macros:
team_huawei: QijunPan TommyLike edisonxiang freesky-edward hwDCN niuzhenguo xuxiaowei0512 yanzhangi zengchen1024 zhongjun2
team_ipa: Akasurde Nosmoht justchris1
team_jboss: Wolfant jairojunior wbrefvem
team_keycloak: eikef ndclt mattock
team_keycloak: eikef ndclt mattock thomasbach-dev
team_linode: InTheCloudDan decentral1se displague rmcintosh Charliekenney23 LBGarber
team_macos: Akasurde kyleabenson martinm82 danieljaouen indrajitr
team_manageiq: abellotti cben gtanzillo yaacov zgalor dkorn evertmulder

View File

@@ -2,34 +2,45 @@
**Topics**
- <a href="#v9-2-0">v9\.2\.0</a>
- <a href="#v9-4-0">v9\.4\.0</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="#v9-3-0">v9\.3\.0</a>
- <a href="#release-summary-1">Release Summary</a>
- <a href="#minor-changes-1">Minor Changes</a>
- <a href="#bugfixes-1">Bugfixes</a>
- <a href="#new-modules-1">New Modules</a>
- <a href="#v9-2-0">v9\.2\.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="#filter">Filter</a>
- <a href="#test">Test</a>
- <a href="#v9-1-0">v9\.1\.0</a>
- <a href="#release-summary-1">Release Summary</a>
- <a href="#minor-changes-1">Minor Changes</a>
- <a href="#deprecated-features">Deprecated Features</a>
- <a href="#bugfixes-1">Bugfixes</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="#known-issues">Known Issues</a>
- <a href="#new-plugins-1">New Plugins</a>
- <a href="#filter-1">Filter</a>
- <a href="#new-modules">New Modules</a>
- <a href="#new-modules-2">New Modules</a>
- <a href="#v9-0-1">v9\.0\.1</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="#release-summary-4">Release Summary</a>
- <a href="#minor-changes-4">Minor Changes</a>
- <a href="#bugfixes-4">Bugfixes</a>
- <a href="#v9-0-0">v9\.0\.0</a>
- <a href="#release-summary-3">Release Summary</a>
- <a href="#minor-changes-3">Minor Changes</a>
- <a href="#release-summary-5">Release Summary</a>
- <a href="#minor-changes-5">Minor Changes</a>
- <a href="#breaking-changes--porting-guide">Breaking Changes / Porting Guide</a>
- <a href="#deprecated-features-1">Deprecated Features</a>
- <a href="#deprecated-features-2">Deprecated Features</a>
- <a href="#removed-features-previously-deprecated">Removed Features \(previously deprecated\)</a>
- <a href="#security-fixes">Security Fixes</a>
- <a href="#bugfixes-3">Bugfixes</a>
- <a href="#bugfixes-5">Bugfixes</a>
- <a href="#new-plugins-2">New Plugins</a>
- <a href="#become">Become</a>
- <a href="#callback">Callback</a>
@@ -37,20 +48,183 @@
- <a href="#filter-2">Filter</a>
- <a href="#lookup">Lookup</a>
- <a href="#test-1">Test</a>
- <a href="#new-modules-1">New Modules</a>
- <a href="#new-modules-3">New Modules</a>
This changelog describes changes after version 8\.0\.0\.
<a id="v9-2-0"></a>
## v9\.2\.0
<a id="v9-4-0"></a>
## v9\.4\.0
<a id="release-summary"></a>
### Release Summary
Regular bugfix and feature release\.
Bugfix and feature release\.
<a id="minor-changes"></a>
### Minor Changes
* MH module utils \- add parameter <code>when</code> to <code>cause\_changes</code> decorator \([https\://github\.com/ansible\-collections/community\.general/pull/8766](https\://github\.com/ansible\-collections/community\.general/pull/8766)\)\.
* MH module utils \- minor refactor in decorators \([https\://github\.com/ansible\-collections/community\.general/pull/8766](https\://github\.com/ansible\-collections/community\.general/pull/8766)\)\.
* alternatives \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\.
* apache2\_mod\_proxy \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\.
* apache2\_mod\_proxy \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\.
* consul\_acl \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\.
* copr \- Added <code>includepkgs</code> and <code>excludepkgs</code> parameters to limit the list of packages fetched or excluded from the repository\([https\://github\.com/ansible\-collections/community\.general/pull/8779](https\://github\.com/ansible\-collections/community\.general/pull/8779)\)\.
* credstash lookup plugin \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\.
* csv module utils \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\.
* deco MH module utils \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\.
* etcd3 \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\.
* gio\_mime \- mute the old <code>VarDict</code> deprecation \([https\://github\.com/ansible\-collections/community\.general/pull/8776](https\://github\.com/ansible\-collections/community\.general/pull/8776)\)\.
* gitlab\_group \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\.
* gitlab\_project \- add option <code>issues\_access\_level</code> to enable/disable project issues \([https\://github\.com/ansible\-collections/community\.general/pull/8760](https\://github\.com/ansible\-collections/community\.general/pull/8760)\)\.
* gitlab\_project \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\.
* gitlab\_project \- sorted parameters in order to avoid future merge conflicts \([https\://github\.com/ansible\-collections/community\.general/pull/8759](https\://github\.com/ansible\-collections/community\.general/pull/8759)\)\.
* hashids filter plugin \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\.
* hwc\_ecs\_instance \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\.
* hwc\_evs\_disk \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\.
* hwc\_vpc\_eip \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\.
* hwc\_vpc\_peering\_connect \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\.
* hwc\_vpc\_port \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\.
* hwc\_vpc\_subnet \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\.
* imc\_rest \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\.
* ipa\_otptoken \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\.
* jira \- mute the old <code>VarDict</code> deprecation \([https\://github\.com/ansible\-collections/community\.general/pull/8776](https\://github\.com/ansible\-collections/community\.general/pull/8776)\)\.
* jira \- replace deprecated params when using decorator <code>cause\_changes</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8791](https\://github\.com/ansible\-collections/community\.general/pull/8791)\)\.
* keep\_keys filter plugin \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\.
* keycloak module utils \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\.
* keycloak\_client \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\.
* keycloak\_clientscope \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\.
* keycloak\_identity\_provider \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\.
* keycloak\_user\_federation \- add module argument allowing users to optout of the removal of unspecified mappers\, for example to keep the keycloak default mappers \([https\://github\.com/ansible\-collections/community\.general/pull/8764](https\://github\.com/ansible\-collections/community\.general/pull/8764)\)\.
* keycloak\_user\_federation \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\.
* keycloak\_user\_federation \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\.
* keycloak\_user\_federation \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\.
* linode \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\.
* lxc\_container \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\.
* lxd\_container \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\.
* manageiq\_provider \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\.
* ocapi\_utils \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\.
* one\_service \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\.
* one\_vm \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\.
* onepassword lookup plugin \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\.
* pids \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\.
* pipx \- added new states <code>install\_all</code>\, <code>uninject</code>\, <code>upgrade\_shared</code>\, <code>pin</code>\, and <code>unpin</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8809](https\://github\.com/ansible\-collections/community\.general/pull/8809)\)\.
* pipx \- added parameter <code>global</code> to module \([https\://github\.com/ansible\-collections/community\.general/pull/8793](https\://github\.com/ansible\-collections/community\.general/pull/8793)\)\.
* pipx \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\.
* pipx\_info \- added parameter <code>global</code> to module \([https\://github\.com/ansible\-collections/community\.general/pull/8793](https\://github\.com/ansible\-collections/community\.general/pull/8793)\)\.
* pipx\_info \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\.
* pkg5\_publisher \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\.
* proxmox \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\.
* proxmox\_disk \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\.
* proxmox\_kvm \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\.
* proxmox\_kvm \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\.
* redfish\_utils \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\.
* redfish\_utils module utils \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\.
* redis cache plugin \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\.
* remove\_keys filter plugin \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\.
* replace\_keys filter plugin \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\.
* scaleway \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\.
* scaleway module utils \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\.
* scaleway\_compute \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\.
* scaleway\_ip \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\.
* scaleway\_lb \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\.
* scaleway\_security\_group \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\.
* scaleway\_security\_group \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\.
* scaleway\_user\_data \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\.
* sensu\_silence \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\.
* snmp\_facts \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\.
* sorcery \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8833](https\://github\.com/ansible\-collections/community\.general/pull/8833)\)\.
* ufw \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\.
* unsafe plugin utils \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\.
* vardict module utils \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\.
* vars MH module utils \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8814](https\://github\.com/ansible\-collections/community\.general/pull/8814)\)\.
* vmadm \- replace Python 2\.6 construct with dict comprehensions \([https\://github\.com/ansible\-collections/community\.general/pull/8822](https\://github\.com/ansible\-collections/community\.general/pull/8822)\)\.
<a id="deprecated-features"></a>
### Deprecated Features
* MH decorator cause\_changes module utils \- deprecate parameters <code>on\_success</code> and <code>on\_failure</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8791](https\://github\.com/ansible\-collections/community\.general/pull/8791)\)\.
* pipx \- support for versions of the command line tool <code>pipx</code> older than <code>1\.7\.0</code> is deprecated and will be removed in community\.general 11\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/8793](https\://github\.com/ansible\-collections/community\.general/pull/8793)\)\.
* pipx\_info \- support for versions of the command line tool <code>pipx</code> older than <code>1\.7\.0</code> is deprecated and will be removed in community\.general 11\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/8793](https\://github\.com/ansible\-collections/community\.general/pull/8793)\)\.
<a id="bugfixes"></a>
### Bugfixes
* gitlab\_group\_access\_token \- fix crash in check mode caused by attempted access to a newly created access token \([https\://github\.com/ansible\-collections/community\.general/pull/8796](https\://github\.com/ansible\-collections/community\.general/pull/8796)\)\.
* gitlab\_project \- fix <code>container\_expiration\_policy</code> not being applied when creating a new project \([https\://github\.com/ansible\-collections/community\.general/pull/8790](https\://github\.com/ansible\-collections/community\.general/pull/8790)\)\.
* gitlab\_project \- fix crash caused by old Gitlab projects not having a <code>container\_expiration\_policy</code> attribute \([https\://github\.com/ansible\-collections/community\.general/pull/8790](https\://github\.com/ansible\-collections/community\.general/pull/8790)\)\.
* gitlab\_project\_access\_token \- fix crash in check mode caused by attempted access to a newly created access token \([https\://github\.com/ansible\-collections/community\.general/pull/8796](https\://github\.com/ansible\-collections/community\.general/pull/8796)\)\.
* keycloak\_realm\_key \- fix invalid usage of <code>parent\_id</code> \([https\://github\.com/ansible\-collections/community\.general/issues/7850](https\://github\.com/ansible\-collections/community\.general/issues/7850)\, [https\://github\.com/ansible\-collections/community\.general/pull/8823](https\://github\.com/ansible\-collections/community\.general/pull/8823)\)\.
* keycloak\_user\_federation \- fix key error when removing mappers during an update and new mappers are specified in the module args \([https\://github\.com/ansible\-collections/community\.general/pull/8762](https\://github\.com/ansible\-collections/community\.general/pull/8762)\)\.
* keycloak\_user\_federation \- fix the <code>UnboundLocalError</code> that occurs when an ID is provided for a user federation mapper \([https\://github\.com/ansible\-collections/community\.general/pull/8831](https\://github\.com/ansible\-collections/community\.general/pull/8831)\)\.
* keycloak\_user\_federation \- sort desired and after mapper list by name \(analog to before mapper list\) to minimize diff and make change detection more accurate \([https\://github\.com/ansible\-collections/community\.general/pull/8761](https\://github\.com/ansible\-collections/community\.general/pull/8761)\)\.
* proxmox inventory plugin \- fixed a possible error on concatenating responses from proxmox\. In case an API call unexpectedly returned an empty result\, the inventory failed with a fatal error\. Added check for empty response \([https\://github\.com/ansible\-collections/community\.general/issues/8798](https\://github\.com/ansible\-collections/community\.general/issues/8798)\, [https\://github\.com/ansible\-collections/community\.general/pull/8794](https\://github\.com/ansible\-collections/community\.general/pull/8794)\)\.
<a id="new-modules"></a>
### New Modules
* community\.general\.keycloak\_userprofile \- Allows managing Keycloak User Profiles\.
* community\.general\.one\_vnet \- Manages OpenNebula virtual networks\.
<a id="v9-3-0"></a>
## v9\.3\.0
<a id="release-summary-1"></a>
### Release Summary
Regular bugfix and feature release\.
<a id="minor-changes-1"></a>
### Minor Changes
* cgroup\_memory\_recap\, hipchat\, jabber\, log\_plays\, loganalytics\, logentries\, logstash\, slack\, splunk\, sumologic\, syslog\_json callback plugins \- make sure that all options are typed \([https\://github\.com/ansible\-collections/community\.general/pull/8628](https\://github\.com/ansible\-collections/community\.general/pull/8628)\)\.
* chef\_databag\, consul\_kv\, cyberarkpassword\, dsv\, etcd\, filetree\, hiera\, onepassword\, onepassword\_doc\, onepassword\_raw\, passwordstore\, redis\, shelvefile\, tss lookup plugins \- make sure that all options are typed \([https\://github\.com/ansible\-collections/community\.general/pull/8626](https\://github\.com/ansible\-collections/community\.general/pull/8626)\)\.
* chroot\, funcd\, incus\, iocage\, jail\, lxc\, lxd\, qubes\, zone connection plugins \- make sure that all options are typed \([https\://github\.com/ansible\-collections/community\.general/pull/8627](https\://github\.com/ansible\-collections/community\.general/pull/8627)\)\.
* cobbler\, linode\, lxd\, nmap\, online\, scaleway\, stackpath\_compute\, virtualbox inventory plugins \- make sure that all options are typed \([https\://github\.com/ansible\-collections/community\.general/pull/8625](https\://github\.com/ansible\-collections/community\.general/pull/8625)\)\.
* doas\, dzdo\, ksu\, machinectl\, pbrun\, pfexec\, pmrun\, sesu\, sudosu become plugins \- make sure that all options are typed \([https\://github\.com/ansible\-collections/community\.general/pull/8623](https\://github\.com/ansible\-collections/community\.general/pull/8623)\)\.
* gconftool2 \- make use of <code>ModuleHelper</code> features to simplify code \([https\://github\.com/ansible\-collections/community\.general/pull/8711](https\://github\.com/ansible\-collections/community\.general/pull/8711)\)\.
* gitlab\_project \- add option <code>container\_expiration\_policy</code> to schedule container registry cleanup \([https\://github\.com/ansible\-collections/community\.general/pull/8674](https\://github\.com/ansible\-collections/community\.general/pull/8674)\)\.
* gitlab\_project \- add option <code>model\_registry\_access\_level</code> to disable model registry \([https\://github\.com/ansible\-collections/community\.general/pull/8688](https\://github\.com/ansible\-collections/community\.general/pull/8688)\)\.
* gitlab\_project \- add option <code>pages\_access\_level</code> to disable project pages \([https\://github\.com/ansible\-collections/community\.general/pull/8688](https\://github\.com/ansible\-collections/community\.general/pull/8688)\)\.
* gitlab\_project \- add option <code>repository\_access\_level</code> to disable project repository \([https\://github\.com/ansible\-collections/community\.general/pull/8674](https\://github\.com/ansible\-collections/community\.general/pull/8674)\)\.
* gitlab\_project \- add option <code>service\_desk\_enabled</code> to disable service desk \([https\://github\.com/ansible\-collections/community\.general/pull/8688](https\://github\.com/ansible\-collections/community\.general/pull/8688)\)\.
* locale\_gen \- add support for multiple locales \([https\://github\.com/ansible\-collections/community\.general/issues/8677](https\://github\.com/ansible\-collections/community\.general/issues/8677)\, [https\://github\.com/ansible\-collections/community\.general/pull/8682](https\://github\.com/ansible\-collections/community\.general/pull/8682)\)\.
* memcached\, pickle\, redis\, yaml cache plugins \- make sure that all options are typed \([https\://github\.com/ansible\-collections/community\.general/pull/8624](https\://github\.com/ansible\-collections/community\.general/pull/8624)\)\.
* opentelemetry callback plugin \- fix default value for <code>store\_spans\_in\_file</code> causing traces to be produced to a file named <code>None</code> \([https\://github\.com/ansible\-collections/community\.general/issues/8566](https\://github\.com/ansible\-collections/community\.general/issues/8566)\, [https\://github\.com/ansible\-collections/community\.general/pull/8741](https\://github\.com/ansible\-collections/community\.general/pull/8741)\)\.
* passwordstore lookup plugin \- add the current user to the lockfile file name to address issues on multi\-user systems \([https\://github\.com/ansible\-collections/community\.general/pull/8689](https\://github\.com/ansible\-collections/community\.general/pull/8689)\)\.
* pipx \- add parameter <code>suffix</code> to module \([https\://github\.com/ansible\-collections/community\.general/pull/8675](https\://github\.com/ansible\-collections/community\.general/pull/8675)\, [https\://github\.com/ansible\-collections/community\.general/issues/8656](https\://github\.com/ansible\-collections/community\.general/issues/8656)\)\.
* pkgng \- add option <code>use\_globs</code> \(default <code>true</code>\) to optionally disable glob patterns \([https\://github\.com/ansible\-collections/community\.general/issues/8632](https\://github\.com/ansible\-collections/community\.general/issues/8632)\, [https\://github\.com/ansible\-collections/community\.general/pull/8633](https\://github\.com/ansible\-collections/community\.general/pull/8633)\)\.
* proxmox inventory plugin \- add new fact for LXC interface details \([https\://github\.com/ansible\-collections/community\.general/pull/8713](https\://github\.com/ansible\-collections/community\.general/pull/8713)\)\.
* redis\, redis\_info \- add <code>client\_cert</code> and <code>client\_key</code> options to specify path to certificate for Redis authentication \([https\://github\.com/ansible\-collections/community\.general/pull/8654](https\://github\.com/ansible\-collections/community\.general/pull/8654)\)\.
<a id="bugfixes-1"></a>
### Bugfixes
* gitlab\_runner \- fix <code>paused</code> parameter being ignored \([https\://github\.com/ansible\-collections/community\.general/pull/8648](https\://github\.com/ansible\-collections/community\.general/pull/8648)\)\.
* homebrew\_cask \- fix <code>upgrade\_all</code> returns <code>changed</code> when nothing upgraded \([https\://github\.com/ansible\-collections/community\.general/issues/8707](https\://github\.com/ansible\-collections/community\.general/issues/8707)\, [https\://github\.com/ansible\-collections/community\.general/pull/8708](https\://github\.com/ansible\-collections/community\.general/pull/8708)\)\.
* keycloak\_user\_federation \- get cleartext IDP <code>clientSecret</code> from full realm info to detect changes to it \([https\://github\.com/ansible\-collections/community\.general/issues/8294](https\://github\.com/ansible\-collections/community\.general/issues/8294)\, [https\://github\.com/ansible\-collections/community\.general/pull/8735](https\://github\.com/ansible\-collections/community\.general/pull/8735)\)\.
* keycloak\_user\_federation \- remove existing user federation mappers if they are not present in the federation configuration and will not be updated \([https\://github\.com/ansible\-collections/community\.general/issues/7169](https\://github\.com/ansible\-collections/community\.general/issues/7169)\, [https\://github\.com/ansible\-collections/community\.general/pull/8695](https\://github\.com/ansible\-collections/community\.general/pull/8695)\)\.
* proxmox \- fixed an issue where the new volume handling incorrectly converted <code>null</code> values into <code>\"None\"</code> strings \([https\://github\.com/ansible\-collections/community\.general/pull/8646](https\://github\.com/ansible\-collections/community\.general/pull/8646)\)\.
* proxmox \- fixed an issue where volume strings where overwritten instead of appended to in the new <code>build\_volume\(\)</code> method \([https\://github\.com/ansible\-collections/community\.general/pull/8646](https\://github\.com/ansible\-collections/community\.general/pull/8646)\)\.
* proxmox \- removed the forced conversion of non\-string values to strings to be consistent with the module documentation \([https\://github\.com/ansible\-collections/community\.general/pull/8646](https\://github\.com/ansible\-collections/community\.general/pull/8646)\)\.
<a id="new-modules-1"></a>
### New Modules
* community\.general\.bootc\_manage \- Bootc Switch and Upgrade\.
* community\.general\.homebrew\_services \- Services manager for Homebrew\.
* community\.general\.keycloak\_realm\_keys\_metadata\_info \- Allows obtaining Keycloak realm keys metadata via Keycloak API\.
<a id="v9-2-0"></a>
## v9\.2\.0
<a id="release-summary-2"></a>
### Release Summary
Regular bugfix and feature release\.
<a id="minor-changes-2"></a>
### Minor Changes
* CmdRunner module utils \- the parameter <code>force\_lang</code> now supports the special value <code>auto</code> which will automatically try and determine the best parsable locale in the system \([https\://github\.com/ansible\-collections/community\.general/pull/8517](https\://github\.com/ansible\-collections/community\.general/pull/8517)\)\.
* proxmox \- add <code>disk\_volume</code> and <code>mount\_volumes</code> keys for better readability \([https\://github\.com/ansible\-collections/community\.general/pull/8542](https\://github\.com/ansible\-collections/community\.general/pull/8542)\)\.
* proxmox \- translate the old <code>disk</code> and <code>mounts</code> keys to the new handling internally \([https\://github\.com/ansible\-collections/community\.general/pull/8542](https\://github\.com/ansible\-collections/community\.general/pull/8542)\)\.
@@ -60,7 +234,7 @@ Regular bugfix and feature release\.
* virtualbox inventory plugin \- expose a new parameter <code>enable\_advanced\_group\_parsing</code> to change how the VirtualBox dynamic inventory parses VM groups \([https\://github\.com/ansible\-collections/community\.general/issues/8508](https\://github\.com/ansible\-collections/community\.general/issues/8508)\, [https\://github\.com/ansible\-collections/community\.general/pull/8510](https\://github\.com/ansible\-collections/community\.general/pull/8510)\)\.
* wdc\_redfish\_command \- minor change to handle upgrade file for Redfish WD platforms \([https\://github\.com/ansible\-collections/community\.general/pull/8444](https\://github\.com/ansible\-collections/community\.general/pull/8444)\)\.
<a id="bugfixes"></a>
<a id="bugfixes-2"></a>
### Bugfixes
* bitwarden lookup plugin \- fix <code>KeyError</code> in <code>search\_field</code> \([https\://github\.com/ansible\-collections/community\.general/issues/8549](https\://github\.com/ansible\-collections/community\.general/issues/8549)\, [https\://github\.com/ansible\-collections/community\.general/pull/8557](https\://github\.com/ansible\-collections/community\.general/pull/8557)\)\.
@@ -85,12 +259,12 @@ Regular bugfix and feature release\.
<a id="v9-1-0"></a>
## v9\.1\.0
<a id="release-summary-1"></a>
<a id="release-summary-3"></a>
### Release Summary
Regular feature and bugfix release\.
<a id="minor-changes-1"></a>
<a id="minor-changes-3"></a>
### Minor Changes
* CmdRunner module util \- argument formats can be specified as plain functions without calling <code>cmd\_runner\_fmt\.as\_func\(\)</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8479](https\://github\.com/ansible\-collections/community\.general/pull/8479)\)\.
@@ -107,14 +281,14 @@ Regular feature and bugfix release\.
* redfish\_info \- add command <code>CheckAvailability</code> to check if a service is accessible \([https\://github\.com/ansible\-collections/community\.general/issues/8051](https\://github\.com/ansible\-collections/community\.general/issues/8051)\, [https\://github\.com/ansible\-collections/community\.general/pull/8434](https\://github\.com/ansible\-collections/community\.general/pull/8434)\)\.
* redis\_info \- adds support for getting cluster info \([https\://github\.com/ansible\-collections/community\.general/pull/8464](https\://github\.com/ansible\-collections/community\.general/pull/8464)\)\.
<a id="deprecated-features"></a>
<a id="deprecated-features-1"></a>
### Deprecated Features
* CmdRunner module util \- setting the value of the <code>ignore\_none</code> parameter within a <code>CmdRunner</code> context is deprecated and that feature should be removed in community\.general 12\.0\.0 \([https\://github\.com/ansible\-collections/community\.general/pull/8479](https\://github\.com/ansible\-collections/community\.general/pull/8479)\)\.
* git\_config \- the <code>list\_all</code> option has been deprecated and will be removed in community\.general 11\.0\.0\. Use the <code>community\.general\.git\_config\_info</code> module instead \([https\://github\.com/ansible\-collections/community\.general/pull/8453](https\://github\.com/ansible\-collections/community\.general/pull/8453)\)\.
* git\_config \- using <code>state\=present</code> without providing <code>value</code> is deprecated and will be disallowed in community\.general 11\.0\.0\. Use the <code>community\.general\.git\_config\_info</code> module instead to read a value \([https\://github\.com/ansible\-collections/community\.general/pull/8453](https\://github\.com/ansible\-collections/community\.general/pull/8453)\)\.
<a id="bugfixes-1"></a>
<a id="bugfixes-3"></a>
### Bugfixes
* git\_config \- fix behavior of <code>state\=absent</code> if <code>value</code> is present \([https\://github\.com/ansible\-collections/community\.general/issues/8436](https\://github\.com/ansible\-collections/community\.general/issues/8436)\, [https\://github\.com/ansible\-collections/community\.general/pull/8452](https\://github\.com/ansible\-collections/community\.general/pull/8452)\)\.
@@ -141,7 +315,7 @@ Regular feature and bugfix release\.
* community\.general\.remove\_keys \- Remove specific keys from dictionaries in a list\.
* community\.general\.replace\_keys \- Replace specific keys in a list of dictionaries\.
<a id="new-modules"></a>
<a id="new-modules-2"></a>
### New Modules
* community\.general\.consul\_agent\_check \- Add\, modify\, and delete checks within a consul cluster\.
@@ -152,17 +326,17 @@ Regular feature and bugfix release\.
<a id="v9-0-1"></a>
## v9\.0\.1
<a id="release-summary-2"></a>
<a id="release-summary-4"></a>
### Release Summary
Bugfix release for inclusion in Ansible 10\.0\.0rc1\.
<a id="minor-changes-2"></a>
<a id="minor-changes-4"></a>
### Minor Changes
* 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-2"></a>
<a id="bugfixes-4"></a>
### Bugfixes
* 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)\)\.
@@ -181,12 +355,12 @@ Bugfix release for inclusion in Ansible 10\.0\.0rc1\.
<a id="v9-0-0"></a>
## v9\.0\.0
<a id="release-summary-3"></a>
<a id="release-summary-5"></a>
### Release Summary
This is release 9\.0\.0 of <code>community\.general</code>\, released on 2024\-05\-20\.
<a id="minor-changes-3"></a>
<a id="minor-changes-5"></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)\)\.
@@ -315,7 +489,7 @@ This is release 9\.0\.0 of <code>community\.general</code>\, released on 2024\-0
* 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-1"></a>
<a id="deprecated-features-2"></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)\)\.
@@ -356,7 +530,7 @@ This is release 9\.0\.0 of <code>community\.general</code>\, released on 2024\-0
* 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-3"></a>
<a id="bugfixes-5"></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)\)\.
@@ -471,7 +645,7 @@ This is release 9\.0\.0 of <code>community\.general</code>\, released on 2024\-0
* community\.general\.fqdn\_valid \- Validates fully\-qualified domain names against RFC 1123\.
<a id="new-modules-1"></a>
<a id="new-modules-3"></a>
### New Modules
* community\.general\.consul\_acl\_bootstrap \- Bootstrap ACLs in Consul\.

View File

@@ -6,6 +6,169 @@ Community General Release Notes
This changelog describes changes after version 8.0.0.
v9.4.0
======
Release Summary
---------------
Bugfix and feature release.
Minor Changes
-------------
- MH module utils - add parameter ``when`` to ``cause_changes`` decorator (https://github.com/ansible-collections/community.general/pull/8766).
- MH module utils - minor refactor in decorators (https://github.com/ansible-collections/community.general/pull/8766).
- alternatives - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- apache2_mod_proxy - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- apache2_mod_proxy - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- consul_acl - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- copr - Added ``includepkgs`` and ``excludepkgs`` parameters to limit the list of packages fetched or excluded from the repository(https://github.com/ansible-collections/community.general/pull/8779).
- credstash lookup plugin - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- csv module utils - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- deco MH module utils - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- etcd3 - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- gio_mime - mute the old ``VarDict`` deprecation (https://github.com/ansible-collections/community.general/pull/8776).
- gitlab_group - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- gitlab_project - add option ``issues_access_level`` to enable/disable project issues (https://github.com/ansible-collections/community.general/pull/8760).
- gitlab_project - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- gitlab_project - sorted parameters in order to avoid future merge conflicts (https://github.com/ansible-collections/community.general/pull/8759).
- hashids filter plugin - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- hwc_ecs_instance - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- hwc_evs_disk - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- hwc_vpc_eip - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- hwc_vpc_peering_connect - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- hwc_vpc_port - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- hwc_vpc_subnet - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- imc_rest - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- ipa_otptoken - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- jira - mute the old ``VarDict`` deprecation (https://github.com/ansible-collections/community.general/pull/8776).
- jira - replace deprecated params when using decorator ``cause_changes`` (https://github.com/ansible-collections/community.general/pull/8791).
- keep_keys filter plugin - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- keycloak module utils - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- keycloak_client - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- keycloak_clientscope - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- keycloak_identity_provider - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- keycloak_user_federation - add module argument allowing users to optout of the removal of unspecified mappers, for example to keep the keycloak default mappers (https://github.com/ansible-collections/community.general/pull/8764).
- keycloak_user_federation - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- keycloak_user_federation - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- keycloak_user_federation - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- linode - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- lxc_container - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- lxd_container - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- manageiq_provider - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- ocapi_utils - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- one_service - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- one_vm - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- onepassword lookup plugin - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- pids - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- pipx - added new states ``install_all``, ``uninject``, ``upgrade_shared``, ``pin``, and ``unpin`` (https://github.com/ansible-collections/community.general/pull/8809).
- pipx - added parameter ``global`` to module (https://github.com/ansible-collections/community.general/pull/8793).
- pipx - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- pipx_info - added parameter ``global`` to module (https://github.com/ansible-collections/community.general/pull/8793).
- pipx_info - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- pkg5_publisher - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- proxmox - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- proxmox_disk - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- proxmox_kvm - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- proxmox_kvm - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- redfish_utils - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- redfish_utils module utils - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- redis cache plugin - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- remove_keys filter plugin - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- replace_keys filter plugin - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- scaleway - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- scaleway module utils - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- scaleway_compute - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- scaleway_ip - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- scaleway_lb - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- scaleway_security_group - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- scaleway_security_group - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- scaleway_user_data - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- sensu_silence - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- snmp_facts - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- sorcery - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- ufw - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- unsafe plugin utils - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- vardict module utils - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- vars MH module utils - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- vmadm - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
Deprecated Features
-------------------
- MH decorator cause_changes module utils - deprecate parameters ``on_success`` and ``on_failure`` (https://github.com/ansible-collections/community.general/pull/8791).
- pipx - support for versions of the command line tool ``pipx`` older than ``1.7.0`` is deprecated and will be removed in community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/8793).
- pipx_info - support for versions of the command line tool ``pipx`` older than ``1.7.0`` is deprecated and will be removed in community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/8793).
Bugfixes
--------
- gitlab_group_access_token - fix crash in check mode caused by attempted access to a newly created access token (https://github.com/ansible-collections/community.general/pull/8796).
- gitlab_project - fix ``container_expiration_policy`` not being applied when creating a new project (https://github.com/ansible-collections/community.general/pull/8790).
- gitlab_project - fix crash caused by old Gitlab projects not having a ``container_expiration_policy`` attribute (https://github.com/ansible-collections/community.general/pull/8790).
- gitlab_project_access_token - fix crash in check mode caused by attempted access to a newly created access token (https://github.com/ansible-collections/community.general/pull/8796).
- keycloak_realm_key - fix invalid usage of ``parent_id`` (https://github.com/ansible-collections/community.general/issues/7850, https://github.com/ansible-collections/community.general/pull/8823).
- keycloak_user_federation - fix key error when removing mappers during an update and new mappers are specified in the module args (https://github.com/ansible-collections/community.general/pull/8762).
- keycloak_user_federation - fix the ``UnboundLocalError`` that occurs when an ID is provided for a user federation mapper (https://github.com/ansible-collections/community.general/pull/8831).
- keycloak_user_federation - sort desired and after mapper list by name (analog to before mapper list) to minimize diff and make change detection more accurate (https://github.com/ansible-collections/community.general/pull/8761).
- proxmox inventory plugin - fixed a possible error on concatenating responses from proxmox. In case an API call unexpectedly returned an empty result, the inventory failed with a fatal error. Added check for empty response (https://github.com/ansible-collections/community.general/issues/8798, https://github.com/ansible-collections/community.general/pull/8794).
New Modules
-----------
- community.general.keycloak_userprofile - Allows managing Keycloak User Profiles.
- community.general.one_vnet - Manages OpenNebula virtual networks.
v9.3.0
======
Release Summary
---------------
Regular bugfix and feature release.
Minor Changes
-------------
- cgroup_memory_recap, hipchat, jabber, log_plays, loganalytics, logentries, logstash, slack, splunk, sumologic, syslog_json callback plugins - make sure that all options are typed (https://github.com/ansible-collections/community.general/pull/8628).
- chef_databag, consul_kv, cyberarkpassword, dsv, etcd, filetree, hiera, onepassword, onepassword_doc, onepassword_raw, passwordstore, redis, shelvefile, tss lookup plugins - make sure that all options are typed (https://github.com/ansible-collections/community.general/pull/8626).
- chroot, funcd, incus, iocage, jail, lxc, lxd, qubes, zone connection plugins - make sure that all options are typed (https://github.com/ansible-collections/community.general/pull/8627).
- cobbler, linode, lxd, nmap, online, scaleway, stackpath_compute, virtualbox inventory plugins - make sure that all options are typed (https://github.com/ansible-collections/community.general/pull/8625).
- doas, dzdo, ksu, machinectl, pbrun, pfexec, pmrun, sesu, sudosu become plugins - make sure that all options are typed (https://github.com/ansible-collections/community.general/pull/8623).
- gconftool2 - make use of ``ModuleHelper`` features to simplify code (https://github.com/ansible-collections/community.general/pull/8711).
- gitlab_project - add option ``container_expiration_policy`` to schedule container registry cleanup (https://github.com/ansible-collections/community.general/pull/8674).
- gitlab_project - add option ``model_registry_access_level`` to disable model registry (https://github.com/ansible-collections/community.general/pull/8688).
- gitlab_project - add option ``pages_access_level`` to disable project pages (https://github.com/ansible-collections/community.general/pull/8688).
- gitlab_project - add option ``repository_access_level`` to disable project repository (https://github.com/ansible-collections/community.general/pull/8674).
- gitlab_project - add option ``service_desk_enabled`` to disable service desk (https://github.com/ansible-collections/community.general/pull/8688).
- locale_gen - add support for multiple locales (https://github.com/ansible-collections/community.general/issues/8677, https://github.com/ansible-collections/community.general/pull/8682).
- memcached, pickle, redis, yaml cache plugins - make sure that all options are typed (https://github.com/ansible-collections/community.general/pull/8624).
- opentelemetry callback plugin - fix default value for ``store_spans_in_file`` causing traces to be produced to a file named ``None`` (https://github.com/ansible-collections/community.general/issues/8566, https://github.com/ansible-collections/community.general/pull/8741).
- passwordstore lookup plugin - add the current user to the lockfile file name to address issues on multi-user systems (https://github.com/ansible-collections/community.general/pull/8689).
- pipx - add parameter ``suffix`` to module (https://github.com/ansible-collections/community.general/pull/8675, https://github.com/ansible-collections/community.general/issues/8656).
- pkgng - add option ``use_globs`` (default ``true``) to optionally disable glob patterns (https://github.com/ansible-collections/community.general/issues/8632, https://github.com/ansible-collections/community.general/pull/8633).
- proxmox inventory plugin - add new fact for LXC interface details (https://github.com/ansible-collections/community.general/pull/8713).
- redis, redis_info - add ``client_cert`` and ``client_key`` options to specify path to certificate for Redis authentication (https://github.com/ansible-collections/community.general/pull/8654).
Bugfixes
--------
- gitlab_runner - fix ``paused`` parameter being ignored (https://github.com/ansible-collections/community.general/pull/8648).
- homebrew_cask - fix ``upgrade_all`` returns ``changed`` when nothing upgraded (https://github.com/ansible-collections/community.general/issues/8707, https://github.com/ansible-collections/community.general/pull/8708).
- keycloak_user_federation - get cleartext IDP ``clientSecret`` from full realm info to detect changes to it (https://github.com/ansible-collections/community.general/issues/8294, https://github.com/ansible-collections/community.general/pull/8735).
- keycloak_user_federation - remove existing user federation mappers if they are not present in the federation configuration and will not be updated (https://github.com/ansible-collections/community.general/issues/7169, https://github.com/ansible-collections/community.general/pull/8695).
- proxmox - fixed an issue where the new volume handling incorrectly converted ``null`` values into ``"None"`` strings (https://github.com/ansible-collections/community.general/pull/8646).
- proxmox - fixed an issue where volume strings where overwritten instead of appended to in the new ``build_volume()`` method (https://github.com/ansible-collections/community.general/pull/8646).
- proxmox - removed the forced conversion of non-string values to strings to be consistent with the module documentation (https://github.com/ansible-collections/community.general/pull/8646).
New Modules
-----------
- community.general.bootc_manage - Bootc Switch and Upgrade.
- community.general.homebrew_services - Services manager for Homebrew.
- community.general.keycloak_realm_keys_metadata_info - Allows obtaining Keycloak realm keys metadata via Keycloak API.
v9.2.0
======

View File

@@ -56,6 +56,8 @@ cd ~/dev/ansible_collections/community/general
Then you can run `ansible-test` (which is a part of [ansible-core](https://pypi.org/project/ansible-core/)) inside the checkout. The following example commands expect that you have installed Docker or Podman. Note that Podman has only been supported by more recent ansible-core releases. If you are using Docker, the following will work with Ansible 2.9+.
### Sanity tests
The following commands show how to run sanity tests:
```.bash
@@ -66,6 +68,8 @@ ansible-test sanity --docker -v
ansible-test sanity --docker -v plugins/modules/system/pids.py tests/integration/targets/pids/
```
### Unit tests
The following commands show how to run unit tests:
```.bash
@@ -79,13 +83,32 @@ ansible-test units --docker -v --python 3.8
ansible-test units --docker -v --python 3.8 tests/unit/plugins/modules/net_tools/test_nmcli.py
```
### Integration tests
The following commands show how to run integration tests:
```.bash
# Run integration tests for the interfaces_files module in a Docker container using the
# fedora35 operating system image (the supported images depend on your ansible-core version):
ansible-test integration --docker fedora35 -v interfaces_file
#### In Docker
Integration tests on Docker have the following parameters:
- `image_name` (required): The name of the Docker image. To get the list of supported Docker images, run
`ansible-test integration --help` and look for _target docker images_.
- `test_name` (optional): The name of the integration test.
For modules, this equals the short name of the module; for example, `pacman` in case of `community.general.pacman`.
For plugins, the plugin type is added before the plugin's short name, for example `callback_yaml` for the `community.general.yaml` callback.
```.bash
# Test all plugins/modules on fedora40
ansible-test integration -v --docker fedora40
# Template
ansible-test integration -v --docker image_name test_name
# Example community.general.ini_file module on fedora40 Docker image:
ansible-test integration -v --docker fedora40 ini_file
```
#### Without isolation
```.bash
# Run integration tests for the flattened lookup **without any isolation**:
ansible-test integration -v lookup_flattened
```

View File

@@ -23,6 +23,18 @@ We follow [Ansible Code of Conduct](https://docs.ansible.com/ansible/latest/comm
If you encounter abusive behavior violating the [Ansible Code of Conduct](https://docs.ansible.com/ansible/latest/community/code_of_conduct.html), please refer to the [policy violations](https://docs.ansible.com/ansible/latest/community/code_of_conduct.html#policy-violations) section of the Code of Conduct for information on how to raise a complaint.
## Communication
* Join the Ansible forum:
* [Get Help](https://forum.ansible.com/c/help/6): get help or help others. This is for questions about modules or plugins in the collection. Please add appropriate tags if you start new discussions.
* [Tag `community-general`](https://forum.ansible.com/tag/community-general): discuss the *collection itself*, instead of specific modules or plugins.
* [Social Spaces](https://forum.ansible.com/c/chat/4): gather and interact with fellow enthusiasts.
* [News & Announcements](https://forum.ansible.com/c/news/5): track project-wide announcements including social events.
* The Ansible [Bullhorn newsletter](https://docs.ansible.com/ansible/devel/community/communication.html#the-bullhorn): used to announce releases and important changes.
For more information about communication, see the [Ansible communication guide](https://docs.ansible.com/ansible/devel/community/communication.html).
## Tested with Ansible
Tested with the current ansible-core 2.13, ansible-core 2.14, ansible-core 2.15, ansible-core 2.16, ansible-core 2.17 releases and the current development version of ansible-core. Ansible-core versions before 2.13.0 are not supported. This includes all ansible-base 2.10 and Ansible 2.9 releases.
@@ -98,18 +110,6 @@ It is necessary for maintainers of this collection to be subscribed to:
They also should be subscribed to Ansible's [The Bullhorn newsletter](https://docs.ansible.com/ansible/devel/community/communication.html#the-bullhorn).
## Communication
We announce important development changes and releases through Ansible's [The Bullhorn newsletter](https://eepurl.com/gZmiEP). If you are a collection developer, be sure you are subscribed.
Join us in the `#ansible` (general use questions and support), `#ansible-community` (community and collection development questions), and other [IRC channels](https://docs.ansible.com/ansible/devel/community/communication.html#irc-channels) on [Libera.chat](https://libera.chat).
We take part in the global quarterly [Ansible Contributor Summit](https://github.com/ansible/community/wiki/Contributor-Summit) virtually or in-person. Track [The Bullhorn newsletter](https://eepurl.com/gZmiEP) and join us.
For more information about communities, meetings and agendas see [Community Wiki](https://github.com/ansible/community/wiki/Community).
For more information about communication, refer to Ansible's the [Communication guide](https://docs.ansible.com/ansible/devel/community/communication.html).
## Publishing New Version
See the [Releasing guidelines](https://github.com/ansible/community-docs/blob/main/releasing_collections.rst) to learn how to release this collection.

View File

@@ -972,3 +972,279 @@ releases:
name: ansible_type
namespace: null
release_date: '2024-07-15'
9.3.0:
changes:
bugfixes:
- gitlab_runner - fix ``paused`` parameter being ignored (https://github.com/ansible-collections/community.general/pull/8648).
- homebrew_cask - fix ``upgrade_all`` returns ``changed`` when nothing upgraded
(https://github.com/ansible-collections/community.general/issues/8707, https://github.com/ansible-collections/community.general/pull/8708).
- keycloak_user_federation - get cleartext IDP ``clientSecret`` from full
realm info to detect changes to it (https://github.com/ansible-collections/community.general/issues/8294,
https://github.com/ansible-collections/community.general/pull/8735).
- keycloak_user_federation - remove existing user federation mappers if they
are not present in the federation configuration and will not be updated
(https://github.com/ansible-collections/community.general/issues/7169, https://github.com/ansible-collections/community.general/pull/8695).
- proxmox - fixed an issue where the new volume handling incorrectly converted
``null`` values into ``"None"`` strings (https://github.com/ansible-collections/community.general/pull/8646).
- proxmox - fixed an issue where volume strings where overwritten instead
of appended to in the new ``build_volume()`` method (https://github.com/ansible-collections/community.general/pull/8646).
- proxmox - removed the forced conversion of non-string values to strings
to be consistent with the module documentation (https://github.com/ansible-collections/community.general/pull/8646).
minor_changes:
- cgroup_memory_recap, hipchat, jabber, log_plays, loganalytics, logentries,
logstash, slack, splunk, sumologic, syslog_json callback plugins - make
sure that all options are typed (https://github.com/ansible-collections/community.general/pull/8628).
- chef_databag, consul_kv, cyberarkpassword, dsv, etcd, filetree, hiera, onepassword,
onepassword_doc, onepassword_raw, passwordstore, redis, shelvefile, tss
lookup plugins - make sure that all options are typed (https://github.com/ansible-collections/community.general/pull/8626).
- chroot, funcd, incus, iocage, jail, lxc, lxd, qubes, zone connection plugins
- make sure that all options are typed (https://github.com/ansible-collections/community.general/pull/8627).
- cobbler, linode, lxd, nmap, online, scaleway, stackpath_compute, virtualbox
inventory plugins - make sure that all options are typed (https://github.com/ansible-collections/community.general/pull/8625).
- doas, dzdo, ksu, machinectl, pbrun, pfexec, pmrun, sesu, sudosu become plugins
- make sure that all options are typed (https://github.com/ansible-collections/community.general/pull/8623).
- gconftool2 - make use of ``ModuleHelper`` features to simplify code (https://github.com/ansible-collections/community.general/pull/8711).
- gitlab_project - add option ``container_expiration_policy`` to schedule
container registry cleanup (https://github.com/ansible-collections/community.general/pull/8674).
- gitlab_project - add option ``model_registry_access_level`` to disable model
registry (https://github.com/ansible-collections/community.general/pull/8688).
- gitlab_project - add option ``pages_access_level`` to disable project pages
(https://github.com/ansible-collections/community.general/pull/8688).
- gitlab_project - add option ``repository_access_level`` to disable project
repository (https://github.com/ansible-collections/community.general/pull/8674).
- gitlab_project - add option ``service_desk_enabled`` to disable service
desk (https://github.com/ansible-collections/community.general/pull/8688).
- locale_gen - add support for multiple locales (https://github.com/ansible-collections/community.general/issues/8677,
https://github.com/ansible-collections/community.general/pull/8682).
- memcached, pickle, redis, yaml cache plugins - make sure that all options
are typed (https://github.com/ansible-collections/community.general/pull/8624).
- opentelemetry callback plugin - fix default value for ``store_spans_in_file``
causing traces to be produced to a file named ``None`` (https://github.com/ansible-collections/community.general/issues/8566,
https://github.com/ansible-collections/community.general/pull/8741).
- passwordstore lookup plugin - add the current user to the lockfile file
name to address issues on multi-user systems (https://github.com/ansible-collections/community.general/pull/8689).
- pipx - add parameter ``suffix`` to module (https://github.com/ansible-collections/community.general/pull/8675,
https://github.com/ansible-collections/community.general/issues/8656).
- pkgng - add option ``use_globs`` (default ``true``) to optionally disable
glob patterns (https://github.com/ansible-collections/community.general/issues/8632,
https://github.com/ansible-collections/community.general/pull/8633).
- proxmox inventory plugin - add new fact for LXC interface details (https://github.com/ansible-collections/community.general/pull/8713).
- redis, redis_info - add ``client_cert`` and ``client_key`` options to specify
path to certificate for Redis authentication (https://github.com/ansible-collections/community.general/pull/8654).
release_summary: Regular bugfix and feature release.
fragments:
- 8623-become-types.yml
- 8624-cache-types.yml
- 8625-inventory-types.yml
- 8626-lookup-types.yml
- 8627-connection-types.yml
- 8628-callback-types.yml
- 8632-pkgng-add-option-use_globs.yml
- 8646-fix-bug-in-proxmox-volumes.yml
- 8648-fix-gitlab-runner-paused.yaml
- 8654-add-redis-tls-params.yml
- 8674-add-gitlab-project-cleanup-policy.yml
- 8675-pipx-install-suffix.yml
- 8682-locale-gen-multiple.yaml
- 8688-gitlab_project-add-new-params.yml
- 8689-passwordstore-lock-naming.yml
- 8695-keycloak_user_federation-mapper-removal.yml
- 8708-homebrew_cask-fix-upgrade-all.yml
- 8711-gconftool2-refactor.yml
- 8713-proxmox_lxc_interfaces.yml
- 8735-keycloak_identity_provider-get-cleartext-secret-from-realm-info.yml
- 8741-fix-opentelemetry-callback.yml
- 9.3.0.yml
modules:
- description: Bootc Switch and Upgrade.
name: bootc_manage
namespace: ''
- description: Services manager for Homebrew.
name: homebrew_services
namespace: ''
- description: Allows obtaining Keycloak realm keys metadata via Keycloak API.
name: keycloak_realm_keys_metadata_info
namespace: ''
release_date: '2024-08-12'
9.4.0:
changes:
bugfixes:
- gitlab_group_access_token - fix crash in check mode caused by attempted
access to a newly created access token (https://github.com/ansible-collections/community.general/pull/8796).
- gitlab_project - fix ``container_expiration_policy`` not being applied when
creating a new project (https://github.com/ansible-collections/community.general/pull/8790).
- gitlab_project - fix crash caused by old Gitlab projects not having a ``container_expiration_policy``
attribute (https://github.com/ansible-collections/community.general/pull/8790).
- gitlab_project_access_token - fix crash in check mode caused by attempted
access to a newly created access token (https://github.com/ansible-collections/community.general/pull/8796).
- keycloak_realm_key - fix invalid usage of ``parent_id`` (https://github.com/ansible-collections/community.general/issues/7850,
https://github.com/ansible-collections/community.general/pull/8823).
- keycloak_user_federation - fix key error when removing mappers during an
update and new mappers are specified in the module args (https://github.com/ansible-collections/community.general/pull/8762).
- keycloak_user_federation - fix the ``UnboundLocalError`` that occurs when
an ID is provided for a user federation mapper (https://github.com/ansible-collections/community.general/pull/8831).
- keycloak_user_federation - sort desired and after mapper list by name (analog
to before mapper list) to minimize diff and make change detection more accurate
(https://github.com/ansible-collections/community.general/pull/8761).
- proxmox inventory plugin - fixed a possible error on concatenating responses
from proxmox. In case an API call unexpectedly returned an empty result,
the inventory failed with a fatal error. Added check for empty response
(https://github.com/ansible-collections/community.general/issues/8798, https://github.com/ansible-collections/community.general/pull/8794).
deprecated_features:
- MH decorator cause_changes module utils - deprecate parameters ``on_success``
and ``on_failure`` (https://github.com/ansible-collections/community.general/pull/8791).
- 'pipx - support for versions of the command line tool ``pipx`` older than
``1.7.0`` is deprecated and will be removed in community.general 11.0.0
(https://github.com/ansible-collections/community.general/pull/8793).
'
- 'pipx_info - support for versions of the command line tool ``pipx`` older
than ``1.7.0`` is deprecated and will be removed in community.general 11.0.0
(https://github.com/ansible-collections/community.general/pull/8793).
'
minor_changes:
- MH module utils - add parameter ``when`` to ``cause_changes`` decorator
(https://github.com/ansible-collections/community.general/pull/8766).
- MH module utils - minor refactor in decorators (https://github.com/ansible-collections/community.general/pull/8766).
- alternatives - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- apache2_mod_proxy - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8814).
- apache2_mod_proxy - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8833).
- consul_acl - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- copr - Added ``includepkgs`` and ``excludepkgs`` parameters to limit the
list of packages fetched or excluded from the repository(https://github.com/ansible-collections/community.general/pull/8779).
- credstash lookup plugin - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8822).
- csv module utils - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8814).
- deco MH module utils - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8822).
- etcd3 - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- gio_mime - mute the old ``VarDict`` deprecation (https://github.com/ansible-collections/community.general/pull/8776).
- gitlab_group - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- gitlab_project - add option ``issues_access_level`` to enable/disable project
issues (https://github.com/ansible-collections/community.general/pull/8760).
- gitlab_project - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- gitlab_project - sorted parameters in order to avoid future merge conflicts
(https://github.com/ansible-collections/community.general/pull/8759).
- hashids filter plugin - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8814).
- hwc_ecs_instance - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8822).
- hwc_evs_disk - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- hwc_vpc_eip - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- hwc_vpc_peering_connect - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8822).
- hwc_vpc_port - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- hwc_vpc_subnet - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- imc_rest - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- ipa_otptoken - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- jira - mute the old ``VarDict`` deprecation (https://github.com/ansible-collections/community.general/pull/8776).
- jira - replace deprecated params when using decorator ``cause_changes``
(https://github.com/ansible-collections/community.general/pull/8791).
- keep_keys filter plugin - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8814).
- keycloak module utils - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8822).
- keycloak_client - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8814).
- keycloak_clientscope - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8814).
- keycloak_identity_provider - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8814).
- keycloak_user_federation - add module argument allowing users to optout
of the removal of unspecified mappers, for example to keep the keycloak
default mappers (https://github.com/ansible-collections/community.general/pull/8764).
- keycloak_user_federation - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8814).
- keycloak_user_federation - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8822).
- keycloak_user_federation - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8833).
- linode - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- lxc_container - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- lxd_container - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- manageiq_provider - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8814).
- ocapi_utils - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- one_service - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- one_vm - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- onepassword lookup plugin - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8833).
- pids - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- pipx - added new states ``install_all``, ``uninject``, ``upgrade_shared``,
``pin``, and ``unpin`` (https://github.com/ansible-collections/community.general/pull/8809).
- pipx - added parameter ``global`` to module (https://github.com/ansible-collections/community.general/pull/8793).
- pipx - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- pipx_info - added parameter ``global`` to module (https://github.com/ansible-collections/community.general/pull/8793).
- pipx_info - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- pkg5_publisher - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- proxmox - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- proxmox_disk - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- proxmox_kvm - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8814).
- proxmox_kvm - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- redfish_utils - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- redfish_utils module utils - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8822).
- redis cache plugin - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8833).
- remove_keys filter plugin - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8814).
- replace_keys filter plugin - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8814).
- scaleway - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- scaleway module utils - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8822).
- scaleway_compute - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8833).
- scaleway_ip - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- scaleway_lb - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- scaleway_security_group - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8822).
- scaleway_security_group - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8833).
- scaleway_user_data - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8833).
- sensu_silence - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- snmp_facts - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- sorcery - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8833).
- ufw - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
- unsafe plugin utils - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8814).
- vardict module utils - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8814).
- vars MH module utils - replace Python 2.6 construct with dict comprehensions
(https://github.com/ansible-collections/community.general/pull/8814).
- vmadm - replace Python 2.6 construct with dict comprehensions (https://github.com/ansible-collections/community.general/pull/8822).
release_summary: Bugfix and feature release.
fragments:
- 8738-limit-packages-for-copr.yml
- 8759-gitlab_project-sort-params.yml
- 8760-gitlab_project-add-issues-access-level.yml
- 8761-keycloak_user_federation-sort-desired-and-after-mappers-by-name.yml
- 8762-keycloac_user_federation-fix-key-error-when-updating.yml
- 8764-keycloak_user_federation-make-mapper-removal-optout.yml
- 8766-mh-deco-improve.yml
- 8776-mute-vardict-deprecation.yml
- 8790-gitlab_project-fix-cleanup-policy-on-project-create.yml
- 8791-mh-cause-changes-param-depr.yml
- 8793-pipx-global.yml
- 8794-Fixing-possible-concatination-error.yaml
- 8796-gitlab-access-token-check-mode.yml
- 8809-pipx-new-params.yml
- 8814-dict-comprehension.yml
- 8822-dict-comprehension.yml
- 8823-keycloak-realm-key.yml
- 8831-fix-error-when-mapper-id-is-provided.yml
- 8833-dict-comprehension.yml
- 9.4.0.yml
modules:
- description: Allows managing Keycloak User Profiles.
name: keycloak_userprofile
namespace: ''
- description: Manages OpenNebula virtual networks.
name: one_vnet
namespace: ''
release_date: '2024-09-09'

View File

@@ -19,3 +19,4 @@ sections:
- guide_deps
- guide_vardict
- guide_cmdrunner
- guide_modulehelper

View File

@@ -9,6 +9,8 @@ edit_on_github:
path_prefix: ''
extra_links:
- description: Ask for help
url: https://forum.ansible.com/c/help/6/none
- description: Submit a bug report
url: https://github.com/ansible-collections/community.general/issues/new?assignees=&labels=&template=bug_report.yml
- description: Request a feature
@@ -22,10 +24,10 @@ communication:
- topic: General usage and support questions
network: Libera
channel: '#ansible'
mailing_lists:
- topic: Ansible Project List
url: https://groups.google.com/g/ansible-project
forums:
- topic: Ansible Forum
- topic: "Ansible Forum: General usage and support questions"
# The following URL directly points to the "Get Help" section
url: https://forum.ansible.com/c/help/6/none
- topic: "Ansible Forum: Discussions about the collection itself, not for specific modules or plugins"
# The following URL directly points to the "community-general" tag
url: https://forum.ansible.com/tag/community-general

View File

@@ -0,0 +1,540 @@
..
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
.. _ansible_collections.community.general.docsite.guide_modulehelper:
Module Helper guide
===================
Introduction
^^^^^^^^^^^^
Writing a module for Ansible is largely described in existing documentation.
However, a good part of that is boilerplate code that needs to be repeated every single time.
That is where ``ModuleHelper`` comes to assistance: a lot of that boilerplate code is done.
.. _ansible_collections.community.general.docsite.guide_modulehelper.quickstart:
Quickstart
""""""""""
See the `example from Ansible documentation <https://docs.ansible.com/ansible/latest/dev_guide/developing_modules_general.html#creating-a-module>`_
written with ``ModuleHelper``.
But bear in mind that it does not showcase all of MH's features:
.. code-block:: python
from ansible_collections.community.general.plugins.module_utils.module_helper import ModuleHelper
class MyTest(ModuleHelper):
module = dict(
argument_spec=dict(
name=dict(type='str', required=True),
new=dict(type='bool', required=False, default=False),
),
supports_check_mode=True,
)
use_old_vardict = False
def __run__(self):
self.vars.original_message = ''
self.vars.message = ''
if self.check_mode:
return
self.vars.original_message = self.vars.name
self.vars.message = 'goodbye'
self.changed = self.vars['new']
if self.vars.name == "fail me":
self.do_raise("You requested this to fail")
def main():
MyTest.execute()
if __name__ == '__main__':
main()
Module Helper
^^^^^^^^^^^^^
Introduction
""""""""""""
``ModuleHelper`` is a wrapper around the standard ``AnsibleModule``, providing extra features and conveniences.
The basic structure of a module using ``ModuleHelper`` is as shown in the
:ref:`ansible_collections.community.general.docsite.guide_modulehelper.quickstart`
section above, but there are more elements that will take part in it.
.. code-block:: python
from ansible_collections.community.general.plugins.module_utils.module_helper import ModuleHelper
class MyTest(ModuleHelper):
output_params = ()
change_params = ()
diff_params = ()
facts_name = None
facts_params = ()
use_old_vardict = True
mute_vardict_deprecation = False
module = dict(
argument_spec=dict(...),
# ...
)
After importing the ``ModuleHelper`` class, you need to declare your own class extending it.
.. seealso::
There is a variation called ``StateModuleHelper``, which builds on top of the features provided by MH.
See :ref:`ansible_collections.community.general.docsite.guide_modulehelper.statemh` below for more details.
The easiest way of specifying the module is to create the class variable ``module`` with a dictionary
containing the exact arguments that would be passed as parameters to ``AnsibleModule``.
If you prefer to create the ``AnsibleModule`` object yourself, just assign it to the ``module`` class variable.
MH also accepts a parameter ``module`` in its constructor, if that parameter is used used,
then it will override the class variable. The parameter can either be ``dict`` or ``AnsibleModule`` as well.
Beyond the definition of the module, there are other variables that can be used to control aspects
of MH's behavior. These variables should be set at the very beginning of the class, and their semantics are
explained through this document.
The main logic of MH happens in the ``ModuleHelper.run()`` method, which looks like:
.. code-block:: python
@module_fails_on_exception
def run(self):
self.__init_module__()
self.__run__()
self.__quit_module__()
output = self.output
if 'failed' not in output:
output['failed'] = False
self.module.exit_json(changed=self.has_changed(), **output)
The method ``ModuleHelper.__run__()`` must be implemented by the module and most
modules will be able to perform their actions implementing only that MH method.
However, in some cases, you might want to execute actions before or after the main tasks, in which cases
you should implement ``ModuleHelper.__init_module__()`` and ``ModuleHelper.__quit_module__()`` respectively.
Note that the output comes from ``self.output``, which is a ``@property`` method.
By default, that property will collect all the variables that are marked for output and return them in a dictionary with their values.
Moreover, the default ``self.output`` will also handle Ansible ``facts`` and *diff mode*.
Also note the changed status comes from ``self.has_changed()``, which is usually calculated from variables that are marked
to track changes in their content.
.. seealso::
More details in sections
:ref:`ansible_collections.community.general.docsite.guide_modulehelper.paramvaroutput` and
:ref:`ansible_collections.community.general.docsite.guide_modulehelper.changes` below.
.. seealso::
See more about the decorator
:ref:`ansible_collections.community.general.docsite.guide_modulehelper.modulefailsdeco` below.
Another way to write the example from the
:ref:`ansible_collections.community.general.docsite.guide_modulehelper.quickstart`
would be:
.. code-block:: python
def __init_module__(self):
self.vars.original_message = ''
self.vars.message = ''
def __run__(self):
if self.check_mode:
return
self.vars.original_message = self.vars.name
self.vars.message = 'goodbye'
self.changed = self.vars['new']
def __quit_module__(self):
if self.vars.name == "fail me":
self.do_raise("You requested this to fail")
Notice that there are no calls to ``module.exit_json()`` nor ``module.fail_json()``: if the module fails, raise an exception.
You can use the convenience method ``self.do_raise()`` or raise the exception as usual in Python to do that.
If no exception is raised, then the module succeeds.
.. seealso::
See more about exceptions in section
:ref:`ansible_collections.community.general.docsite.guide_modulehelper.exceptions` below.
Ansible modules must have a ``main()`` function and the usual test for ``'__main__'``. When using MH that should look like:
.. code-block:: python
def main():
MyTest.execute()
if __name__ == '__main__':
main()
The class method ``execute()`` is nothing more than a convenience shorcut for:
.. code-block:: python
m = MyTest()
m.run()
Optionally, an ``AnsibleModule`` may be passed as parameter to ``execute()``.
.. _ansible_collections.community.general.docsite.guide_modulehelper.paramvaroutput:
Parameters, variables, and output
"""""""""""""""""""""""""""""""""
All the parameters automatically become variables in the ``self.vars`` attribute, which is of the ``VarDict`` type.
By using ``self.vars``, you get a central mechanism to access the parameters but also to expose variables as return values of the module.
As described in :ref:`ansible_collections.community.general.docsite.guide_vardict`, variables in ``VarDict`` have metadata associated to them.
One of the attributes in that metadata marks the variable for output, and MH makes use of that to generate the module's return values.
.. important::
The ``VarDict`` feature described was introduced in community.general 7.1.0, but there was a first
implementation of it embedded within ``ModuleHelper``.
That older implementation is now deprecated and will be removed in community.general 11.0.0.
After community.general 7.1.0, MH modules generate a deprecation message about *using the old VarDict*.
There are two ways to prevent that from happening:
#. Set ``mute_vardict_deprecation = True`` and the deprecation will be silenced. If the module still uses the old ``VarDict``,
it will not be able to update to community.general 11.0.0 (Spring 2026) upon its release.
#. Set ``use_old_vardict = False`` to make the MH module use the new ``VarDict`` immediatelly.
The new ``VarDict`` and its use is documented and this is the recommended way to handle this.
.. code-block:: python
class MyTest(ModuleHelper):
use_old_vardict = False
mute_vardict_deprecation = True
...
These two settings are mutually exclusive, but that is not enforced and the behavior when setting both is not specified.
Contrary to new variables created in ``VarDict``, module parameters are not set for output by default.
If you want to include some module parameters in the output, list them in the ``output_params`` class variable.
.. code-block:: python
class MyTest(ModuleHelper):
output_params = ('state', 'name')
...
Another neat feature provided by MH by using ``VarDict`` is the automatic tracking of changes when setting the metadata ``change=True``.
Again, to enable this feature for module parameters, you must list them in the ``change_params`` class variable.
.. code-block:: python
class MyTest(ModuleHelper):
# example from community.general.xfconf
change_params = ('value', )
...
.. seealso::
See more about this in
:ref:`ansible_collections.community.general.docsite.guide_modulehelper.changes` below.
Similarly, if you want to use Ansible's diff mode, you can set the metadata ``diff=True`` and ``diff_params`` for module parameters.
With that, MH will automatically generate the diff output for variables that have changed.
.. code-block:: python
class MyTest(ModuleHelper):
diff_params = ('value', )
def __run__(self):
# example from community.general.gio_mime
self.vars.set_meta("handler", initial_value=gio_mime_get(self.runner, self.vars.mime_type), diff=True, change=True)
Moreover, if a module is set to return *facts* instead of return values, then again use the metadata ``fact=True`` and ``fact_params`` for module parameters.
Additionally, you must specify ``facts_name``, as in:
.. code-block:: python
class VolumeFacts(ModuleHelper):
facts_name = 'volume_facts'
def __init_module__(self):
self.vars.set("volume", 123, fact=True)
That generates an Ansible fact like:
.. code-block:: yaml+jinja
- name: Obtain volume facts
some.collection.volume_facts:
# parameters
- name: Print volume facts
debug:
msg: Volume fact is {{ ansible_facts.volume_facts.volume }}
.. important::
If ``facts_name`` is not set, the module does not generate any facts.
.. _ansible_collections.community.general.docsite.guide_modulehelper.changes:
Handling changes
""""""""""""""""
In MH there are many ways to indicate change in the module execution. Here they are:
Tracking changes in variables
-----------------------------
As explained above, you can enable change tracking in any number of variables in ``self.vars``.
By the end of the module execution, if any of those variables has a value different then the first value assigned to them,
then that will be picked up by MH and signalled as changed at the module output.
See the example below to learn how you can enabled change tracking in variables:
.. code-block:: python
# using __init_module__() as example, it works the same in __run__() and __quit_module__()
def __init_module__(self):
# example from community.general.ansible_galaxy_install
self.vars.set("new_roles", {}, change=True)
# example of "hidden" variable used only to track change in a value from community.general.gconftool2
self.vars.set('_value', self.vars.previous_value, output=False, change=True)
# enable change-tracking without assigning value
self.vars.set_meta("new_roles", change=True)
# if you must forcibly set an initial value to the variable
self.vars.set_meta("new_roles", initial_value=[])
...
If the end value of any variable marked ``change`` is different from its initial value, then MH will return ``changed=True``.
Indicating changes with ``changed``
-----------------------------------
If you want to indicate change directly in the code, then use the ``self.changed`` property in MH.
Beware that this is a ``@property`` method in MH, with both a *getter* and a *setter*.
By default, that hidden field is set to ``False``.
Effective change
----------------
The effective outcome for the module is determined in the ``self.has_changed()`` method, and it consists of the logical *OR* operation
between ``self.changed`` and the change calculated from ``self.vars``.
.. _ansible_collections.community.general.docsite.guide_modulehelper.exceptions:
Exceptions
""""""""""
In MH, instead of calling ``module.fail_json()`` you can just raise an exception.
The output variables are collected the same way they would be for a successful execution.
However, you can set output variables specifically for that exception, if you so choose.
.. code-block:: python
def __init_module__(self):
if not complex_validation():
self.do_raise("Validation failed!")
# Or passing output variables
awesomeness = calculate_awesomeness()
if awesomeness > 1000:
self.do_raise("Over awesome, I cannot handle it!", update_output={"awesomeness": awesomeness})
All exceptions derived from ``Exception`` are captured and translated into a ``fail_json()`` call.
However, if you do want to call ``self.module.fail_json()`` yourself it will work,
just keep in mind that there will be no automatic handling of output variables in that case.
.. _ansible_collections.community.general.docsite.guide_modulehelper.statemh:
StateModuleHelper
^^^^^^^^^^^^^^^^^
Many modules use a parameter ``state`` that effectively controls the exact action performed by the module, such as
``state=present`` or ``state=absent`` for installing or removing packages.
By using ``StateModuleHelper`` you can make your code like the excerpt from the ``gconftool2`` below:
.. code-block:: python
from ansible_collections.community.general.plugins.module_utils.module_helper import StateModuleHelper
class GConftool(StateModuleHelper):
...
module = dict(
...
)
use_old_vardict = False
def __init_module__(self):
self.runner = gconftool2_runner(self.module, check_rc=True)
...
self.vars.set('previous_value', self._get(), fact=True)
self.vars.set('value_type', self.vars.value_type)
self.vars.set('_value', self.vars.previous_value, output=False, change=True)
self.vars.set_meta('value', initial_value=self.vars.previous_value)
self.vars.set('playbook_value', self.vars.value, fact=True)
...
def state_absent(self):
with self.runner("state key", output_process=self._make_process(False)) as ctx:
ctx.run()
self.vars.set('run_info', ctx.run_info, verbosity=4)
self.vars.set('new_value', None, fact=True)
self.vars._value = None
def state_present(self):
with self.runner("direct config_source value_type state key value", output_process=self._make_process(True)) as ctx:
ctx.run()
self.vars.set('run_info', ctx.run_info, verbosity=4)
self.vars.set('new_value', self._get(), fact=True)
self.vars._value = self.vars.new_value
Note that the method ``__run__()`` is implemented in ``StateModuleHelper``, all you need to implement are the methods ``state_<state_value>``.
In the example above, :ansplugin:`community.general.gconftool2#module` only has two states, ``present`` and ``absent``, thus, ``state_present()`` and ``state_absent()``.
If the controlling parameter is not called ``state``, like in :ansplugin:`community.general.jira#module` module, just let SMH know about it:
.. code-block:: python
class JIRA(StateModuleHelper):
state_param = 'operation'
def operation_create(self):
...
def operation_search(self):
...
Lastly, if the module is called with ``state=somevalue`` and the method ``state_somevalue``
is not implemented, SMH will resort to call a method called ``__state_fallback__()``.
By default, this method will raise a ``ValueError`` indicating the method was not found.
Naturally, you can override that method to write a default implementation, as in :ansplugin:`community.general.locale_gen#module`:
.. code-block:: python
def __state_fallback__(self):
if self.vars.state_tracking == self.vars.state:
return
if self.vars.ubuntu_mode:
self.apply_change_ubuntu(self.vars.state, self.vars.name)
else:
self.apply_change(self.vars.state, self.vars.name)
That module has only the states ``present`` and ``absent`` and the code for both is the one in the fallback method.
.. note::
The name of the fallback method **does not change** if you set a different value of ``state_param``.
Other Conveniences
^^^^^^^^^^^^^^^^^^
Delegations to AnsibleModule
""""""""""""""""""""""""""""
The MH properties and methods below are delegated as-is to the underlying ``AnsibleModule`` instance in ``self.module``:
- ``check_mode``
- ``get_bin_path()``
- ``warn()``
- ``deprecate()``
Additionally, MH will also delegate:
- ``diff_mode`` to ``self.module._diff``
- ``verbosity`` to ``self.module._verbosity``
Decorators
""""""""""
The following decorators should only be used within ``ModuleHelper`` class.
@cause_changes
--------------
This decorator will control whether the outcome of the method will cause the module to signal change in its output.
If the method completes without raising an exception it is considered to have succeeded, otherwise, it will have failed.
The decorator has a parameter ``when`` that accepts three different values: ``success``, ``failure``, and ``always``.
There are also two legacy parameters, ``on_success`` and ``on_failure``, that will be deprecated, so do not use them.
The value of ``changed`` in the module output will be set to ``True``:
- ``when="success"`` and the method completes without raising an exception.
- ``when="failure"`` and the method raises an exception.
- ``when="always"``, regardless of the method raising an exception or not.
.. code-block:: python
from ansible_collections.community.general.plugins.module_utils.module_helper import cause_changes
# adapted excerpt from the community.general.jira module
class JIRA(StateModuleHelper):
@cause_changes(when="success")
def operation_create(self):
...
If ``when`` has a different value or no parameters are specificied, the decorator will have no effect whatsoever.
.. _ansible_collections.community.general.docsite.guide_modulehelper.modulefailsdeco:
@module_fails_on_exception
--------------------------
In a method using this decorator, if an exception is raised, the text message of that exception will be captured
by the decorator and used to call ``self.module.fail_json()``.
In most of the cases there will be no need to use this decorator, because ``ModuleHelper.run()`` already uses it.
@check_mode_skip
----------------
If the module is running in check mode, this decorator will prevent the method from executing.
The return value in that case is ``None``.
.. code-block:: python
from ansible_collections.community.general.plugins.module_utils.module_helper import check_mode_skip
# adapted excerpt from the community.general.locale_gen module
class LocaleGen(StateModuleHelper):
@check_mode_skip
def __state_fallback__(self):
...
@check_mode_skip_returns
------------------------
This decorator is similar to the previous one, but the developer can control the return value for the method when running in check mode.
It is used with one of two parameters. One is ``callable`` and the return value in check mode will be ``callable(self, *args, **kwargs)``,
where ``self`` is the ``ModuleHelper`` instance and the union of ``args`` and ``kwargs`` will contain all the parameters passed to the method.
The other option is to use the parameter ``value``, in which case the method will return ``value`` when in check mode.
References
^^^^^^^^^^
- `Ansible Developer Guide <https://docs.ansible.com/ansible/latest/dev_guide/index.html>`_
- `Creating a module <https://docs.ansible.com/ansible/latest/dev_guide/developing_modules_general.html#creating-a-module>`_
- `Returning ansible facts <https://docs.ansible.com/ansible/latest/reference_appendices/common_return_values.html#ansible-facts>`_
- :ref:`ansible_collections.community.general.docsite.guide_vardict`
.. versionadded:: 3.1.0

View File

@@ -5,7 +5,7 @@
namespace: community
name: general
version: 9.2.0
version: 9.4.0
readme: README.md
authors:
- Ansible (https://github.com/ansible)

View File

@@ -88,6 +88,10 @@ class ActionModule(ActionBase):
max_timeout = self._connection._play_context.timeout
module_args = self._task.args
async_status_args = {}
starter_cmd = None
confirm_cmd = None
if module_args.get('state', None) == 'restored':
if not wrap_async:
if not check_mode:

View File

@@ -13,7 +13,8 @@ DOCUMENTATION = '''
author: Ansible Core Team
options:
become_user:
description: User you 'become' to execute the task
description: User you 'become' to execute the task.
type: string
ini:
- section: privilege_escalation
key: become_user
@@ -26,7 +27,8 @@ DOCUMENTATION = '''
- name: ANSIBLE_BECOME_USER
- name: ANSIBLE_DOAS_USER
become_exe:
description: Doas executable
description: Doas executable.
type: string
default: doas
ini:
- section: privilege_escalation
@@ -40,7 +42,8 @@ DOCUMENTATION = '''
- name: ANSIBLE_BECOME_EXE
- name: ANSIBLE_DOAS_EXE
become_flags:
description: Options to pass to doas
description: Options to pass to doas.
type: string
default: ''
ini:
- section: privilege_escalation
@@ -54,7 +57,8 @@ DOCUMENTATION = '''
- name: ANSIBLE_BECOME_FLAGS
- name: ANSIBLE_DOAS_FLAGS
become_pass:
description: password for doas prompt
description: Password for doas prompt.
type: string
required: false
vars:
- name: ansible_become_password
@@ -68,8 +72,10 @@ DOCUMENTATION = '''
key: password
prompt_l10n:
description:
- List of localized strings to match for prompt detection
- If empty we'll use the built in one
- List of localized strings to match for prompt detection.
- If empty we will use the built in one.
type: list
elements: string
default: []
ini:
- section: doas_become_plugin

View File

@@ -13,7 +13,8 @@ DOCUMENTATION = '''
author: Ansible Core Team
options:
become_user:
description: User you 'become' to execute the task
description: User you 'become' to execute the task.
type: string
ini:
- section: privilege_escalation
key: become_user
@@ -26,7 +27,8 @@ DOCUMENTATION = '''
- name: ANSIBLE_BECOME_USER
- name: ANSIBLE_DZDO_USER
become_exe:
description: Dzdo executable
description: Dzdo executable.
type: string
default: dzdo
ini:
- section: privilege_escalation
@@ -40,7 +42,8 @@ DOCUMENTATION = '''
- name: ANSIBLE_BECOME_EXE
- name: ANSIBLE_DZDO_EXE
become_flags:
description: Options to pass to dzdo
description: Options to pass to dzdo.
type: string
default: -H -S -n
ini:
- section: privilege_escalation
@@ -54,7 +57,8 @@ DOCUMENTATION = '''
- name: ANSIBLE_BECOME_FLAGS
- name: ANSIBLE_DZDO_FLAGS
become_pass:
description: Options to pass to dzdo
description: Options to pass to dzdo.
type: string
required: false
vars:
- name: ansible_become_password

View File

@@ -13,7 +13,8 @@ DOCUMENTATION = '''
author: Ansible Core Team
options:
become_user:
description: User you 'become' to execute the task
description: User you 'become' to execute the task.
type: string
ini:
- section: privilege_escalation
key: become_user
@@ -27,7 +28,8 @@ DOCUMENTATION = '''
- name: ANSIBLE_KSU_USER
required: true
become_exe:
description: Su executable
description: Su executable.
type: string
default: ksu
ini:
- section: privilege_escalation
@@ -41,7 +43,8 @@ DOCUMENTATION = '''
- name: ANSIBLE_BECOME_EXE
- name: ANSIBLE_KSU_EXE
become_flags:
description: Options to pass to ksu
description: Options to pass to ksu.
type: string
default: ''
ini:
- section: privilege_escalation
@@ -55,7 +58,8 @@ DOCUMENTATION = '''
- name: ANSIBLE_BECOME_FLAGS
- name: ANSIBLE_KSU_FLAGS
become_pass:
description: ksu password
description: Ksu password.
type: string
required: false
vars:
- name: ansible_ksu_pass
@@ -69,8 +73,10 @@ DOCUMENTATION = '''
key: password
prompt_l10n:
description:
- List of localized strings to match for prompt detection
- If empty we'll use the built in one
- List of localized strings to match for prompt detection.
- If empty we will use the built in one.
type: list
elements: string
default: []
ini:
- section: ksu_become_plugin

View File

@@ -13,7 +13,8 @@ DOCUMENTATION = '''
author: Ansible Core Team
options:
become_user:
description: User you 'become' to execute the task
description: User you 'become' to execute the task.
type: string
default: ''
ini:
- section: privilege_escalation
@@ -27,7 +28,8 @@ DOCUMENTATION = '''
- name: ANSIBLE_BECOME_USER
- name: ANSIBLE_MACHINECTL_USER
become_exe:
description: Machinectl executable
description: Machinectl executable.
type: string
default: machinectl
ini:
- section: privilege_escalation
@@ -41,7 +43,8 @@ DOCUMENTATION = '''
- name: ANSIBLE_BECOME_EXE
- name: ANSIBLE_MACHINECTL_EXE
become_flags:
description: Options to pass to machinectl
description: Options to pass to machinectl.
type: string
default: ''
ini:
- section: privilege_escalation
@@ -55,7 +58,8 @@ DOCUMENTATION = '''
- name: ANSIBLE_BECOME_FLAGS
- name: ANSIBLE_MACHINECTL_FLAGS
become_pass:
description: Password for machinectl
description: Password for machinectl.
type: string
required: false
vars:
- name: ansible_become_password

View File

@@ -13,7 +13,8 @@ DOCUMENTATION = '''
author: Ansible Core Team
options:
become_user:
description: User you 'become' to execute the task
description: User you 'become' to execute the task.
type: string
default: ''
ini:
- section: privilege_escalation
@@ -27,7 +28,8 @@ DOCUMENTATION = '''
- name: ANSIBLE_BECOME_USER
- name: ANSIBLE_PBRUN_USER
become_exe:
description: Sudo executable
description: Sudo executable.
type: string
default: pbrun
ini:
- section: privilege_escalation
@@ -41,7 +43,8 @@ DOCUMENTATION = '''
- name: ANSIBLE_BECOME_EXE
- name: ANSIBLE_PBRUN_EXE
become_flags:
description: Options to pass to pbrun
description: Options to pass to pbrun.
type: string
default: ''
ini:
- section: privilege_escalation
@@ -55,7 +58,8 @@ DOCUMENTATION = '''
- name: ANSIBLE_BECOME_FLAGS
- name: ANSIBLE_PBRUN_FLAGS
become_pass:
description: Password for pbrun
description: Password for pbrun.
type: string
required: false
vars:
- name: ansible_become_password
@@ -68,7 +72,7 @@ DOCUMENTATION = '''
- section: pbrun_become_plugin
key: password
wrap_exe:
description: Toggle to wrap the command pbrun calls in 'shell -c' or not
description: Toggle to wrap the command pbrun calls in C(shell -c) or not.
default: false
type: bool
ini:

View File

@@ -14,9 +14,10 @@ DOCUMENTATION = '''
options:
become_user:
description:
- User you 'become' to execute the task
- User you 'become' to execute the task.
- This plugin ignores this setting as pfexec uses it's own C(exec_attr) to figure this out,
but it is supplied here for Ansible to make decisions needed for the task execution, like file permissions.
type: string
default: root
ini:
- section: privilege_escalation
@@ -30,7 +31,8 @@ DOCUMENTATION = '''
- name: ANSIBLE_BECOME_USER
- name: ANSIBLE_PFEXEC_USER
become_exe:
description: Sudo executable
description: Sudo executable.
type: string
default: pfexec
ini:
- section: privilege_escalation
@@ -44,7 +46,8 @@ DOCUMENTATION = '''
- name: ANSIBLE_BECOME_EXE
- name: ANSIBLE_PFEXEC_EXE
become_flags:
description: Options to pass to pfexec
description: Options to pass to pfexec.
type: string
default: -H -S -n
ini:
- section: privilege_escalation
@@ -58,7 +61,8 @@ DOCUMENTATION = '''
- name: ANSIBLE_BECOME_FLAGS
- name: ANSIBLE_PFEXEC_FLAGS
become_pass:
description: pfexec password
description: pfexec password.
type: string
required: false
vars:
- name: ansible_become_password
@@ -71,7 +75,7 @@ DOCUMENTATION = '''
- section: pfexec_become_plugin
key: password
wrap_exe:
description: Toggle to wrap the command pfexec calls in 'shell -c' or not
description: Toggle to wrap the command pfexec calls in C(shell -c) or not.
default: false
type: bool
ini:
@@ -82,7 +86,7 @@ DOCUMENTATION = '''
env:
- name: ANSIBLE_PFEXEC_WRAP_EXECUTION
notes:
- This plugin ignores O(become_user) as pfexec uses it's own C(exec_attr) to figure this out.
- This plugin ignores O(become_user) as pfexec uses its own C(exec_attr) to figure this out.
'''
from ansible.plugins.become import BecomeBase

View File

@@ -14,6 +14,7 @@ DOCUMENTATION = '''
options:
become_exe:
description: Sudo executable
type: string
default: pmrun
ini:
- section: privilege_escalation
@@ -27,7 +28,8 @@ DOCUMENTATION = '''
- name: ANSIBLE_BECOME_EXE
- name: ANSIBLE_PMRUN_EXE
become_flags:
description: Options to pass to pmrun
description: Options to pass to pmrun.
type: string
default: ''
ini:
- section: privilege_escalation
@@ -41,7 +43,8 @@ DOCUMENTATION = '''
- name: ANSIBLE_BECOME_FLAGS
- name: ANSIBLE_PMRUN_FLAGS
become_pass:
description: pmrun password
description: pmrun password.
type: string
required: false
vars:
- name: ansible_become_password

View File

@@ -13,7 +13,8 @@ DOCUMENTATION = '''
author: ansible (@nekonyuu)
options:
become_user:
description: User you 'become' to execute the task
description: User you 'become' to execute the task.
type: string
default: ''
ini:
- section: privilege_escalation
@@ -27,7 +28,8 @@ DOCUMENTATION = '''
- name: ANSIBLE_BECOME_USER
- name: ANSIBLE_SESU_USER
become_exe:
description: sesu executable
description: sesu executable.
type: string
default: sesu
ini:
- section: privilege_escalation
@@ -41,7 +43,8 @@ DOCUMENTATION = '''
- name: ANSIBLE_BECOME_EXE
- name: ANSIBLE_SESU_EXE
become_flags:
description: Options to pass to sesu
description: Options to pass to sesu.
type: string
default: -H -S -n
ini:
- section: privilege_escalation
@@ -55,7 +58,8 @@ DOCUMENTATION = '''
- name: ANSIBLE_BECOME_FLAGS
- name: ANSIBLE_SESU_FLAGS
become_pass:
description: Password to pass to sesu
description: Password to pass to sesu.
type: string
required: false
vars:
- name: ansible_become_password

View File

@@ -16,6 +16,7 @@ DOCUMENTATION = """
options:
become_user:
description: User you 'become' to execute the task.
type: string
default: root
ini:
- section: privilege_escalation
@@ -30,6 +31,7 @@ DOCUMENTATION = """
- name: ANSIBLE_SUDO_USER
become_flags:
description: Options to pass to C(sudo).
type: string
default: -H -S -n
ini:
- section: privilege_escalation
@@ -44,6 +46,7 @@ DOCUMENTATION = """
- name: ANSIBLE_SUDO_FLAGS
become_pass:
description: Password to pass to C(sudo).
type: string
required: false
vars:
- name: ansible_become_password

View File

@@ -29,6 +29,7 @@ DOCUMENTATION = '''
section: defaults
_prefix:
description: User defined prefix to use when creating the DB entries
type: string
default: ansible_facts
env:
- name: ANSIBLE_CACHE_PLUGIN_PREFIX
@@ -37,13 +38,14 @@ DOCUMENTATION = '''
section: defaults
_timeout:
default: 86400
type: integer
# TODO: determine whether it is OK to change to: type: float
description: Expiration timeout in seconds for the cache plugin data. Set to 0 to never expire
env:
- name: ANSIBLE_CACHE_PLUGIN_TIMEOUT
ini:
- key: fact_caching_timeout
section: defaults
type: integer
'''
import collections

View File

@@ -24,6 +24,7 @@ DOCUMENTATION = '''
ini:
- key: fact_caching_connection
section: defaults
type: path
_prefix:
description: User defined prefix to use when creating the files
env:
@@ -31,6 +32,7 @@ DOCUMENTATION = '''
ini:
- key: fact_caching_prefix
section: defaults
type: string
_timeout:
default: 86400
description: Expiration timeout in seconds for the cache plugin data. Set to 0 to never expire
@@ -39,6 +41,7 @@ DOCUMENTATION = '''
ini:
- key: fact_caching_timeout
section: defaults
type: float
'''
try:

View File

@@ -21,6 +21,7 @@ DOCUMENTATION = '''
- The format is V(host:port:db:password), for example V(localhost:6379:0:changeme).
- To use encryption in transit, prefix the connection with V(tls://), as in V(tls://localhost:6379:0:changeme).
- To use redis sentinel, use separator V(;), for example V(localhost:26379;localhost:26379;0:changeme). Requires redis>=2.9.0.
type: string
required: true
env:
- name: ANSIBLE_CACHE_PLUGIN_CONNECTION
@@ -29,6 +30,7 @@ DOCUMENTATION = '''
section: defaults
_prefix:
description: User defined prefix to use when creating the DB entries
type: string
default: ansible_facts
env:
- name: ANSIBLE_CACHE_PLUGIN_PREFIX
@@ -37,6 +39,7 @@ DOCUMENTATION = '''
section: defaults
_keyset_name:
description: User defined name for cache keyset name.
type: string
default: ansible_cache_keys
env:
- name: ANSIBLE_CACHE_REDIS_KEYSET_NAME
@@ -46,6 +49,7 @@ DOCUMENTATION = '''
version_added: 1.3.0
_sentinel_service_name:
description: The redis sentinel service name (or referenced as cluster name).
type: string
env:
- name: ANSIBLE_CACHE_REDIS_SENTINEL
ini:
@@ -54,13 +58,14 @@ DOCUMENTATION = '''
version_added: 1.3.0
_timeout:
default: 86400
type: integer
# TODO: determine whether it is OK to change to: type: float
description: Expiration timeout in seconds for the cache plugin data. Set to 0 to never expire
env:
- name: ANSIBLE_CACHE_PLUGIN_TIMEOUT
ini:
- key: fact_caching_timeout
section: defaults
type: integer
'''
import re
@@ -222,7 +227,7 @@ class CacheModule(BaseCacheModule):
def copy(self):
# TODO: there is probably a better way to do this in redis
ret = dict([(k, self.get(k)) for k in self.keys()])
ret = {k: self.get(k) for k in self.keys()}
return ret
def __getstate__(self):

View File

@@ -24,6 +24,7 @@ DOCUMENTATION = '''
ini:
- key: fact_caching_connection
section: defaults
type: string
_prefix:
description: User defined prefix to use when creating the files
env:
@@ -31,6 +32,7 @@ DOCUMENTATION = '''
ini:
- key: fact_caching_prefix
section: defaults
type: string
_timeout:
default: 86400
description: Expiration timeout in seconds for the cache plugin data. Set to 0 to never expire
@@ -40,6 +42,7 @@ DOCUMENTATION = '''
- key: fact_caching_timeout
section: defaults
type: integer
# TODO: determine whether it is OK to change to: type: float
'''

View File

@@ -25,6 +25,7 @@ DOCUMENTATION = '''
max_mem_file:
required: true
description: Path to cgroups C(memory.max_usage_in_bytes) file. Example V(/sys/fs/cgroup/memory/ansible_profile/memory.max_usage_in_bytes).
type: str
env:
- name: CGROUP_MAX_MEM_FILE
ini:
@@ -33,6 +34,7 @@ DOCUMENTATION = '''
cur_mem_file:
required: true
description: Path to C(memory.usage_in_bytes) file. Example V(/sys/fs/cgroup/memory/ansible_profile/memory.usage_in_bytes).
type: str
env:
- name: CGROUP_CUR_MEM_FILE
ini:

View File

@@ -25,6 +25,7 @@ DOCUMENTATION = '''
options:
token:
description: HipChat API token for v1 or v2 API.
type: str
required: true
env:
- name: HIPCHAT_TOKEN
@@ -33,6 +34,10 @@ DOCUMENTATION = '''
key: token
api_version:
description: HipChat API version, v1 or v2.
type: str
choices:
- v1
- v2
required: false
default: v1
env:
@@ -42,6 +47,7 @@ DOCUMENTATION = '''
key: api_version
room:
description: HipChat room to post in.
type: str
default: ansible
env:
- name: HIPCHAT_ROOM
@@ -50,6 +56,7 @@ DOCUMENTATION = '''
key: room
from:
description: Name to post as
type: str
default: ansible
env:
- name: HIPCHAT_FROM

View File

@@ -20,21 +20,25 @@ DOCUMENTATION = '''
options:
server:
description: connection info to jabber server
type: str
required: true
env:
- name: JABBER_SERV
user:
description: Jabber user to authenticate as
type: str
required: true
env:
- name: JABBER_USER
password:
description: Password for the user to the jabber server
type: str
required: true
env:
- name: JABBER_PASS
to:
description: chat identifier that will receive the message
type: str
required: true
env:
- name: JABBER_TO

View File

@@ -21,6 +21,7 @@ DOCUMENTATION = '''
log_folder:
default: /var/log/ansible/hosts
description: The folder where log files will be created.
type: str
env:
- name: ANSIBLE_LOG_FOLDER
ini:

View File

@@ -21,6 +21,7 @@ DOCUMENTATION = '''
options:
workspace_id:
description: Workspace ID of the Azure log analytics workspace.
type: str
required: true
env:
- name: WORKSPACE_ID
@@ -29,6 +30,7 @@ DOCUMENTATION = '''
key: workspace_id
shared_key:
description: Shared key to connect to Azure log analytics workspace.
type: str
required: true
env:
- name: WORKSPACE_SHARED_KEY

View File

@@ -22,6 +22,7 @@ DOCUMENTATION = '''
options:
api:
description: URI to the Logentries API.
type: str
env:
- name: LOGENTRIES_API
default: data.logentries.com
@@ -30,6 +31,7 @@ DOCUMENTATION = '''
key: api
port:
description: HTTP port to use when connecting to the API.
type: int
env:
- name: LOGENTRIES_PORT
default: 80
@@ -38,6 +40,7 @@ DOCUMENTATION = '''
key: port
tls_port:
description: Port to use when connecting to the API when TLS is enabled.
type: int
env:
- name: LOGENTRIES_TLS_PORT
default: 443
@@ -46,6 +49,7 @@ DOCUMENTATION = '''
key: tls_port
token:
description: The logentries C(TCP token).
type: str
env:
- name: LOGENTRIES_ANSIBLE_TOKEN
required: true

View File

@@ -20,6 +20,7 @@ DOCUMENTATION = r'''
options:
server:
description: Address of the Logstash server.
type: str
env:
- name: LOGSTASH_SERVER
ini:
@@ -29,6 +30,7 @@ DOCUMENTATION = r'''
default: localhost
port:
description: Port on which logstash is listening.
type: int
env:
- name: LOGSTASH_PORT
ini:
@@ -38,6 +40,7 @@ DOCUMENTATION = r'''
default: 5000
type:
description: Message type.
type: str
env:
- name: LOGSTASH_TYPE
ini:
@@ -47,6 +50,7 @@ DOCUMENTATION = r'''
default: ansible
pre_command:
description: Executes command before run and its result is added to the C(ansible_pre_command_output) logstash field.
type: str
version_added: 2.0.0
ini:
- section: callback_logstash

View File

@@ -85,7 +85,6 @@ DOCUMENTATION = '''
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
@@ -356,6 +355,7 @@ class OpenTelemetrySource(object):
status = Status(status_code=StatusCode.OK)
if host_data.status != 'included':
# Support loops
enriched_error_message = None
if 'results' in host_data.result._result:
if host_data.status == 'failed':
message = self.get_error_message_from_results(host_data.result._result['results'], task_data.action)

View File

@@ -22,6 +22,7 @@ DOCUMENTATION = '''
webhook_url:
required: true
description: Slack Webhook URL.
type: str
env:
- name: SLACK_WEBHOOK_URL
ini:
@@ -30,6 +31,7 @@ DOCUMENTATION = '''
channel:
default: "#ansible"
description: Slack room to post in.
type: str
env:
- name: SLACK_CHANNEL
ini:
@@ -37,6 +39,7 @@ DOCUMENTATION = '''
key: channel
username:
description: Username to post as.
type: str
env:
- name: SLACK_USERNAME
default: ansible

View File

@@ -22,6 +22,7 @@ DOCUMENTATION = '''
options:
url:
description: URL to the Splunk HTTP collector source.
type: str
env:
- name: SPLUNK_URL
ini:
@@ -29,6 +30,7 @@ DOCUMENTATION = '''
key: url
authtoken:
description: Token to authenticate the connection to the Splunk HTTP collector.
type: str
env:
- name: SPLUNK_AUTHTOKEN
ini:

View File

@@ -20,6 +20,7 @@ requirements:
options:
url:
description: URL to the Sumologic HTTP collector source.
type: str
env:
- name: SUMOLOGIC_URL
ini:

View File

@@ -19,6 +19,7 @@ DOCUMENTATION = '''
options:
server:
description: Syslog server that will receive the event.
type: str
env:
- name: SYSLOG_SERVER
default: localhost
@@ -27,6 +28,7 @@ DOCUMENTATION = '''
key: syslog_server
port:
description: Port on which the syslog server is listening.
type: int
env:
- name: SYSLOG_PORT
default: 514
@@ -35,6 +37,7 @@ DOCUMENTATION = '''
key: syslog_port
facility:
description: Syslog facility to log as.
type: str
env:
- name: SYSLOG_FACILITY
default: user

View File

@@ -20,6 +20,7 @@ DOCUMENTATION = '''
remote_addr:
description:
- The path of the chroot you want to access.
type: string
default: inventory_hostname
vars:
- name: inventory_hostname
@@ -27,6 +28,7 @@ DOCUMENTATION = '''
executable:
description:
- User specified executable shell
type: string
ini:
- section: defaults
key: executable
@@ -38,6 +40,7 @@ DOCUMENTATION = '''
chroot_exe:
description:
- User specified chroot binary
type: string
ini:
- section: chroot_connection
key: exe

View File

@@ -21,6 +21,7 @@ DOCUMENTATION = '''
remote_addr:
description:
- The path of the chroot you want to access.
type: string
default: inventory_hostname
vars:
- name: ansible_host

View File

@@ -19,6 +19,7 @@ DOCUMENTATION = """
remote_addr:
description:
- The instance identifier.
type: string
default: inventory_hostname
vars:
- name: inventory_hostname
@@ -27,6 +28,7 @@ DOCUMENTATION = """
executable:
description:
- The shell to use for execution inside the instance.
type: string
default: /bin/sh
vars:
- name: ansible_executable
@@ -35,6 +37,7 @@ DOCUMENTATION = """
description:
- The name of the Incus remote to use (per C(incus remote list)).
- Remotes are used to access multiple servers from a single client.
type: string
default: local
vars:
- name: ansible_incus_remote
@@ -42,6 +45,7 @@ DOCUMENTATION = """
description:
- The name of the Incus project to use (per C(incus project list)).
- Projects are used to divide the instances running on a server.
type: string
default: default
vars:
- name: ansible_incus_project

View File

@@ -20,12 +20,14 @@ DOCUMENTATION = '''
remote_addr:
description:
- Path to the jail
type: string
vars:
- name: ansible_host
- name: ansible_iocage_host
remote_user:
description:
- User to execute as inside the jail
type: string
vars:
- name: ansible_user
- name: ansible_iocage_user

View File

@@ -20,6 +20,7 @@ DOCUMENTATION = '''
remote_addr:
description:
- Path to the jail
type: string
default: inventory_hostname
vars:
- name: inventory_hostname
@@ -28,6 +29,7 @@ DOCUMENTATION = '''
remote_user:
description:
- User to execute as inside the jail
type: string
vars:
- name: ansible_user
- name: ansible_jail_user

View File

@@ -17,6 +17,7 @@ DOCUMENTATION = '''
remote_addr:
description:
- Container identifier
type: string
default: inventory_hostname
vars:
- name: inventory_hostname
@@ -26,6 +27,7 @@ DOCUMENTATION = '''
default: /bin/sh
description:
- Shell executable
type: string
vars:
- name: ansible_executable
- name: ansible_lxc_executable

View File

@@ -19,6 +19,7 @@ DOCUMENTATION = '''
- Instance (container/VM) identifier.
- Since community.general 8.0.0, a FQDN can be provided; in that case, the first component (the part before C(.))
is used as the instance identifier.
type: string
default: inventory_hostname
vars:
- name: inventory_hostname
@@ -27,6 +28,7 @@ DOCUMENTATION = '''
executable:
description:
- Shell to use for execution inside instance.
type: string
default: /bin/sh
vars:
- name: ansible_executable
@@ -34,6 +36,7 @@ DOCUMENTATION = '''
remote:
description:
- Name of the LXD remote to use.
type: string
default: local
vars:
- name: ansible_lxd_remote
@@ -41,6 +44,7 @@ DOCUMENTATION = '''
project:
description:
- Name of the LXD project to use.
type: string
vars:
- name: ansible_lxd_project
version_added: 2.0.0

View File

@@ -25,14 +25,16 @@ DOCUMENTATION = '''
options:
remote_addr:
description:
- vm name
- VM name.
type: string
default: inventory_hostname
vars:
- name: ansible_host
remote_user:
description:
- The user to execute as inside the vm.
default: The *user* account as default in Qubes OS.
- The user to execute as inside the VM.
type: string
default: The I(user) account as default in Qubes OS.
vars:
- name: ansible_user
# keyword:

View File

@@ -16,11 +16,12 @@ DOCUMENTATION = '''
name: zone
short_description: Run tasks in a zone instance
description:
- Run commands or put/fetch files to an existing zone
- Run commands or put/fetch files to an existing zone.
options:
remote_addr:
description:
- Zone identifier
type: string
default: inventory_hostname
vars:
- name: ansible_host

View File

@@ -49,6 +49,16 @@ options:
- Path to root certificates file. If not set and O(tls) is
set to V(true), certifi ca-certificates will be used.
type: str
client_cert_file:
description:
- Path to the client certificate file.
type: str
version_added: 9.3.0
client_key_file:
description:
- Path to the client private key file.
type: str
version_added: 9.3.0
requirements: [ "redis", "certifi" ]
notes:

View File

@@ -27,7 +27,7 @@ def initialize_hashids(**kwargs):
if not HAS_HASHIDS:
raise AnsibleError("The hashids library must be installed in order to use this plugin")
params = dict((k, v) for k, v in kwargs.items() if v)
params = {k: v for k, v in kwargs.items() if v}
try:
return Hashids(**params)

View File

@@ -127,7 +127,7 @@ def keep_keys(data, target=None, matching_parameter='equal'):
def keep_key(key):
return tt.match(key) is not None
return [dict((k, v) for k, v in d.items() if keep_key(k)) for d in data]
return [{k: v for k, v in d.items() if keep_key(k)} for d in data]
class FilterModule(object):

View File

@@ -127,7 +127,7 @@ def remove_keys(data, target=None, matching_parameter='equal'):
def keep_key(key):
return tt.match(key) is None
return [dict((k, v) for k, v in d.items() if keep_key(k)) for d in data]
return [{k: v for k, v in d.items() if keep_key(k)} for d in data]
class FilterModule(object):

View File

@@ -169,7 +169,7 @@ def replace_keys(data, target=None, matching_parameter='equal'):
return a
return key
return [dict((replace_key(k), v) for k, v in d.items()) for d in data]
return [{replace_key(k): v for k, v in d.items()} for d in data]
class FilterModule(object):

View File

@@ -21,20 +21,24 @@ DOCUMENTATION = '''
options:
plugin:
description: The name of this plugin, it should always be set to V(community.general.cobbler) for this plugin to recognize it as it's own.
type: string
required: true
choices: [ 'cobbler', 'community.general.cobbler' ]
url:
description: URL to cobbler.
type: string
default: 'http://cobbler/cobbler_api'
env:
- name: COBBLER_SERVER
user:
description: Cobbler authentication user.
type: string
required: false
env:
- name: COBBLER_USER
password:
description: Cobbler authentication password.
type: string
required: false
env:
- name: COBBLER_PASSWORD

View File

@@ -35,6 +35,7 @@ DOCUMENTATION = r'''
version_added: 4.5.0
plugin:
description: Marks this as an instance of the 'linode' plugin.
type: string
required: true
choices: ['linode', 'community.general.linode']
ip_style:
@@ -47,6 +48,7 @@ DOCUMENTATION = r'''
version_added: 3.6.0
access_token:
description: The Linode account personal access token.
type: string
required: true
env:
- name: LINODE_ACCESS_TOKEN

View File

@@ -20,6 +20,7 @@ DOCUMENTATION = r'''
options:
plugin:
description: Token that ensures this is a source file for the 'lxd' plugin.
type: string
required: true
choices: [ 'community.general.lxd' ]
url:
@@ -27,8 +28,8 @@ DOCUMENTATION = r'''
- The unix domain socket path or the https URL for the lxd server.
- Sockets in filesystem have to start with C(unix:).
- Mostly C(unix:/var/lib/lxd/unix.socket) or C(unix:/var/snap/lxd/common/lxd/unix.socket).
type: string
default: unix:/var/snap/lxd/common/lxd/unix.socket
type: str
client_key:
description:
- The client certificate key file path.

View File

@@ -20,6 +20,7 @@ DOCUMENTATION = '''
options:
plugin:
description: token that ensures this is a source file for the 'nmap' plugin.
type: string
required: true
choices: ['nmap', 'community.general.nmap']
sudo:
@@ -29,6 +30,7 @@ DOCUMENTATION = '''
type: boolean
address:
description: Network IP or range of IPs to scan, you can use a simple range (10.2.2.15-25) or CIDR notation.
type: string
required: true
env:
- name: ANSIBLE_NMAP_ADDRESS
@@ -91,7 +93,7 @@ DOCUMENTATION = '''
default: true
version_added: 7.4.0
notes:
- At least one of ipv4 or ipv6 is required to be True, both can be True, but they cannot both be False.
- At least one of O(ipv4) or O(ipv6) is required to be V(true); both can be V(true), but they cannot both be V(false).
- 'TODO: add OS fingerprinting'
'''
EXAMPLES = '''

View File

@@ -16,11 +16,13 @@ DOCUMENTATION = r'''
options:
plugin:
description: token that ensures this is a source file for the 'online' plugin.
type: string
required: true
choices: ['online', 'community.general.online']
oauth_token:
required: true
description: Online OAuth token.
type: string
env:
# in order of precedence
- name: ONLINE_TOKEN

View File

@@ -329,8 +329,9 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
data = json['data']
break
else:
# /hosts 's 'results' is a list of all hosts, returned is paginated
data = data + json['data']
if json['data']:
# /hosts 's 'results' is a list of all hosts, returned is paginated
data = data + json['data']
break
self._cache[self.cache_key][url] = data
@@ -362,6 +363,34 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
except Exception:
return None
def _get_lxc_interfaces(self, properties, node, vmid):
status_key = self._fact('status')
if status_key not in properties or not properties[status_key] == 'running':
return
ret = self._get_json("%s/api2/json/nodes/%s/lxc/%s/interfaces" % (self.proxmox_url, node, vmid), ignore_errors=[501])
if not ret:
return
result = []
for iface in ret:
result_iface = {
'name': iface['name'],
'hwaddr': iface['hwaddr']
}
if 'inet' in iface:
result_iface['inet'] = iface['inet']
if 'inet6' in iface:
result_iface['inet6'] = iface['inet6']
result.append(result_iface)
properties[self._fact('lxc_interfaces')] = result
def _get_agent_network_interfaces(self, node, vmid, vmtype):
result = []
@@ -526,6 +555,9 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
self._get_vm_config(properties, node, vmid, ittype, name)
self._get_vm_snapshots(properties, node, vmid, ittype, name)
if ittype == 'lxc':
self._get_lxc_interfaces(properties, node, vmid)
# ensure the host satisfies filters
if not self._can_add_host(name, properties):
return None

View File

@@ -20,6 +20,7 @@ DOCUMENTATION = r'''
plugin:
description: Token that ensures this is a source file for the 'scaleway' plugin.
required: true
type: string
choices: ['scaleway', 'community.general.scaleway']
regions:
description: Filter results on a specific Scaleway region.
@@ -46,6 +47,7 @@ DOCUMENTATION = r'''
- If not explicitly defined or in environment variables, it will try to lookup in the scaleway-cli configuration file
(C($SCW_CONFIG_PATH), C($XDG_CONFIG_HOME/scw/config.yaml), or C(~/.config/scw/config.yaml)).
- More details on L(how to generate token, https://www.scaleway.com/en/docs/generate-api-keys/).
type: string
env:
# in order of precedence
- name: SCW_TOKEN

View File

@@ -24,6 +24,7 @@ DOCUMENTATION = '''
description:
- A token that ensures this is a source file for the plugin.
required: true
type: string
choices: ['community.general.stackpath_compute']
client_id:
description:

View File

@@ -22,6 +22,7 @@ DOCUMENTATION = '''
options:
plugin:
description: token that ensures this is a source file for the 'virtualbox' plugin
type: string
required: true
choices: ['virtualbox', 'community.general.virtualbox']
running_only:
@@ -30,8 +31,10 @@ DOCUMENTATION = '''
default: false
settings_password_file:
description: provide a file containing the settings password (equivalent to --settingspwfile)
type: string
network_info_path:
description: property path to query for network information (ansible_host)
type: string
default: "/VirtualBox/GuestInfo/Net/0/V4/IP"
query:
description: create vars from virtualbox properties

View File

@@ -22,10 +22,12 @@ DOCUMENTATION = '''
name:
description:
- Name of the databag
type: string
required: true
item:
description:
- Item to fetch
type: string
required: true
'''

View File

@@ -29,13 +29,17 @@ DOCUMENTATION = '''
index:
description:
- If the key has a value with the specified index then this is returned allowing access to historical values.
type: int
datacenter:
description:
- Retrieve the key from a consul datacenter other than the default for the consul host.
type: str
token:
description: The acl token to allow access to restricted values.
type: str
host:
default: localhost
type: str
description:
- The target to connect to, must be a resolvable address.
- Will be determined from E(ANSIBLE_CONSUL_URL) if that is set.
@@ -46,22 +50,26 @@ DOCUMENTATION = '''
description:
- The port of the target host to connect to.
- If you use E(ANSIBLE_CONSUL_URL) this value will be used from there.
type: int
default: 8500
scheme:
default: http
type: str
description:
- Whether to use http or https.
- If you use E(ANSIBLE_CONSUL_URL) this value will be used from there.
validate_certs:
default: true
description: Whether to verify the ssl connection or not.
description: Whether to verify the TLS connection or not.
type: bool
env:
- name: ANSIBLE_CONSUL_VALIDATE_CERTS
ini:
- section: lookup_consul
key: validate_certs
client_cert:
description: The client cert to verify the ssl connection.
description: The client cert to verify the TLS connection.
type: str
env:
- name: ANSIBLE_CONSUL_CLIENT_CERT
ini:
@@ -94,7 +102,7 @@ EXAMPLES = """
- name: retrieving a KV from a remote cluster on non default port
ansible.builtin.debug:
msg: "{{ lookup('community.general.consul_kv', 'my/key', host='10.10.10.10', port='2000') }}"
msg: "{{ lookup('community.general.consul_kv', 'my/key', host='10.10.10.10', port=2000) }}"
"""
RETURN = """

View File

@@ -120,10 +120,10 @@ class LookupModule(LookupBase):
aws_secret_access_key = self.get_option('aws_secret_access_key')
aws_session_token = self.get_option('aws_session_token')
context = dict(
(k, v) for k, v in kwargs.items()
context = {
k: v for k, v in kwargs.items()
if k not in ('version', 'region', 'table', 'profile_name', 'aws_access_key_id', 'aws_secret_access_key', 'aws_session_token')
)
}
kwargs_pass = {
'profile_name': profile_name,

View File

@@ -17,19 +17,23 @@ DOCUMENTATION = '''
options :
_command:
description: Cyberark CLI utility.
type: string
env:
- name: AIM_CLIPASSWORDSDK_CMD
default: '/opt/CARKaim/sdk/clipasswordsdk'
appid:
description: Defines the unique ID of the application that is issuing the password request.
type: string
required: true
query:
description: Describes the filter criteria for the password retrieval.
type: string
required: true
output:
description:
- Specifies the desired output fields separated by commas.
- "They could be: Password, PassProps.<property>, PasswordChangeInProcess"
type: string
default: 'password'
_extra:
description: for extra_params values please check parameters for clipasswordsdk in CyberArk's "Credential Provider and ASCP Implementation Guide"

View File

@@ -22,6 +22,7 @@ options:
required: true
tenant:
description: The first format parameter in the default O(url_template).
type: string
env:
- name: DSV_TENANT
ini:
@@ -32,6 +33,7 @@ options:
default: com
description: The top-level domain of the tenant; the second format
parameter in the default O(url_template).
type: string
env:
- name: DSV_TLD
ini:
@@ -40,6 +42,7 @@ options:
required: false
client_id:
description: The client_id with which to request the Access Grant.
type: string
env:
- name: DSV_CLIENT_ID
ini:
@@ -48,6 +51,7 @@ options:
required: true
client_secret:
description: The client secret associated with the specific O(client_id).
type: string
env:
- name: DSV_CLIENT_SECRET
ini:
@@ -58,6 +62,7 @@ options:
default: https://{}.secretsvaultcloud.{}/v1
description: The path to prepend to the base URL to form a valid REST
API request.
type: string
env:
- name: DSV_URL_TEMPLATE
ini:

View File

@@ -25,12 +25,14 @@ DOCUMENTATION = '''
url:
description:
- Environment variable with the URL for the etcd server
type: string
default: 'http://127.0.0.1:4001'
env:
- name: ANSIBLE_ETCD_URL
version:
description:
- Environment variable with the etcd protocol version
type: string
default: 'v1'
env:
- name: ANSIBLE_ETCD_VERSION

View File

@@ -17,8 +17,10 @@ description:
This enables merging different trees in order of importance, or add role_vars to specific paths to influence different instances of the same role.
options:
_terms:
description: path(s) of files to read
description: Path(s) of files to read.
required: true
type: list
elements: string
'''
EXAMPLES = r"""

View File

@@ -25,12 +25,14 @@ DOCUMENTATION = '''
executable:
description:
- Binary file to execute Hiera.
type: string
default: '/usr/bin/hiera'
env:
- name: ANSIBLE_HIERA_BIN
config_file:
description:
- File that describes the hierarchy of Hiera.
type: string
default: '/etc/hiera.yaml'
env:
- name: ANSIBLE_HIERA_CFG

View File

@@ -23,6 +23,8 @@ DOCUMENTATION = '''
_terms:
description: Identifier(s) (case-insensitive UUID or name) of item(s) to retrieve.
required: true
type: list
elements: string
account_id:
version_added: 7.5.0
domain:
@@ -133,7 +135,7 @@ class OnePassCLIBase(with_metaclass(abc.ABCMeta, object)):
self._version = None
def _check_required_params(self, required_params):
non_empty_attrs = dict((param, getattr(self, param, None)) for param in required_params if getattr(self, param, None))
non_empty_attrs = {param: getattr(self, param) for param in required_params if getattr(self, param, None)}
missing = set(required_params).difference(non_empty_attrs)
if missing:
prefix = "Unable to sign in to 1Password. Missing required parameter"

View File

@@ -24,6 +24,8 @@ DOCUMENTATION = '''
_terms:
description: Identifier(s) (case-insensitive UUID or name) of item(s) to retrieve.
required: true
type: list
elements: string
extends_documentation_fragment:
- community.general.onepassword

View File

@@ -23,6 +23,8 @@ DOCUMENTATION = '''
_terms:
description: Identifier(s) (case-insensitive UUID or name) of item(s) to retrieve.
required: true
type: list
elements: string
account_id:
version_added: 7.5.0
domain:

View File

@@ -42,8 +42,9 @@ DOCUMENTATION = '''
default: false
umask:
description:
- Sets the umask for the created .gpg files. The first octed must be greater than 3 (user readable).
- Sets the umask for the created V(.gpg) files. The first octed must be greater than 3 (user readable).
- Note pass' default value is V('077').
type: string
env:
- name: PASSWORD_STORE_UMASK
version_added: 1.3.0
@@ -468,7 +469,8 @@ class LookupModule(LookupBase):
def opt_lock(self, type):
if self.get_option('lock') == type:
tmpdir = os.environ.get('TMPDIR', '/tmp')
lockfile = os.path.join(tmpdir, '.passwordstore.lock')
user = os.environ.get('USER')
lockfile = os.path.join(tmpdir, '.{0}.passwordstore.lock'.format(user))
with FileLock().lock_file(lockfile, tmpdir, self.lock_timeout):
self.locked = type
yield

View File

@@ -104,37 +104,37 @@ EXAMPLES = r"""
- name: Generate random string
ansible.builtin.debug:
var: lookup('community.general.random_string')
# Example result: ['DeadBeeF']
# Example result: 'DeadBeeF'
- name: Generate random string with length 12
ansible.builtin.debug:
var: lookup('community.general.random_string', length=12)
# Example result: ['Uan0hUiX5kVG']
# Example result: 'Uan0hUiX5kVG'
- name: Generate base64 encoded random string
ansible.builtin.debug:
var: lookup('community.general.random_string', base64=True)
# Example result: ['NHZ6eWN5Qk0=']
# Example result: 'NHZ6eWN5Qk0='
- name: Generate a random string with 1 lower, 1 upper, 1 number and 1 special char (at least)
ansible.builtin.debug:
var: lookup('community.general.random_string', min_lower=1, min_upper=1, min_special=1, min_numeric=1)
# Example result: ['&Qw2|E[-']
# Example result: '&Qw2|E[-'
- name: Generate a random string with all lower case characters
debug:
ansible.builtin.debug:
var: query('community.general.random_string', upper=false, numbers=false, special=false)
# Example result: ['exolxzyz']
- name: Generate random hexadecimal string
debug:
ansible.builtin.debug:
var: query('community.general.random_string', upper=false, lower=false, override_special=hex_chars, numbers=false)
vars:
hex_chars: '0123456789ABCDEF'
# Example result: ['D2A40737']
- name: Generate random hexadecimal string with override_all
debug:
ansible.builtin.debug:
var: query('community.general.random_string', override_all=hex_chars)
vars:
hex_chars: '0123456789ABCDEF'

View File

@@ -19,8 +19,11 @@ DOCUMENTATION = '''
options:
_terms:
description: list of keys to query
type: list
elements: string
host:
description: location of Redis host
type: string
default: '127.0.0.1'
env:
- name: ANSIBLE_REDIS_HOST

View File

@@ -15,11 +15,15 @@ DOCUMENTATION = '''
options:
_terms:
description: Sets of key value pairs of parameters.
type: list
elements: str
key:
description: Key to query.
type: str
required: true
file:
description: Path to shelve file.
type: path
required: true
'''

View File

@@ -25,7 +25,8 @@ options:
_terms:
description: The integer ID of the secret.
required: true
type: int
type: list
elements: int
secret_path:
description: Indicate a full path of secret including folder and secret name when the secret ID is set to 0.
required: false
@@ -52,6 +53,7 @@ options:
version_added: 7.0.0
base_url:
description: The base URL of the server, for example V(https://localhost/SecretServer).
type: string
env:
- name: TSS_BASE_URL
ini:
@@ -60,6 +62,7 @@ options:
required: true
username:
description: The username with which to request the OAuth2 Access Grant.
type: string
env:
- name: TSS_USERNAME
ini:
@@ -69,6 +72,7 @@ options:
description:
- The password associated with the supplied username.
- Required when O(token) is not provided.
type: string
env:
- name: TSS_PASSWORD
ini:
@@ -80,6 +84,7 @@ options:
- The domain with which to request the OAuth2 Access Grant.
- Optional when O(token) is not provided.
- Requires C(python-tss-sdk) version 1.0.0 or greater.
type: string
env:
- name: TSS_DOMAIN
ini:
@@ -92,6 +97,7 @@ options:
- Existing token for Thycotic authorizer.
- If provided, O(username) and O(password) are not needed.
- Requires C(python-tss-sdk) version 1.0.0 or greater.
type: string
env:
- name: TSS_TOKEN
ini:
@@ -102,6 +108,7 @@ options:
default: /api/v1
description: The path to append to the base URL to form a valid REST
API request.
type: string
env:
- name: TSS_API_PATH_URI
required: false
@@ -109,6 +116,7 @@ options:
default: /oauth2/token
description: The path to append to the base URL to form a valid OAuth2
Access Grant request.
type: string
env:
- name: TSS_TOKEN_PATH_URI
required: false

View File

@@ -43,7 +43,7 @@ def initialize_dialect(dialect, **kwargs):
raise DialectNotAvailableError("Dialect '%s' is not supported by your version of python." % dialect)
# Create a dictionary from only set options
dialect_params = dict((k, v) for k, v in kwargs.items() if v is not None)
dialect_params = {k: v for k, v in kwargs.items() if v is not None}
if dialect_params:
try:
csv.register_dialect('custom', dialect, **dialect_params)

View File

@@ -113,3 +113,30 @@ class HomebrewValidate(object):
return isinstance(
package, string_types
) and not cls.INVALID_PACKAGE_REGEX.search(package)
def parse_brew_path(module):
# type: (...) -> str
"""Attempt to find the Homebrew executable path.
Requires:
- module has a `path` parameter
- path is a valid path string for the target OS. Otherwise, module.fail_json()
is called with msg="Invalid_path: <path>".
"""
path = module.params["path"]
if not HomebrewValidate.valid_path(path):
module.fail_json(msg="Invalid path: {0}".format(path))
if isinstance(path, string_types):
paths = path.split(":")
elif isinstance(path, list):
paths = path
else:
module.fail_json(msg="Invalid path: {0}".format(path))
brew_path = module.get_bin_path("brew", required=True, opt_dirs=paths)
if not HomebrewValidate.valid_brew_path(brew_path):
module.fail_json(msg="Invalid brew path: {0}".format(brew_path))
return brew_path

View File

@@ -19,6 +19,7 @@ from ansible.module_utils.common.text.converters import to_native, to_text
URL_REALM_INFO = "{url}/realms/{realm}"
URL_REALMS = "{url}/admin/realms"
URL_REALM = "{url}/admin/realms/{realm}"
URL_REALM_KEYS_METADATA = "{url}/admin/realms/{realm}/keys"
URL_TOKEN = "{url}/realms/{realm}/protocol/openid-connect/token"
URL_CLIENT = "{url}/admin/realms/{realm}/clients/{id}"
@@ -184,8 +185,7 @@ def get_token(module_params):
'password': auth_password,
}
# Remove empty items, for instance missing client_secret
payload = dict(
(k, v) for k, v in temp_payload.items() if v is not None)
payload = {k: v for k, v in temp_payload.items() if v is not None}
try:
r = json.loads(to_native(open_url(auth_url, method='POST',
validate_certs=validate_certs, http_agent=http_agent, timeout=connection_timeout,
@@ -306,6 +306,37 @@ class KeycloakAPI(object):
self.module.fail_json(msg='Could not obtain realm %s: %s' % (realm, str(e)),
exception=traceback.format_exc())
def get_realm_keys_metadata_by_id(self, realm='master'):
"""Obtain realm public info by id
:param realm: realm id
:return: None, or a 'KeysMetadataRepresentation'
(https://www.keycloak.org/docs-api/latest/rest-api/index.html#KeysMetadataRepresentation)
-- a dict containing the keys 'active' and 'keys', the former containing a mapping
from algorithms to key-ids, the latter containing a list of dicts with key
information.
"""
realm_keys_metadata_url = URL_REALM_KEYS_METADATA.format(url=self.baseurl, realm=realm)
try:
return json.loads(to_native(open_url(realm_keys_metadata_url, method='GET', http_agent=self.http_agent, headers=self.restheaders,
timeout=self.connection_timeout,
validate_certs=self.validate_certs).read()))
except HTTPError as e:
if e.code == 404:
return None
else:
self.fail_open_url(e, msg='Could not obtain realm %s: %s' % (realm, str(e)),
exception=traceback.format_exc())
except ValueError as e:
self.module.fail_json(msg='API returned incorrect JSON when trying to obtain realm %s: %s' % (realm, str(e)),
exception=traceback.format_exc())
except Exception as e:
self.module.fail_json(msg='Could not obtain realm %s: %s' % (realm, str(e)),
exception=traceback.format_exc())
def get_realm_by_id(self, realm='master'):
""" Obtain realm representation by id

View File

@@ -29,6 +29,7 @@ class iLORedfishUtils(RedfishUtils):
result['ret'] = True
data = response['data']
current_session = None
if 'Oem' in data:
if data["Oem"]["Hpe"]["Links"]["MySession"]["@odata.id"]:
current_session = data["Oem"]["Hpe"]["Links"]["MySession"]["@odata.id"]

View File

@@ -13,23 +13,27 @@ from functools import wraps
from ansible_collections.community.general.plugins.module_utils.mh.exceptions import ModuleHelperException
def cause_changes(on_success=None, on_failure=None):
def cause_changes(on_success=None, on_failure=None, when=None):
# Parameters on_success and on_failure are deprecated and should be removed in community.general 12.0.0
def deco(func):
if on_success is None and on_failure is None:
return func
@wraps(func)
def wrapper(*args, **kwargs):
def wrapper(self, *args, **kwargs):
try:
self = args[0]
func(*args, **kwargs)
func(self, *args, **kwargs)
if on_success is not None:
self.changed = on_success
elif when == "success":
self.changed = True
except Exception:
if on_failure is not None:
self.changed = on_failure
elif when == "failure":
self.changed = True
raise
finally:
if when == "always":
self.changed = True
return wrapper
@@ -41,17 +45,15 @@ def module_fails_on_exception(func):
@wraps(func)
def wrapper(self, *args, **kwargs):
def fix_key(k):
return k if k not in conflict_list else "_" + k
def fix_var_conflicts(output):
result = dict([
(k if k not in conflict_list else "_" + k, v)
for k, v in output.items()
])
result = {fix_key(k): v for k, v in output.items()}
return result
try:
func(self, *args, **kwargs)
except SystemExit:
raise
except ModuleHelperException as e:
if e.update_output:
self.update_output(e.update_output)
@@ -73,6 +75,7 @@ def check_mode_skip(func):
def wrapper(self, *args, **kwargs):
if not self.module.check_mode:
return func(self, *args, **kwargs)
return wrapper
@@ -87,7 +90,7 @@ def check_mode_skip_returns(callable=None, value=None):
return func(self, *args, **kwargs)
return wrapper_callable
if value is not None:
else:
@wraps(func)
def wrapper_value(self, *args, **kwargs):
if self.module.check_mode:
@@ -95,7 +98,4 @@ def check_mode_skip_returns(callable=None, value=None):
return func(self, *args, **kwargs)
return wrapper_value
if callable is None and value is None:
return check_mode_skip
return deco

View File

@@ -113,7 +113,7 @@ class VarDict(object):
self._meta[name] = meta
def output(self):
return dict((k, v) for k, v in self._data.items() if self.meta(k).output)
return {k: v for k, v in self._data.items() if self.meta(k).output}
def diff(self):
diff_results = [(k, self.meta(k).diff_result) for k in self._data]
@@ -125,7 +125,7 @@ class VarDict(object):
return None
def facts(self):
facts_result = dict((k, v) for k, v in self._data.items() if self._meta[k].fact)
facts_result = {k: v for k, v in self._data.items() if self._meta[k].fact}
return facts_result if facts_result else None
def change_vars(self):

View File

@@ -56,7 +56,7 @@ class OcapiUtils(object):
follow_redirects='all',
use_proxy=True, timeout=self.timeout)
data = json.loads(to_native(resp.read()))
headers = dict((k.lower(), v) for (k, v) in resp.info().items())
headers = {k.lower(): v for (k, v) in resp.info().items()}
except HTTPError as e:
return {'ret': False,
'msg': "HTTP Error %s on GET request to '%s'"
@@ -86,7 +86,7 @@ class OcapiUtils(object):
data = json.loads(to_native(resp.read()))
else:
data = ""
headers = dict((k.lower(), v) for (k, v) in resp.info().items())
headers = {k.lower(): v for (k, v) in resp.info().items()}
except HTTPError as e:
return {'ret': False,
'msg': "HTTP Error %s on DELETE request to '%s'"
@@ -113,7 +113,7 @@ class OcapiUtils(object):
force_basic_auth=basic_auth, validate_certs=False,
follow_redirects='all',
use_proxy=True, timeout=self.timeout)
headers = dict((k.lower(), v) for (k, v) in resp.info().items())
headers = {k.lower(): v for (k, v) in resp.info().items()}
except HTTPError as e:
return {'ret': False,
'msg': "HTTP Error %s on PUT request to '%s'"
@@ -144,7 +144,7 @@ class OcapiUtils(object):
force_basic_auth=basic_auth, validate_certs=False,
follow_redirects='all',
use_proxy=True, timeout=self.timeout if timeout is None else timeout)
headers = dict((k.lower(), v) for (k, v) in resp.info().items())
headers = {k.lower(): v for (k, v) in resp.info().items()}
except HTTPError as e:
return {'ret': False,
'msg': "HTTP Error %s on POST request to '%s'"

View File

@@ -11,39 +11,47 @@ from ansible_collections.community.general.plugins.module_utils.cmd_runner impor
_state_map = dict(
install='install',
install_all='install-all',
present='install',
uninstall='uninstall',
absent='uninstall',
uninstall_all='uninstall-all',
inject='inject',
uninject='uninject',
upgrade='upgrade',
upgrade_shared='upgrade-shared',
upgrade_all='upgrade-all',
reinstall='reinstall',
reinstall_all='reinstall-all',
pin='pin',
unpin='unpin',
)
def pipx_runner(module, command, **kwargs):
arg_formats = dict(
state=fmt.as_map(_state_map),
name=fmt.as_list(),
name_source=fmt.as_func(fmt.unpack_args(lambda n, s: [s] if s else [n])),
install_apps=fmt.as_bool("--include-apps"),
install_deps=fmt.as_bool("--include-deps"),
inject_packages=fmt.as_list(),
force=fmt.as_bool("--force"),
include_injected=fmt.as_bool("--include-injected"),
index_url=fmt.as_opt_val('--index-url'),
python=fmt.as_opt_val('--python'),
system_site_packages=fmt.as_bool("--system-site-packages"),
_list=fmt.as_fixed(['list', '--include-injected', '--json']),
editable=fmt.as_bool("--editable"),
pip_args=fmt.as_opt_eq_val('--pip-args'),
suffix=fmt.as_opt_val('--suffix'),
)
arg_formats["global"] = fmt.as_bool("--global")
runner = CmdRunner(
module,
command=command,
arg_formats=dict(
state=fmt.as_map(_state_map),
name=fmt.as_list(),
name_source=fmt.as_func(fmt.unpack_args(lambda n, s: [s] if s else [n])),
install_apps=fmt.as_bool("--include-apps"),
install_deps=fmt.as_bool("--include-deps"),
inject_packages=fmt.as_list(),
force=fmt.as_bool("--force"),
include_injected=fmt.as_bool("--include-injected"),
index_url=fmt.as_opt_val('--index-url'),
python=fmt.as_opt_val('--python'),
system_site_packages=fmt.as_bool("--system-site-packages"),
_list=fmt.as_fixed(['list', '--include-injected', '--json']),
editable=fmt.as_bool("--editable"),
pip_args=fmt.as_opt_eq_val('--pip-args'),
),
arg_formats=arg_formats,
environ_update={'USE_EMOJI': '0'},
check_rc=True,
**kwargs

View File

@@ -151,7 +151,7 @@ class RedfishUtils(object):
force_basic_auth=basic_auth, validate_certs=False,
follow_redirects='all',
use_proxy=True, timeout=timeout, ciphers=self.ciphers)
headers = dict((k.lower(), v) for (k, v) in resp.info().items())
headers = {k.lower(): v for (k, v) in resp.info().items()}
try:
if headers.get('content-encoding') == 'gzip' and LooseVersion(ansible_version) < LooseVersion('2.14'):
# Older versions of Ansible do not automatically decompress the data
@@ -206,7 +206,7 @@ class RedfishUtils(object):
except Exception as e:
# No response data; this is okay in many cases
data = None
headers = dict((k.lower(), v) for (k, v) in resp.info().items())
headers = {k.lower(): v for (k, v) in resp.info().items()}
except HTTPError as e:
msg = self._get_extended_message(e)
return {'ret': False,
@@ -610,12 +610,13 @@ class RedfishUtils(object):
data = response['data']
if 'Parameters' in data:
params = data['Parameters']
ai = dict((p['Name'], p)
for p in params if 'Name' in p)
ai = {p['Name']: p for p in params if 'Name' in p}
if not ai:
ai = dict((k[:-24],
{'AllowableValues': v}) for k, v in action.items()
if k.endswith('@Redfish.AllowableValues'))
ai = {
k[:-24]: {'AllowableValues': v}
for k, v in action.items()
if k.endswith('@Redfish.AllowableValues')
}
return ai
def _get_allowable_values(self, action, name, default_values=None):
@@ -2242,7 +2243,7 @@ class RedfishUtils(object):
continue
# If already set to requested value, remove it from PATCH payload
if data[u'Attributes'][attr_name] == attributes[attr_name]:
if data[u'Attributes'][attr_name] == attr_value:
del attrs_to_patch[attr_name]
warning = ""
@@ -2780,9 +2781,11 @@ class RedfishUtils(object):
def virtual_media_insert_via_patch(self, options, param_map, uri, data, image_only=False):
# get AllowableValues
ai = dict((k[:-24],
{'AllowableValues': v}) for k, v in data.items()
if k.endswith('@Redfish.AllowableValues'))
ai = {
k[:-24]: {'AllowableValues': v}
for k, v in data.items()
if k.endswith('@Redfish.AllowableValues')
}
# construct payload
payload = self._insert_virt_media_payload(options, param_map, data, ai)
if 'Inserted' not in payload and not image_only:

View File

@@ -57,7 +57,9 @@ def redis_auth_argument_spec(tls_default=True):
validate_certs=dict(type='bool',
default=True
),
ca_certs=dict(type='str')
ca_certs=dict(type='str'),
client_cert_file=dict(type='str'),
client_key_file=dict(type='str'),
)
@@ -71,6 +73,8 @@ def redis_auth_params(module):
ca_certs = module.params['ca_certs']
if tls and ca_certs is None:
ca_certs = str(certifi.where())
client_cert_file = module.params['client_cert_file']
client_key_file = module.params['client_key_file']
if tuple(map(int, redis_version.split('.'))) < (3, 4, 0) and login_user is not None:
module.fail_json(
msg='The option `username` in only supported with redis >= 3.4.0.')
@@ -78,6 +82,8 @@ def redis_auth_params(module):
'port': login_port,
'password': login_password,
'ssl_ca_certs': ca_certs,
'ssl_certfile': client_cert_file,
'ssl_keyfile': client_key_file,
'ssl_cert_reqs': validate_certs,
'ssl': tls}
if login_user is not None:

View File

@@ -51,11 +51,11 @@ def scaleway_waitable_resource_argument_spec():
def payload_from_object(scw_object):
return dict(
(k, v)
return {
k: v
for k, v in scw_object.items()
if k != 'id' and v is not None
)
}
class ScalewayException(Exception):
@@ -117,10 +117,7 @@ class SecretVariables(object):
@staticmethod
def list_to_dict(source_list, hashed=False):
key_value = 'hashed_value' if hashed else 'value'
return dict(
(var['key'], var[key_value])
for var in source_list
)
return {var['key']: var[key_value] for var in source_list}
@classmethod
def decode(cls, secrets_list, values_list):
@@ -143,7 +140,7 @@ def resource_attributes_should_be_changed(target, wished, verifiable_mutable_att
diff[attr] = wished[attr]
if diff:
return dict((attr, wished[attr]) for attr in mutable_attributes)
return {attr: wished[attr] for attr in mutable_attributes}
else:
return diff

View File

@@ -175,18 +175,18 @@ class VarDict(object):
self.__vars__[name] = var
def output(self, verbosity=0):
return dict((n, v.value) for n, v in self.__vars__.items() if v.output and v.is_visible(verbosity))
return {n: v.value for n, v in self.__vars__.items() if v.output and v.is_visible(verbosity)}
def diff(self, verbosity=0):
diff_results = [(n, v.diff_result) for n, v in self.__vars__.items() if v.diff_result and v.is_visible(verbosity)]
if diff_results:
before = dict((n, dr['before']) for n, dr in diff_results)
after = dict((n, dr['after']) for n, dr in diff_results)
before = {n: dr['before'] for n, dr in diff_results}
after = {n: dr['after'] for n, dr in diff_results}
return {'before': before, 'after': after}
return None
def facts(self, verbosity=0):
facts_result = dict((n, v.value) for n, v in self.__vars__.items() if v.fact and v.is_visible(verbosity))
facts_result = {n: v.value for n, v in self.__vars__.items() if v.fact and v.is_visible(verbosity)}
return facts_result if facts_result else None
@property
@@ -194,4 +194,4 @@ class VarDict(object):
return any(var.has_changed for var in self.__vars__.values())
def as_dict(self):
return dict((name, var.value) for name, var in self.__vars__.items())
return {name: var.value for name, var in self.__vars__.items()}

View File

@@ -192,6 +192,7 @@ def main():
rmitab = module.get_bin_path('rmitab')
chitab = module.get_bin_path('chitab')
rc = 0
err = None
# check if the new entry exists
current_entry = check_current_entry(module)

View File

@@ -344,7 +344,7 @@ class AlternativesModule(object):
subcmd_path_map = dict(subcmd_path_link_regex.findall(display_output))
if not subcmd_path_map and self.subcommands:
subcmd_path_map = dict((s['name'], s['link']) for s in self.subcommands)
subcmd_path_map = {s['name']: s['link'] for s in self.subcommands}
for path, prio, subcmd in alternative_regex.findall(display_output):
self.current_alternatives[path] = dict(

View File

@@ -277,7 +277,7 @@ class BalancerMember(object):
for valuesset in subsoup[1::1]:
if re.search(pattern=self.host, string=str(valuesset)):
values = valuesset.findAll('td')
return dict((keys[x].string, values[x].string) for x in range(0, len(keys)))
return {keys[x].string: values[x].string for x in range(0, len(keys))}
def get_member_status(self):
""" Returns a dictionary of a balancer member's status attributes."""
@@ -286,7 +286,7 @@ class BalancerMember(object):
'hot_standby': 'Stby',
'ignore_errors': 'Ign'}
actual_status = str(self.attributes['Status'])
status = dict((mode, patt in actual_status) for mode, patt in iteritems(status_mapping))
status = {mode: patt in actual_status for mode, patt in iteritems(status_mapping)}
return status
def set_member_status(self, values):

View File

@@ -0,0 +1,95 @@
#!/usr/bin/python
# Copyright (c) 2024, Ryan Cook <rcook@redhat.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: bootc_manage
version_added: 9.3.0
author:
- Ryan Cook (@cooktheryan)
short_description: Bootc Switch and Upgrade
description:
- This module manages the switching and upgrading of C(bootc).
options:
state:
description:
- 'Control to apply the latest image or switch the image.'
- 'B(Note:) This will not reboot the system.'
- 'Please use M(ansible.builtin.reboot) to reboot the system.'
required: true
type: str
choices: ['switch', 'latest']
image:
description:
- 'The image to switch to.'
- 'This is required when O(state=switch).'
required: false
type: str
'''
EXAMPLES = '''
# Switch to a different image
- name: Provide image to switch to a different image and retain the current running image
community.general.bootc_manage:
state: switch
image: "example.com/image:latest"
# Apply updates of the current running image
- name: Apply updates of the current running image
community.general.bootc_manage:
state: latest
'''
RETURN = '''
'''
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.locale import get_best_parsable_locale
def main():
argument_spec = dict(
state=dict(type='str', required=True, choices=['switch', 'latest']),
image=dict(type='str', required=False),
)
module = AnsibleModule(
argument_spec=argument_spec,
required_if=[
('state', 'switch', ['image']),
],
)
state = module.params['state']
image = module.params['image']
if state == 'switch':
command = ['bootc', 'switch', image, '--retain']
elif state == 'latest':
command = ['bootc', 'upgrade']
locale = get_best_parsable_locale(module)
module.run_command_environ_update = dict(LANG=locale, LC_ALL=locale, LC_MESSAGES=locale, LC_CTYPE=locale, LANGUAGE=locale)
rc, stdout, err = module.run_command(command, check_rc=True)
if 'Queued for next boot: ' in stdout:
result = {'changed': True, 'stdout': stdout}
module.exit_json(**result)
elif 'No changes in ' in stdout or 'Image specification is unchanged.' in stdout:
result = {'changed': False, 'stdout': stdout}
module.exit_json(**result)
else:
result = {'changed': False, 'stderr': err}
module.fail_json(msg='ERROR: Command execution failed.', **result)
if __name__ == '__main__':
main()

View File

@@ -273,8 +273,8 @@ def set_acl(consul_client, configuration):
:return: the output of setting the ACL
"""
acls_as_json = decode_acls_as_json(consul_client.acl.list())
existing_acls_mapped_by_name = dict((acl.name, acl) for acl in acls_as_json if acl.name is not None)
existing_acls_mapped_by_token = dict((acl.token, acl) for acl in acls_as_json)
existing_acls_mapped_by_name = {acl.name: acl for acl in acls_as_json if acl.name is not None}
existing_acls_mapped_by_token = {acl.token: acl for acl in acls_as_json}
if None in existing_acls_mapped_by_token:
raise AssertionError("expecting ACL list to be associated to a token: %s" %
existing_acls_mapped_by_token[None])

View File

@@ -52,6 +52,18 @@ options:
for example V(epel-7-x86_64). Default chroot is determined by the operating system,
version of the operating system, and architecture on which the module is run.
type: str
includepkgs:
description: List of packages to include.
required: false
type: list
elements: str
version_added: 9.4.0
excludepkgs:
description: List of packages to exclude.
required: false
type: list
elements: str
version_added: 9.4.0
"""
EXAMPLES = r"""
@@ -255,6 +267,12 @@ class CoprModule(object):
"""
if not repo_content:
repo_content = self._download_repo_info()
if self.ansible_module.params["includepkgs"]:
includepkgs_value = ','.join(self.ansible_module.params['includepkgs'])
repo_content = repo_content.rstrip('\n') + '\nincludepkgs={0}\n'.format(includepkgs_value)
if self.ansible_module.params["excludepkgs"]:
excludepkgs_value = ','.join(self.ansible_module.params['excludepkgs'])
repo_content = repo_content.rstrip('\n') + '\nexcludepkgs={0}\n'.format(excludepkgs_value)
if self._compare_repo_content(repo_filename_path, repo_content):
return False
if not self.check_mode:
@@ -470,6 +488,8 @@ def run_module():
name=dict(type="str", required=True),
state=dict(type="str", choices=["enabled", "disabled", "absent"], default="enabled"),
chroot=dict(type="str"),
includepkgs=dict(type='list', elements="str", required=False),
excludepkgs=dict(type='list', elements="str", required=False),
)
module = AnsibleModule(argument_spec=module_args, supports_check_mode=True)
params = module.params

View File

@@ -183,6 +183,7 @@ class CronVar(object):
fileh = open(backup_file, 'w')
elif self.cron_file:
fileh = open(self.cron_file, 'w')
path = None
else:
filed, path = tempfile.mkstemp(prefix='crontab')
fileh = os.fdopen(filed, 'w')

View File

@@ -193,13 +193,8 @@ def run_module():
allowed_keys = ['host', 'port', 'ca_cert', 'cert_cert', 'cert_key',
'timeout', 'user', 'password']
# TODO(evrardjp): Move this back to a dict comprehension when python 2.7 is
# the minimum supported version
# client_params = {key: value for key, value in module.params.items() if key in allowed_keys}
client_params = dict()
for key, value in module.params.items():
if key in allowed_keys:
client_params[key] = value
client_params = {key: value for key, value in module.params.items() if key in allowed_keys}
try:
etcd = etcd3.client(**client_params)
except Exception as exp:

View File

@@ -127,9 +127,8 @@ class GConftool(StateModuleHelper):
def __init_module__(self):
self.runner = gconftool2_runner(self.module, check_rc=True)
if self.vars.state != "get":
if not self.vars.direct and self.vars.config_source is not None:
self.module.fail_json(msg='If the "config_source" is specified then "direct" must be "true"')
if not self.vars.direct and self.vars.config_source is not None:
self.do_raise('If the "config_source" is specified then "direct" must be "true"')
self.vars.set('previous_value', self._get(), fact=True)
self.vars.set('value_type', self.vars.value_type)
@@ -140,7 +139,7 @@ class GConftool(StateModuleHelper):
def _make_process(self, fail_on_err):
def process(rc, out, err):
if err and fail_on_err:
self.ansible.fail_json(msg='gconftool-2 failed with error: %s' % (str(err)))
self.do_raise('gconftool-2 failed with error:\n%s' % err.strip())
out = out.rstrip()
self.vars.value = None if out == "" else out
return self.vars.value
@@ -152,16 +151,14 @@ class GConftool(StateModuleHelper):
def state_absent(self):
with self.runner("state key", output_process=self._make_process(False)) as ctx:
ctx.run()
if self.verbosity >= 4:
self.vars.run_info = ctx.run_info
self.vars.set('run_info', ctx.run_info, verbosity=4)
self.vars.set('new_value', None, fact=True)
self.vars._value = None
def state_present(self):
with self.runner("direct config_source value_type state key value", output_process=self._make_process(True)) as ctx:
ctx.run()
if self.verbosity >= 4:
self.vars.run_info = ctx.run_info
self.vars.set('run_info', ctx.run_info, verbosity=4)
self.vars.set('new_value', self._get(), fact=True)
self.vars._value = self.vars.new_value

View File

@@ -84,6 +84,7 @@ class GioMime(ModuleHelper):
),
supports_check_mode=True,
)
mute_vardict_deprecation = True
def __init_module__(self):
self.runner = gio_mime_runner(self.module, check_rc=True)

View File

@@ -261,7 +261,7 @@ class GitLabGroup(object):
try:
# Filter out None values
filtered = dict((arg_key, arg_value) for arg_key, arg_value in arguments.items() if arg_value is not None)
filtered = {arg_key: arg_value for arg_key, arg_value in arguments.items() if arg_value is not None}
group = self._gitlab.groups.create(filtered)
except (gitlab.exceptions.GitlabCreateError) as e:

View File

@@ -313,7 +313,10 @@ def main():
module.exit_json(changed=True, msg="Successfully recreated access token", access_token=gitlab_access_token.access_token_object._attrs)
else:
gitlab_access_token.create_access_token(group, {'name': name, 'scopes': scopes, 'access_level': access_level, 'expires_at': expires_at})
module.exit_json(changed=True, msg="Successfully created access token", access_token=gitlab_access_token.access_token_object._attrs)
if module.check_mode:
module.exit_json(changed=True, msg="Successfully created access token", access_token={})
else:
module.exit_json(changed=True, msg="Successfully created access token", access_token=gitlab_access_token.access_token_object._attrs)
if __name__ == '__main__':

View File

@@ -34,152 +34,17 @@ attributes:
support: none
options:
group:
description:
- Id or the full path of the group of which this projects belongs to.
type: str
name:
description:
- The name of the project.
required: true
type: str
path:
description:
- The path of the project you want to create, this will be server_url/<group>/path.
- If not supplied, name will be used.
type: str
description:
description:
- An description for the project.
type: str
initialize_with_readme:
description:
- Will initialize the project with a default C(README.md).
- Is only used when the project is created, and ignored otherwise.
type: bool
default: false
version_added: "4.0.0"
issues_enabled:
description:
- Whether you want to create issues or not.
- Possible values are true and false.
type: bool
default: true
merge_requests_enabled:
description:
- If merge requests can be made or not.
- Possible values are true and false.
type: bool
default: true
wiki_enabled:
description:
- If an wiki for this project should be available or not.
type: bool
default: true
snippets_enabled:
description:
- If creating snippets should be available or not.
type: bool
default: true
visibility:
description:
- V(private) Project access must be granted explicitly for each user.
- V(internal) The project can be cloned by any logged in user.
- V(public) The project can be cloned without any authentication.
default: private
type: str
choices: ["private", "internal", "public"]
aliases:
- visibility_level
import_url:
description:
- Git repository which will be imported into gitlab.
- GitLab server needs read access to this git repository.
required: false
type: str
state:
description:
- Create or delete project.
- Possible values are present and absent.
default: present
type: str
choices: ["present", "absent"]
merge_method:
description:
- What requirements are placed upon merges.
- Possible values are V(merge), V(rebase_merge) merge commit with semi-linear history, V(ff) fast-forward merges only.
type: str
choices: ["ff", "merge", "rebase_merge"]
default: merge
version_added: "1.0.0"
lfs_enabled:
description:
- Enable Git large file systems to manages large files such
as audio, video, and graphics files.
type: bool
required: false
default: false
version_added: "2.0.0"
username:
description:
- Used to create a personal project under a user's name.
type: str
version_added: "3.3.0"
allow_merge_on_skipped_pipeline:
description:
- Allow merge when skipped pipelines exist.
type: bool
version_added: "3.4.0"
only_allow_merge_if_all_discussions_are_resolved:
description:
- All discussions on a merge request (MR) have to be resolved.
type: bool
version_added: "3.4.0"
only_allow_merge_if_pipeline_succeeds:
description:
- Only allow merges if pipeline succeeded.
type: bool
version_added: "3.4.0"
packages_enabled:
description:
- Enable GitLab package repository.
type: bool
version_added: "3.4.0"
remove_source_branch_after_merge:
description:
- Remove the source branch after merge.
type: bool
version_added: "3.4.0"
squash_option:
description:
- Squash commits when merging.
type: str
choices: ["never", "always", "default_off", "default_on"]
version_added: "3.4.0"
ci_config_path:
description:
- Custom path to the CI configuration file for this project.
type: str
version_added: "3.7.0"
shared_runners_enabled:
description:
- Enable shared runners for this project.
type: bool
version_added: "3.7.0"
avatar_path:
description:
- Absolute path image to configure avatar. File size should not exceed 200 kb.
- This option is only used on creation, not for updates.
type: path
version_added: "4.2.0"
default_branch:
description:
- The default branch name for this project.
- For project creation, this option requires O(initialize_with_readme=true).
- For project update, the branch must exist.
- Supports project's default branch update since community.general 8.0.0.
type: str
version_added: "4.2.0"
builds_access_level:
description:
- V(private) means that repository CI/CD is allowed only to project members.
@@ -188,14 +53,46 @@ options:
type: str
choices: ["private", "disabled", "enabled"]
version_added: "6.2.0"
forking_access_level:
ci_config_path:
description:
- V(private) means that repository forks is allowed only to project members.
- V(disabled) means that repository forks are disabled.
- V(enabled) means that repository forks are enabled.
- Custom path to the CI configuration file for this project.
type: str
choices: ["private", "disabled", "enabled"]
version_added: "6.2.0"
version_added: "3.7.0"
container_expiration_policy:
description:
- Project cleanup policy for its container registry.
type: dict
suboptions:
cadence:
description:
- How often cleanup should be run.
type: str
choices: ["1d", "7d", "14d", "1month", "3month"]
enabled:
description:
- Enable the cleanup policy.
type: bool
keep_n:
description:
- Number of tags kept per image name.
- V(0) clears the field.
type: int
choices: [0, 1, 5, 10, 25, 50, 100]
older_than:
description:
- Destroy tags older than this.
- V(0d) clears the field.
type: str
choices: ["0d", "7d", "14d", "30d", "90d"]
name_regex:
description:
- Destroy tags matching this regular expression.
type: str
name_regex_keep:
description:
- Keep tags matching this regular expression.
type: str
version_added: "9.3.0"
container_registry_access_level:
description:
- V(private) means that container registry is allowed only to project members.
@@ -204,14 +101,18 @@ options:
type: str
choices: ["private", "disabled", "enabled"]
version_added: "6.2.0"
releases_access_level:
default_branch:
description:
- V(private) means that accessing release is allowed only to project members.
- V(disabled) means that accessing release is disabled.
- V(enabled) means that accessing release is enabled.
- The default branch name for this project.
- For project creation, this option requires O(initialize_with_readme=true).
- For project update, the branch must exist.
- Supports project's default branch update since community.general 8.0.0.
type: str
version_added: "4.2.0"
description:
description:
- An description for the project.
type: str
choices: ["private", "disabled", "enabled"]
version_added: "6.4.0"
environments_access_level:
description:
- V(private) means that deployment to environment is allowed only to project members.
@@ -228,6 +129,24 @@ options:
type: str
choices: ["private", "disabled", "enabled"]
version_added: "6.4.0"
forking_access_level:
description:
- V(private) means that repository forks is allowed only to project members.
- V(disabled) means that repository forks are disabled.
- V(enabled) means that repository forks are enabled.
type: str
choices: ["private", "disabled", "enabled"]
version_added: "6.2.0"
group:
description:
- Id or the full path of the group of which this projects belongs to.
type: str
import_url:
description:
- Git repository which will be imported into gitlab.
- GitLab server needs read access to this git repository.
required: false
type: str
infrastructure_access_level:
description:
- V(private) means that configuring infrastructure is allowed only to project members.
@@ -236,6 +155,57 @@ options:
type: str
choices: ["private", "disabled", "enabled"]
version_added: "6.4.0"
initialize_with_readme:
description:
- Will initialize the project with a default C(README.md).
- Is only used when the project is created, and ignored otherwise.
type: bool
default: false
version_added: "4.0.0"
issues_access_level:
description:
- V(private) means that accessing issues tab is allowed only to project members.
- V(disabled) means that accessing issues tab is disabled.
- V(enabled) means that accessing issues tab is enabled.
- O(issues_access_level) and O(issues_enabled) are mutually exclusive.
type: str
choices: ["private", "disabled", "enabled"]
version_added: "9.4.0"
issues_enabled:
description:
- Whether you want to create issues or not.
- O(issues_access_level) and O(issues_enabled) are mutually exclusive.
type: bool
default: true
lfs_enabled:
description:
- Enable Git large file systems to manages large files such
as audio, video, and graphics files.
type: bool
required: false
default: false
version_added: "2.0.0"
merge_method:
description:
- What requirements are placed upon merges.
- Possible values are V(merge), V(rebase_merge) merge commit with semi-linear history, V(ff) fast-forward merges only.
type: str
choices: ["ff", "merge", "rebase_merge"]
default: merge
version_added: "1.0.0"
merge_requests_enabled:
description:
- If merge requests can be made or not.
type: bool
default: true
model_registry_access_level:
description:
- V(private) means that accessing model registry tab is allowed only to project members.
- V(disabled) means that accessing model registry tab is disabled.
- V(enabled) means that accessing model registry tab is enabled.
type: str
choices: ["private", "disabled", "enabled"]
version_added: "9.3.0"
monitor_access_level:
description:
- V(private) means that monitoring health is allowed only to project members.
@@ -244,6 +214,60 @@ options:
type: str
choices: ["private", "disabled", "enabled"]
version_added: "6.4.0"
name:
description:
- The name of the project.
required: true
type: str
only_allow_merge_if_all_discussions_are_resolved:
description:
- All discussions on a merge request (MR) have to be resolved.
type: bool
version_added: "3.4.0"
only_allow_merge_if_pipeline_succeeds:
description:
- Only allow merges if pipeline succeeded.
type: bool
version_added: "3.4.0"
packages_enabled:
description:
- Enable GitLab package repository.
type: bool
version_added: "3.4.0"
pages_access_level:
description:
- V(private) means that accessing pages tab is allowed only to project members.
- V(disabled) means that accessing pages tab is disabled.
- V(enabled) means that accessing pages tab is enabled.
type: str
choices: ["private", "disabled", "enabled"]
version_added: "9.3.0"
path:
description:
- The path of the project you want to create, this will be server_url/<group>/path.
- If not supplied, name will be used.
type: str
releases_access_level:
description:
- V(private) means that accessing release is allowed only to project members.
- V(disabled) means that accessing release is disabled.
- V(enabled) means that accessing release is enabled.
type: str
choices: ["private", "disabled", "enabled"]
version_added: "6.4.0"
remove_source_branch_after_merge:
description:
- Remove the source branch after merge.
type: bool
version_added: "3.4.0"
repository_access_level:
description:
- V(private) means that accessing repository is allowed only to project members.
- V(disabled) means that accessing repository is disabled.
- V(enabled) means that accessing repository is enabled.
type: str
choices: ["private", "disabled", "enabled"]
version_added: "9.3.0"
security_and_compliance_access_level:
description:
- V(private) means that accessing security and complicance tab is allowed only to project members.
@@ -252,6 +276,34 @@ options:
type: str
choices: ["private", "disabled", "enabled"]
version_added: "6.4.0"
service_desk_enabled:
description:
- Enable Service Desk.
type: bool
version_added: "9.3.0"
shared_runners_enabled:
description:
- Enable shared runners for this project.
type: bool
version_added: "3.7.0"
snippets_enabled:
description:
- If creating snippets should be available or not.
type: bool
default: true
squash_option:
description:
- Squash commits when merging.
type: str
choices: ["never", "always", "default_off", "default_on"]
version_added: "3.4.0"
state:
description:
- Create or delete project.
- Possible values are present and absent.
default: present
type: str
choices: ["present", "absent"]
topics:
description:
- A topic or list of topics to be assigned to a project.
@@ -259,6 +311,26 @@ options:
type: list
elements: str
version_added: "6.6.0"
username:
description:
- Used to create a personal project under a user's name.
type: str
version_added: "3.3.0"
visibility:
description:
- V(private) Project access must be granted explicitly for each user.
- V(internal) The project can be cloned by any logged in user.
- V(public) The project can be cloned without any authentication.
default: private
type: str
choices: ["private", "internal", "public"]
aliases:
- visibility_level
wiki_enabled:
description:
- If an wiki for this project should be available or not.
type: bool
default: true
'''
EXAMPLES = r'''
@@ -358,32 +430,38 @@ class GitLabProject(object):
def create_or_update_project(self, module, project_name, namespace, options):
changed = False
project_options = {
'name': project_name,
'description': options['description'],
'issues_enabled': options['issues_enabled'],
'merge_requests_enabled': options['merge_requests_enabled'],
'merge_method': options['merge_method'],
'wiki_enabled': options['wiki_enabled'],
'snippets_enabled': options['snippets_enabled'],
'visibility': options['visibility'],
'lfs_enabled': options['lfs_enabled'],
'allow_merge_on_skipped_pipeline': options['allow_merge_on_skipped_pipeline'],
'builds_access_level': options['builds_access_level'],
'ci_config_path': options['ci_config_path'],
'container_expiration_policy': options['container_expiration_policy'],
'container_registry_access_level': options['container_registry_access_level'],
'description': options['description'],
'environments_access_level': options['environments_access_level'],
'feature_flags_access_level': options['feature_flags_access_level'],
'forking_access_level': options['forking_access_level'],
'infrastructure_access_level': options['infrastructure_access_level'],
'issues_access_level': options['issues_access_level'],
'issues_enabled': options['issues_enabled'],
'lfs_enabled': options['lfs_enabled'],
'merge_method': options['merge_method'],
'merge_requests_enabled': options['merge_requests_enabled'],
'model_registry_access_level': options['model_registry_access_level'],
'monitor_access_level': options['monitor_access_level'],
'name': project_name,
'only_allow_merge_if_all_discussions_are_resolved': options['only_allow_merge_if_all_discussions_are_resolved'],
'only_allow_merge_if_pipeline_succeeds': options['only_allow_merge_if_pipeline_succeeds'],
'packages_enabled': options['packages_enabled'],
'remove_source_branch_after_merge': options['remove_source_branch_after_merge'],
'squash_option': options['squash_option'],
'ci_config_path': options['ci_config_path'],
'shared_runners_enabled': options['shared_runners_enabled'],
'builds_access_level': options['builds_access_level'],
'forking_access_level': options['forking_access_level'],
'container_registry_access_level': options['container_registry_access_level'],
'pages_access_level': options['pages_access_level'],
'releases_access_level': options['releases_access_level'],
'environments_access_level': options['environments_access_level'],
'feature_flags_access_level': options['feature_flags_access_level'],
'infrastructure_access_level': options['infrastructure_access_level'],
'monitor_access_level': options['monitor_access_level'],
'remove_source_branch_after_merge': options['remove_source_branch_after_merge'],
'repository_access_level': options['repository_access_level'],
'security_and_compliance_access_level': options['security_and_compliance_access_level'],
'service_desk_enabled': options['service_desk_enabled'],
'shared_runners_enabled': options['shared_runners_enabled'],
'snippets_enabled': options['snippets_enabled'],
'squash_option': options['squash_option'],
'visibility': options['visibility'],
'wiki_enabled': options['wiki_enabled'],
}
# topics was introduced on gitlab >=14 and replace tag_list. We get current gitlab version
@@ -396,7 +474,7 @@ class GitLabProject(object):
# Because we have already call userExists in main()
if self.project_object is None:
if options['default_branch'] and not options['initialize_with_readme']:
module.fail_json(msg="Param default_branch need param initialize_with_readme set to true")
module.fail_json(msg="Param default_branch needs param initialize_with_readme set to true")
project_options.update({
'path': options['path'],
'import_url': options['import_url'],
@@ -430,7 +508,7 @@ class GitLabProject(object):
try:
project.save()
except Exception as e:
self._module.fail_json(msg="Failed update project: %s " % e)
self._module.fail_json(msg="Failed to update project: %s " % e)
return True
return False
@@ -443,6 +521,8 @@ class GitLabProject(object):
return True
arguments['namespace_id'] = namespace.id
if 'container_expiration_policy' in arguments:
arguments['container_expiration_policy_attributes'] = arguments['container_expiration_policy']
try:
project = self._gitlab.projects.create(arguments)
except (gitlab.exceptions.GitlabCreateError) as e:
@@ -454,11 +534,7 @@ class GitLabProject(object):
@param arguments Attributes of the project
'''
def get_options_with_value(self, arguments):
ret_arguments = dict()
for arg_key, arg_value in arguments.items():
if arguments[arg_key] is not None:
ret_arguments[arg_key] = arg_value
ret_arguments = {k: v for k, v in arguments.items() if v is not None}
return ret_arguments
'''
@@ -469,9 +545,22 @@ class GitLabProject(object):
changed = False
for arg_key, arg_value in arguments.items():
if arguments[arg_key] is not None:
if getattr(project, arg_key) != arguments[arg_key]:
setattr(project, arg_key, arguments[arg_key])
if arg_value is not None:
if getattr(project, arg_key, None) != arg_value:
if arg_key == 'container_expiration_policy':
old_val = getattr(project, arg_key, {})
final_val = {key: value for key, value in arg_value.items() if value is not None}
if final_val.get('older_than') == '0d':
final_val['older_than'] = None
if final_val.get('keep_n') == 0:
final_val['keep_n'] = None
if all(old_val.get(key) == value for key, value in final_val.items()):
continue
setattr(project, 'container_expiration_policy_attributes', final_val)
else:
setattr(project, arg_key, arg_value)
changed = True
return (changed, project)
@@ -501,41 +590,54 @@ def main():
argument_spec = basic_auth_argument_spec()
argument_spec.update(auth_argument_spec())
argument_spec.update(dict(
group=dict(type='str'),
name=dict(type='str', required=True),
path=dict(type='str'),
description=dict(type='str'),
initialize_with_readme=dict(type='bool', default=False),
default_branch=dict(type='str'),
issues_enabled=dict(type='bool', default=True),
merge_requests_enabled=dict(type='bool', default=True),
merge_method=dict(type='str', default='merge', choices=["merge", "rebase_merge", "ff"]),
wiki_enabled=dict(type='bool', default=True),
snippets_enabled=dict(default=True, type='bool'),
visibility=dict(type='str', default="private", choices=["internal", "private", "public"], aliases=["visibility_level"]),
import_url=dict(type='str'),
state=dict(type='str', default="present", choices=["absent", "present"]),
lfs_enabled=dict(default=False, type='bool'),
username=dict(type='str'),
allow_merge_on_skipped_pipeline=dict(type='bool'),
avatar_path=dict(type='path'),
builds_access_level=dict(type='str', choices=['private', 'disabled', 'enabled']),
ci_config_path=dict(type='str'),
container_expiration_policy=dict(type='dict', default=None, options=dict(
cadence=dict(type='str', choices=["1d", "7d", "14d", "1month", "3month"]),
enabled=dict(type='bool'),
keep_n=dict(type='int', choices=[0, 1, 5, 10, 25, 50, 100]),
older_than=dict(type='str', choices=["0d", "7d", "14d", "30d", "90d"]),
name_regex=dict(type='str'),
name_regex_keep=dict(type='str'),
)),
container_registry_access_level=dict(type='str', choices=['private', 'disabled', 'enabled']),
default_branch=dict(type='str'),
description=dict(type='str'),
environments_access_level=dict(type='str', choices=['private', 'disabled', 'enabled']),
feature_flags_access_level=dict(type='str', choices=['private', 'disabled', 'enabled']),
forking_access_level=dict(type='str', choices=['private', 'disabled', 'enabled']),
group=dict(type='str'),
import_url=dict(type='str'),
infrastructure_access_level=dict(type='str', choices=['private', 'disabled', 'enabled']),
initialize_with_readme=dict(type='bool', default=False),
issues_access_level=dict(type='str', choices=['private', 'disabled', 'enabled']),
issues_enabled=dict(type='bool', default=True),
lfs_enabled=dict(default=False, type='bool'),
merge_method=dict(type='str', default='merge', choices=["merge", "rebase_merge", "ff"]),
merge_requests_enabled=dict(type='bool', default=True),
model_registry_access_level=dict(type='str', choices=['private', 'disabled', 'enabled']),
monitor_access_level=dict(type='str', choices=['private', 'disabled', 'enabled']),
name=dict(type='str', required=True),
only_allow_merge_if_all_discussions_are_resolved=dict(type='bool'),
only_allow_merge_if_pipeline_succeeds=dict(type='bool'),
packages_enabled=dict(type='bool'),
remove_source_branch_after_merge=dict(type='bool'),
squash_option=dict(type='str', choices=['never', 'always', 'default_off', 'default_on']),
ci_config_path=dict(type='str'),
shared_runners_enabled=dict(type='bool'),
avatar_path=dict(type='path'),
builds_access_level=dict(type='str', choices=['private', 'disabled', 'enabled']),
forking_access_level=dict(type='str', choices=['private', 'disabled', 'enabled']),
container_registry_access_level=dict(type='str', choices=['private', 'disabled', 'enabled']),
pages_access_level=dict(type='str', choices=['private', 'disabled', 'enabled']),
path=dict(type='str'),
releases_access_level=dict(type='str', choices=['private', 'disabled', 'enabled']),
environments_access_level=dict(type='str', choices=['private', 'disabled', 'enabled']),
feature_flags_access_level=dict(type='str', choices=['private', 'disabled', 'enabled']),
infrastructure_access_level=dict(type='str', choices=['private', 'disabled', 'enabled']),
monitor_access_level=dict(type='str', choices=['private', 'disabled', 'enabled']),
remove_source_branch_after_merge=dict(type='bool'),
repository_access_level=dict(type='str', choices=['private', 'disabled', 'enabled']),
security_and_compliance_access_level=dict(type='str', choices=['private', 'disabled', 'enabled']),
service_desk_enabled=dict(type='bool'),
shared_runners_enabled=dict(type='bool'),
snippets_enabled=dict(default=True, type='bool'),
squash_option=dict(type='str', choices=['never', 'always', 'default_off', 'default_on']),
state=dict(type='str', default="present", choices=["absent", "present"]),
topics=dict(type='list', elements='str'),
username=dict(type='str'),
visibility=dict(type='str', default="private", choices=["internal", "private", "public"], aliases=["visibility_level"]),
wiki_enabled=dict(type='bool', default=True),
))
module = AnsibleModule(
@@ -547,6 +649,7 @@ def main():
['api_token', 'api_oauth_token'],
['api_token', 'api_job_token'],
['group', 'username'],
['issues_access_level', 'issues_enabled'],
],
required_together=[
['api_username', 'api_password'],
@@ -560,41 +663,47 @@ def main():
# check prerequisites and connect to gitlab server
gitlab_instance = gitlab_authentication(module)
group_identifier = module.params['group']
project_name = module.params['name']
project_path = module.params['path']
project_description = module.params['description']
initialize_with_readme = module.params['initialize_with_readme']
issues_enabled = module.params['issues_enabled']
merge_requests_enabled = module.params['merge_requests_enabled']
merge_method = module.params['merge_method']
wiki_enabled = module.params['wiki_enabled']
snippets_enabled = module.params['snippets_enabled']
visibility = module.params['visibility']
import_url = module.params['import_url']
state = module.params['state']
lfs_enabled = module.params['lfs_enabled']
username = module.params['username']
allow_merge_on_skipped_pipeline = module.params['allow_merge_on_skipped_pipeline']
avatar_path = module.params['avatar_path']
builds_access_level = module.params['builds_access_level']
ci_config_path = module.params['ci_config_path']
container_expiration_policy = module.params['container_expiration_policy']
container_registry_access_level = module.params['container_registry_access_level']
default_branch = module.params['default_branch']
environments_access_level = module.params['environments_access_level']
feature_flags_access_level = module.params['feature_flags_access_level']
forking_access_level = module.params['forking_access_level']
group_identifier = module.params['group']
import_url = module.params['import_url']
infrastructure_access_level = module.params['infrastructure_access_level']
initialize_with_readme = module.params['initialize_with_readme']
issues_access_level = module.params['issues_access_level']
issues_enabled = module.params['issues_enabled']
lfs_enabled = module.params['lfs_enabled']
merge_method = module.params['merge_method']
merge_requests_enabled = module.params['merge_requests_enabled']
model_registry_access_level = module.params['model_registry_access_level']
monitor_access_level = module.params['monitor_access_level']
only_allow_merge_if_all_discussions_are_resolved = module.params['only_allow_merge_if_all_discussions_are_resolved']
only_allow_merge_if_pipeline_succeeds = module.params['only_allow_merge_if_pipeline_succeeds']
packages_enabled = module.params['packages_enabled']
remove_source_branch_after_merge = module.params['remove_source_branch_after_merge']
squash_option = module.params['squash_option']
ci_config_path = module.params['ci_config_path']
shared_runners_enabled = module.params['shared_runners_enabled']
avatar_path = module.params['avatar_path']
default_branch = module.params['default_branch']
builds_access_level = module.params['builds_access_level']
forking_access_level = module.params['forking_access_level']
container_registry_access_level = module.params['container_registry_access_level']
pages_access_level = module.params['pages_access_level']
project_description = module.params['description']
project_name = module.params['name']
project_path = module.params['path']
releases_access_level = module.params['releases_access_level']
environments_access_level = module.params['environments_access_level']
feature_flags_access_level = module.params['feature_flags_access_level']
infrastructure_access_level = module.params['infrastructure_access_level']
monitor_access_level = module.params['monitor_access_level']
remove_source_branch_after_merge = module.params['remove_source_branch_after_merge']
repository_access_level = module.params['repository_access_level']
security_and_compliance_access_level = module.params['security_and_compliance_access_level']
service_desk_enabled = module.params['service_desk_enabled']
shared_runners_enabled = module.params['shared_runners_enabled']
snippets_enabled = module.params['snippets_enabled']
squash_option = module.params['squash_option']
state = module.params['state']
topics = module.params['topics']
username = module.params['username']
visibility = module.params['visibility']
wiki_enabled = module.params['wiki_enabled']
# Set project_path to project_name if it is empty.
if project_path is None:
@@ -633,42 +742,48 @@ def main():
if project_exists:
gitlab_project.delete_project()
module.exit_json(changed=True, msg="Successfully deleted project %s" % project_name)
module.exit_json(changed=False, msg="Project deleted or does not exists")
module.exit_json(changed=False, msg="Project deleted or does not exist")
if state == 'present':
if gitlab_project.create_or_update_project(module, project_name, namespace, {
"path": project_path,
"description": project_description,
"initialize_with_readme": initialize_with_readme,
"default_branch": default_branch,
"issues_enabled": issues_enabled,
"merge_requests_enabled": merge_requests_enabled,
"merge_method": merge_method,
"wiki_enabled": wiki_enabled,
"snippets_enabled": snippets_enabled,
"visibility": visibility,
"import_url": import_url,
"lfs_enabled": lfs_enabled,
"allow_merge_on_skipped_pipeline": allow_merge_on_skipped_pipeline,
"avatar_path": avatar_path,
"builds_access_level": builds_access_level,
"ci_config_path": ci_config_path,
"container_expiration_policy": container_expiration_policy,
"container_registry_access_level": container_registry_access_level,
"default_branch": default_branch,
"description": project_description,
"environments_access_level": environments_access_level,
"feature_flags_access_level": feature_flags_access_level,
"forking_access_level": forking_access_level,
"import_url": import_url,
"infrastructure_access_level": infrastructure_access_level,
"initialize_with_readme": initialize_with_readme,
"issues_access_level": issues_access_level,
"issues_enabled": issues_enabled,
"lfs_enabled": lfs_enabled,
"merge_method": merge_method,
"merge_requests_enabled": merge_requests_enabled,
"model_registry_access_level": model_registry_access_level,
"monitor_access_level": monitor_access_level,
"only_allow_merge_if_all_discussions_are_resolved": only_allow_merge_if_all_discussions_are_resolved,
"only_allow_merge_if_pipeline_succeeds": only_allow_merge_if_pipeline_succeeds,
"packages_enabled": packages_enabled,
"remove_source_branch_after_merge": remove_source_branch_after_merge,
"squash_option": squash_option,
"ci_config_path": ci_config_path,
"shared_runners_enabled": shared_runners_enabled,
"avatar_path": avatar_path,
"builds_access_level": builds_access_level,
"forking_access_level": forking_access_level,
"container_registry_access_level": container_registry_access_level,
"pages_access_level": pages_access_level,
"path": project_path,
"releases_access_level": releases_access_level,
"environments_access_level": environments_access_level,
"feature_flags_access_level": feature_flags_access_level,
"infrastructure_access_level": infrastructure_access_level,
"monitor_access_level": monitor_access_level,
"remove_source_branch_after_merge": remove_source_branch_after_merge,
"repository_access_level": repository_access_level,
"security_and_compliance_access_level": security_and_compliance_access_level,
"service_desk_enabled": service_desk_enabled,
"shared_runners_enabled": shared_runners_enabled,
"snippets_enabled": snippets_enabled,
"squash_option": squash_option,
"topics": topics,
"visibility": visibility,
"wiki_enabled": wiki_enabled,
}):
module.exit_json(changed=True, msg="Successfully created or updated the project %s" % project_name, project=gitlab_project.project_object._attrs)

Some files were not shown because too many files have changed in this diff Show More