Compare commits

..

74 Commits
3.8.4 ... 3.8.7

Author SHA1 Message Date
Felix Fontein
48b14b293c Release 3.8.7. 2022-05-16 12:32:29 +02:00
Felix Fontein
4b9cc9928b [stable-3] Add PSF-license.txt file (#4677)
* Add PSF-license.txt file. (#4675)

(cherry picked from commit 1327d81dd7)

* Update with actual CPython 3.9.5 license. (#4676)

(cherry picked from commit ee4e1d997b)
2022-05-16 09:15:01 +02:00
Felix Fontein
5f1a4fe75c Prepare 3.8.7 release. 2022-05-14 13:54:11 +02:00
patchback[bot]
3ad920c872 gconftool2: improvements (#4647) (#4665)
* gconftool2: improvements

* added changelog fragment

* typo

* Update changelogs/fragments/4647-gconftool2-command-arg.yaml

Per recommendation from Felix. Danke!

(cherry picked from commit fbff98c5f2)

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
2022-05-12 12:48:36 +02:00
patchback[bot]
4ed3fa9a73 onepassword - Get first found config file (#4640) (#4652)
* Get first found configuration file

There are three valid places to get the configuration.

https://developer.1password.com/docs/cli/about-biometric-unlock#remove-old-account-information

* Use common config class

* Add changelog fragment

* Explicitly use new style classes for Python 2.7 compatibility

This shouldn’t matter for lookups, but does matter for module_utils
and modules since Python 2.7 is still supported on the managed node.

* Update changelogs/fragments/4065-onepassword-config.yml

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

Co-authored-by: Sam Doran <github@samdoran.com>
2022-05-09 12:31:09 +02:00
patchback[bot]
5759688b0f Clarify ansible_pre_command_output (#4636) (#4645)
##### SUMMARY
Clarify what ansible_pre_command_output actually is

##### ISSUE TYPE
- Docs Pull Request

+label: docsite_pr

(cherry picked from commit e57fc54a10)

Co-authored-by: Jan-Piet Mens <jp@mens.de>
2022-05-08 09:18:40 +00:00
patchback[bot]
72f78f5937 change list.copy() with list[:] for py2 compat in terraform module (#4621) (#4643)
* change list.copy() with list[:] for py2 compat in terraform module

* add changelog fragment

* Update changelogs/fragments/4621-terraform-py2-compat.yml

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

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

Co-authored-by: Andrea Tartaglia <andrea@braingap.uk>
2022-05-08 09:18:32 +00:00
Felix Fontein
af7bf6aead [stable-4] Move in-plugin docs to sidecar for filters not named like the filename that contain them (#4626) (#4631)
* Move in-plugin docs to sidecar for filters not named like the filename that contain them.

* Update BOTMETA.

(cherry picked from commit d1877e1915)
2022-05-05 06:56:13 +00:00
patchback[bot]
bfb26d5562 [opentelemetry][callback] fix warning when using the include_tasks (#4623) (#4627)
* opentelemetry: fix include_tasks missing _task_fields

* opentelemetry: add uts for the include_tasks

* opentelemetry: add changelog fragment

* pep8: fix spaces

(cherry picked from commit 841b46ff6a)

Co-authored-by: Victor Martinez <victormartinezrubio@gmail.com>
2022-05-05 08:43:26 +02:00
patchback[bot]
31e622a0a3 consul: fixed bug in ConsulService when storing checks (#4590) (#4629)
* consul: fixed bug in ConsulService when storing checks

* added changelog fragment

* typo

(cherry picked from commit 5a8422c8cb)

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
2022-05-05 08:34:25 +02:00
patchback[bot]
5434d9217e doc: time_filter: fix duplicate (#4611) (#4616)
(cherry picked from commit 8d37591605)

Co-authored-by: René Moser <mail@renemoser.net>
2022-05-03 18:11:22 +02:00
patchback[bot]
bb695a00a0 Small fixes. (#4605) (#4606)
(cherry picked from commit 5cb7c2e45e)

Co-authored-by: Felix Fontein <felix@fontein.de>
2022-05-02 08:16:11 +02:00
Felix Fontein
0ba06f8d82 Document all filter and test plugins (#4597) (#4604)
* Fix/improve docs.

* Document the a_module test.

* Document the dict filter.

* Linting.

* Add more filter docs.

* More filters.

* Update BOTMETA.

* Add another plugin.

* Fix typos.

* Add explicit entries.

* Fix lookup documentation.

(cherry picked from commit f055f47161)
2022-05-02 07:49:11 +02:00
patchback[bot]
020fa081d7 Add docs for ansible-core 2.13 use (#4202) (#4586)
* Add docs for ansible-core 2.13 use

local testing shows fine, adding here as example for other filters/tests

* Update plugins/filter/random_mac.py

* Improve docs.

* Remove wrong 'positional'.

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

Co-authored-by: Brian Coca <bcoca@users.noreply.github.com>
2022-04-28 07:45:16 +02:00
patchback[bot]
348d2c26de documenting to_seconds filter (#4203) (#4584)
* documenting to_seconds filter

example of documenting filters when multiple exist inside one file

* Update to_seconds.yml

* Apply suggestions from code review

* Extend documentation. Add BOTMETA entry.

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

Co-authored-by: Brian Coca <bcoca@users.noreply.github.com>
2022-04-27 23:13:11 +02:00
patchback[bot]
708dcf9fe8 Fix keycloak realm parameters types (#4526) (#4559)
* Fix keycloack realm parameters types

* Add changelog fragment

* Update changelog fragment

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

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

Co-authored-by: Alexandr <36310479+Vespand@users.noreply.github.com>
2022-04-23 08:49:38 +02:00
patchback[bot]
592dead162 Fix import. (#4550) (#4551)
(cherry picked from commit 2f980e89fe)

Co-authored-by: Felix Fontein <felix@fontein.de>
2022-04-21 17:16:19 +02:00
patchback[bot]
9d26e0c468 Remove distutils from unit tests. (#4545) (#4546)
(cherry picked from commit d9ba598938)

Co-authored-by: Felix Fontein <felix@fontein.de>
2022-04-21 11:28:41 +02:00
patchback[bot]
3d512d88f1 [pritunl] removed unnecessary data from auth string (#4530) (#4537)
* removed unnecessary data from auth string

* add changelog

Co-authored-by: vadim <vadim>
(cherry picked from commit 51a68517ce)

Co-authored-by: vvatlin <vvvvatlin@gmail.com>
2022-04-20 09:33:54 +02:00
patchback[bot]
612c2936aa Bump version numbers for deprecation and removal since we didn't deprecate this in 4.0.0. (#4515) (#4518)
(cherry picked from commit 9e537d4a6b)

Co-authored-by: Felix Fontein <felix@fontein.de>
2022-04-16 21:46:00 +02:00
Felix Fontein
5c43ae6a67 CI: remove FreeBSD 12.0 and 12.2, re-enable pkgng tests (#4511) (#4514)
* Remove FreeBSD 12.0 and 12.2 from CI.

* Revert "Temporarily disable the pkgng tests. (#4493)"

This reverts commit 5ecac692de.

(cherry picked from commit 26cebb9c30)
2022-04-16 12:45:01 +02:00
patchback[bot]
cbca116a3e Remove no longer true statement. (#4505) (#4509)
(cherry picked from commit efbf02f284)

Co-authored-by: Felix Fontein <felix@fontein.de>
2022-04-15 15:53:24 +02:00
patchback[bot]
1d800cea6c dnsmadeeasy: only get monitor if it is not null api response (#4459) (#4499)
* Only get monitor if it is not null api response

* Add changelog fragment

* Update changelogs/fragments/4459-only-get-monitor-if-it-is-not-null-api-response.yaml

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

* Update plugins/modules/net_tools/dnsmadeeasy.py

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

Co-authored-by: drevai <revai.dominik@gravityrd.com>
Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit 06675034fe)

Co-authored-by: drevai753 <86595897+drevai753@users.noreply.github.com>
2022-04-13 11:16:31 +00:00
patchback[bot]
0c5422811d modules/xbps: fix error message (#4438) (#4488)
The previous error message was not giving the full or even correct
information to the user.

(cherry picked from commit d3adde4739)

Co-authored-by: Cameron Nemo <CameronNemo@users.noreply.github.com>
2022-04-11 08:01:29 +02:00
patchback[bot]
24b5530cfc Switch from antsibull to antsibull-docs. (#4480) (#4482)
(cherry picked from commit aa27f2152e)

Co-authored-by: Felix Fontein <felix@fontein.de>
2022-04-10 11:08:48 +02:00
Felix Fontein
56e1a2f921 Next expected release is 3.8.7. 2022-04-05 14:52:13 +02:00
Felix Fontein
92203378fd Release 3.8.6. 2022-04-05 14:01:54 +02:00
patchback[bot]
bf1a0450fe Fix small typo (#4452) (#4453)
(cherry picked from commit 380de2d0c1)

Co-authored-by: Wouter Schoot <wouter@schoot.org>
2022-04-05 14:00:37 +02:00
Felix Fontein
1d2e10b812 Prepare 3.8.6 release. 2022-04-05 07:53:11 +02:00
patchback[bot]
77c42e7e18 Bug fix: Warns user if incorrect SDK version is installed (#4422) (#4449)
* Add error handling to check correct SDK version installed

* Fix CI errors

* Added changelog fragment

* Changed exeption type

* Update changelogs fragment

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

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

Co-authored-by: Ricky White <rickywhite@outlook.com>
2022-04-05 07:49:27 +02:00
patchback[bot]
a339f97d89 Bugfix: zypper issue with specified package versions (#4421) (#4445)
* fixed issue with specified package versions

zypper.py was doing nothing on state=present, when ALL requestet/checked packages had a specific version stated. This was caused by get_installed_state() being called with an empty package list, which in this case returns information about all ALL installed packages. This lead to an exessive filter list prerun_state, essentially removing all packages that are installed in ANY version on the target system from the request list.

* Create 4421-zypper_package_version_handling_fix

added changelog fragment for https://github.com/ansible-collections/community.general/pull/4421

* Delete 4421-zypper_package_version_handling_fix

* Create 4421-zypper_package_version_handling_fix.yml

(cherry picked from commit bbe231e261)

Co-authored-by: tover99 <101673769+tover99@users.noreply.github.com>
2022-04-05 06:28:18 +02:00
patchback[bot]
75dce4b1de Replace antsibull-lint collection-docs with antsibull-docs lint-collection-docs. (#4423) (#4425)
(cherry picked from commit 668bbed602)

Co-authored-by: Felix Fontein <felix@fontein.de>
2022-03-30 08:17:32 +02:00
Felix Fontein
ec2fa9fa52 Replace devel with stable-2.13. (#4412) 2022-03-29 06:14:13 +02:00
patchback[bot]
e40cb558c6 ldap: added documentation as requested (#4389) (#4397)
* added documentation as requested

* Update plugins/doc_fragments/ldap.py

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

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

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
2022-03-24 06:44:28 +00:00
patchback[bot]
9552140d23 Fixed typo in keycloak_client_rolemapping examples (#4393) (#4400)
* Fixed typo in keycloak_client_rolemapping examples

* Add a changelog fragment.

* Removed changelogs fragment for docs-only change.

Co-authored-by: shnee <shnee@shnee.net>
(cherry picked from commit cb30eb2d30)

Co-authored-by: shnee <CurtyD13@gmail.com>
2022-03-24 06:44:12 +00:00
Felix Fontein
83d1c6ea8f Remove default for required=true option. (#4376) 2022-03-18 20:19:24 +00:00
patchback[bot]
c572ff2501 Revert "Allow complex values in variables parameter of terraform module (#4281)" (#4368) (#4369)
This reverts commit 4cc7f41395.

(cherry picked from commit 9618fb9786)

Co-authored-by: Felix Fontein <felix@fontein.de>
2022-03-16 07:22:03 +01:00
patchback[bot]
e8d276e689 Proxmox inventory plugin - Fix string to dict conversion (#4349) (#4365)
* Proxmox inventory plugin - Fix string to dict conversion (#4348)

  * Re-use the (defined but unused) `plaintext_configs` variable to list
    configuration entries that should be ignored by the string to
    dictionary conversion code. At this point, it only contains the
    `description` string.
  * Convert to a dictionary if the all substrings obtained by splitting
    off the initial value with commas contain a `=` character
  * Limit substring splitting to a single split, so that a substring
    containing `a=b=c` will generate an `a` entry with value `b=c`.

* Added changelog fragment for PR #4349

* Fix changelog fragment for #4349

(cherry picked from commit 3eec63421a)

Co-authored-by: Emmanuel Benoît <tseeker@nocternity.net>
2022-03-15 12:34:29 +01:00
Felix Fontein
78113c061b Fix sanity issues. (#4346) (#4358)
(cherry picked from commit ca2c64b5ca)
2022-03-14 21:30:52 +01:00
patchback[bot]
2ffcda21dd Update doc. tss.py (env REQUESTS_CA_BUNDLE) (#4338) (#4344)
* Update doc. tss.py (env REQUESTS_CA_BUNDLE)

Add a reference to environment variable REQUESTS_CA_BUNDLE to enable using self signed certificates (on-prem server) in documentation.

* Update tss.py

Remove trailing blank

* Update plugins/lookup/tss.py

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

* Update plugins/lookup/tss.py

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

* Update plugins/lookup/tss.py

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

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

Co-authored-by: Josef Fuchs <josef.fuchs@j-fuchs.at>
2022-03-11 07:20:39 +01:00
patchback[bot]
515e6832e6 Allow complex values in variables parameter of terraform module (#4281) (#4340)
* Allow complex values in variables parameter

Signed-off-by: Webster Mudge <wmudge@gmail.com>

* Add changelog fragment

Signed-off-by: Webster Mudge <wmudge@gmail.com>

* Update changelogs fragments formatting

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

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

Co-authored-by: Webster Mudge <wmudge@cloudera.com>
2022-03-11 06:55:57 +01:00
patchback[bot]
a71a35a19e BOTMETA.yml: add new maintainer to gitlab team (#3695) (#4331)
(cherry picked from commit 56e8bf130a)

Co-authored-by: Andrew Klychkov <aklychko@redhat.com>
2022-03-08 08:34:39 +01:00
patchback[bot]
96d191d549 Remove DWSR from BOTMETA.yml (#4323) (#4324)
* Remove DWSR from BOTMETA.yml

I'm no longer using Ansible.

* Update .github/BOTMETA.yml

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

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

Co-authored-by: Brandon McNama <brandonmcnama@outlook.com>
2022-03-07 07:17:24 +01:00
patchback[bot]
e294cc2aa4 filesize: fix alpine linux sparse file (#4288) (#4293)
* fix sparse file creation on Alpine linux

* re-enable tests for Alpine
* remove `conv=sparse` flag (rely only on `seek=fullsize` & `count=0`)
* doc: add a reference to busybox's dd
* doc: remove restrictions for OpenBSD, Solaris & AIX (should work as
  for Alpine linux now)
* add a changelog fragment

* fix typo

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

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

Co-authored-by: quidame <quidame@poivron.org>
2022-02-27 13:55:47 +01:00
patchback[bot]
f7baaafae2 Re-enable ansible_galaxy_install tests. (#4253) (#4254)
(cherry picked from commit 2b0b780ccb)

Co-authored-by: Felix Fontein <felix@fontein.de>
2022-02-22 23:16:26 +01:00
Felix Fontein
32dad20033 Next expected release is 3.8.6. 2022-02-22 14:26:25 +01:00
Felix Fontein
231fae71cc Release 3.8.5. 2022-02-22 13:55:08 +01:00
patchback[bot]
f7c8a89328 Fixes for keycloak_user_federation (#4212) (#4251)
* keycloak: fix creating a user federation w/ idempotent id

Creating a user federation while specifying an id (that doesn't exist
yet) will fail with a 404. This commits fix this behavior.

* keycloak: fix user federation mapper duplication

This commit fixes a bug where mappers are duplicated instead of
configured when creating a user federation.

When creating a user federation, some mappers are autogenerated by
keycloak. This commit lets the keycloak_user_federation module recompute
mappers final values after the user federation is created so that the
module can try to merge them by their name.

* add missing fragment for pr #4212

(cherry picked from commit c1485b885d)

Co-authored-by: Jules Lamur <jlamur@users.noreply.github.com>
2022-02-22 09:08:42 +00:00
patchback[bot]
b0e518967d Temporarily disable ansible_galaxy_install tests due to Galaxy failures. (#4247) (#4249)
(cherry picked from commit 06705348e3)

Co-authored-by: Felix Fontein <felix@fontein.de>
2022-02-22 09:39:50 +01:00
patchback[bot]
55a3ca024d Fix module failure due to itertools.izip_longest (#4211) (#4237)
* Fix module failure due to itertools.izip_longest

* Add changelog fragment. Remove itertools import

* Update changelogs/fragments/4206-imc-rest-module.yaml

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

Co-authored-by: Boris Vasilev <bvasilev@vmware.com>
Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit 40f9445aea)

Co-authored-by: Boris <borisvasilev395@gmail.com>
2022-02-20 09:53:45 +01:00
patchback[bot]
323c95437b [PR #4183/f5ec7373 backport][stable-3] yum_versionlock: Fix entry matching (#4227)
* yum_versionlock: Fix entry matching (#4183)

As an input the module receives names of packages to lock.
Those never matched existing entries and therefore always reported
changes.

For compatibility yum is symlinked to dnf on newer systems,
but versionlock entries defer. Try to parse both formats.

Signed-off-by: Florian Achleitner <flo@fopen.at>
(cherry picked from commit f5ec73735f)

* Empty commit to trigger CI.

Co-authored-by: fachleitner <flo@fopen.at>
Co-authored-by: Felix Fontein <felix@fontein.de>
2022-02-18 23:32:18 +01:00
patchback[bot]
2473c08ed2 Drop CentOS 8 from CI. (#4139) (#4230)
(cherry picked from commit b444dc81a1)

Co-authored-by: Felix Fontein <felix@fontein.de>
2022-02-18 22:31:22 +01:00
patchback[bot]
e879afd802 passwordstore: Fix error detection for non-English locales (#4219) (#4220)
The passwordstore lookup plugin depends on parsing GnuPG's
error messages in English language. As a result, detection of
a specific error failes when users set a different locale.

This change corrects this by setting the `LANGUAGE` environment
variable to `C` when invoking `pass`, as this only affects
gettext translations.

See
https://www.gnu.org/software/gettext/manual/html_node/The-LANGUAGE-variable.html

(cherry picked from commit 77a0c139c9)

Co-authored-by: grembo <freebsd@grem.de>
2022-02-17 22:21:06 +01:00
patchback[bot]
56c5a8b9b2 passwordstore: Prevent using path as password (#4192) (#4217)
Given a password stored in _path/to/secret_, requesting the password
_path/to_ will literally return `path/to`. This can lead to using
weak passwords by accident/mess up logic in code, based on the
state of the password store.

This is worked around by applying the same logic `pass` uses:
If a password was returned, check if there is a .gpg file it could
have come from. If not, treat it as missing.

Fixes ansible-collections/community.general#4185

(cherry picked from commit da49c0968d)

Co-authored-by: grembo <freebsd@grem.de>
2022-02-17 21:33:09 +01:00
patchback[bot]
78de6f2494 Allow YAML docs in plugins/test/ and plugins/filters/. (#4204) (#4215)
(cherry picked from commit 1e4b8e30a9)

Co-authored-by: Felix Fontein <felix@fontein.de>
2022-02-17 19:44:28 +01:00
patchback[bot]
316b36862f ini_file: Don't report changed=true when removing if nothing is changed. (#4155) (#4213)
* don't report changed when nothing is removed

* add change log

* linter happy

* Update plugins/modules/files/ini_file.py

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

* Update changelogs/fragments/4154-ini_file_changed.yml

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

* add absent idempotency test

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

Co-authored-by: James Livulpi <james.livulpi@me.com>
2022-02-17 13:51:03 +01:00
patchback[bot]
a110f6eb4b Add nejch and lgatellier as GitLab module maintainers. (#4199) (#4200)
(cherry picked from commit 7b02adc57e)

Co-authored-by: Felix Fontein <felix@fontein.de>
2022-02-14 21:10:03 +01:00
patchback[bot]
512a46a18c dconf: Skip processes that disappeared while we inspected them (#4153) (#4181)
* dconf: Skip processes that disappeared while we inspected them

Fixes #4151

* Update changelogs/fragments/4151-dconf-catch-psutil-nosuchprocess.yaml

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

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

Co-authored-by: Pavol Babinčák‏ <scroolik@gmail.com>
2022-02-10 07:29:35 +01:00
patchback[bot]
d97c7aa777 vdo: Remove unused variable (#4163) (#4169)
* fix vdo error #3916

* add changelog fragment

(cherry picked from commit acd8853242)

Co-authored-by: Joseph Torcasso <87090265+jatorcasso@users.noreply.github.com>
2022-02-07 20:21:10 +01:00
patchback[bot]
4a32f7bc56 Update Proxmox Inventory Documentation with additional examples (#4148) (#4158)
* Update Documentation with additional example

* Added an example to have the plugin return an IP address for a Proxmox guest, instead of the name of the guest (default behavior)
* Added an example to include a string literal to every guest (to support a playbook being able to check for variable presence to identify inventory in use)

* Update for line length readability

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

* Changed to cleaner static value

* Changed text for clarity

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

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

Co-authored-by: IronTooch <27360514+IronTooch@users.noreply.github.com>
2022-02-05 21:57:10 +01:00
patchback[bot]
49ae02d445 Fix return value documentation to use a valid value for 'type'. (#4142) (#4146)
(cherry picked from commit 9322809b3a)

Co-authored-by: Felix Fontein <felix@fontein.de>
2022-02-02 22:16:14 +01:00
patchback[bot]
1b609a34ae homebrew_cask: reinstall when force is install option (#4090) (#4144)
* homebrew_cask: reinstall when force is install option

* add changelog entry

* Fix OSX CI runs - run as non-root

* test with cask that has no macos dependencies

* use `brooklyn` cask to test

(cherry picked from commit 8b95c56030)

Co-authored-by: Joseph Torcasso <87090265+jatorcasso@users.noreply.github.com>
2022-02-02 22:00:33 +01:00
patchback[bot]
e6c90cc52c Try to fix CentOS 8 in CI - at least a bit. (#4132) (#4137)
(cherry picked from commit 24f7a3b6ad)

Co-authored-by: Felix Fontein <felix@fontein.de>
2022-01-31 21:54:26 +01:00
patchback[bot]
15a80aa004 gitlab: use gitlab instance runner to create runner (#3965) (#4122)
When using project it will use project level runner to create runner that based on python-gitlab it will be used for enabling runner and needs a runner_id so for creating a new runner it should use gitlab level runner

Signed-off-by: Seena Fallah <seenafallah@gmail.com>
(cherry picked from commit 929136808f)

Co-authored-by: Seena Fallah <seenafallah@gmail.com>
2022-01-31 06:19:59 +01:00
Felix Fontein
b9ea3ce19b Prepare 3.8.5 release. 2022-01-30 15:17:43 +01:00
patchback[bot]
f314ab6679 PyOpenSSL 22.0.0 no longer supports Python 2.7 (#4114) (#4117)
* PyOpenSSL 22.0.0 no longer supports Python 2.7.

* Try to make pip on CentOS 6 happy.

(cherry picked from commit 84124224ae)

Co-authored-by: Felix Fontein <felix@fontein.de>
2022-01-30 15:07:46 +01:00
patchback[bot]
25778a8da4 python_requirements_info: don't overwrite results in 'mismatched' dict key (#4078) (#4110)
* bugfix: don't overwrite results in 'mismatched'

Whichever mismatched package is evaluated last is the value stored in the
'mismatched' key. Instead, it should have a subdict for each pkg that is mismatched
to keep in line with its documented usage.

* Update changelogs/fragments/4078-python_requirements_info.yaml

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

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

Co-authored-by: Will Hegedus <will@wbhegedus.me>
2022-01-29 15:19:47 +00:00
patchback[bot]
c40a1e561a Actually expand ~ in yarn global install folder (#4048) (#4099)
* Fix 'changed' status for yarn global by actually expanding ~

* Ignore use-argspec-type-path test

* Add changelog fragment

* Update changelogs/fragments/4048-expand-tilde-in-yarn-global-install-folder.yaml

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

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

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>
2022-01-28 07:41:33 +01:00
patchback[bot]
aaee4a5a59 Properly parse JSON Lines output from yarn (#4050) (#4097)
* Properly parse JSON Lines output from yarn

* Properly support output of yarn global list

* Add changelog fragment

* Check that the string starts with 'bins-'

* Fix changelog fragment

* Update changelogs/fragments/4050-properly-parse-json-lines-output-from-yarn.yaml

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

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

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>
2022-01-28 07:38:29 +01:00
patchback[bot]
e600fe573f Fix missing '>'. (#4080) (#4081)
(cherry picked from commit 5fead8bbde)

Co-authored-by: Felix Fontein <felix@fontein.de>
2022-01-25 08:04:37 +01:00
patchback[bot]
3f79a173a8 Improve documentation on how to run tests (#4070) (#4071)
* Improve documentation on how to run tests.

* Fix incomplete sentence.

* Apply suggestions from code review

Co-authored-by: Andrew Klychkov <aaklychkov@mail.ru>

* Improve separation.

* Fix unrelated typo.

Co-authored-by: Andrew Klychkov <aaklychkov@mail.ru>
(cherry picked from commit 8a03d9f286)

Co-authored-by: Felix Fontein <felix@fontein.de>
2022-01-21 19:55:10 +01:00
patchback[bot]
08eac051f4 Fix exception in the mail callback plugin (#4026) (#4063)
(cherry picked from commit c7500c217f)

Co-authored-by: Lénaïc Huard <L3n41c@users.noreply.github.com>
2022-01-20 09:30:06 +01:00
patchback[bot]
5f20d7f109 Update CI matrix for Remote Devel. (#4033) (#4034)
(cherry picked from commit 3faffe8f47)

Co-authored-by: Felix Fontein <felix@fontein.de>
2022-01-13 09:07:17 +01:00
Felix Fontein
96f8d1b8a1 Next expected release is 3.8.5. 2022-01-11 07:23:00 +01:00
111 changed files with 1763 additions and 216 deletions

View File

@@ -55,14 +55,14 @@ pool: Standard
stages:
### Sanity
- stage: Sanity_devel
displayName: Sanity devel
- stage: Sanity_2_13
displayName: Sanity 2.13
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
nameFormat: Test {0}
testFormat: devel/sanity/{0}
testFormat: 2.13/sanity/{0}
targets:
- test: 1
- test: 2
@@ -122,14 +122,14 @@ stages:
- test: 3
- test: 4
### Units
- stage: Units_devel
displayName: Units devel
- stage: Units_2_13
displayName: Units 2.13
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
nameFormat: Python {0}
testFormat: devel/units/{0}/1
testFormat: 2.13/units/{0}/1
targets:
- test: 2.7
- test: 3.5
@@ -198,22 +198,22 @@ stages:
- test: 3.8
## Remote
- stage: Remote_devel
displayName: Remote devel
- stage: Remote_2_13
displayName: Remote 2.13
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
testFormat: devel/{0}
testFormat: 2.13/{0}
targets:
- name: macOS 11.1
test: macos/11.1
- name: macOS 12.0
test: macos/12.0
- name: RHEL 7.9
test: rhel/7.9
- name: RHEL 8.5
test: rhel/8.5
- name: FreeBSD 12.2
test: freebsd/12.2
- name: FreeBSD 12.3
test: freebsd/12.3
- name: FreeBSD 13.0
test: freebsd/13.0
groups:
@@ -249,8 +249,8 @@ stages:
test: rhel/7.9
- name: RHEL 8.3
test: rhel/8.3
- name: FreeBSD 12.2
test: freebsd/12.2
#- name: FreeBSD 12.2
# test: freebsd/12.2
groups:
- 1
- 2
@@ -281,20 +281,20 @@ stages:
test: rhel/8.2
- name: RHEL 7.8
test: rhel/7.8
- name: FreeBSD 12.0
test: freebsd/12.0
#- name: FreeBSD 12.0
# test: freebsd/12.0
groups:
- 1
- 2
### Docker
- stage: Docker_devel
displayName: Docker devel
- stage: Docker_2_13
displayName: Docker 2.13
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
testFormat: devel/linux/{0}
testFormat: 2.13/linux/{0}
targets:
- name: CentOS 7
test: centos7
@@ -324,8 +324,6 @@ stages:
targets:
- name: CentOS 6
test: centos6
- name: CentOS 8
test: centos8
- name: Fedora 34
test: fedora34
- name: openSUSE 15 py3
@@ -385,14 +383,14 @@ stages:
- 3
### Cloud
- stage: Cloud_devel
displayName: Cloud devel
- stage: Cloud_2_13
displayName: Cloud 2.13
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
nameFormat: Python {0}
testFormat: devel/cloud/{0}/1
testFormat: 2.13/cloud/{0}/1
targets:
- test: 2.7
- test: 3.9
@@ -439,27 +437,27 @@ stages:
- stage: Summary
condition: succeededOrFailed()
dependsOn:
- Sanity_devel
- Sanity_2_13
- Sanity_2_9
- Sanity_2_10
- Sanity_2_11
- Sanity_2_12
- Units_devel
- Units_2_13
- Units_2_9
- Units_2_10
- Units_2_11
- Units_2_12
- Remote_devel
- Remote_2_13
- Remote_2_9
- Remote_2_10
- Remote_2_11
- Remote_2_12
- Docker_devel
- Docker_2_13
- Docker_2_9
- Docker_2_10
- Docker_2_11
- Docker_2_12
- Cloud_devel
- Cloud_2_13
- Cloud_2_9
- Cloud_2_10
- Cloud_2_11

35
.github/BOTMETA.yml vendored
View File

@@ -124,15 +124,23 @@ files:
maintainers: giner
$filters/from_csv.py:
maintainers: Ajpantuso
$filters/groupby:
$filters/groupby.py:
maintainers: felixfontein
$filters/hashids:
$filters/groupby_as_dict.yml:
maintainers: felixfontein
$filters/hashids.py:
maintainers: Ajpantuso
$filters/hashids_decode.yml:
maintainers: Ajpantuso
$filters/hashids_encode.yml:
maintainers: Ajpantuso
$filters/jc.py:
maintainers: kellyjonbrazil
$filters/json_query.py: {}
$filters/list.py:
maintainers: vbotka
$filters/lists_mergeby.yml:
maintainers: vbotka
$filters/path_join_shim.py:
maintainers: felixfontein
$filters/random_mac.py: {}
@@ -140,6 +148,24 @@ files:
maintainers: resmo
$filters/unicode_normalize.py:
maintainers: Ajpantuso
$filters/to_days.yml:
maintainers: resmo
$filters/to_hours.yml:
maintainers: resmo
$filters/to_milliseconds.yml:
maintainers: resmo
$filters/to_minutes.yml:
maintainers: resmo
$filters/to_months.yml:
maintainers: resmo
$filters/to_seconds.yml:
maintainers: resmo
$filters/to_time_unit.yml:
maintainers: resmo
$filters/to_weeks.yml:
maintainers: resmo
$filters/to_years.yml:
maintainers: resmo
$filters/version_sort.py:
maintainers: ericzolf
$inventories/:
@@ -1163,7 +1189,8 @@ files:
$modules/web_infrastructure/jenkins_script.py:
maintainers: hogarthj
$modules/web_infrastructure/jira.py:
maintainers: Slezhuk tarka pertoft DWSR
maintainers: Slezhuk tarka pertoft
ignore: DWSR
labels: jira
$modules/web_infrastructure/nginx_status_info.py:
maintainers: resmo
@@ -1229,7 +1256,7 @@ macros:
team_cyberark_conjur: jvanderhoof ryanprior
team_e_spirit: MatrixCrawler getjack
team_flatpak: JayKayy oolongbrothers
team_gitlab: Lunik Shaps dj-wasabi marwatk waheedi zanssa scodeman metanovii sh0shin
team_gitlab: Lunik Shaps dj-wasabi marwatk waheedi zanssa scodeman metanovii sh0shin nejch lgatellier suukit
team_hpux: bcoca davx8342
team_huawei: QijunPan TommyLike edisonxiang freesky-edward hwDCN niuzhenguo xuxiaowei0512 yanzhangi zengchen1024 zhongjun2
team_ipa: Akasurde Nosmoht fxfitz justchris1

View File

@@ -6,6 +6,78 @@ Community General Release Notes
This changelog describes changes after version 2.0.0.
v3.8.7
======
Release Summary
---------------
Regular maintenance release.
Major Changes
-------------
- The community.general 3.x.y release stream will from now on only receive major bugfixes and security fixes. There will be no more regular bugfix releases, or regular bugfixes backported to the ``stable-3`` branch.
Bugfixes
--------
- Include ``PSF-license.txt`` file for ``plugins/module_utils/_version.py``.
- consul - fixed bug where class ``ConsulService`` was overwriting the field ``checks``, preventing the addition of checks to a service (https://github.com/ansible-collections/community.general/pull/4590).
- dnsmadeeasy - fix failure on deleting DNS entries when API response does not contain monitor value (https://github.com/ansible-collections/community.general/issues/3620).
- gconftool2 - properly escape values when passing them to ``gconftool-2`` (https://github.com/ansible-collections/community.general/pull/4647).
- keycloak - fix parameters types for ``defaultDefaultClientScopes`` and ``defaultOptionalClientScopes`` from list of dictionaries to list of strings (https://github.com/ansible-collections/community.general/pull/4526).
- onepassword - search all valid configuration locations and use the first found (https://github.com/ansible-collections/community.general/pull/4640).
- opentelemetry callback plugin - fix warning for the include_tasks (https://github.com/ansible-collections/community.general/pull/4623).
- pritunl - fixed bug where pritunl plugin api add unneeded data in ``auth_string`` parameter (https://github.com/ansible-collections/community.general/issues/4527).
- terraform - fix list initialization to support both Python 2 and Python 3 (https://github.com/ansible-collections/community.general/issues/4531).
- xbps - fix error message that is reported when installing packages fails (https://github.com/ansible-collections/community.general/pull/4438).
v3.8.6
======
Release Summary
---------------
Regular bugfix release.
Bugfixes
--------
- dsv lookup plugin - raise an Ansible error if the wrong ``python-dsv-sdk`` version is installed (https://github.com/ansible-collections/community.general/pull/4422).
- filesize - add support for busybox dd implementation, that is used by default on Alpine linux (https://github.com/ansible-collections/community.general/pull/4288, https://github.com/ansible-collections/community.general/issues/4259).
- proxmox inventory plugin - always convert strings that follow the ``key=value[,key=value[...]]`` form into dictionaries (https://github.com/ansible-collections/community.general/pull/4349).
- proxmox inventory plugin - fixed the ``description`` field being ignored if it contained a comma (https://github.com/ansible-collections/community.general/issues/4348).
- zypper - fixed bug that caused zypper to always report [ok] and do nothing on ``state=present`` when all packages in ``name`` had a version specification (https://github.com/ansible-collections/community.general/issues/4371, https://github.com/ansible-collections/community.general/pull/4421).
v3.8.5
======
Release Summary
---------------
Regular bugfix release.
Bugfixes
--------
- dconf - skip processes that disappeared while we inspected them (https://github.com/ansible-collections/community.general/issues/4151).
- gitlab_runner - use correct API endpoint to create and retrieve project level runners when using ``project`` (https://github.com/ansible-collections/community.general/pull/3965).
- homebrew_cask - fix force install operation (https://github.com/ansible-collections/community.general/issues/3703).
- imc_rest - fixes the module failure due to the usage of ``itertools.izip_longest`` which is not available in Python 3 (https://github.com/ansible-collections/community.general/issues/4206).
- ini_file - when removing nothing do not report changed (https://github.com/ansible-collections/community.general/issues/4154).
- keycloak_user_federation - creating a user federation while specifying an ID (that does not exist yet) no longer fail with a 404 Not Found (https://github.com/ansible-collections/community.general/pull/4212).
- keycloak_user_federation - mappers auto-created by keycloak are matched and merged by their name and no longer create duplicated entries (https://github.com/ansible-collections/community.general/pull/4212).
- mail callback plugin - fix crash on Python 3 (https://github.com/ansible-collections/community.general/issues/4025, https://github.com/ansible-collections/community.general/pull/4026).
- passwordstore lookup plugin - fix error detection for non-English locales (https://github.com/ansible-collections/community.general/pull/4219).
- passwordstore lookup plugin - prevent returning path names as passwords by accident (https://github.com/ansible-collections/community.general/issues/4185, https://github.com/ansible-collections/community.general/pull/4192).
- python_requirements_info - store ``mismatched`` return values per package as documented in the module (https://github.com/ansible-collections/community.general/pull/4078).
- vdo - fix options error (https://github.com/ansible-collections/community.general/pull/4163).
- yarn - fix incorrect handling of ``yarn list`` and ``yarn global list`` output that could result in fatal error (https://github.com/ansible-collections/community.general/pull/4050).
- yarn - fix incorrectly reported status when installing a package globally (https://github.com/ansible-collections/community.general/issues/4045, https://github.com/ansible-collections/community.general/pull/4050).
- yarn - fix missing ``~`` expansion in yarn global install folder which resulted in incorrect task status (https://github.com/ansible-collections/community.general/issues/4045, https://github.com/ansible-collections/community.general/pull/4048).
- yum_versionlock - fix matching of existing entries with names passed to the module. Match yum and dnf lock format (https://github.com/ansible-collections/community.general/pull/4183).
v3.8.4
======

View File

@@ -24,7 +24,7 @@ Also, consider taking up a valuable, reviewed, but abandoned pull request which
* Try committing your changes with an informative but short commit message.
* Do not squash your commits and force-push to your branch if not needed. Reviews of your pull request are much easier with individual commits to comprehend the pull request history. All commits of your pull request branch will be squashed into one commit by GitHub upon merge.
* Do not add merge commits to your PR. The bot will complain and you will have to rebase ([instructions for rebasing](https://docs.ansible.com/ansible/latest/dev_guide/developing_rebasing.html)) to remove them before your PR can be merged. To avoid that git automatically does merges during pulls, you can configure it to do rebases instead by running `git config pull.rebase true` inside the respository checkout.
* Do not add merge commits to your PR. The bot will complain and you will have to rebase ([instructions for rebasing](https://docs.ansible.com/ansible/latest/dev_guide/developing_rebasing.html)) to remove them before your PR can be merged. To avoid that git automatically does merges during pulls, you can configure it to do rebases instead by running `git config pull.rebase true` inside the repository checkout.
* Make sure your PR includes a [changelog fragment](https://docs.ansible.com/ansible/devel/community/development_process.html#changelogs-how-to). (You must not include a fragment for new modules or new plugins, except for test and filter plugins. Also you shouldn't include one for docs-only changes. If you're not sure, simply don't include one, we'll tell you whether one is needed or not :) )
* Avoid reformatting unrelated parts of the codebase in your PR. These types of changes will likely be requested for reversion, create additional work for reviewers, and may cause approval to be delayed.
@@ -36,6 +36,54 @@ If you want to test a PR locally, refer to [our testing guide](https://github.co
If you find any inconsistencies or places in this document which can be improved, feel free to raise an issue or pull request to fix it.
## Run sanity, unit or integration tests locally
You have to check out the repository into a specific path structure to be able to run `ansible-test`. The path to the git checkout must end with `.../ansible_collections/community/general`. Please see [our testing guide](https://github.com/ansible/community-docs/blob/main/test_pr_locally_guide.rst) for instructions on how to check out the repository into a correct path structure. The short version of these instructions is:
```.bash
mkdir -p ~/dev/ansible_collections/community
git clone https://github.com/ansible-collections/community.general.git ~/dev/ansible_collections/community/general
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+.
The following commands show how to run sanity tests:
```.bash
# Run sanity tests for all files in the collection:
ansible-test sanity --docker -v
# Run sanity tests for the given files and directories:
ansible-test sanity --docker -v plugins/modules/system/pids.py tests/integration/targets/pids/
```
The following commands show how to run unit tests:
```.bash
# Run all unit tests:
ansible-test units --docker -v
# Run all unit tests for one Python version (a lot faster):
ansible-test units --docker -v --python 3.8
# Run a specific unit test (for the nmcli module) for one Python version:
ansible-test units --docker -v --python 3.8 tests/unit/plugins/modules/net_tools/test_nmcli.py
```
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
# Run integration tests for the flattened lookup **without any isolation**:
ansible-test integration -v lookup_flattened
```
If you are unsure about the integration test target name for a module or plugin, you can take a look in `tests/integration/targets/`. Tests for plugins have the plugin type prepended.
## Creating new modules or plugins
Creating new modules and plugins requires a bit more work than other Pull Requests.

48
PSF-license.txt Normal file
View File

@@ -0,0 +1,48 @@
PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
--------------------------------------------
1. This LICENSE AGREEMENT is between the Python Software Foundation
("PSF"), and the Individual or Organization ("Licensee") accessing and
otherwise using this software ("Python") in source or binary form and
its associated documentation.
2. Subject to the terms and conditions of this License Agreement, PSF hereby
grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
analyze, test, perform and/or display publicly, prepare derivative works,
distribute, and otherwise use Python alone or in any derivative version,
provided, however, that PSF's License Agreement and PSF's notice of copyright,
i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Python Software Foundation;
All Rights Reserved" are retained in Python alone or in any derivative version
prepared by Licensee.
3. In the event Licensee prepares a derivative work that is based on
or incorporates Python or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python.
4. PSF is making Python available to Licensee on an "AS IS"
basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.
5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.
7. Nothing in this License Agreement shall be deemed to create any
relationship of agency, partnership, or joint venture between PSF and
Licensee. This License Agreement does not grant permission to use PSF
trademarks or trade name in a trademark sense to endorse or promote
products or services of Licensee, or any third party.
8. By copying, installing or otherwise using Python, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.

View File

@@ -17,7 +17,7 @@ If you encounter abusive behavior violating the [Ansible Code of Conduct](https:
## Tested with Ansible
Tested with the current Ansible 2.9, ansible-base 2.10, ansible-core 2.11, ansible-core 2.12 releases and the current development version of ansible-core. Ansible versions before 2.9.10 are not supported.
Tested with the current Ansible 2.9, ansible-base 2.10, ansible-core 2.11, ansible-core 2.12 and ansible-core 2.13 releases. Ansible versions before 2.9.10 are not supported.
## External requirements

View File

@@ -2066,3 +2066,114 @@ releases:
- 3940_fix_contenttype_scaleway_user_data.yml
- 3976-fix-alternatives-parsing.yml
release_date: '2022-01-11'
3.8.5:
changes:
bugfixes:
- dconf - skip processes that disappeared while we inspected them (https://github.com/ansible-collections/community.general/issues/4151).
- gitlab_runner - use correct API endpoint to create and retrieve project level
runners when using ``project`` (https://github.com/ansible-collections/community.general/pull/3965).
- homebrew_cask - fix force install operation (https://github.com/ansible-collections/community.general/issues/3703).
- imc_rest - fixes the module failure due to the usage of ``itertools.izip_longest``
which is not available in Python 3 (https://github.com/ansible-collections/community.general/issues/4206).
- ini_file - when removing nothing do not report changed (https://github.com/ansible-collections/community.general/issues/4154).
- keycloak_user_federation - creating a user federation while specifying an
ID (that does not exist yet) no longer fail with a 404 Not Found (https://github.com/ansible-collections/community.general/pull/4212).
- keycloak_user_federation - mappers auto-created by keycloak are matched and
merged by their name and no longer create duplicated entries (https://github.com/ansible-collections/community.general/pull/4212).
- mail callback plugin - fix crash on Python 3 (https://github.com/ansible-collections/community.general/issues/4025,
https://github.com/ansible-collections/community.general/pull/4026).
- passwordstore lookup plugin - fix error detection for non-English locales
(https://github.com/ansible-collections/community.general/pull/4219).
- passwordstore lookup plugin - prevent returning path names as passwords by
accident (https://github.com/ansible-collections/community.general/issues/4185,
https://github.com/ansible-collections/community.general/pull/4192).
- python_requirements_info - store ``mismatched`` return values per package
as documented in the module (https://github.com/ansible-collections/community.general/pull/4078).
- vdo - fix options error (https://github.com/ansible-collections/community.general/pull/4163).
- yarn - fix incorrect handling of ``yarn list`` and ``yarn global list`` output
that could result in fatal error (https://github.com/ansible-collections/community.general/pull/4050).
- yarn - fix incorrectly reported status when installing a package globally
(https://github.com/ansible-collections/community.general/issues/4045, https://github.com/ansible-collections/community.general/pull/4050).
- yarn - fix missing ``~`` expansion in yarn global install folder which resulted
in incorrect task status (https://github.com/ansible-collections/community.general/issues/4045,
https://github.com/ansible-collections/community.general/pull/4048).
- yum_versionlock - fix matching of existing entries with names passed to the
module. Match yum and dnf lock format (https://github.com/ansible-collections/community.general/pull/4183).
release_summary: Regular bugfix release.
fragments:
- 3.8.5.yml
- 3703-force-install-homebrew-cask.yml
- 3916-fix-vdo-options-type.yml
- 3935-use-gitlab-instance-runner-to-create-runner.yml
- 4026-fix-mail-callback.yml
- 4048-expand-tilde-in-yarn-global-install-folder.yaml
- 4050-properly-parse-json-lines-output-from-yarn.yaml
- 4078-python_requirements_info.yaml
- 4151-dconf-catch-psutil-nosuchprocess.yaml
- 4154-ini_file_changed.yml
- 4183-fix-yum_versionlock.yaml
- 4192-improve-passwordstore-consistency.yml
- 4206-imc-rest-module.yaml
- 4212-fixes-for-keycloak-user-federation.yml
- 4219-passwordstore-locale-fix.yml
release_date: '2022-02-22'
3.8.6:
changes:
bugfixes:
- dsv lookup plugin - raise an Ansible error if the wrong ``python-dsv-sdk``
version is installed (https://github.com/ansible-collections/community.general/pull/4422).
- filesize - add support for busybox dd implementation, that is used by default
on Alpine linux (https://github.com/ansible-collections/community.general/pull/4288,
https://github.com/ansible-collections/community.general/issues/4259).
- proxmox inventory plugin - always convert strings that follow the ``key=value[,key=value[...]]``
form into dictionaries (https://github.com/ansible-collections/community.general/pull/4349).
- proxmox inventory plugin - fixed the ``description`` field being ignored if
it contained a comma (https://github.com/ansible-collections/community.general/issues/4348).
- zypper - fixed bug that caused zypper to always report [ok] and do nothing
on ``state=present`` when all packages in ``name`` had a version specification
(https://github.com/ansible-collections/community.general/issues/4371, https://github.com/ansible-collections/community.general/pull/4421).
release_summary: Regular bugfix release.
fragments:
- 3.8.6.yml
- 4288-fix-4259-support-busybox-dd.yml
- 4349-proxmox-inventory-dict-facts.yml
- 4421-zypper_package_version_handling_fix.yml
- 4422-warn-user-if-incorrect-SDK-version-is-installed.yaml
release_date: '2022-04-05'
3.8.7:
changes:
bugfixes:
- Include ``PSF-license.txt`` file for ``plugins/module_utils/_version.py``.
- consul - fixed bug where class ``ConsulService`` was overwriting the field
``checks``, preventing the addition of checks to a service (https://github.com/ansible-collections/community.general/pull/4590).
- dnsmadeeasy - fix failure on deleting DNS entries when API response does not
contain monitor value (https://github.com/ansible-collections/community.general/issues/3620).
- gconftool2 - properly escape values when passing them to ``gconftool-2`` (https://github.com/ansible-collections/community.general/pull/4647).
- keycloak - fix parameters types for ``defaultDefaultClientScopes`` and ``defaultOptionalClientScopes``
from list of dictionaries to list of strings (https://github.com/ansible-collections/community.general/pull/4526).
- onepassword - search all valid configuration locations and use the first found
(https://github.com/ansible-collections/community.general/pull/4640).
- opentelemetry callback plugin - fix warning for the include_tasks (https://github.com/ansible-collections/community.general/pull/4623).
- pritunl - fixed bug where pritunl plugin api add unneeded data in ``auth_string``
parameter (https://github.com/ansible-collections/community.general/issues/4527).
- terraform - fix list initialization to support both Python 2 and Python 3
(https://github.com/ansible-collections/community.general/issues/4531).
- xbps - fix error message that is reported when installing packages fails (https://github.com/ansible-collections/community.general/pull/4438).
major_changes:
- The community.general 3.x.y release stream will from now on only receive major
bugfixes and security fixes. There will be no more regular bugfix releases,
or regular bugfixes backported to the ``stable-3`` branch.
release_summary: Regular maintenance release.
fragments:
- 3.8.7.yml
- 4065-onepassword-config.yml
- 4438-fix-error-message.yaml
- 4459-only-get-monitor-if-it-is-not-null-api-response.yaml
- 4526-keycloak-realm-types.yaml
- 4530-fix-unauthorized-pritunl-request.yaml
- 4590-consul-fix-service-checks.yaml
- 4621-terraform-py2-compat.yml
- 4623-opentelemetry_bug_fix_include_tasks.yml
- 4647-gconftool2-command-arg.yaml
- psf-license.yml
release_date: '2022-05-16'

View File

@@ -1,6 +1,6 @@
namespace: community
name: general
version: 3.8.4
version: 3.8.7
readme: README.md
authors:
- Ansible (https://github.com/ansible)

View File

@@ -20,6 +20,7 @@ DOCUMENTATION = '''
- List of connection information for the memcached DBs
default: ['127.0.0.1:11211']
type: list
elements: string
env:
- name: ANSIBLE_CACHE_PLUGIN_CONNECTION
ini:

View File

@@ -45,7 +45,7 @@ DOCUMENTATION = r'''
version_added: 1.0.0
default: ansible
pre_command:
description: Executes command before run and result put to ansible_pre_command_output field.
description: Executes command before run and its result is added to the C(ansible_pre_command_output) logstash field.
version_added: 2.0.0
ini:
- section: callback_logstash

View File

@@ -100,28 +100,21 @@ class CallbackModule(CallbackBase):
smtp = smtplib.SMTP(self.smtphost, port=self.smtpport)
b_sender = to_bytes(self.sender)
b_to = to_bytes(self.to)
b_cc = to_bytes(self.cc)
b_bcc = to_bytes(self.bcc)
b_subject = to_bytes(subject)
b_body = to_bytes(body)
b_content = b'From: %s\n' % b_sender
b_content += b'To: %s\n' % b_to
content = 'From: %s\n' % self.sender
content += 'To: %s\n' % self.to
if self.cc:
b_content += b'Cc: %s\n' % b_cc
b_content += b'Subject: %s\n\n' % b_subject
b_content += b_body
content += 'Cc: %s\n' % self.cc
content += 'Subject: %s\n\n' % subject.strip()
content += body
b_addresses = b_to.split(b',')
addresses = self.to.split(',')
if self.cc:
b_addresses += b_cc.split(b',')
addresses += self.cc.split(',')
if self.bcc:
b_addresses += b_bcc.split(b',')
addresses += self.bcc.split(',')
for b_address in b_addresses:
smtp.sendmail(b_sender, b_address, b_content)
for address in addresses:
smtp.sendmail(self.sender, address, to_bytes(content))
smtp.quit()

View File

@@ -198,7 +198,7 @@ class OpenTelemetrySource(object):
task = tasks_data[task_uuid]
if self.ansible_version is None and result._task_fields['args'].get('_ansible_version'):
if self.ansible_version is None and hasattr(result, '_task_fields') and result._task_fields['args'].get('_ansible_version'):
self.ansible_version = result._task_fields['args'].get('_ansible_version')
task.add_host(HostData(host_uuid, host_name, status, result))

View File

@@ -38,8 +38,10 @@ options:
version_added: 2.0.0
server_uri:
description:
- A URI to the LDAP server.
- The I(server_uri) parameter may be a comma- or whitespace-separated list of URIs containing only the schema, the host, and the port fields.
- The default value lets the underlying LDAP client library look for a UNIX domain socket in its default location.
- Note that when using multiple URIs you cannot determine to which URI your client gets connected.
- For URIs containing additional fields, particularly when using commas, behavior is undefined.
type: str
default: ldapi:///
start_tls:

View File

@@ -6,6 +6,60 @@
from __future__ import absolute_import, division, print_function
__metaclass__ = type
DOCUMENTATION = '''
name: dict
short_description: Convert a list of tuples into a dictionary
version_added: 3.0.0
author: Felix Fontein (@felixfontein)
description:
- Convert a list of tuples into a dictionary. This is a filter version of the C(dict) function.
options:
_input:
description: A list of tuples (with exactly two elements).
type: list
elements: tuple
required: true
'''
EXAMPLES = '''
- name: Convert list of tuples into dictionary
ansible.builtin.set_fact:
dictionary: "{{ [[1, 2], ['a', 'b']] | community.general.dict }}"
# Result is {1: 2, 'a': 'b'}
- name: Create a list of dictionaries with map and the community.general.dict filter
ansible.builtin.debug:
msg: >-
{{ values | map('zip', ['k1', 'k2', 'k3'])
| map('map', 'reverse')
| map('community.general.dict') }}
vars:
values:
- - foo
- 23
- a
- - bar
- 42
- b
# Produces the following list of dictionaries:
# {
# "k1": "foo",
# "k2": 23,
# "k3": "a"
# },
# {
# "k1": "bar",
# "k2": 42,
# "k3": "b"
# }
'''
RETURN = '''
_value:
description: The dictionary having the provided key-value pairs.
type: boolean
'''
def dict_filter(sequence):
'''Convert a list of tuples to a dictionary.

View File

@@ -5,6 +5,38 @@
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
DOCUMENTATION = '''
name: dict_kv
short_description: Convert a value to a dictionary with a single key-value pair
version_added: 1.3.0
author: Stanislav German-Evtushenko (@giner)
description:
- Convert a value to a dictionary with a single key-value pair.
positional: key
options:
_input:
description: The value for the single key-value pair.
type: any
required: true
key:
description: The key for the single key-value pair.
type: any
required: true
'''
EXAMPLES = '''
- name: Create a one-element dictionary from a value
ansible.builtin.debug:
msg: "{{ 'myvalue' | dict_kv('mykey') }}"
# Produces the dictionary {'mykey': 'myvalue'}
'''
RETURN = '''
_value:
description: A dictionary with a single key-value pair.
type: dictionary
'''
def dict_kv(value, key):
'''Return a dictionary with a single key-value pair

View File

@@ -7,6 +7,78 @@
from __future__ import absolute_import, division, print_function
__metaclass__ = type
DOCUMENTATION = '''
name: from_csv
short_description: Converts CSV text input into list of dicts
version_added: 2.3.0
author: Andrew Pantuso (@Ajpantuso)
description:
- Converts CSV text input into list of dictionaries.
options:
_input:
description: A string containing a CSV document.
type: string
required: true
dialect:
description:
- The CSV dialect to use when parsing the CSV file.
- Possible values include C(excel), C(excel-tab) or C(unix).
type: str
default: excel
fieldnames:
description:
- A list of field names for every column.
- This is needed if the CSV does not have a header.
type: list
elements: str
delimiter:
description:
- A one-character string used to separate fields.
- When using this parameter, you change the default value used by I(dialect).
- The default value depends on the dialect used.
type: str
skipinitialspace:
description:
- Whether to ignore any whitespaces immediately following the delimiter.
- When using this parameter, you change the default value used by I(dialect).
- The default value depends on the dialect used.
type: bool
strict:
description:
- Whether to raise an exception on bad CSV input.
- When using this parameter, you change the default value used by I(dialect).
- The default value depends on the dialect used.
type: bool
'''
EXAMPLES = '''
- name: Parse a CSV file's contents
ansible.builtin.debug:
msg: >-
{{ csv_data | community.genera.from_csv(dialect='unix') }}
vars:
csv_data: |
Column 1,Value
foo,23
bar,42
# Produces the following list of dictionaries:
# {
# "Column 1": "foo",
# "Value": "23",
# },
# {
# "Column 1": "bar",
# "Value": "42",
# }
'''
RETURN = '''
_value:
description: A list with one dictionary per row.
type: list
elements: dictionary
'''
from ansible.errors import AnsibleFilterError
from ansible.module_utils.common.text.converters import to_native

View File

@@ -0,0 +1,42 @@
DOCUMENTATION:
name: groupby_as_dict
short_description: Transform a sequence of dictionaries to a dictionary where the dictionaries are indexed by an attribute
version_added: 3.1.0
author: Felix Fontein (@felixfontein)
description:
- Transform a sequence of dictionaries to a dictionary where the dictionaries are indexed by an attribute.
positional: attribute
options:
_input:
description: A list of dictionaries
type: list
elements: dictionary
required: true
attribute:
description: The attribute to use as the key.
type: str
required: true
EXAMPLES: |
- name: Arrange a list of dictionaries as a dictionary of dictionaries
ansible.builtin.debug:
msg: "{{ sequence | community.general.groupby_as_dict('key') }}"
vars:
sequence:
- key: value
foo: bar
- key: other_value
baz: bar
# Produces the following nested structure:
#
# value:
# key: value
# foo: bar
# other_value:
# key: other_value
# baz: bar
RETURN:
_value:
description: A dictionary containing the dictionaries from the list as values.
type: dictionary

View File

@@ -0,0 +1,38 @@
DOCUMENTATION:
name: hashids_decode
short_description: Decodes a sequence of numbers from a YouTube-like hash
version_added: 3.0.0
author: Andrew Pantuso (@Ajpantuso)
description:
- Decodes a sequence of numbers from a YouTube-like hash.
options:
_input:
description: A YouTube-like hash.
type: string
required: true
salt:
description:
- String to use as salt when hashing.
type: str
default: excel
alphabet:
description:
- String of 16 or more unique characters to produce a hash.
type: list
elements: str
min_length:
description:
- Minimum length of hash produced.
type: integer
EXAMPLES: |
- name: Convert hash to list of integers
ansible.builtin.debug:
msg: "{{ 'o2fXhV' | community.general.hashids_decode }}"
# Produces: [1, 2, 3]
RETURN:
_value:
description: A list of integers.
type: list
elements: integer

View File

@@ -0,0 +1,38 @@
DOCUMENTATION:
name: hashids_encode
short_description: Encodes YouTube-like hashes from a sequence of integers
version_added: 3.0.0
author: Andrew Pantuso (@Ajpantuso)
description:
- Encodes YouTube-like hashes from a sequence of integers.
options:
_input:
description: A list of integers.
type: list
elements: integer
required: true
salt:
description:
- String to use as salt when hashing.
type: str
default: excel
alphabet:
description:
- String of 16 or more unique characters to produce a hash.
type: list
elements: str
min_length:
description:
- Minimum length of hash produced.
type: integer
EXAMPLES: |
- name: Convert list of integers to hash
ansible.builtin.debug:
msg: "{{ [1, 2, 3] | community.general.hashids_encode }}"
# Produces: 'o2fXhV'
RETURN:
_value:
description: A YouTube-like hash.
type: string

View File

@@ -21,6 +21,67 @@
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
DOCUMENTATION = '''
name: jc
short_description: Convert output of many shell commands and file-types to JSON
version_added: 1.1.0
author: Kelly Brazil (@kellyjonbrazil)
description:
- Convert output of many shell commands and file-types to JSON.
- Uses the L(jc library,https://github.com/kellyjonbrazil/jc).
positional: parser
options:
_input:
description: The data to convert.
type: string
required: true
parser:
description:
- The correct parser for the input data.
- For exmaple C(ifconfig).
- See U(https://github.com/kellyjonbrazil/jc#parsers) for the latest list of parsers.
type: string
required: true
quiet:
description: Set to C(false) to not suppress warnings.
type: boolean
default: true
raw:
description: Set to C(true) to return pre-processed JSON.
type: boolean
default: false
requirements:
- jc (https://github.com/kellyjonbrazil/jc)
'''
EXAMPLES = '''
- name: Run command
ansible.builtin.command: uname -a
register: result
- name: Convert command's result to JSON
ansible.builtin.debug:
msg: "{{ result.stdout | community.general.jc('uname') }}"
# Possible output:
#
# "msg": {
# "hardware_platform": "x86_64",
# "kernel_name": "Linux",
# "kernel_release": "4.15.0-112-generic",
# "kernel_version": "#113-Ubuntu SMP Thu Jul 9 23:41:39 UTC 2020",
# "machine": "x86_64",
# "node_name": "kbrazil-ubuntu",
# "operating_system": "GNU/Linux",
# "processor": "x86_64"
# }
'''
RETURN = '''
_value:
description: The processed output.
type: any
'''
from ansible.errors import AnsibleError, AnsibleFilterError
import importlib

View File

@@ -19,6 +19,107 @@
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
DOCUMENTATION = '''
name: json_query
short_description: Select a single element or a data subset from a complex data structure
description:
- This filter lets you query a complex JSON structure and iterate over it using a loop structure.
positional: expr
options:
_input:
description:
- The JSON data to query.
type: any
required: true
expr:
description:
- The query expression.
- See U(http://jmespath.org/examples.html) for examples.
type: string
required: true
requirements:
- jmespath
'''
EXAMPLES = '''
- name: Define data to work on in the examples below
ansible.builtin.set_fact:
domain_definition:
domain:
cluster:
- name: cluster1
- name: cluster2
server:
- name: server11
cluster: cluster1
port: '8080'
- name: server12
cluster: cluster1
port: '8090'
- name: server21
cluster: cluster2
port: '9080'
- name: server22
cluster: cluster2
port: '9090'
library:
- name: lib1
target: cluster1
- name: lib2
target: cluster2
- name: Display all cluster names
ansible.builtin.debug:
var: item
loop: "{{ domain_definition | community.general.json_query('domain.cluster[*].name') }}"
- name: Display all server names
ansible.builtin.debug:
var: item
loop: "{{ domain_definition | community.general.json_query('domain.server[*].name') }}"
- name: Display all ports from cluster1
ansible.builtin.debug:
var: item
loop: "{{ domain_definition | community.general.json_query(server_name_cluster1_query) }}"
vars:
server_name_cluster1_query: "domain.server[?cluster=='cluster1'].port"
- name: Display all ports from cluster1 as a string
ansible.builtin.debug:
msg: "{{ domain_definition | community.general.json_query('domain.server[?cluster==`cluster1`].port') | join(', ') }}"
- name: Display all ports from cluster1
ansible.builtin.debug:
var: item
loop: "{{ domain_definition | community.general.json_query('domain.server[?cluster==''cluster1''].port') }}"
- name: Display all server ports and names from cluster1
ansible.builtin.debug:
var: item
loop: "{{ domain_definition | community.general.json_query(server_name_cluster1_query) }}"
vars:
server_name_cluster1_query: "domain.server[?cluster=='cluster2'].{name: name, port: port}"
- name: Display all ports from cluster1
ansible.builtin.debug:
msg: "{{ domain_definition | to_json | from_json | community.general.json_query(server_name_query) }}"
vars:
server_name_query: "domain.server[?starts_with(name,'server1')].port"
- name: Display all ports from cluster1
ansible.builtin.debug:
msg: "{{ domain_definition | to_json | from_json | community.general.json_query(server_name_query) }}"
vars:
server_name_query: "domain.server[?contains(name,'server1')].port"
'''
RETURN = '''
_value:
description: The result of the query.
type: any
'''
from ansible.errors import AnsibleError, AnsibleFilterError
try:

View File

@@ -0,0 +1,62 @@
DOCUMENTATION:
name: lists_mergeby
short_description: Merge two lists of dictionaries by a given attribute
version_added: 2.0.0
author: Vladimir Botka (@vbotka)
description:
- Merge two lists by attribute I(index).
positional: another_list, index
options:
_input:
description: A list of dictionaries.
type: list
elements: dictionary
required: true
another_list:
description: Another list of dictionaries.
type: list
elements: dictionary
required: true
index:
description:
- The dictionary key that must be present in every dictionary in every list that is used to
merge the lists.
type: string
required: true
EXAMPLES: |
- name: Merge two lists
ansible.builtin.debug:
msg: >-
{{ list1 | community.general.lists_mergeby(list2, 'index') }}"
vars:
list1:
- index: a
value: 123
- index: b
value: 42
list2:
- index: a
foo: bar
- index: c
foo: baz
# Produces the following list of dictionaries:
# {
# "index": "a",
# "foo": "bar",
# "value": 123
# },
# {
# "index": "b",
# "value": 42
# },
# {
# "index": "c",
# "foo": "baz"
# }
RETURN:
_value:
description: The merged list.
type: list
elements: dictionary

View File

@@ -20,6 +20,41 @@
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
DOCUMENTATION = '''
name: random_mac
short_description: Generate a random MAC address
description:
- Generates random networking interfaces MAC addresses for a given prefix.
options:
_input:
description: A string prefix to use as a basis for the random MAC generated.
type: string
required: true
seed:
description:
- A randomization seed to initialize the process, used to get repeatable results.
- If no seed is provided, a system random source such as C(/dev/urandom) is used.
required: false
type: string
'''
EXAMPLES = '''
- name: Random MAC given a prefix
ansible.builtin.debug:
msg: "{{ '52:54:00' | community.general.random_mac }}"
# => '52:54:00:ef:1c:03'
- name: With a seed
ansible.builtin.debug:
msg: "{{ '52:54:00' | community.general.random_mac(seed=inventory_hostname) }}"
'''
RETURN = '''
_value:
description: The generated MAC.
type: string
'''
import re
from random import Random, SystemRandom

View File

@@ -0,0 +1,40 @@
DOCUMENTATION:
name: to_days
short_description: Converte a duration string to days
version_added: 0.2.0
description:
- Parse a human readable time duration string and convert to days.
options:
_input:
description:
- The time string to convert.
- Can use the units C(y) and C(year) for a year, C(mo) and C(month) for a month, C(w) and C(week) for a week,
C(d) and C(day) for a day, C(h) and C(hour) for a hour, C(m), C(min) and C(minute) for minutes, C(s), C(sec)
and C(second) for seconds, C(ms), C(msec), C(msecond) and C(millisecond) for milliseconds. The suffix C(s)
can be added to a unit as well, so C(seconds) is the same as C(second).
- Valid strings are space separated combinations of an integer with an optional minus sign and a unit.
- Examples are C(1h), C(-5m), and C(3h -5m 6s).
type: string
required: true
year:
description:
- Number of days per year.
default: 365
type: float
month:
description:
- Number of days per month.
default: 30
type: float
author:
- René Moser (@resmo)
EXAMPLES: |
- name: Convert a duration into days
ansible.builtin.debug:
msg: "{{ '1y 7m 5d 30h' | community.general.to_days }}"
RETURN:
_value:
description: Number of days.
type: float

View File

@@ -0,0 +1,40 @@
DOCUMENTATION:
name: to_hours
short_description: Converte a duration string to hours
version_added: 0.2.0
description:
- Parse a human readable time duration string and convert to hours.
options:
_input:
description:
- The time string to convert.
- Can use the units C(y) and C(year) for a year, C(mo) and C(month) for a month, C(w) and C(week) for a week,
C(d) and C(day) for a day, C(h) and C(hour) for a hour, C(m), C(min) and C(minute) for minutes, C(s), C(sec)
and C(second) for seconds, C(ms), C(msec), C(msecond) and C(millisecond) for milliseconds. The suffix C(s)
can be added to a unit as well, so C(seconds) is the same as C(second).
- Valid strings are space separated combinations of an integer with an optional minus sign and a unit.
- Examples are C(1h), C(-5m), and C(3h -5m 6s).
type: string
required: true
year:
description:
- Number of days per year.
default: 365
type: float
month:
description:
- Number of days per month.
default: 30
type: float
author:
- René Moser (@resmo)
EXAMPLES: |
- name: Convert a duration into hours
ansible.builtin.debug:
msg: "{{ '7d 30h 20m 10s 123ms' | community.general.to_hours }}"
RETURN:
_value:
description: Number of hours.
type: float

View File

@@ -0,0 +1,40 @@
DOCUMENTATION:
name: to_milliseconds
short_description: Converte a duration string to milliseconds
version_added: 0.2.0
description:
- Parse a human readable time duration string and convert to milliseconds.
options:
_input:
description:
- The time string to convert.
- Can use the units C(y) and C(year) for a year, C(mo) and C(month) for a month, C(w) and C(week) for a week,
C(d) and C(day) for a day, C(h) and C(hour) for a hour, C(m), C(min) and C(minute) for minutes, C(s), C(sec)
and C(second) for seconds, C(ms), C(msec), C(msecond) and C(millisecond) for milliseconds. The suffix C(s)
can be added to a unit as well, so C(seconds) is the same as C(second).
- Valid strings are space separated combinations of an integer with an optional minus sign and a unit.
- Examples are C(1h), C(-5m), and C(3h -5m 6s).
type: string
required: true
year:
description:
- Number of days per year.
default: 365
type: float
month:
description:
- Number of days per month.
default: 30
type: float
author:
- René Moser (@resmo)
EXAMPLES: |
- name: Convert a duration into milliseconds
ansible.builtin.debug:
msg: "{{ '30h 20m 10s 123ms' | community.general.to_milliseconds }}"
RETURN:
_value:
description: Number of milliseconds.
type: float

View File

@@ -0,0 +1,40 @@
DOCUMENTATION:
name: to_minutes
short_description: Converte a duration string to minutes
version_added: 0.2.0
description:
- Parse a human readable time duration string and convert to minutes.
options:
_input:
description:
- The time string to convert.
- Can use the units C(y) and C(year) for a year, C(mo) and C(month) for a month, C(w) and C(week) for a week,
C(d) and C(day) for a day, C(h) and C(hour) for a hour, C(m), C(min) and C(minute) for minutes, C(s), C(sec)
and C(second) for seconds, C(ms), C(msec), C(msecond) and C(millisecond) for milliseconds. The suffix C(s)
can be added to a unit as well, so C(seconds) is the same as C(second).
- Valid strings are space separated combinations of an integer with an optional minus sign and a unit.
- Examples are C(1h), C(-5m), and C(3h -5m 6s).
type: string
required: true
year:
description:
- Number of days per year.
default: 365
type: float
month:
description:
- Number of days per month.
default: 30
type: float
author:
- René Moser (@resmo)
EXAMPLES: |
- name: Convert a duration into minutes
ansible.builtin.debug:
msg: "{{ '30h 20m 10s 123ms' | community.general.to_minutes }}"
RETURN:
_value:
description: Number of minutes.
type: float

View File

@@ -0,0 +1,40 @@
DOCUMENTATION:
name: to_months
short_description: Converte a duration string to months
version_added: 0.2.0
description:
- Parse a human readable time duration string and convert to months.
options:
_input:
description:
- The time string to convert.
- Can use the units C(y) and C(year) for a year, C(mo) and C(month) for a month, C(w) and C(week) for a week,
C(d) and C(day) for a day, C(h) and C(hour) for a hour, C(m), C(min) and C(minute) for minutes, C(s), C(sec)
and C(second) for seconds, C(ms), C(msec), C(msecond) and C(millisecond) for milliseconds. The suffix C(s)
can be added to a unit as well, so C(seconds) is the same as C(second).
- Valid strings are space separated combinations of an integer with an optional minus sign and a unit.
- Examples are C(1h), C(-5m), and C(3h -5m 6s).
type: string
required: true
year:
description:
- Number of days per year.
default: 365
type: float
month:
description:
- Number of days per month.
default: 30
type: float
author:
- René Moser (@resmo)
EXAMPLES: |
- name: Convert a duration into months
ansible.builtin.debug:
msg: "{{ '1y 7m 5d 30h' | community.general.to_months }}"
RETURN:
_value:
description: Number of months.
type: float

View File

@@ -0,0 +1,40 @@
DOCUMENTATION:
name: to_seconds
short_description: Converte a duration string to seconds
version_added: 0.2.0
description:
- Parse a human readable time duration string and convert to seconds.
options:
_input:
description:
- The time string to convert.
- Can use the units C(y) and C(year) for a year, C(mo) and C(month) for a month, C(w) and C(week) for a week,
C(d) and C(day) for a day, C(h) and C(hour) for a hour, C(m), C(min) and C(minute) for minutes, C(s), C(sec)
and C(second) for seconds, C(ms), C(msec), C(msecond) and C(millisecond) for milliseconds. The suffix C(s)
can be added to a unit as well, so C(seconds) is the same as C(second).
- Valid strings are space separated combinations of an integer with an optional minus sign and a unit.
- Examples are C(1h), C(-5m), and C(3h -5m 6s).
type: string
required: true
year:
description:
- Number of days per year.
default: 365
type: float
month:
description:
- Number of days per month.
default: 30
type: float
author:
- René Moser (@resmo)
EXAMPLES: |
- name: Convert a duration into seconds
ansible.builtin.debug:
msg: "{{ '30h 20m 10s 123ms' | community.general.to_seconds }}"
RETURN:
_value:
description: Number of seconds.
type: float

View File

@@ -0,0 +1,84 @@
DOCUMENTATION:
name: to_time_unit
short_description: Converte a duration string to the given time unit
version_added: 0.2.0
description:
- Parse a human readable time duration string and convert to the given time unit.
positional: unit
options:
_input:
description:
- The time string to convert.
- Can use the units C(y) and C(year) for a year, C(mo) and C(month) for a month, C(w) and C(week) for a week,
C(d) and C(day) for a day, C(h) and C(hour) for a hour, C(m), C(min) and C(minute) for minutes, C(s), C(sec)
and C(second) for seconds, C(ms), C(msec), C(msecond) and C(millisecond) for milliseconds. The suffix C(s)
can be added to a unit as well, so C(seconds) is the same as C(second).
- Valid strings are space separated combinations of an integer with an optional minus sign and a unit.
- Examples are C(1h), C(-5m), and C(3h -5m 6s).
type: string
required: true
unit:
description:
- Time unit to convert the duration to.
default: ms
choices:
- millisecond
- milliseconds
- ms
- msec
- msecs
- msecond
- mseconds
- s
- sec
- secs
- second
- seconds
- h
- hour
- hours
- hs
- m
- min
- mins
- minute
- minutes
- d
- ds
- day
- days
- w
- ws
- week
- weeks
- mo
- mos
- month
- months
- y
- ys
- year
- years
type: string
year:
description:
- Number of days per year.
default: 365
type: float
month:
description:
- Number of days per month.
default: 30
type: float
author:
- René Moser (@resmo)
EXAMPLES: |
- name: Convert a duration into seconds
ansible.builtin.debug:
msg: "{{ '1053d 17h 53m -10s 391ms' | community.general.to_time_unit('s') }}"
RETURN:
_value:
description: Number of time units.
type: float

View File

@@ -0,0 +1,40 @@
DOCUMENTATION:
name: to_weeks
short_description: Converte a duration string to weeks
version_added: 0.2.0
description:
- Parse a human readable time duration string and convert to weeks.
options:
_input:
description:
- The time string to convert.
- Can use the units C(y) and C(year) for a year, C(mo) and C(month) for a month, C(w) and C(week) for a week,
C(d) and C(day) for a day, C(h) and C(hour) for a hour, C(m), C(min) and C(minute) for minutes, C(s), C(sec)
and C(second) for seconds, C(ms), C(msec), C(msecond) and C(millisecond) for milliseconds. The suffix C(s)
can be added to a unit as well, so C(seconds) is the same as C(second).
- Valid strings are space separated combinations of an integer with an optional minus sign and a unit.
- Examples are C(1h), C(-5m), and C(3h -5m 6s).
type: string
required: true
year:
description:
- Number of days per year.
default: 365
type: float
month:
description:
- Number of days per month.
default: 30
type: float
author:
- René Moser (@resmo)
EXAMPLES: |
- name: Convert a duration into weeks
ansible.builtin.debug:
msg: "{{ '1y 7m 5d 30h' | community.general.to_weeks }}"
RETURN:
_value:
description: Number of weeks.
type: float

View File

@@ -0,0 +1,40 @@
DOCUMENTATION:
name: to_years
short_description: Converte a duration string to years
version_added: 0.2.0
description:
- Parse a human readable time duration string and convert to years.
options:
_input:
description:
- The time string to convert.
- Can use the units C(y) and C(year) for a year, C(mo) and C(month) for a month, C(w) and C(week) for a week,
C(d) and C(day) for a day, C(h) and C(hour) for a hour, C(m), C(min) and C(minute) for minutes, C(s), C(sec)
and C(second) for seconds, C(ms), C(msec), C(msecond) and C(millisecond) for milliseconds. The suffix C(s)
can be added to a unit as well, so C(seconds) is the same as C(second).
- Valid strings are space separated combinations of an integer with an optional minus sign and a unit.
- Examples are C(1h), C(-5m), and C(3h -5m 6s).
type: string
required: true
year:
description:
- Number of days per year.
default: 365
type: float
month:
description:
- Number of days per month.
default: 30
type: float
author:
- René Moser (@resmo)
EXAMPLES: |
- name: Convert a duration into years
ansible.builtin.debug:
msg: "{{ '1053d 30h' | community.general.to_years }}"
RETURN:
_value:
description: Number of years.
type: float

View File

@@ -6,6 +6,46 @@
from __future__ import absolute_import, division, print_function
__metaclass__ = type
DOCUMENTATION = '''
name: unicode_normalize
short_description: Normalizes unicode strings to facilitate comparison of characters with normalized forms
version_added: 3.7.0
author: Andrew Pantuso (@Ajpantuso)
description:
- Normalizes unicode strings to facilitate comparison of characters with normalized forms.
positional: form
options:
_input:
description: A unicode string.
type: string
required: true
form:
description:
- The normal form to use.
- See U(https://docs.python.org/3/library/unicodedata.html#unicodedata.normalize) for details.
type: string
default: NFC
choices:
- NFC
- NFD
- NFKC
- NFKD
'''
EXAMPLES = '''
- name: Normalize unicode string
ansible.builtin.set_fact:
dictionary: "{{ 'ä' | community.general.unicode_normalize('NFKD') }}"
# The resulting string has length 2: one letter is 'a', the other
# the diacritic combiner.
'''
RETURN = '''
_value:
description: The normalized unicode string of the specified normal form.
type: string
'''
from unicodedata import normalize
from ansible.errors import AnsibleFilterError, AnsibleFilterTypeError

View File

@@ -5,6 +5,35 @@
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
DOCUMENTATION = '''
name: version_sort
short_description: Sort a list according to version order instead of pure alphabetical one
version_added: 2.2.0
author: Eric L. (@ericzolf)
description:
- Sort a list according to version order instead of pure alphabetical one.
options:
_input:
description: A list of strings to sort.
type: list
elements: string
required: true
'''
EXAMPLES = '''
- name: Convert list of tuples into dictionary
ansible.builtin.set_fact:
dictionary: "{{ ['2.1', '2.10', '2.9'] | community.general.version_sort }}"
# Result is ['2.1', '2.9', '2.10']
'''
RETURN = '''
_value:
description: The list of strings sorted by version.
type: list
elements: string
'''
from ansible_collections.community.general.plugins.module_utils.version import LooseVersion

View File

@@ -47,6 +47,7 @@ DOCUMENTATION = '''
group_by:
description: Keys to group hosts by
type: list
elements: string
default: [ 'mgmt_classes', 'owners', 'status' ]
group:
description: Group to place all hosts into

View File

@@ -35,7 +35,6 @@ DOCUMENTATION = '''
version_added: 1.0.0
type: str
required: true
default: https://gitlab.com
api_token:
description: GitLab token for logging in.
env:

View File

@@ -43,15 +43,18 @@ DOCUMENTATION = r'''
description: Populate inventory with instances in this region.
default: []
type: list
elements: string
tags:
description: Populate inventory only with instances which have at least one of the tags listed here.
default: []
type: list
elements: string
version_added: 2.0.0
types:
description: Populate inventory with instances with this type.
default: []
type: list
elements: string
strict:
version_added: 2.0.0
compose:

View File

@@ -27,6 +27,7 @@ DOCUMENTATION = '''
exclude:
description: list of addresses to exclude
type: list
elements: string
ports:
description: Enable/disable scanning for open ports
type: boolean

View File

@@ -28,6 +28,7 @@ DOCUMENTATION = r'''
hostnames:
description: List of preference about what to use as an hostname.
type: list
elements: string
default:
- public_ipv4
choices:
@@ -37,6 +38,7 @@ DOCUMENTATION = r'''
groups:
description: List of groups.
type: list
elements: string
choices:
- location
- offer

View File

@@ -114,6 +114,22 @@ groups:
mailservers: "'mail' in (proxmox_tags_parsed|list)"
compose:
ansible_port: 2222
# Using the inventory to allow ansible to connect via the first IP address of the VM / Container
# (Default is connection by name of QEMU/LXC guests)
# Note: my_inv_var demonstrates how to add a string variable to every host used by the inventory.
# my.proxmox.yml
plugin: community.general.proxmox
url: http://pve.domain.com:8006
user: ansible@pve
password: secure
validate_certs: false
want_facts: true
compose:
ansible_host: proxmox_ipconfig0.ip | default(proxmox_net0.ip) | ipaddr('address')
my_inv_var_1: "'my_var1_value'"
my_inv_var_2: >
"my_var_2_value"
'''
import re
@@ -291,7 +307,7 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
self.inventory.set_variable(name, vmtype_key, vmtype)
plaintext_configs = [
'tags',
'description',
]
for config in ret:
@@ -317,11 +333,11 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
if agent_iface_value:
self.inventory.set_variable(name, agent_iface_key, agent_iface_value)
if not (isinstance(value, int) or ',' not in value):
if config not in plaintext_configs and not isinstance(value, int) and all("=" in v for v in value.split(",")):
# split off strings with commas to a dict
# skip over any keys that cannot be processed
try:
value = dict(key.split("=") for key in value.split(","))
value = dict(key.split("=", 1) for key in value.split(","))
except Exception:
continue

View File

@@ -23,6 +23,7 @@ DOCUMENTATION = r'''
regions:
description: Filter results on a specific Scaleway region.
type: list
elements: string
default:
- ams1
- par1
@@ -31,6 +32,7 @@ DOCUMENTATION = r'''
tags:
description: Filter results on a specific tag.
type: list
elements: string
oauth_token:
description:
- Scaleway OAuth token.
@@ -45,6 +47,7 @@ DOCUMENTATION = r'''
hostnames:
description: List of preference about what to use as an hostname.
type: list
elements: string
default:
- public_ipv4
choices:

View File

@@ -20,6 +20,7 @@ DOCUMENTATION = '''
_raw:
description: List of key(s) to retrieve.
type: list
elements: string
recurse:
type: boolean
description: If true, will retrieve all the values that have the given key as prefix.

View File

@@ -17,11 +17,11 @@ DOCUMENTATION = '''
_terms:
description: term or list of terms to lookup in the credit store
type: list
required: True
elements: string
required: true
table:
description: name of the credstash table to query
default: 'credential-store'
required: True
version:
description: Credstash version
region:

View File

@@ -57,14 +57,19 @@ EXAMPLES = """
"""
RETURN = """
password:
description:
- The actual value stored
passprops:
description: properties assigned to the entry
type: dictionary
passwordchangeinprocess:
description: did the password change?
_result:
description: A list containing one dictionary.
type: list
elements: dictionary
contains:
password:
description:
- The actual value stored
passprops:
description: properties assigned to the entry
type: dictionary
passwordchangeinprocess:
description: did the password change?
"""
import os

View File

@@ -18,6 +18,7 @@ DOCUMENTATION = '''
description: domain or list of domains to query TXT records from
required: True
type: list
elements: string
'''
EXAMPLES = """

View File

@@ -105,11 +105,15 @@ display = Display()
class LookupModule(LookupBase):
@staticmethod
def Client(vault_parameters):
return SecretsVault(**vault_parameters)
try:
vault = SecretsVault(**vault_parameters)
return vault
except TypeError:
raise AnsibleError("python-dsv-sdk==0.0.1 must be installed to use this plugin")
def run(self, terms, variables, **kwargs):
if sdk_is_missing:
raise AnsibleError("python-dsv-sdk must be installed to use this plugin")
raise AnsibleError("python-dsv-sdk==0.0.1 must be installed to use this plugin")
self.set_options(var_options=variables, direct=kwargs)

View File

@@ -48,7 +48,6 @@ options:
- The CIDR of the network to retrieve the next network from next available network within the
specified container. Also, Requested CIDR must be specified and greater than the parent CIDR.
required: True
default: 24
num:
description: The number of network addresses to return from network-container
required: false

View File

@@ -45,8 +45,8 @@ DOCUMENTATION = '''
description: Vault containing the item to retrieve (case-insensitive). If absent will search all vaults.
notes:
- This lookup will use an existing 1Password session if one exists. If not, and you have already
performed an initial sign in (meaning C(~/.op/config exists)), then only the C(master_password) is required.
You may optionally specify C(subdomain) in this scenario, otherwise the last used subdomain will be used by C(op).
performed an initial sign in (meaning C(~/.op/config), C(~/.config/op/config) or C(~/.config/.op/config) exists), then only the
C(master_password) is required. You may optionally specify C(subdomain) in this scenario, otherwise the last used subdomain will be used by C(op).
- This lookup can perform an initial login by providing C(subdomain), C(username), C(secret_key), and C(master_password).
- Due to the B(very) sensitive nature of these credentials, it is B(highly) recommended that you only pass in the minimal credentials
needed at any given time. Also, store these credentials in an Ansible Vault using a key that is equal to or greater in strength
@@ -105,12 +105,12 @@ from ansible.plugins.lookup import LookupBase
from ansible.errors import AnsibleLookupError
from ansible.module_utils.common.text.converters import to_bytes, to_text
from ansible_collections.community.general.plugins.module_utils.onepassword import OnePasswordConfig
class OnePass(object):
def __init__(self, path='op'):
self.cli_path = path
self.config_file_path = os.path.expanduser('~/.op/config')
self.logged_in = False
self.token = None
self.subdomain = None
@@ -119,9 +119,11 @@ class OnePass(object):
self.secret_key = None
self.master_password = None
self._config = OnePasswordConfig()
def get_token(self):
# If the config file exists, assume an initial signin has taken place and try basic sign in
if os.path.isfile(self.config_file_path):
if os.path.isfile(self._config.config_file_path):
if not self.master_password:
raise AnsibleLookupError('Unable to sign in to 1Password. master_password is required.')
@@ -281,4 +283,5 @@ class LookupModule(LookupBase):
values = []
for term in terms:
values.append(op.get_field(term, field, section, vault))
return values

View File

@@ -154,6 +154,7 @@ display = Display()
# backhacked check_output with input for python 2.7
# http://stackoverflow.com/questions/10103551/passing-data-to-subprocess-check-output
# note: contains special logic for calling 'pass', so not a drop-in replacement for check_output
def check_output2(*popenargs, **kwargs):
if 'stdout' in kwargs:
raise ValueError('stdout argument not allowed, it will be overridden.')
@@ -175,9 +176,10 @@ def check_output2(*popenargs, **kwargs):
process.wait()
raise
retcode = process.poll()
if retcode != 0 or \
b'encryption failed: Unusable public key' in b_out or \
b'encryption failed: Unusable public key' in b_err:
if retcode == 0 and (b'encryption failed: Unusable public key' in b_out or
b'encryption failed: Unusable public key' in b_err):
retcode = 78 # os.EX_CONFIG
if retcode != 0:
cmd = kwargs.get("args")
if cmd is None:
cmd = popenargs[0]
@@ -227,13 +229,13 @@ class LookupModule(LookupBase):
# Collect pass environment variables from the plugin's parameters.
self.env = os.environ.copy()
self.env['LANGUAGE'] = 'C' # make sure to get errors in English as required by check_output2
# Set PASSWORD_STORE_DIR if directory is set
if self.paramvals['directory']:
if os.path.isdir(self.paramvals['directory']):
self.env['PASSWORD_STORE_DIR'] = self.paramvals['directory']
else:
raise AnsibleError('Passwordstore directory \'{0}\' does not exist'.format(self.paramvals['directory']))
# Set PASSWORD_STORE_DIR
if os.path.isdir(self.paramvals['directory']):
self.env['PASSWORD_STORE_DIR'] = self.paramvals['directory']
else:
raise AnsibleError('Passwordstore directory \'{0}\' does not exist'.format(self.paramvals['directory']))
# Set PASSWORD_STORE_UMASK if umask is set
if 'umask' in self.paramvals:
@@ -261,19 +263,20 @@ class LookupModule(LookupBase):
if ':' in line:
name, value = line.split(':', 1)
self.passdict[name.strip()] = value.strip()
if os.path.isfile(os.path.join(self.paramvals['directory'], self.passname + ".gpg")):
# Only accept password as found, if there a .gpg file for it (might be a tree node otherwise)
return True
except (subprocess.CalledProcessError) as e:
if e.returncode != 0 and 'not in the password store' in e.output:
# if pass returns 1 and return string contains 'is not in the password store.'
# We need to determine if this is valid or Error.
if self.paramvals['missing'] == 'error':
raise AnsibleError('passwordstore: passname {0} not found and missing=error is set'.format(self.passname))
else:
if self.paramvals['missing'] == 'warn':
display.warning('passwordstore: passname {0} not found'.format(self.passname))
return False
else:
# 'not in password store' is the expected error if a password wasn't found
if 'not in the password store' not in e.output:
raise AnsibleError(e)
return True
if self.paramvals['missing'] == 'error':
raise AnsibleError('passwordstore: passname {0} not found and missing=error is set'.format(self.passname))
elif self.paramvals['missing'] == 'warn':
display.warning('passwordstore: passname {0} not found'.format(self.passname))
return False
def get_newpass(self):
if self.paramvals['nosymbols']:
@@ -329,7 +332,9 @@ class LookupModule(LookupBase):
result = []
self.paramvals = {
'subkey': 'password',
'directory': variables.get('passwordstore'),
'directory': variables.get('passwordstore', os.environ.get(
'PASSWORD_STORE_DIR',
os.path.expanduser('~/.password-store'))),
'create': False,
'returnall': False,
'overwrite': False,

View File

@@ -14,6 +14,10 @@ description:
- Uses the Thycotic Secret Server Python SDK to get Secrets from Secret
Server using token authentication with I(username) and I(password) on
the REST API at I(base_url).
- When using self-signed certificates the environment variable
C(REQUESTS_CA_BUNDLE) can be set to a file containing the trusted certificates
(in C(.pem) format).
- For example, C(export REQUESTS_CA_BUNDLE='/etc/ssl/certs/ca-bundle.trust.crt').
requirements:
- python-tss-sdk - https://pypi.org/project/python-tss-sdk/
options:

View File

@@ -3,7 +3,7 @@
# Implements multiple version numbering conventions for the
# Python Module Distribution Utilities.
#
# PSF License (see licenses/PSF-license.txt or https://opensource.org/licenses/Python-2.0)
# PSF License (see PSF-license.txt or https://opensource.org/licenses/Python-2.0)
#
"""Provides classes to represent module version numbers (one class for

View File

@@ -337,7 +337,6 @@ def pritunl_auth_request(
auth_string = "&".join(
[api_token, auth_timestamp, auth_nonce, method.upper(), path]
+ ([data] if data else [])
)
auth_signature = base64.b64encode(

View File

@@ -0,0 +1,29 @@
# -*- coding: utf-8 -*-
# Simplified BSD License (see licenses/simplified_bsd.txt or https://opensource.org/licenses/BSD-2-Clause)
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
import os
class OnePasswordConfig(object):
_config_file_paths = (
"~/.op/config",
"~/.config/op/config",
"~/.config/.op/config",
)
def __init__(self):
self._config_file_path = ""
@property
def config_file_path(self):
if self._config_file_path:
return self._config_file_path
for path in self._config_file_paths:
realpath = os.path.expanduser(path)
if os.path.exists(realpath):
self._config_file_path = realpath
return self._config_file_path

View File

@@ -42,7 +42,7 @@ options:
description:
- Whether to wait for the tasks to finish before returning.
type: str
default: True
default: 'True'
required: False
requirements:
- python = 2.7

View File

@@ -66,8 +66,8 @@ options:
description:
- Whether the firewall policy is enabled or disabled
type: str
choices: [True, False]
default: True
choices: ['True', 'False']
default: 'True'
requirements:
- python = 2.7
- requests >= 2.5.0

View File

@@ -48,7 +48,7 @@ options:
description:
- Port to configure on the public-facing side of the load balancer pool
type: str
choices: [80, 443]
choices: ['80', '443']
nodes:
description:
- A list of nodes that needs to be added to the load balancer pool

View File

@@ -36,7 +36,7 @@ options:
wait:
description:
- Whether to wait for the provisioning tasks to finish before returning.
default: True
default: 'True'
required: False
type: str
requirements:

View File

@@ -51,7 +51,6 @@ options:
group.s
type: str
required: false
default: 0
vpc_id:
description:
- Specifies the resource ID of the VPC to which the security group

View File

@@ -324,7 +324,7 @@ def build_plan(command, project_path, variables_args, state_file, targets, state
if plan_path is None:
f, plan_path = tempfile.mkstemp(suffix='.tfplan')
local_command = command.copy()
local_command = command[:]
plan_command = [command[0], 'plan']

View File

@@ -42,7 +42,7 @@ options:
description:
- version of database (MySQL supports 5.1 and 5.6, MariaDB supports 10, Percona supports 5.6)
- "The available choices are: C(5.1), C(5.6) and C(10)."
default: 5.6
default: '5.6'
aliases: ['version']
state:
type: str

View File

@@ -411,7 +411,7 @@ class ConsulService(object):
self.address = address
self.port = port
self.tags = tags
self.checks = []
self._checks = []
if loaded:
self.id = loaded['ID']
self.name = loaded['Service']
@@ -424,8 +424,8 @@ class ConsulService(object):
if self.port:
optional['port'] = self.port
if len(self.checks) > 0:
optional['check'] = self.checks[0].check
if len(self._checks) > 0:
optional['check'] = self._checks[0].check
consul_api.agent.service.register(
self.name,
@@ -435,13 +435,13 @@ class ConsulService(object):
**optional)
def add_check(self, check):
self.checks.append(check)
self._checks.append(check)
def checks(self):
return self.checks
return self._checks
def has_checks(self):
return len(self.checks) > 0
return len(self._checks) > 0
def __eq__(self, other):
return (isinstance(other, self.__class__) and
@@ -459,8 +459,8 @@ class ConsulService(object):
data['port'] = self.port
if self.tags and len(self.tags) > 0:
data['tags'] = self.tags
if len(self.checks) > 0:
data['check'] = self.checks[0].to_dict()
if len(self._checks) > 0:
data['check'] = self._checks[0].to_dict()
return data

View File

@@ -25,7 +25,7 @@ options:
port:
description:
Database port to connect to.
default: 5433
default: '5433'
type: str
db:
description:

View File

@@ -44,7 +44,7 @@ options:
port:
description:
- Vertica cluster port to connect to.
default: 5433
default: '5433'
type: str
login_user:
description:

View File

@@ -58,7 +58,7 @@ options:
port:
description:
- Vertica cluster port to connect to.
default: 5433
default: '5433'
type: str
login_user:
description:

View File

@@ -70,7 +70,7 @@ options:
port:
description:
- Vertica cluster port to connect to.
default: 5433
default: '5433'
type: str
login_user:
description:

View File

@@ -83,7 +83,7 @@ options:
- Whether or not the file to create should be a sparse file.
- This option is effective only on newly created files, or when growing a
file, only for the bytes to append.
- This option is not supported on OpenBSD, Solaris and AIX.
- This option is not supported on OSes or filesystems not supporting sparse files.
- I(force=true) and I(sparse=true) are mutually exclusive.
type: bool
default: false
@@ -129,6 +129,10 @@ seealso:
- name: dd(1) manpage for NetBSD
description: Manual page of the NetBSD's dd implementation.
link: https://man.netbsd.org/dd.1
- name: busybox(1) manpage for Linux
description: Manual page of the GNU/Linux's busybox, that provides its own dd implementation.
link: https://www.unix.com/man-page/linux/1/busybox
'''
EXAMPLES = r'''
@@ -377,12 +381,10 @@ def complete_dd_cmdline(args, dd_cmd):
return list()
bs = args['size_spec']['blocksize']
conv = list()
# For sparse files (create, truncate, grow): write count=0 block.
if args['sparse']:
seek = args['size_spec']['blocks']
conv += ['sparse']
elif args['force'] or not os.path.exists(args['path']): # Create file
seek = 0
elif args['size_diff'] < 0: # Truncate file
@@ -394,8 +396,6 @@ def complete_dd_cmdline(args, dd_cmd):
count = args['size_spec']['blocks'] - seek
dd_cmd += ['bs=%s' % str(bs), 'seek=%s' % str(seek), 'count=%s' % str(count)]
if conv:
dd_cmd += ['conv=%s' % ','.join(conv)]
return dd_cmd

View File

@@ -367,9 +367,10 @@ def do_ini(module, filename, section=None, option=None, values=None,
section_lines = new_section_lines
else:
# drop the entire section
section_lines = []
msg = 'section removed'
changed = True
if section_lines:
section_lines = []
msg = 'section removed'
changed = True
# reassemble the ini_lines after manipulation
ini_lines = before + section_lines + after

View File

@@ -48,19 +48,19 @@ options:
delimiter:
description:
- A one-character string used to separate fields.
- When using this parameter, you change the default value used by C(dialect).
- When using this parameter, you change the default value used by I(dialect).
- The default value depends on the dialect used.
type: str
skipinitialspace:
description:
- Whether to ignore any whitespaces immediately following the delimiter.
- When using this parameter, you change the default value used by C(dialect).
- When using this parameter, you change the default value used by I(dialect).
- The default value depends on the dialect used.
type: bool
strict:
description:
- Whether to raise an exception on bad CSV input.
- When using this parameter, you change the default value used by C(dialect).
- When using this parameter, you change the default value used by I(dialect).
- The default value depends on the dialect used.
type: bool
notes:

View File

@@ -103,7 +103,7 @@ author:
EXAMPLES = '''
- name: Map a client role to a group, authentication with credentials
community.general.keycloak_client_rolemappings:
community.general.keycloak_client_rolemapping:
realm: MyCustomRealm
auth_client_id: admin-cli
auth_keycloak_url: https://auth.example.com/auth
@@ -121,7 +121,7 @@ EXAMPLES = '''
delegate_to: localhost
- name: Map a client role to a group, authentication with token
community.general.keycloak_client_rolemappings:
community.general.keycloak_client_rolemapping:
realm: MyCustomRealm
auth_client_id: admin-cli
auth_keycloak_url: https://auth.example.com/auth
@@ -137,7 +137,7 @@ EXAMPLES = '''
delegate_to: localhost
- name: Unmap client role from a group
community.general.keycloak_client_rolemappings:
community.general.keycloak_client_rolemapping:
realm: MyCustomRealm
auth_client_id: admin-cli
auth_keycloak_url: https://auth.example.com/auth

View File

@@ -155,7 +155,7 @@ options:
aliases:
- defaultDefaultClientScopes
type: list
elements: dict
elements: str
default_groups:
description:
- The realm default groups.
@@ -175,7 +175,7 @@ options:
aliases:
- defaultOptionalClientScopes
type: list
elements: dict
elements: str
default_roles:
description:
- The realm default roles.
@@ -618,10 +618,10 @@ def main():
brute_force_protected=dict(type='bool', aliases=['bruteForceProtected']),
client_authentication_flow=dict(type='str', aliases=['clientAuthenticationFlow']),
client_scope_mappings=dict(type='dict', aliases=['clientScopeMappings']),
default_default_client_scopes=dict(type='list', elements='dict', aliases=['defaultDefaultClientScopes']),
default_default_client_scopes=dict(type='list', elements='str', aliases=['defaultDefaultClientScopes']),
default_groups=dict(type='list', elements='dict', aliases=['defaultGroups']),
default_locale=dict(type='str', aliases=['defaultLocale']),
default_optional_client_scopes=dict(type='list', elements='dict', aliases=['defaultOptionalClientScopes']),
default_optional_client_scopes=dict(type='list', elements='str', aliases=['defaultOptionalClientScopes']),
default_roles=dict(type='list', elements='dict', aliases=['defaultRoles']),
default_signature_algorithm=dict(type='str', aliases=['defaultSignatureAlgorithm']),
direct_grant_flow=dict(type='str', aliases=['directGrantFlow']),

View File

@@ -828,7 +828,7 @@ def main():
before_comp = dict()
# if user federation exists, get associated mappers
if cid is not None:
if cid is not None and before_comp:
before_comp['mappers'] = sorted(kc.get_components(urlencode(dict(parent=cid)), realm), key=lambda x: x.get('name'))
# build a changeset
@@ -904,12 +904,23 @@ def main():
after_comp = kc.create_component(updated_comp, realm)
for mapper in updated_mappers:
if mapper.get('id') is not None:
kc.update_component(mapper, realm)
found = kc.get_components(urlencode(dict(parent=cid, name=mapper['name'])), realm)
if len(found) > 1:
module.fail_json(msg='Found multiple mappers with name `{name}`. Cannot continue.'.format(name=mapper['name']))
if len(found) == 1:
old_mapper = found[0]
else:
if mapper.get('parentId') is None:
mapper['parentId'] = after_comp['id']
mapper = kc.create_component(mapper, realm)
old_mapper = {}
new_mapper = old_mapper.copy()
new_mapper.update(mapper)
if new_mapper.get('id') is not None:
kc.update_component(new_mapper, realm)
else:
if new_mapper.get('parentId') is None:
new_mapper['parentId'] = after_comp['id']
mapper = kc.create_component(new_mapper, realm)
after_comp['mappers'] = updated_mappers
result['end_state'] = sanitize(after_comp)

View File

@@ -166,6 +166,8 @@ from subprocess import Popen, PIPE
from ansible.module_utils.common.text.converters import to_bytes, to_native
from ansible.module_utils.basic import AnsibleModule
from ansible_collections.community.general.plugins.module_utils.onepassword import OnePasswordConfig
class AnsibleModuleError(Exception):
def __init__(self, results):
@@ -179,7 +181,6 @@ class OnePasswordInfo(object):
def __init__(self):
self.cli_path = module.params.get('cli_path')
self.config_file_path = '~/.op/config'
self.auto_login = module.params.get('auto_login')
self.logged_in = False
self.token = None
@@ -187,6 +188,8 @@ class OnePasswordInfo(object):
terms = module.params.get('search_terms')
self.terms = self.parse_search_terms(terms)
self._config = OnePasswordConfig()
def _run(self, args, expected_rc=0, command_input=None, ignore_errors=False):
if self.token:
# Adds the session token to all commands if we're logged in.
@@ -294,12 +297,12 @@ class OnePasswordInfo(object):
except AnsibleModuleError as e:
module.fail_json(msg="Failed to perform initial sign in to 1Password: %s" % to_native(e))
else:
module.fail_json(msg="Unable to perform an initial sign in to 1Password. Please run '%s sigin' "
module.fail_json(msg="Unable to perform an initial sign in to 1Password. Please run '%s signin' "
"or define credentials in 'auto_login'. See the module documentation for details." % self.cli_path)
def get_token(self):
# If the config file exists, assume an initial signin has taken place and try basic sign in
if os.path.isfile(self.config_file_path):
if os.path.isfile(self._config.config_file_path):
if self.auto_login is not None:

View File

@@ -84,7 +84,6 @@ options:
description:
- Dictionary of scopes to silence, with timestamps or None.
- Each scope will be muted until the given POSIX timestamp or forever if the value is None.
default: ""
notify_no_data:
description:
- Whether this monitor will notify when data stops reporting.

View File

@@ -623,7 +623,7 @@ def main():
# Fetch existing monitor if the A record indicates it should exist and build the new monitor
current_monitor = dict()
new_monitor = dict()
if current_record and current_record['type'] == 'A':
if current_record and current_record['type'] == 'A' and current_record.get('monitor'):
current_monitor = DME.getMonitor(current_record['id'])
# Build the new monitor

View File

@@ -77,8 +77,8 @@ options:
description:
- Network family defined by Infinity, e.g. IPv4, IPv6 and Dual stack
type: str
choices: [ 4, 6, dual ]
default: 4
choices: [ '4', '6', dual ]
default: '4'
'''
EXAMPLES = r'''

View File

@@ -72,8 +72,8 @@ options:
default: false
description:
- Avoid loading any C(.gemrc) file. Ignored for RubyGems prior to 2.5.2.
- "The current default value will be deprecated in community.general 4.0.0: if the value is not explicitly specified, a deprecation message will be shown."
- From community.general 5.0.0 on, the default will be changed to C(true).
- "The current default value will be deprecated in community.general 5.0.0: if the value is not explicitly specified, a deprecation message will be shown."
- From community.general 6.0.0 on, the default will be changed to C(true).
version_added: 3.3.0
env_shebang:
description:

View File

@@ -163,7 +163,7 @@ from ansible.module_utils.basic import AnsibleModule
class Yarn(object):
DEFAULT_GLOBAL_INSTALLATION_PATH = '~/.config/yarn/global'
DEFAULT_GLOBAL_INSTALLATION_PATH = os.path.expanduser('~/.config/yarn/global')
def __init__(self, module, **kwargs):
self.module = module
@@ -241,16 +241,19 @@ class Yarn(object):
if error:
self.module.fail_json(msg=error)
data = json.loads(result)
try:
dependencies = data['data']['trees']
except KeyError:
missing.append(self.name)
return installed, missing
for json_line in result.strip().split('\n'):
data = json.loads(json_line)
if self.globally:
if data['type'] == 'list' and data['data']['type'].startswith('bins-'):
# This is a string in format: 'bins-<PACKAGE_NAME>'
installed.append(data['data']['type'][5:])
else:
if data['type'] == 'tree':
dependencies = data['data']['trees']
for dep in dependencies:
name, version = dep['name'].rsplit('@', 1)
installed.append(name)
for dep in dependencies:
name, version = dep['name'].rsplit('@', 1)
installed.append(name)
if self.name not in installed:
missing.append(self.name)

View File

@@ -102,6 +102,12 @@ EXAMPLES = '''
state: present
install_options: 'debug,appdir=/Applications'
- name: Install cask with force option
community.general.homebrew_cask:
name: alfred
state: present
install_options: force
- name: Allow external app
community.general.homebrew_cask:
name: alfred
@@ -600,7 +606,7 @@ class HomebrewCask(object):
self.message = 'Invalid cask: {0}.'.format(self.current_cask)
raise HomebrewCaskException(self.message)
if self._current_cask_is_installed():
if '--force' not in self.install_options and self._current_cask_is_installed():
self.unchanged_count += 1
self.message = 'Cask already installed: {0}'.format(
self.current_cask,

View File

@@ -230,7 +230,9 @@ def install_packages(module, xbps_path, state, packages):
module.params['upgrade_xbps'] = False
install_packages(module, xbps_path, state, packages)
elif rc != 0 and not (state == 'latest' and rc == 17):
module.fail_json(msg="failed to install %s" % (package))
module.fail_json(msg="failed to install %s packages(s)"
% (len(toInstall)),
packages=toInstall)
module.exit_json(changed=True, msg="installed %s package(s)"
% (len(toInstall)),

View File

@@ -17,7 +17,7 @@ description:
options:
name:
description:
- Package name or a list of packages.
- Package name or a list of package names with optional wildcards.
type: list
required: true
elements: str
@@ -74,10 +74,17 @@ state:
sample: present
'''
import re
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from fnmatch import fnmatch
# on DNF-based distros, yum is a symlink to dnf, so we try to handle their different entry formats.
NEVRA_RE_YUM = re.compile(r'^(?P<exclude>!)?(?P<epoch>\d+):(?P<name>.+)-'
r'(?P<version>.+)-(?P<release>.+)\.(?P<arch>.+)$')
NEVRA_RE_DNF = re.compile(r"^(?P<exclude>!)?(?P<name>.+)-(?P<epoch>\d+):(?P<version>.+)-"
r"(?P<release>.+)\.(?P<arch>.+)$")
class YumVersionLock:
def __init__(self, module):
@@ -102,6 +109,15 @@ class YumVersionLock:
self.module.fail_json(msg="Error: " + to_native(err) + to_native(out))
def match(entry, name):
m = NEVRA_RE_YUM.match(entry)
if not m:
m = NEVRA_RE_DNF.match(entry)
if not m:
return False
return fnmatch(m.group("name"), name)
def main():
""" start main program to add/remove a package to yum versionlock"""
module = AnsibleModule(
@@ -123,20 +139,20 @@ def main():
# Ensure versionlock state of packages
packages_list = []
if state in ('present'):
if state in ('present', ):
command = 'add'
for single_pkg in packages:
if not any(fnmatch(pkg.split(":", 1)[-1], single_pkg) for pkg in versionlock_packages.split()):
if not any(match(pkg, single_pkg) for pkg in versionlock_packages.split()):
packages_list.append(single_pkg)
if packages_list:
if module.check_mode:
changed = True
else:
changed = yum_v.ensure_state(packages_list, command)
elif state in ('absent'):
elif state in ('absent', ):
command = 'delete'
for single_pkg in packages:
if any(fnmatch(pkg, single_pkg) for pkg in versionlock_packages.split()):
if any(match(pkg, single_pkg) for pkg in versionlock_packages.split()):
packages_list.append(single_pkg)
if packages_list:
if module.check_mode:

View File

@@ -417,7 +417,9 @@ def package_present(m, name, want_latest):
# if a version is given leave the package in to let zypper handle the version
# resolution
packageswithoutversion = [p for p in packages if not p.version]
prerun_state = get_installed_state(m, packageswithoutversion)
prerun_state = {}
if packageswithoutversion:
prerun_state = get_installed_state(m, packageswithoutversion)
# generate lists of packages to install or remove
packages = [p for p in packages if p.shouldinstall != (p.name in prerun_state)]

View File

@@ -261,7 +261,6 @@ output:
'''
import datetime
import itertools
import os
import traceback
from functools import partial
@@ -283,6 +282,7 @@ except ImportError:
HAS_XMLJSON_COBRA = False
from ansible.module_utils.basic import AnsibleModule, missing_required_lib
from ansible.module_utils.six.moves import zip_longest
from ansible.module_utils.urls import fetch_url
@@ -318,7 +318,7 @@ def merge(one, two):
return copy
elif isinstance(one, list) and isinstance(two, list):
return [merge(alpha, beta) for (alpha, beta) in itertools.izip_longest(one, two)]
return [merge(alpha, beta) for (alpha, beta) in zip_longest(one, two)]
return one if two is None else two

View File

@@ -15,7 +15,7 @@ short_description: Configuration of alerts in ManageIQ
extends_documentation_fragment:
- community.general.manageiq
author: Elad Alfassa (@elad661) <ealfassa@redhat.com
author: Elad Alfassa (@elad661) <ealfassa@redhat.com>
description:
- The manageiq_alerts module supports adding, updating and deleting alerts in ManageIQ.

View File

@@ -249,7 +249,7 @@ class GitLabRunner(object):
return True
try:
runner = self._runners_endpoint.create(arguments)
runner = self._gitlab.runners.create(arguments)
except (gitlab.exceptions.GitlabCreateError) as e:
self._module.fail_json(msg="Failed to create runner: %s " % to_native(e))
@@ -293,10 +293,10 @@ class GitLabRunner(object):
# object, so we need to handle both
if hasattr(runner, "description"):
if (runner.description == description):
return self._runners_endpoint.get(runner.id)
return self._gitlab.runners.get(runner.id)
else:
if (runner['description'] == description):
return self._runners_endpoint.get(runner['id'])
return self._gitlab.runners.get(runner['id'])
'''
@param description Description of the runner

View File

@@ -51,7 +51,6 @@ options:
description:
- The password of the user.
- GitLab server enforces minimum password length to 8, set this value with 8 or more characters.
- Required only if C(state) is set to C(present).
type: str
reset_password:
description:

View File

@@ -180,9 +180,9 @@ class DBusWrapper(object):
self.module.debug("Trying to detect existing D-Bus user session for user: %d" % uid)
for pid in psutil.pids():
process = psutil.Process(pid)
process_real_uid, dummy, dummy = process.uids()
try:
process = psutil.Process(pid)
process_real_uid, dummy, dummy = process.uids()
if process_real_uid == uid and 'DBUS_SESSION_BUS_ADDRESS' in process.environ():
dbus_session_bus_address_candidate = process.environ()['DBUS_SESSION_BUS_ADDRESS']
self.module.debug("Found D-Bus user session candidate at address: %s" % dbus_session_bus_address_candidate)
@@ -198,6 +198,9 @@ class DBusWrapper(object):
# This can happen with things like SSH sessions etc.
except psutil.AccessDenied:
pass
# Process has disappeared while inspecting it
except psutil.NoSuchProcess:
pass
self.module.debug("Failed to find running D-Bus user session, will use dbus-run-session")

View File

@@ -99,45 +99,41 @@ class GConf2Preference(object):
def call(self, call_type, fail_onerr=True):
""" Helper function to perform gconftool-2 operations """
config_source = ''
direct = ''
config_source = []
direct = []
changed = False
out = ''
# If the configuration source is different from the default, create
# the argument
if self.config_source is not None and len(self.config_source) > 0:
config_source = "--config-source " + self.config_source
config_source = ["--config-source", self.config_source]
# If direct is true, create the argument
if self.direct:
direct = "--direct"
direct = ["--direct"]
# Execute the call
cmd = "gconftool-2 "
cmd = ["gconftool-2"]
try:
# If the call is "get", then we don't need as many parameters and
# we can ignore some
if call_type == 'get':
cmd += "--get {0}".format(self.key)
cmd.extend(["--get", self.key])
# Otherwise, we will use all relevant parameters
elif call_type == 'set':
cmd += "{0} {1} --type {2} --{3} {4} \"{5}\"".format(direct,
config_source,
self.value_type,
call_type,
self.key,
self.value)
cmd.extend(direct)
cmd.extend(config_source)
cmd.extend(["--type", self.value_type, "--{3}".format(call_type), self.key, self.value])
elif call_type == 'unset':
cmd += "--unset {0}".format(self.key)
cmd.extend(["--unset", self.key])
# Start external command
rc, out, err = self.ansible.run_command(cmd, use_unsafe_shell=True)
rc, out, err = self.ansible.run_command(cmd)
if len(err) > 0:
if fail_onerr:
self.ansible.fail_json(msg='gconftool-2 failed with '
'error: %s' % (str(err)))
if err and fail_onerr:
self.ansible.fail_json(msg='gconftool-2 failed with '
'error: %s' % (str(err)))
else:
changed = True

View File

@@ -28,7 +28,7 @@ options:
description:
- The port on which the iSCSI target process listens.
type: str
default: 3260
default: '3260'
target:
description:
- The iSCSI target name.

View File

@@ -153,7 +153,7 @@ def main():
'desired': dep,
}
else:
results['mismatched'] = {
results['mismatched'][pkg] = {
'installed': existing,
'desired': dep,
}

View File

@@ -20,7 +20,6 @@ options:
- The domain that will be added or removed from the list of permissive domains.
type: str
required: true
default: ''
aliases: [ name ]
permissive:
description:

View File

@@ -386,7 +386,6 @@ def deactivate_vdo(module, vdoname, vdocmd):
def add_vdooptions(params):
vdocmdoptions = ""
options = []
if params.get('logicalsize') is not None:
@@ -437,7 +436,7 @@ def add_vdooptions(params):
if params.get('physicalthreads') is not None:
options.append("--vdoPhysicalThreads=" + params['physicalthreads'])
return vdocmdoptions
return options
def run_module():

View File

@@ -107,23 +107,26 @@ RETURN = '''
- The type of the value that was changed (C(none) for C(get) and C(reset)
state). Either a single string value or a list of strings for array
types.
- This is a string or a list of strings.
returned: success
type: string or list of strings
type: any
sample: '"int" or ["str", "str", "str"]'
value:
description:
- The value of the preference key after executing the module. Either a
single string value or a list of strings for array types.
- This is a string or a list of strings.
returned: success
type: string or list of strings
type: any
sample: '"192" or ["orange", "yellow", "violet"]'
previous_value:
description:
- The value of the preference key before executing the module (C(none) for
C(get) state). Either a single string value or a list of strings for array
types.
- This is a string or a list of strings.
returned: success
type: string or list of strings
type: any
sample: '"96" or ["red", "blue", "green"]'
'''

View File

@@ -0,0 +1,6 @@
shippable/posix/group1
skip/aix
skip/freebsd
skip/rhel
skip/docker
skip/python2.6

View File

@@ -0,0 +1 @@
cask: brooklyn

View File

@@ -0,0 +1,71 @@
####################################################################
# WARNING: These are designed specifically for Ansible tests #
# and should not be used as examples of how to write Ansible roles #
####################################################################
# Test code for the homebrew_cask module.
# Copyright: (c) 2022, Joseph Torcasso <jtorcass@redhat.com>
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
---
- name: Find brew binary
command: which brew
register: brew_which
when: ansible_distribution in ['MacOSX']
- name: Get owner of brew binary
stat:
path: "{{ brew_which.stdout }}"
register: brew_stat
when: ansible_distribution in ['MacOSX']
- block:
- name: Install cask
homebrew_cask:
name: "{{ cask }}"
state: present
become: yes
become_user: "{{ brew_stat.stat.pw_name }}"
register: cask_install_result
- assert:
that:
- cask_install_result is changed
- "'Cask installed' in cask_install_result.msg"
- name: Install cask (idempotence)
homebrew_cask:
name: "{{ cask }}"
state: present
become: yes
become_user: "{{ brew_stat.stat.pw_name }}"
register: cask_install_result
- assert:
that:
- cask_install_result is not changed
- "'Cask installed' not in cask_install_result.msg"
- "'Cask already installed' in cask_install_result.msg"
- name: Install cask with force install option
homebrew_cask:
name: "{{ cask }}"
state: present
install_options: force
become: yes
become_user: "{{ brew_stat.stat.pw_name }}"
register: cask_install_result
- assert:
that:
- cask_install_result is changed
- "'Cask installed' in cask_install_result.msg"
always:
- name: Delete cask
homebrew_cask:
name: "{{ cask }}"
state: absent
install_options: force
become: yes
become_user: "{{ brew_stat.stat.pw_name }}"
ignore_errors: yes

View File

@@ -504,6 +504,13 @@
state: absent
register: result20
- name: test-values 20 - remove section 'drinks' again to ensure idempotency"
ini_file:
path: "{{ output_file }}"
section: drinks
state: absent
register: result20_remove_again
- name: test-values 20 - read content from output file
slurp:
src: "{{ output_file }}"
@@ -517,6 +524,7 @@
assert:
that:
- result20 is changed
- result20_remove_again is not changed
- result20.msg == 'section removed'
- content20 == "\n"

View File

@@ -15,3 +15,9 @@
ansible_pkg_mgr: community.general.zypper
cacheable: yes
when: ansible_os_family == "Suse"
- shell:
cmd: |
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-Linux-*.repo
sed -i 's%#baseurl=http://mirror.centos.org/$contentdir/$releasever/%baseurl=https://vault.centos.org/8.4.2105/%g' /etc/yum.repos.d/CentOS-Linux-*.repo
when: ansible_distribution in 'CentOS' and ansible_distribution_major_version == '8'

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
"""Check extra collection docs with antsibull-lint."""
"""Check extra collection docs with antsibull-docs."""
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type

View File

@@ -5,6 +5,6 @@
],
"output": "path-line-column-message",
"requirements": [
"antsibull"
"antsibull-docs"
]
}

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
"""Check extra collection docs with antsibull-lint."""
"""Check extra collection docs with antsibull-docs."""
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
@@ -14,7 +14,7 @@ def main():
"""Main entry point."""
if not os.path.isdir(os.path.join('docs', 'docsite')):
return
p = subprocess.run(['antsibull-lint', 'collection-docs', '.'], check=False)
p = subprocess.run(['antsibull-docs', 'lint-collection-docs', '.'], check=False)
if p.returncode not in (0, 3):
print('{0}:0:0: unexpected return code {1}'.format(sys.argv[0], p.returncode))

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