diff --git a/.azure-pipelines/azure-pipelines.yml b/.azure-pipelines/azure-pipelines.yml index 06a87dda57..455d0659b4 100644 --- a/.azure-pipelines/azure-pipelines.yml +++ b/.azure-pipelines/azure-pipelines.yml @@ -29,14 +29,14 @@ schedules: always: true branches: include: + - stable-11 - stable-10 - - stable-9 - cron: 0 11 * * 0 displayName: Weekly (old stable branches) always: true branches: include: - - stable-8 + - stable-9 variables: - name: checkoutPath @@ -51,7 +51,7 @@ variables: resources: containers: - container: default - image: quay.io/ansible/azure-pipelines-test-container:6.0.0 + image: quay.io/ansible/azure-pipelines-test-container:7.0.0 pool: Standard @@ -70,6 +70,19 @@ stages: - test: 2 - test: 3 - test: 4 + - stage: Sanity_2_19 + displayName: Sanity 2.19 + dependsOn: [] + jobs: + - template: templates/matrix.yml + parameters: + nameFormat: Test {0} + testFormat: 2.19/sanity/{0} + targets: + - test: 1 + - test: 2 + - test: 3 + - test: 4 - stage: Sanity_2_18 displayName: Sanity 2.18 dependsOn: [] @@ -106,12 +119,24 @@ stages: nameFormat: Python {0} testFormat: devel/units/{0}/1 targets: - - test: 3.8 - test: 3.9 - test: '3.10' - test: '3.11' - test: '3.12' - test: '3.13' + - test: '3.14' + - stage: Units_2_19 + displayName: Units 2.19 + dependsOn: [] + jobs: + - template: templates/matrix.yml + parameters: + nameFormat: Python {0} + testFormat: 2.19/units/{0}/1 + targets: + - test: 3.8 + - test: "3.11" + - test: "3.13" - stage: Units_2_18 displayName: Units 2.18 dependsOn: [] @@ -122,6 +147,7 @@ stages: testFormat: 2.18/units/{0}/1 targets: - test: 3.8 + - test: "3.11" - test: "3.13" - stage: Units_2_17 displayName: Units 2.17 @@ -133,6 +159,7 @@ stages: testFormat: 2.17/units/{0}/1 targets: - test: 3.7 + - test: "3.10" - test: "3.12" ## Remote @@ -144,10 +171,10 @@ stages: parameters: testFormat: devel/{0} targets: - - name: Alpine 3.21 - test: alpine/3.21 - # - name: Fedora 41 - # test: fedora/41 + - name: Alpine 3.22 + test: alpine/3.22 + # - name: Fedora 42 + # test: fedora/42 - name: Ubuntu 22.04 test: ubuntu/22.04 - name: Ubuntu 24.04 @@ -166,16 +193,34 @@ stages: test: macos/15.3 - name: RHEL 10.0 test: rhel/10.0 - - name: RHEL 9.5 - test: rhel/9.5 - - name: FreeBSD 14.2 - test: freebsd/14.2 + - name: RHEL 9.6 + test: rhel/9.6 + - name: FreeBSD 14.3 + test: freebsd/14.3 - name: FreeBSD 13.5 test: freebsd/13.5 groups: - 1 - 2 - 3 + - stage: Remote_2_19 + displayName: Remote 2.19 + dependsOn: [] + jobs: + - template: templates/matrix.yml + parameters: + testFormat: 2.19/{0} + targets: + - name: RHEL 9.5 + test: rhel/9.5 + - name: RHEL 10.0 + test: rhel/10.0 + - name: FreeBSD 14.2 + test: freebsd/14.2 + groups: + - 1 + - 2 + - 3 - stage: Remote_2_18 displayName: Remote 2.18 dependsOn: [] @@ -202,8 +247,8 @@ stages: parameters: testFormat: 2.17/{0} targets: - - name: FreeBSD 13.3 - test: freebsd/13.3 + - name: FreeBSD 13.5 + test: freebsd/13.5 - name: RHEL 9.3 test: rhel/9.3 groups: @@ -220,10 +265,10 @@ stages: parameters: testFormat: devel/linux/{0} targets: - - name: Fedora 41 - test: fedora41 - - name: Alpine 3.21 - test: alpine321 + - name: Fedora 42 + test: fedora42 + - name: Alpine 3.22 + test: alpine322 - name: Ubuntu 22.04 test: ubuntu2204 - name: Ubuntu 24.04 @@ -232,6 +277,22 @@ stages: - 1 - 2 - 3 + - stage: Docker_2_19 + displayName: Docker 2.19 + dependsOn: [] + jobs: + - template: templates/matrix.yml + parameters: + testFormat: 2.19/linux/{0} + targets: + - name: Fedora 41 + test: fedora41 + - name: Alpine 3.21 + test: alpine321 + groups: + - 1 + - 2 + - 3 - stage: Docker_2_18 displayName: Docker 2.18 dependsOn: [] @@ -300,8 +361,19 @@ stages: # nameFormat: Python {0} # testFormat: devel/generic/{0}/1 # targets: -# - test: '3.8' -# - test: '3.11' +# - test: '3.9' +# - test: '3.12' +# - test: '3.14' +# - stage: Generic_2_19 +# displayName: Generic 2.19 +# dependsOn: [] +# jobs: +# - template: templates/matrix.yml +# parameters: +# nameFormat: Python {0} +# testFormat: 2.19/generic/{0}/1 +# targets: +# - test: '3.9' # - test: '3.13' # - stage: Generic_2_18 # displayName: Generic 2.18 @@ -330,21 +402,26 @@ stages: condition: succeededOrFailed() dependsOn: - Sanity_devel + - Sanity_2_19 - Sanity_2_18 - Sanity_2_17 - Units_devel + - Units_2_19 - Units_2_18 - Units_2_17 - Remote_devel_extra_vms - Remote_devel + - Remote_2_19 - Remote_2_18 - Remote_2_17 - Docker_devel + - Docker_2_19 - Docker_2_18 - Docker_2_17 - Docker_community_devel # Right now all generic tests are disabled. Uncomment when at least one of them is re-enabled. # - Generic_devel +# - Generic_2_19 # - Generic_2_18 # - Generic_2_17 jobs: diff --git a/.github/BOTMETA.yml b/.github/BOTMETA.yml index fc5f7abbdc..fac3fae8f8 100644 --- a/.github/BOTMETA.yml +++ b/.github/BOTMETA.yml @@ -92,6 +92,8 @@ files: maintainers: ryancurrah $callbacks/syslog_json.py: maintainers: imjoseangel + $callbacks/tasks_only.py: + maintainers: felixfontein $callbacks/timestamp.py: maintainers: kurokobo $callbacks/unixy.py: @@ -781,6 +783,8 @@ files: maintainers: brettmilford unnecessary-username juanmcasanova $modules/jenkins_build_info.py: maintainers: juanmcasanova + $modules/jenkins_credential.py: + maintainers: YoussefKhalidAli $modules/jenkins_job.py: maintainers: sermilrod $modules/jenkins_job_info.py: @@ -1053,7 +1057,7 @@ files: $modules/ovh_monthly_billing.py: maintainers: fraff $modules/pacemaker_cluster.py: - maintainers: matbu + maintainers: matbu munchtoast $modules/pacemaker_resource.py: maintainers: munchtoast $modules/packet_: @@ -1513,6 +1517,22 @@ files: maintainers: russoz docs/docsite/rst/guide_deps.rst: maintainers: russoz + docs/docsite/rst/guide_iocage.rst: + maintainers: russoz felixfontein + docs/docsite/rst/guide_iocage_inventory.rst: + maintainers: vbotka + docs/docsite/rst/guide_iocage_inventory_aliases.rst: + maintainers: vbotka + docs/docsite/rst/guide_iocage_inventory_basics.rst: + maintainers: vbotka + docs/docsite/rst/guide_iocage_inventory_dhcp.rst: + maintainers: vbotka + docs/docsite/rst/guide_iocage_inventory_hooks.rst: + maintainers: vbotka + docs/docsite/rst/guide_iocage_inventory_properties.rst: + maintainers: vbotka + docs/docsite/rst/guide_iocage_inventory_tags.rst: + maintainers: vbotka docs/docsite/rst/guide_modulehelper.rst: maintainers: russoz docs/docsite/rst/guide_online.rst: diff --git a/.yamllint b/.yamllint new file mode 100644 index 0000000000..c10d86ab19 --- /dev/null +++ b/.yamllint @@ -0,0 +1,52 @@ +--- +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +extends: default + +ignore: | + /changelogs/ + +rules: + line-length: + max: 1000 + level: error + document-start: disable + document-end: disable + truthy: + level: error + allowed-values: + - 'true' + - 'false' + indentation: + spaces: 2 + indent-sequences: true + key-duplicates: enable + trailing-spaces: enable + new-line-at-end-of-file: disable + hyphens: + max-spaces-after: 1 + empty-lines: + max: 2 + max-start: 0 + max-end: 0 + commas: + max-spaces-before: 0 + min-spaces-after: 1 + max-spaces-after: 1 + colons: + max-spaces-before: 0 + max-spaces-after: 1 + brackets: + min-spaces-inside: 0 + max-spaces-inside: 0 + braces: + min-spaces-inside: 0 + max-spaces-inside: 1 + octal-values: + forbid-implicit-octal: true + forbid-explicit-octal: true + comments: + min-spaces-from-content: 1 + comments-indentation: false diff --git a/README.md b/README.md index 0418421908..dbfc8c0f07 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ For more information about communication, see the [Ansible communication guide]( ## Tested with Ansible -Tested with the current ansible-core 2.16, ansible-core 2.17, ansible-core 2.18 releases and the current development version of ansible-core. Ansible-core versions before 2.16.0 are not supported. This includes all ansible-base 2.10 and Ansible 2.9 releases. +Tested with the current ansible-core 2.16, ansible-core 2.17, ansible-core 2.18, ansible-core 2.19 releases and the current development version of ansible-core. Ansible-core versions before 2.16.0 are not supported. This includes all ansible-base 2.10 and Ansible 2.9 releases. ## External requirements diff --git a/antsibull-nox.toml b/antsibull-nox.toml index 76e8947a02..c631d3a3af 100644 --- a/antsibull-nox.toml +++ b/antsibull-nox.toml @@ -14,8 +14,33 @@ [sessions] +[sessions.lint] +run_isort = false +run_black = false +run_flake8 = false +run_pylint = false +run_yamllint = true +yamllint_config = ".yamllint" +# yamllint_config_plugins = ".yamllint-docs" +# yamllint_config_plugins_examples = ".yamllint-examples" +run_mypy = false + [sessions.docs_check] validate_collection_refs="all" +codeblocks_restrict_types = [ + "ansible-output", + "console", + "ini", + "json", + "python", + "shell", + "yaml", + "yaml+jinja", + "text", +] +codeblocks_restrict_type_exact_case = true +codeblocks_allow_without_type = false +codeblocks_allow_literal_blocks = false [sessions.license_check] diff --git a/changelogs/changelog.yaml b/changelogs/changelog.yaml index ab0a7be6fd..f8129d5d73 100644 --- a/changelogs/changelog.yaml +++ b/changelogs/changelog.yaml @@ -1,3 +1,3 @@ --- -ancestor: 10.0.0 +ancestor: 11.0.0 releases: {} diff --git a/changelogs/config.yaml b/changelogs/config.yaml index 32ffe27f2b..578b8c3765 100644 --- a/changelogs/config.yaml +++ b/changelogs/config.yaml @@ -7,9 +7,9 @@ changelog_filename_template: ../CHANGELOG.rst changelog_filename_version_depth: 0 changes_file: changelog.yaml changes_format: combined +ignore_other_fragment_extensions: true keep_fragments: false mention_ancestor: true -flatmap: true new_plugins_after_name: removed_features notesdir: fragments output_formats: @@ -40,3 +40,4 @@ use_fqcn: true add_plugin_period: true changelog_nice_yaml: true changelog_sort: version +vcs: auto diff --git a/changelogs/fragments/10005-fix-method-exists-in-sysrc.yml b/changelogs/fragments/10005-fix-method-exists-in-sysrc.yml deleted file mode 100644 index 218a9eca06..0000000000 --- a/changelogs/fragments/10005-fix-method-exists-in-sysrc.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - sysrc - no longer always reporting ``changed=true`` when ``state=absent``. This fixes the method ``exists()`` (https://github.com/ansible-collections/community.general/issues/10004, https://github.com/ansible-collections/community.general/pull/10005). diff --git a/changelogs/fragments/10011-github_deploy_key-check-key-present.yml b/changelogs/fragments/10011-github_deploy_key-check-key-present.yml deleted file mode 100644 index 1f3857794c..0000000000 --- a/changelogs/fragments/10011-github_deploy_key-check-key-present.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - "github_deploy_key - check that key really exists on 422 to avoid masking other errors (https://github.com/ansible-collections/community.general/issues/6718, https://github.com/ansible-collections/community.general/pull/10011)." diff --git a/changelogs/fragments/10012-improve-error-handling-homebrew-missing-tap.yml b/changelogs/fragments/10012-improve-error-handling-homebrew-missing-tap.yml deleted file mode 100644 index 443be8358c..0000000000 --- a/changelogs/fragments/10012-improve-error-handling-homebrew-missing-tap.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - homebrew - emit a useful error message if ``brew info`` reports a package tap is ``null`` (https://github.com/ansible-collections/community.general/pull/10013, https://github.com/ansible-collections/community.general/issues/10012). diff --git a/changelogs/fragments/10014-puppet-improve-param.yml b/changelogs/fragments/10014-puppet-improve-param.yml deleted file mode 100644 index 5d888523b7..0000000000 --- a/changelogs/fragments/10014-puppet-improve-param.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - puppet - improve parameter formatting, no impact to user (https://github.com/ansible-collections/community.general/pull/10014). diff --git a/changelogs/fragments/10026-stackpath-compute-deprecation.yml b/changelogs/fragments/10026-stackpath-compute-deprecation.yml deleted file mode 100644 index dfd3f7e236..0000000000 --- a/changelogs/fragments/10026-stackpath-compute-deprecation.yml +++ /dev/null @@ -1,2 +0,0 @@ -deprecated_features: - - stackpath_compute inventory plugin - plugin is deprecated and will be removed in community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/10026). diff --git a/changelogs/fragments/10028-manifold-deprecation.yml b/changelogs/fragments/10028-manifold-deprecation.yml deleted file mode 100644 index 1bb1948026..0000000000 --- a/changelogs/fragments/10028-manifold-deprecation.yml +++ /dev/null @@ -1,2 +0,0 @@ -deprecated_features: - - manifold lookup plugin - plugin is deprecated and will be removed in community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/10028). diff --git a/changelogs/fragments/10031-pipx-python-version.yml b/changelogs/fragments/10031-pipx-python-version.yml deleted file mode 100644 index d18932eb2c..0000000000 --- a/changelogs/fragments/10031-pipx-python-version.yml +++ /dev/null @@ -1,8 +0,0 @@ -minor_changes: - - pipx module_utils - filtering application list by name now happens in the modules (https://github.com/ansible-collections/community.general/pull/10031). - - pipx_info - filtering application list by name now happens in the module (https://github.com/ansible-collections/community.general/pull/10031). - - > - pipx - parameter ``name`` now accepts Python package specifiers - (https://github.com/ansible-collections/community.general/issues/7815, https://github.com/ansible-collections/community.general/pull/10031). -deprecated_features: - - pipx module_utils - function ``make_process_list()`` is deprecated and will be removed in community.general 13.0.0 (https://github.com/ansible-collections/community.general/pull/10031). diff --git a/changelogs/fragments/10063-cobbler-add-connection-timeout.yml b/changelogs/fragments/10063-cobbler-add-connection-timeout.yml deleted file mode 100644 index 4f7912384b..0000000000 --- a/changelogs/fragments/10063-cobbler-add-connection-timeout.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - cobbler inventory plugin - add ``connection_timeout`` option to specify the connection timeout to the cobbler server (https://github.com/ansible-collections/community.general/pull/11063). diff --git a/changelogs/fragments/10075-keycloak_user_rolemapping-diff.yml b/changelogs/fragments/10075-keycloak_user_rolemapping-diff.yml deleted file mode 100644 index 926552ef9d..0000000000 --- a/changelogs/fragments/10075-keycloak_user_rolemapping-diff.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - "keycloak_user_rolemapping - fix ``--diff`` mode (https://github.com/ansible-collections/community.general/issues/10067, https://github.com/ansible-collections/community.general/pull/10075)." diff --git a/changelogs/fragments/10097-fix-rundeck_acl_policy-project-endpoint.yml b/changelogs/fragments/10097-fix-rundeck_acl_policy-project-endpoint.yml deleted file mode 100644 index 0386edc090..0000000000 --- a/changelogs/fragments/10097-fix-rundeck_acl_policy-project-endpoint.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - rundeck_acl_policy - ensure that project ACLs are sent to the correct endpoint (https://github.com/ansible-collections/community.general/pull/10097). diff --git a/changelogs/fragments/10102-ini_file-fix-unmatched-whitespace-before-comment.yml b/changelogs/fragments/10102-ini_file-fix-unmatched-whitespace-before-comment.yml deleted file mode 100644 index 75c7c40299..0000000000 --- a/changelogs/fragments/10102-ini_file-fix-unmatched-whitespace-before-comment.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - ini_file - modify an inactive option also when there are spaces in front of the comment symbol (https://github.com/ansible-collections/community.general/pull/10102, https://github.com/ansible-collections/community.general/issues/8539). diff --git a/changelogs/fragments/10121-sysrc-fix-split-first-separator.yml b/changelogs/fragments/10121-sysrc-fix-split-first-separator.yml deleted file mode 100644 index 9044edff0e..0000000000 --- a/changelogs/fragments/10121-sysrc-fix-split-first-separator.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - "sysrc - split the output of ``sysrc -e -a`` on the first ``=`` only (https://github.com/ansible-collections/community.general/issues/10120, https://github.com/ansible-collections/community.general/pull/10121)." diff --git a/changelogs/fragments/10128-mark-end-of-options.yml b/changelogs/fragments/10128-mark-end-of-options.yml deleted file mode 100644 index 010fdabe8e..0000000000 --- a/changelogs/fragments/10128-mark-end-of-options.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - "kdeconfig - allow option values beginning with a dash (https://github.com/ansible-collections/community.general/issues/10127, https://github.com/ansible-collections/community.general/pull/10128)." diff --git a/changelogs/fragments/10134-add-autoconnect-options.yml b/changelogs/fragments/10134-add-autoconnect-options.yml deleted file mode 100644 index 0ff28c2790..0000000000 --- a/changelogs/fragments/10134-add-autoconnect-options.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - nmcli - adds ``autoconnect_priority`` and ``autoconnect_retries`` options to support autoconnect logic (https://github.com/ansible-collections/community.general/pull/10134). \ No newline at end of file diff --git a/changelogs/fragments/10136-cache-pickle-json.yml b/changelogs/fragments/10136-cache-pickle-json.yml deleted file mode 100644 index a527e5c4b7..0000000000 --- a/changelogs/fragments/10136-cache-pickle-json.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - pickle cache plugin - avoid extra JSON serialization with ansible-core >= 2.19 (https://github.com/ansible-collections/community.general/pull/10136). diff --git a/changelogs/fragments/10137-pipx-cg11.yml b/changelogs/fragments/10137-pipx-cg11.yml deleted file mode 100644 index 2dc641d216..0000000000 --- a/changelogs/fragments/10137-pipx-cg11.yml +++ /dev/null @@ -1,3 +0,0 @@ -removed_features: - - pipx - module no longer supports ``pipx`` older than 1.7.0 (https://github.com/ansible-collections/community.general/pull/10137). - - pipx_info - module no longer supports ``pipx`` older than 1.7.0 (https://github.com/ansible-collections/community.general/pull/10137). diff --git a/changelogs/fragments/10145-fix-typeerror-cobbler-xmlrpc.yml b/changelogs/fragments/10145-fix-typeerror-cobbler-xmlrpc.yml deleted file mode 100644 index e2a9954ea1..0000000000 --- a/changelogs/fragments/10145-fix-typeerror-cobbler-xmlrpc.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - cobbler_system - fix bug with Cobbler >= 3.4.0 caused by giving more than 2 positional arguments to ``CobblerXMLRPCInterface.get_system_handle()`` (https://github.com/ansible-collections/community.general/issues/8506, https://github.com/ansible-collections/community.general/pull/10145). \ No newline at end of file diff --git a/changelogs/fragments/10154-terraform_no_color_paramater.yml b/changelogs/fragments/10154-terraform_no_color_paramater.yml deleted file mode 100644 index 5fa270d5ed..0000000000 --- a/changelogs/fragments/10154-terraform_no_color_paramater.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - terraform - adds the ``no_color`` parameter, which suppresses or allows color codes in stdout from Terraform commands (https://github.com/ansible-collections/community.general/pull/10154). diff --git a/changelogs/fragments/10177-git-config-required.yml b/changelogs/fragments/10177-git-config-required.yml deleted file mode 100644 index a6d7a2f50d..0000000000 --- a/changelogs/fragments/10177-git-config-required.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - git_config - remove redundant ``required=False`` from ``argument_spec`` (https://github.com/ansible-collections/community.general/pull/10177). diff --git a/changelogs/fragments/10178-update-minimum-version-number-to-avoid-wrong-comparisons-cobbler-xmlrpc.yml b/changelogs/fragments/10178-update-minimum-version-number-to-avoid-wrong-comparisons-cobbler-xmlrpc.yml deleted file mode 100644 index a5ffdadfdc..0000000000 --- a/changelogs/fragments/10178-update-minimum-version-number-to-avoid-wrong-comparisons-cobbler-xmlrpc.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - cobbler_system - update minimum version number to avoid wrong comparisons that happen in some cases using LooseVersion class which results in TypeError (https://github.com/ansible-collections/community.general/issues/8506, https://github.com/ansible-collections/community.general/pull/10145, https://github.com/ansible-collections/community.general/pull/10178). diff --git a/changelogs/fragments/10191-github_key-add-api_url-parameter.yml b/changelogs/fragments/10191-github_key-add-api_url-parameter.yml deleted file mode 100644 index de0cd7054a..0000000000 --- a/changelogs/fragments/10191-github_key-add-api_url-parameter.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - github_key - add ``api_url`` parameter to support GitHub Enterprise Server installations (https://github.com/ansible-collections/community.general/pull/10191). diff --git a/changelogs/fragments/10193-callback-ansible_version.yml b/changelogs/fragments/10193-callback-ansible_version.yml deleted file mode 100644 index cad003d644..0000000000 --- a/changelogs/fragments/10193-callback-ansible_version.yml +++ /dev/null @@ -1,6 +0,0 @@ -minor_changes: - - "elastic callback plugin - instead of trying to extract the ansible-core version from task data, use ansible-core's actual version (https://github.com/ansible-collections/community.general/pull/10193)." - - "loganalytics callback plugin - instead of trying to extract the ansible-core version from task data, use ansible-core's actual version (https://github.com/ansible-collections/community.general/pull/10193)." - - "opentelemetry callback plugin - instead of trying to extract the ansible-core version from task data, use ansible-core's actual version (https://github.com/ansible-collections/community.general/pull/10193)." - - "splunk callback plugin - instead of trying to extract the ansible-core version from task data, use ansible-core's actual version (https://github.com/ansible-collections/community.general/pull/10193)." - - "sumologic callback plugin - instead of trying to extract the ansible-core version from task data, use ansible-core's actual version (https://github.com/ansible-collections/community.general/pull/10193)." diff --git a/changelogs/fragments/10194-add-pcs-resource-maintenace-mode.yml b/changelogs/fragments/10194-add-pcs-resource-maintenace-mode.yml deleted file mode 100644 index e6eb218246..0000000000 --- a/changelogs/fragments/10194-add-pcs-resource-maintenace-mode.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - pacemaker_resource - add maintenance mode support for handling resource creation and deletion (https://github.com/ansible-collections/community.general/issues/10180, https://github.com/ansible-collections/community.general/pull/10194). diff --git a/changelogs/fragments/10196-fix-gitlab-access-tokens.yml b/changelogs/fragments/10196-fix-gitlab-access-tokens.yml deleted file mode 100644 index 988f5c78ed..0000000000 --- a/changelogs/fragments/10196-fix-gitlab-access-tokens.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - "gitlab_group_access_token, gitlab_project_access_token - fix handling of group and project access tokens for changes in GitLab 17.10 (https://github.com/ansible-collections/community.general/pull/10196)." diff --git a/changelogs/fragments/10198-cargo-features-parameter.yml b/changelogs/fragments/10198-cargo-features-parameter.yml deleted file mode 100644 index 18cfffd028..0000000000 --- a/changelogs/fragments/10198-cargo-features-parameter.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - cargo - add ``features`` parameter to allow activating specific features when installing Rust packages (https://github.com/ansible-collections/community.general/pull/10198). diff --git a/changelogs/fragments/10207-iocage-inventory-alias.yml b/changelogs/fragments/10207-iocage-inventory-alias.yml deleted file mode 100644 index 8aa02714e8..0000000000 --- a/changelogs/fragments/10207-iocage-inventory-alias.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - iocage inventory plugin - the new parameter ``inventory_hostname_tag`` of the plugin provides the name of the tag in the C(iocage properties notes) that contains the jails alias. The new parameter ``inventory_hostname_required``, if enabled, makes the tag mandatory (https://github.com/ansible-collections/community.general/issues/10206, https://github.com/ansible-collections/community.general/pull/10207). diff --git a/changelogs/fragments/10212-yaml.yml b/changelogs/fragments/10212-yaml.yml deleted file mode 100644 index 7a28339eb7..0000000000 --- a/changelogs/fragments/10212-yaml.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - "yaml callback plugin - adjust to latest changes in ansible-core devel (https://github.com/ansible-collections/community.general/pull/10212)." diff --git a/changelogs/fragments/10213-yaml-deprecation.yml b/changelogs/fragments/10213-yaml-deprecation.yml deleted file mode 100644 index d75d2c1623..0000000000 --- a/changelogs/fragments/10213-yaml-deprecation.yml +++ /dev/null @@ -1,5 +0,0 @@ -deprecated_features: - - "yaml callback plugin - the YAML callback plugin was deprecated for removal in community.general 13.0.0. - Since it needs to use ansible-core internals since ansible-core 2.19 that are changing a lot, - we will remove this plugin already from community.general 12.0.0 to ease the maintenance burden - (https://github.com/ansible-collections/community.general/pull/10213)." diff --git a/changelogs/fragments/10222-zypper_repository-readfp.yml b/changelogs/fragments/10222-zypper_repository-readfp.yml deleted file mode 100644 index 688ceeb7a5..0000000000 --- a/changelogs/fragments/10222-zypper_repository-readfp.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - zypper_repository - make compatible with Python 3.12+ (https://github.com/ansible-collections/community.general/issues/10222, https://github.com/ansible-collections/community.general/pull/10223). diff --git a/changelogs/fragments/10224-zypper_repository-metalink.yml b/changelogs/fragments/10224-zypper_repository-metalink.yml deleted file mode 100644 index 8dd1987a4e..0000000000 --- a/changelogs/fragments/10224-zypper_repository-metalink.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - zypper_repository - use ``metalink`` attribute to identify repositories without ```` element (https://github.com/ansible-collections/community.general/issues/10224, https://github.com/ansible-collections/community.general/pull/10225). diff --git a/changelogs/fragments/10227-pacemaker-cluster-and-resource-enhancement.yml b/changelogs/fragments/10227-pacemaker-cluster-and-resource-enhancement.yml new file mode 100644 index 0000000000..d1cfee7816 --- /dev/null +++ b/changelogs/fragments/10227-pacemaker-cluster-and-resource-enhancement.yml @@ -0,0 +1,7 @@ +deprecated_features: + - pacemaker_cluster - the parameter ``state`` will become a required parameter in community.general 12.0.0 (https://github.com/ansible-collections/community.general/pull/10227). + +minor_changes: + - pacemaker_cluster - add ``state=maintenance`` for managing pacemaker maintenance mode (https://github.com/ansible-collections/community.general/issues/10200, https://github.com/ansible-collections/community.general/pull/10227). + - pacemaker_cluster - rename ``node`` to ``name`` and add ``node`` alias (https://github.com/ansible-collections/community.general/pull/10227). + - pacemaker_resource - enhance module by removing duplicative code (https://github.com/ansible-collections/community.general/pull/10227). diff --git a/changelogs/fragments/10231-keycloak-add-client-credentials-authentication.yml b/changelogs/fragments/10231-keycloak-add-client-credentials-authentication.yml new file mode 100644 index 0000000000..eec12e8669 --- /dev/null +++ b/changelogs/fragments/10231-keycloak-add-client-credentials-authentication.yml @@ -0,0 +1,2 @@ +minor_changes: + - keycloak - add support for ``grant_type=client_credentials`` to all keycloak modules, so that specifying ``auth_client_id`` and ``auth_client_secret`` is sufficient for authentication (https://github.com/ansible-collections/community.general/pull/10231). diff --git a/changelogs/fragments/10242-yaml.yml b/changelogs/fragments/10242-yaml.yml deleted file mode 100644 index 1596cb0909..0000000000 --- a/changelogs/fragments/10242-yaml.yml +++ /dev/null @@ -1,5 +0,0 @@ -bugfixes: - - "yaml callback plugin - when using ansible-core 2.19.0b2 or newer, uses a new utility provided by ansible-core. - This allows us to remove all hacks and vendored code that was part of the plugin for ansible-core versions with - Data Tagging so far - (https://github.com/ansible-collections/community.general/pull/10242)." diff --git a/changelogs/fragments/10267-add-cloudflare-ptr-record-support.yml b/changelogs/fragments/10267-add-cloudflare-ptr-record-support.yml new file mode 100644 index 0000000000..29d71ca393 --- /dev/null +++ b/changelogs/fragments/10267-add-cloudflare-ptr-record-support.yml @@ -0,0 +1,2 @@ +minor_changes: + - cloudflare_dns - adds support for PTR records (https://github.com/ansible-collections/community.general/pull/10267). diff --git a/changelogs/fragments/10269-cloudflare-dns-refactor.yml b/changelogs/fragments/10269-cloudflare-dns-refactor.yml new file mode 100644 index 0000000000..9f91040d63 --- /dev/null +++ b/changelogs/fragments/10269-cloudflare-dns-refactor.yml @@ -0,0 +1,2 @@ +minor_changes: + - cloudflare_dns - simplify validations and refactor some code, no functional changes (https://github.com/ansible-collections/community.general/pull/10269). diff --git a/changelogs/fragments/10271--disable_lookups.yml b/changelogs/fragments/10271--disable_lookups.yml new file mode 100644 index 0000000000..d28e2ac833 --- /dev/null +++ b/changelogs/fragments/10271--disable_lookups.yml @@ -0,0 +1,3 @@ +bugfixes: + - "icinga2 inventory plugin - avoid using deprecated option when templating options (https://github.com/ansible-collections/community.general/pull/10271)." + - "linode inventory plugin - avoid using deprecated option when templating options (https://github.com/ansible-collections/community.general/pull/10271)." diff --git a/changelogs/fragments/10285-fstr-plugins.yml b/changelogs/fragments/10285-fstr-plugins.yml new file mode 100644 index 0000000000..6fff590fee --- /dev/null +++ b/changelogs/fragments/10285-fstr-plugins.yml @@ -0,0 +1,7 @@ +minor_changes: + - dense callback plugin - use f-strings instead of concatenation (https://github.com/ansible-collections/community.general/pull/10285). + - mail callback plugin - use f-strings instead of concatenation (https://github.com/ansible-collections/community.general/pull/10285). + - wsl connection plugin - use f-strings instead of concatenation (https://github.com/ansible-collections/community.general/pull/10285). + - jc filter plugin - use f-strings instead of concatenation (https://github.com/ansible-collections/community.general/pull/10285). + - iocage inventory plugin - use f-strings instead of concatenation (https://github.com/ansible-collections/community.general/pull/10285). + - xen_orchestra inventory plugin - use f-strings instead of concatenation (https://github.com/ansible-collections/community.general/pull/10285). diff --git a/changelogs/fragments/10311-xfconf-refactor.yml b/changelogs/fragments/10311-xfconf-refactor.yml new file mode 100644 index 0000000000..9d71bd17d8 --- /dev/null +++ b/changelogs/fragments/10311-xfconf-refactor.yml @@ -0,0 +1,2 @@ +minor_changes: + - xfconf - minor adjustments the the code (https://github.com/ansible-collections/community.general/pull/10311). diff --git a/changelogs/fragments/10323-nmcli-improvements.yml b/changelogs/fragments/10323-nmcli-improvements.yml new file mode 100644 index 0000000000..53436ea7d6 --- /dev/null +++ b/changelogs/fragments/10323-nmcli-improvements.yml @@ -0,0 +1,2 @@ +minor_changes: + - nmcli - simplify validations and refactor some code, no functional changes (https://github.com/ansible-collections/community.general/pull/10323). diff --git a/changelogs/fragments/10328-redundant-brackets.yml b/changelogs/fragments/10328-redundant-brackets.yml new file mode 100644 index 0000000000..f8f74a336c --- /dev/null +++ b/changelogs/fragments/10328-redundant-brackets.yml @@ -0,0 +1,32 @@ +minor_changes: + - logstash callback plugin - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - keycloak module utils - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - python_runner module utils - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - cloudflare_dns - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - crypttab - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - datadog_monitor - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - gitlab_deploy_key - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - gitlab_group_access_token - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - gitlab_hook - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - gitlab_project_access_token - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - gitlab_runner - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - ipa_group - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - jenkins_build - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - jenkins_build_info - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - nmcli - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - oneandone_firewall_policy - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - oneandone_load_balancer - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - oneandone_monitoring_policy - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - onepassword_info - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - osx_defaults - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - ovh_ip_loadbalancing_backend - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - packet_device - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - pagerduty - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - pingdom - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - rhevm - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - rocketchat - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - sensu_silence - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - sl_vm - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - urpmi - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - xattr - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). + - xml - remove redundant brackets in conditionals, no functional changes (https://github.com/ansible-collections/community.general/pull/10328). diff --git a/changelogs/fragments/10329-catapult-deprecation.yml b/changelogs/fragments/10329-catapult-deprecation.yml new file mode 100644 index 0000000000..5e5209edda --- /dev/null +++ b/changelogs/fragments/10329-catapult-deprecation.yml @@ -0,0 +1,2 @@ +deprecated_features: + - catapult - module is deprecated and will be removed in community.general 13.0.0 (https://github.com/ansible-collections/community.general/issues/10318, https://github.com/ansible-collections/community.general/pull/10329). diff --git a/changelogs/fragments/10339-github_app_access_token.yml b/changelogs/fragments/10339-github_app_access_token.yml new file mode 100644 index 0000000000..00cd71f559 --- /dev/null +++ b/changelogs/fragments/10339-github_app_access_token.yml @@ -0,0 +1,2 @@ +bugfixes: + - github_release - support multiple types of GitHub tokens; no longer failing when ``ghs_`` token type is provided (https://github.com/ansible-collections/community.general/issues/10338, https://github.com/ansible-collections/community.general/pull/10339). \ No newline at end of file diff --git a/changelogs/fragments/10349-incus_connection-error-handling.yml b/changelogs/fragments/10349-incus_connection-error-handling.yml new file mode 100644 index 0000000000..b35da354d2 --- /dev/null +++ b/changelogs/fragments/10349-incus_connection-error-handling.yml @@ -0,0 +1,2 @@ +bugfixes: + - incus connection plugin - fix error handling to return more useful Ansible errors to the user (https://github.com/ansible-collections/community.general/issues/10344, https://github.com/ansible-collections/community.general/pull/10349). diff --git a/changelogs/fragments/10359-dependent.yml b/changelogs/fragments/10359-dependent.yml new file mode 100644 index 0000000000..e48a6142e8 --- /dev/null +++ b/changelogs/fragments/10359-dependent.yml @@ -0,0 +1,2 @@ +bugfixes: + - "dependent lookup plugin - avoid deprecated ansible-core 2.19 functionality (https://github.com/ansible-collections/community.general/pull/10359)." diff --git a/changelogs/fragments/10417-sysrc-refactor.yml b/changelogs/fragments/10417-sysrc-refactor.yml new file mode 100644 index 0000000000..b1b5db632b --- /dev/null +++ b/changelogs/fragments/10417-sysrc-refactor.yml @@ -0,0 +1,4 @@ +minor_changes: + - sysrc - adjustments to the code (https://github.com/ansible-collections/community.general/pull/10417). +bugfixes: + - sysrc - fixes parsing with multi-line variables (https://github.com/ansible-collections/community.general/issues/10394, https://github.com/ansible-collections/community.general/pull/10417). \ No newline at end of file diff --git a/changelogs/fragments/10442-apk-fix-empty-names.yml b/changelogs/fragments/10442-apk-fix-empty-names.yml new file mode 100644 index 0000000000..24d68b52df --- /dev/null +++ b/changelogs/fragments/10442-apk-fix-empty-names.yml @@ -0,0 +1,3 @@ +bugfixes: + - apk - handle empty name strings properly + (https://github.com/ansible-collections/community.general/issues/10441, https://github.com/ansible-collections/community.general/pull/10442). \ No newline at end of file diff --git a/changelogs/fragments/10445-cronvar-reject-empty-values.yml b/changelogs/fragments/10445-cronvar-reject-empty-values.yml new file mode 100644 index 0000000000..1bf39619cc --- /dev/null +++ b/changelogs/fragments/10445-cronvar-reject-empty-values.yml @@ -0,0 +1,2 @@ +bugfixes: + - "cronvar - handle empty strings on ``value`` properly (https://github.com/ansible-collections/community.general/issues/10439, https://github.com/ansible-collections/community.general/pull/10445)." diff --git a/changelogs/fragments/10458-listen_port_facts-prevent-type-error.yml b/changelogs/fragments/10458-listen_port_facts-prevent-type-error.yml new file mode 100644 index 0000000000..70af0932b3 --- /dev/null +++ b/changelogs/fragments/10458-listen_port_facts-prevent-type-error.yml @@ -0,0 +1,2 @@ +bugfixes: + - "listen_port_facts - avoid crash when required commands are missing (https://github.com/ansible-collections/community.general/issues/10457, https://github.com/ansible-collections/community.general/pull/10458)." \ No newline at end of file diff --git a/changelogs/fragments/10459-deprecations.yml b/changelogs/fragments/10459-deprecations.yml new file mode 100644 index 0000000000..4b3f317454 --- /dev/null +++ b/changelogs/fragments/10459-deprecations.yml @@ -0,0 +1,6 @@ +bugfixes: + - "apache2_module - avoid ansible-core 2.19 deprecation (https://github.com/ansible-collections/community.general/pull/10459)." + - "htpasswd - avoid ansible-core 2.19 deprecation (https://github.com/ansible-collections/community.general/pull/10459)." + - "syspatch - avoid ansible-core 2.19 deprecation (https://github.com/ansible-collections/community.general/pull/10459)." + - "sysupgrade - avoid ansible-core 2.19 deprecation (https://github.com/ansible-collections/community.general/pull/10459)." + - "zypper_repository - avoid ansible-core 2.19 deprecation (https://github.com/ansible-collections/community.general/pull/10459)." diff --git a/changelogs/fragments/10461-cronvar-non-existent-dir-crash-fix.yml b/changelogs/fragments/10461-cronvar-non-existent-dir-crash-fix.yml new file mode 100644 index 0000000000..c4b77299f5 --- /dev/null +++ b/changelogs/fragments/10461-cronvar-non-existent-dir-crash-fix.yml @@ -0,0 +1,2 @@ +bugfixes: + - "cronvar - fix crash on missing ``cron_file`` parent directories (https://github.com/ansible-collections/community.general/issues/10460, https://github.com/ansible-collections/community.general/pull/10461)." diff --git a/changelogs/fragments/10491-irc.yml b/changelogs/fragments/10491-irc.yml new file mode 100644 index 0000000000..74867e71a7 --- /dev/null +++ b/changelogs/fragments/10491-irc.yml @@ -0,0 +1,2 @@ +bugfixes: + - "irc - pass hostname to ``wrap_socket()`` if ``use_tls=true`` and ``validate_certs=true`` (https://github.com/ansible-collections/community.general/issues/10472, https://github.com/ansible-collections/community.general/pull/10491)." diff --git a/changelogs/fragments/10494-rfdn-1.yml b/changelogs/fragments/10494-rfdn-1.yml new file mode 100644 index 0000000000..09a0c442b0 --- /dev/null +++ b/changelogs/fragments/10494-rfdn-1.yml @@ -0,0 +1,27 @@ +minor_changes: + - aerospike_migrations - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10494). + - airbrake_deployment - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10494). + - bigpanda - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10494). + - bootc_manage - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10494). + - bower - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10494). + - btrfs_subvolume - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10494). + - bundler - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10494). + - campfire - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10494). + - cargo - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10494). + - catapult - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10494). + - cisco_webex - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10494). + - consul_kv - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10494). + - consul_policy - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10494). + - copr - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10494). + - datadog_downtime - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10494). + - datadog_monitor - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10494). + - dconf - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10494). + - dimensiondata_network - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10494). + - dimensiondata_vlan - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10494). + - dnf_config_manager - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10494). + - dnsmadeeasy - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10494). + - dpkg_divert - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10494). + - easy_install - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10494). + - elasticsearch_plugin - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10494). + - facter - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10494). + - filesystem - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10494). diff --git a/changelogs/fragments/10505-rfdn-2.yml b/changelogs/fragments/10505-rfdn-2.yml new file mode 100644 index 0000000000..89aeab9356 --- /dev/null +++ b/changelogs/fragments/10505-rfdn-2.yml @@ -0,0 +1,39 @@ +minor_changes: + - gem - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - git_config_info - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - github_deploy_key - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - github_repo - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - github_webhook - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - github_webhook_info - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - gitlab_branch - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - gitlab_group_access_token - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - gitlab_group_variable - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - gitlab_hook - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - gitlab_instance_variable - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - gitlab_issue - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - gitlab_label - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - gitlab_merge_request - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - gitlab_milestone - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - gitlab_project - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - gitlab_project_access_token - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - gitlab_project_variable - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - grove - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - hg - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - homebrew - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - homebrew_cask - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - homebrew_tap - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - honeybadger_deployment - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - htpasswd - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - icinga2_host - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - influxdb_user - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - ini_file - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - ipa_dnsrecord - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - ipa_dnszone - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - ipa_service - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - ipbase_info - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - ipwcli_dns - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - irc - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - jabber - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - jenkins_credential - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - jenkins_job - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). + - jenkins_script - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10505). diff --git a/changelogs/fragments/10507-rfdn-3.yml b/changelogs/fragments/10507-rfdn-3.yml new file mode 100644 index 0000000000..fae9d118bc --- /dev/null +++ b/changelogs/fragments/10507-rfdn-3.yml @@ -0,0 +1,35 @@ +minor_changes: + - keycloak_authz_authorization_scope - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - keycloak_authz_permission - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - keycloak_role - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - keycloak_userprofile - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - keyring - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - kibana_plugin - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - layman - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - ldap_attrs - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - ldap_inc - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - librato_annotation - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - lldp - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - logentries - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - lxca_cmms - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - lxca_nodes - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - macports - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - mail - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - manageiq_alerts - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - manageiq_group - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - manageiq_policies - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - manageiq_policies_info - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - manageiq_tags - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - manageiq_tenant - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - matrix - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - mattermost - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - maven_artifact - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - memset_dns_reload - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - memset_zone - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - memset_zone_record - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - mqtt - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - mssql_db - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - mssql_script - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - netcup_dns - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - newrelic_deployment - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). + - nsupdate - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10507). diff --git a/changelogs/fragments/10512-rfdn-4.yml b/changelogs/fragments/10512-rfdn-4.yml new file mode 100644 index 0000000000..6d8f9e7d77 --- /dev/null +++ b/changelogs/fragments/10512-rfdn-4.yml @@ -0,0 +1,42 @@ +minor_changes: + - oci_vcn - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - one_image_info - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - one_template - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - one_vnet - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - onepassword_info - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - oneview_fc_network_info - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - opendj_backendprop - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - ovh_monthly_billing - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - pagerduty - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - pagerduty_change - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - pagerduty_user - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - pam_limits - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - pear - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - pkgng - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - pnpm - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - portage - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - pritunl_org - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - pritunl_org_info - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - pritunl_user - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - pritunl_user_info - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - pubnub_blocks - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - pushbullet - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - pushover - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - redis_data - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - redis_data_incr - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - riak - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - rocketchat - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - rollbar_deployment - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - say - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - scaleway_database_backup - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - sendgrid - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - sensu_silence - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - sorcery - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - ssh_config - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - statusio_maintenance - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - svr4pkg - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - swdepot - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - syslogger - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - sysrc - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - systemd_creds_decrypt - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). + - systemd_creds_encrypt - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10512). diff --git a/changelogs/fragments/10513-rfdn-5.yml b/changelogs/fragments/10513-rfdn-5.yml new file mode 100644 index 0000000000..d930d7345c --- /dev/null +++ b/changelogs/fragments/10513-rfdn-5.yml @@ -0,0 +1,18 @@ +minor_changes: + - taiga_issue - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10513). + - twilio - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10513). + - utm_aaa_group - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10513). + - utm_ca_host_key_cert - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10513). + - utm_dns_host - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10513). + - utm_network_interface_address - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10513). + - utm_proxy_auth_profile - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10513). + - utm_proxy_exception - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10513). + - utm_proxy_frontend - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10513). + - utm_proxy_location - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10513). + - vertica_configuration - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10513). + - vertica_info - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10513). + - vertica_role - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10513). + - xbps - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10513). + - yarn - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10513). + - zypper - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10513). + - zypper_repository - remove redundant constructs from argument specs (https://github.com/ansible-collections/community.general/pull/10513). diff --git a/changelogs/fragments/10531-wsl-paramiko.yml b/changelogs/fragments/10531-wsl-paramiko.yml new file mode 100644 index 0000000000..08257d6c78 --- /dev/null +++ b/changelogs/fragments/10531-wsl-paramiko.yml @@ -0,0 +1,3 @@ +bugfixes: + - "wsl connection plugin - avoid deprecated ansible-core paramiko import helper, import paramiko directly instead + (https://github.com/ansible-collections/community.general/issues/10515, https://github.com/ansible-collections/community.general/pull/10531)." diff --git a/changelogs/fragments/5932-launchd-plist.yml b/changelogs/fragments/5932-launchd-plist.yml deleted file mode 100644 index bf2530841a..0000000000 --- a/changelogs/fragments/5932-launchd-plist.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - launchd - add ``plist`` option for services such as sshd, where the plist filename doesn't match the service name (https://github.com/ansible-collections/community.general/pull/9102). diff --git a/changelogs/fragments/6264-zfs-multiline-property-value.yml b/changelogs/fragments/6264-zfs-multiline-property-value.yml deleted file mode 100644 index 30e06f7919..0000000000 --- a/changelogs/fragments/6264-zfs-multiline-property-value.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - zfs - fix handling of multi-line values of user-defined ZFS properties (https://github.com/ansible-collections/community.general/pull/6264). diff --git a/changelogs/fragments/8437-xml-children-value.yml b/changelogs/fragments/8437-xml-children-value.yml deleted file mode 100644 index 1074764871..0000000000 --- a/changelogs/fragments/8437-xml-children-value.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - xml - support adding value of children when creating with subnodes (https://github.com/ansible-collections/community.general/pull/8437). diff --git a/changelogs/fragments/9076-remove-duplicated-homebrew-package-name-validation.yml b/changelogs/fragments/9076-remove-duplicated-homebrew-package-name-validation.yml deleted file mode 100644 index b067625c0c..0000000000 --- a/changelogs/fragments/9076-remove-duplicated-homebrew-package-name-validation.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - homebrew - remove duplicated package name validation (https://github.com/ansible-collections/community.general/pull/9076). diff --git a/changelogs/fragments/9077-keycloak_client-fix-attributes-dict-turned-into-list.yml b/changelogs/fragments/9077-keycloak_client-fix-attributes-dict-turned-into-list.yml deleted file mode 100644 index d693c2e139..0000000000 --- a/changelogs/fragments/9077-keycloak_client-fix-attributes-dict-turned-into-list.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - keycloak_client - fix diff by removing code that turns the attributes dict which contains additional settings into a list (https://github.com/ansible-collections/community.general/pull/9077). \ No newline at end of file diff --git a/changelogs/fragments/9082-keycloak_clientscope-fix-attributes-dict-turned-into-list.yml b/changelogs/fragments/9082-keycloak_clientscope-fix-attributes-dict-turned-into-list.yml deleted file mode 100644 index c9d61780b2..0000000000 --- a/changelogs/fragments/9082-keycloak_clientscope-fix-attributes-dict-turned-into-list.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - keycloak_clientscope - fix diff and ``end_state`` by removing the code that turns the attributes dict, which contains additional config items, into a list (https://github.com/ansible-collections/community.general/pull/9082). \ No newline at end of file diff --git a/changelogs/fragments/9096-alternatives-add-family-parameter.yml b/changelogs/fragments/9096-alternatives-add-family-parameter.yml deleted file mode 100644 index a0b021f892..0000000000 --- a/changelogs/fragments/9096-alternatives-add-family-parameter.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - alternatives - add ``family`` parameter that allows to utilize the ``--family`` option available in RedHat version of update-alternatives (https://github.com/ansible-collections/community.general/issues/5060, https://github.com/ansible-collections/community.general/pull/9096). diff --git a/changelogs/fragments/9106-passwordstore-fix-subkey-creation-even-when-create-==-false.yml b/changelogs/fragments/9106-passwordstore-fix-subkey-creation-even-when-create-==-false.yml deleted file mode 100644 index b804d2eed9..0000000000 --- a/changelogs/fragments/9106-passwordstore-fix-subkey-creation-even-when-create-==-false.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - passwordstore lookup plugin - fix subkey creation even when ``create=false`` (https://github.com/ansible-collections/community.general/issues/9105, https://github.com/ansible-collections/community.general/pull/9106). diff --git a/changelogs/fragments/9114-redfish-utils-update-remove-default-applytime.yml b/changelogs/fragments/9114-redfish-utils-update-remove-default-applytime.yml deleted file mode 100644 index 672545a0a8..0000000000 --- a/changelogs/fragments/9114-redfish-utils-update-remove-default-applytime.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - redfish_utils module utils - remove undocumented default applytime (https://github.com/ansible-collections/community.general/pull/9114). diff --git a/changelogs/fragments/9123-redfish-command-custom-oem-params.yml b/changelogs/fragments/9123-redfish-command-custom-oem-params.yml deleted file mode 100644 index a09219515a..0000000000 --- a/changelogs/fragments/9123-redfish-command-custom-oem-params.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - redfish_command - add ``update_custom_oem_header``, ``update_custom_oem_params``, and ``update_custom_oem_mime_type`` options (https://github.com/ansible-collections/community.general/pull/9123). diff --git a/changelogs/fragments/9124-dnf_config_manager.yml b/changelogs/fragments/9124-dnf_config_manager.yml deleted file mode 100644 index 9c87f02d64..0000000000 --- a/changelogs/fragments/9124-dnf_config_manager.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - dnf_config_manager - fix hanging when prompting to import GPG keys (https://github.com/ansible-collections/community.general/pull/9124, https://github.com/ansible-collections/community.general/issues/8830). diff --git a/changelogs/fragments/9128-homebrew_cask-name-regex-fix.yml b/changelogs/fragments/9128-homebrew_cask-name-regex-fix.yml deleted file mode 100644 index 69765958fb..0000000000 --- a/changelogs/fragments/9128-homebrew_cask-name-regex-fix.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - homebrew_cask - allow ``+`` symbol in Homebrew cask name validation regex (https://github.com/ansible-collections/community.general/pull/9128). diff --git a/changelogs/fragments/9132-cloudflare_dns-comment-and-tags.yml b/changelogs/fragments/9132-cloudflare_dns-comment-and-tags.yml deleted file mode 100644 index b601e39f55..0000000000 --- a/changelogs/fragments/9132-cloudflare_dns-comment-and-tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - cloudflare_dns - add support for ``comment`` and ``tags`` (https://github.com/ansible-collections/community.general/pull/9132). diff --git a/changelogs/fragments/9157-fix-dnf_config_manager-locale.yml b/changelogs/fragments/9157-fix-dnf_config_manager-locale.yml deleted file mode 100644 index f2084dfa5f..0000000000 --- a/changelogs/fragments/9157-fix-dnf_config_manager-locale.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - dnf_config_manager - forces locale to ``C`` before module starts. If the locale was set to non-English, the output of the ``dnf config-manager`` could not be parsed (https://github.com/ansible-collections/community.general/pull/9157, https://github.com/ansible-collections/community.general/issues/9046). \ No newline at end of file diff --git a/changelogs/fragments/9159-iso-extract_add_password.yml b/changelogs/fragments/9159-iso-extract_add_password.yml deleted file mode 100644 index f1b2650d4f..0000000000 --- a/changelogs/fragments/9159-iso-extract_add_password.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - iso_extract - adds ``password`` parameter that is passed to 7z (https://github.com/ansible-collections/community.general/pull/9159). diff --git a/changelogs/fragments/9167-rpm_ostree_pkg-apply_live.yml b/changelogs/fragments/9167-rpm_ostree_pkg-apply_live.yml deleted file mode 100644 index e473dedd0b..0000000000 --- a/changelogs/fragments/9167-rpm_ostree_pkg-apply_live.yml +++ /dev/null @@ -1,3 +0,0 @@ -minor_changes: -- rpm_ostree_pkg - added the options ``apply_live`` (https://github.com/ansible-collections/community.general/pull/9167). -- rpm_ostree_pkg - added the return value ``needs_reboot`` (https://github.com/ansible-collections/community.general/pull/9167). diff --git a/changelogs/fragments/9168-nmcli-add-sriov-parameter.yml b/changelogs/fragments/9168-nmcli-add-sriov-parameter.yml deleted file mode 100644 index 77f28e73bf..0000000000 --- a/changelogs/fragments/9168-nmcli-add-sriov-parameter.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - nmcli - add ``sriov`` parameter that enables support for SR-IOV settings (https://github.com/ansible-collections/community.general/pull/9168). diff --git a/changelogs/fragments/9171-gio-mime-fix-version.yml b/changelogs/fragments/9171-gio-mime-fix-version.yml deleted file mode 100644 index ca9dbddd7f..0000000000 --- a/changelogs/fragments/9171-gio-mime-fix-version.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - gio_mime - fix command line when determining version of ``gio`` (https://github.com/ansible-collections/community.general/pull/9171, https://github.com/ansible-collections/community.general/issues/9158). diff --git a/changelogs/fragments/9172-opkg-deprecate-force-none.yml b/changelogs/fragments/9172-opkg-deprecate-force-none.yml deleted file mode 100644 index 1b11419c5a..0000000000 --- a/changelogs/fragments/9172-opkg-deprecate-force-none.yml +++ /dev/null @@ -1,2 +0,0 @@ -deprecated_features: - - opkg - deprecate value ``""`` for parameter ``force`` (https://github.com/ansible-collections/community.general/pull/9172). diff --git a/changelogs/fragments/9174-xbps-support-rootdir-and-repository.yml b/changelogs/fragments/9174-xbps-support-rootdir-and-repository.yml deleted file mode 100644 index 9197607684..0000000000 --- a/changelogs/fragments/9174-xbps-support-rootdir-and-repository.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - xbps - add ``root`` and ``repository`` options to enable bootstrapping new void installations (https://github.com/ansible-collections/community.general/pull/9174). diff --git a/changelogs/fragments/9179-deps-tests.yml b/changelogs/fragments/9179-deps-tests.yml deleted file mode 100644 index 1ddf109033..0000000000 --- a/changelogs/fragments/9179-deps-tests.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - deps module utils - add ``deps.clear()`` to clear out previously declared dependencies (https://github.com/ansible-collections/community.general/pull/9179). diff --git a/changelogs/fragments/9180-pipx-version.yml b/changelogs/fragments/9180-pipx-version.yml deleted file mode 100644 index f07d66c83c..0000000000 --- a/changelogs/fragments/9180-pipx-version.yml +++ /dev/null @@ -1,3 +0,0 @@ -minor_changes: - - pipx - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9180). - - pipx_info - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9180). diff --git a/changelogs/fragments/9181-improve-homebrew-module-performance.yml b/changelogs/fragments/9181-improve-homebrew-module-performance.yml deleted file mode 100644 index b3b6ba2ca4..0000000000 --- a/changelogs/fragments/9181-improve-homebrew-module-performance.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - homebrew - greatly speed up module when multiple packages are passed in the ``name`` option (https://github.com/ansible-collections/community.general/pull/9181). \ No newline at end of file diff --git a/changelogs/fragments/9186-fix-broken-check-mode-in-github-key.yml b/changelogs/fragments/9186-fix-broken-check-mode-in-github-key.yml deleted file mode 100644 index dbf1f145d5..0000000000 --- a/changelogs/fragments/9186-fix-broken-check-mode-in-github-key.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - github_key - in check mode, a faulty call to ```datetime.strftime(...)``` was being made which generated an exception (https://github.com/ansible-collections/community.general/issues/9185). \ No newline at end of file diff --git a/changelogs/fragments/9187-flatpak-lang.yml b/changelogs/fragments/9187-flatpak-lang.yml deleted file mode 100644 index 159923cbdc..0000000000 --- a/changelogs/fragments/9187-flatpak-lang.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - flatpak - force the locale language to ``C`` when running the flatpak command (https://github.com/ansible-collections/community.general/pull/9187, https://github.com/ansible-collections/community.general/issues/8883). diff --git a/changelogs/fragments/9189-scalway-lb-simplify-return.yml b/changelogs/fragments/9189-scalway-lb-simplify-return.yml deleted file mode 100644 index 39d161f06b..0000000000 --- a/changelogs/fragments/9189-scalway-lb-simplify-return.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - scaleway_lb - minor simplification in the code (https://github.com/ansible-collections/community.general/pull/9189). diff --git a/changelogs/fragments/9190-redfish-utils-unused-code.yml b/changelogs/fragments/9190-redfish-utils-unused-code.yml deleted file mode 100644 index 47f7588b96..0000000000 --- a/changelogs/fragments/9190-redfish-utils-unused-code.yml +++ /dev/null @@ -1,4 +0,0 @@ -minor_changes: - - redfish_utils module utils - remove redundant code (https://github.com/ansible-collections/community.general/pull/9190). -deprecated_features: - - redfish_utils module utils - deprecate method ``RedfishUtils._init_session()`` (https://github.com/ansible-collections/community.general/pull/9190). diff --git a/changelogs/fragments/9198-fail-if-slack-api-response-is-not-ok-with-error-message.yml b/changelogs/fragments/9198-fail-if-slack-api-response-is-not-ok-with-error-message.yml deleted file mode 100644 index 56ab25f578..0000000000 --- a/changelogs/fragments/9198-fail-if-slack-api-response-is-not-ok-with-error-message.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - slack - fail if Slack API response is not OK with error message (https://github.com/ansible-collections/community.general/pull/9198). diff --git a/changelogs/fragments/9202-keycloak_clientscope_type-sort-lists.yml b/changelogs/fragments/9202-keycloak_clientscope_type-sort-lists.yml deleted file mode 100644 index ef9fc7a6f7..0000000000 --- a/changelogs/fragments/9202-keycloak_clientscope_type-sort-lists.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - keycloak_clientscope_type - sort the default and optional clientscope lists to improve the diff (https://github.com/ansible-collections/community.general/pull/9202). \ No newline at end of file diff --git a/changelogs/fragments/9226-xfconf-version.yml b/changelogs/fragments/9226-xfconf-version.yml deleted file mode 100644 index 517beb9b96..0000000000 --- a/changelogs/fragments/9226-xfconf-version.yml +++ /dev/null @@ -1,3 +0,0 @@ -minor_changes: - - xfconf - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9226). - - xfconf_info - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9226). diff --git a/changelogs/fragments/9234-fix-verify-bios-attributes-multi-system.yml b/changelogs/fragments/9234-fix-verify-bios-attributes-multi-system.yml deleted file mode 100644 index 95bafed8d8..0000000000 --- a/changelogs/fragments/9234-fix-verify-bios-attributes-multi-system.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - redfish_utils module utils - Fix ``VerifyBiosAttributes`` command on multi system resource nodes (https://github.com/ansible-collections/community.general/pull/9234). diff --git a/changelogs/fragments/9238-locale-gen-rewrite.yml b/changelogs/fragments/9238-locale-gen-rewrite.yml deleted file mode 100644 index c2c9160bfb..0000000000 --- a/changelogs/fragments/9238-locale-gen-rewrite.yml +++ /dev/null @@ -1,13 +0,0 @@ -minor_changes: - - "locale_gen - invert the logic to determine ``ubuntu_mode``, making it look first for ``/etc/locale.gen`` (set ``ubuntu_mode`` to ``False``) - and only then looking for ``/var/lib/locales/supported.d/`` (set ``ubuntu_mode`` to ``True``) - (https://github.com/ansible-collections/community.general/pull/9238, - https://github.com/ansible-collections/community.general/issues/9131, - https://github.com/ansible-collections/community.general/issues/8487)." - - > - locale_gen - new return value ``mechanism`` to better express the semantics of the ``ubuntu_mode``, with the possible values being either - ``glibc`` (``ubuntu_mode=False``) or ``ubuntu_legacy`` (``ubuntu_mode=True``) (https://github.com/ansible-collections/community.general/pull/9238). -deprecated_features: - - > - locale_gen - ``ubuntu_mode=True``, or ``mechanism=ubuntu_legacy`` is deprecated and will be removed in community.general 13.0.0 - (https://github.com/ansible-collections/community.general/pull/9238). diff --git a/changelogs/fragments/9255-fix-handling-of-aliased-homebrew-packages.yml b/changelogs/fragments/9255-fix-handling-of-aliased-homebrew-packages.yml deleted file mode 100644 index 350e81af8e..0000000000 --- a/changelogs/fragments/9255-fix-handling-of-aliased-homebrew-packages.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - homebrew - fix incorrect handling of aliased homebrew modules when the alias is requested (https://github.com/ansible-collections/community.general/pull/9255, https://github.com/ansible-collections/community.general/issues/9240). \ No newline at end of file diff --git a/changelogs/fragments/9263-kc_authentication-api-priority.yaml b/changelogs/fragments/9263-kc_authentication-api-priority.yaml deleted file mode 100644 index a943e659ad..0000000000 --- a/changelogs/fragments/9263-kc_authentication-api-priority.yaml +++ /dev/null @@ -1,2 +0,0 @@ -security_fixes: - - keycloak_authentication - API calls did not properly set the ``priority`` during update resulting in incorrectly sorted authentication flows. This apparently only affects Keycloak 25 or newer (https://github.com/ansible-collections/community.general/pull/9263). \ No newline at end of file diff --git a/changelogs/fragments/9270-zypper-add-simple_errors.yaml b/changelogs/fragments/9270-zypper-add-simple_errors.yaml deleted file mode 100644 index 9fcdf3403c..0000000000 --- a/changelogs/fragments/9270-zypper-add-simple_errors.yaml +++ /dev/null @@ -1,3 +0,0 @@ -minor_changes: - - zypper - add ``simple_errors`` option (https://github.com/ansible-collections/community.general/pull/9270). - - zypper - add ``quiet`` option (https://github.com/ansible-collections/community.general/pull/9270). \ No newline at end of file diff --git a/changelogs/fragments/9284-add-keycloak-action-group.yml b/changelogs/fragments/9284-add-keycloak-action-group.yml deleted file mode 100644 index b25c370346..0000000000 --- a/changelogs/fragments/9284-add-keycloak-action-group.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - keycloak - add an action group for Keycloak modules to allow ``module_defaults`` to be set for Keycloak tasks (https://github.com/ansible-collections/community.general/pull/9284). diff --git a/changelogs/fragments/9318-fstr-actionplugins.yml b/changelogs/fragments/9318-fstr-actionplugins.yml deleted file mode 100644 index 7df54f3c19..0000000000 --- a/changelogs/fragments/9318-fstr-actionplugins.yml +++ /dev/null @@ -1,3 +0,0 @@ -minor_changes: - - iptables_state action plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9318). - - shutdown action plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9318). diff --git a/changelogs/fragments/9319-fstr-become-plugins.yml b/changelogs/fragments/9319-fstr-become-plugins.yml deleted file mode 100644 index dcdc4b3f52..0000000000 --- a/changelogs/fragments/9319-fstr-become-plugins.yml +++ /dev/null @@ -1,10 +0,0 @@ -minor_changes: - - doas become plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9319). - - dzdo become plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9319). - - ksu become plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9319). - - machinectl become plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9319). - - pbrun become plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9319). - - pfexec become plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9319). - - pmrun become plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9319). - - sesu become plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9319). - - sudosu become plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9319). diff --git a/changelogs/fragments/9320-fstr-cache-plugins.yml b/changelogs/fragments/9320-fstr-cache-plugins.yml deleted file mode 100644 index cc1aa6ea2e..0000000000 --- a/changelogs/fragments/9320-fstr-cache-plugins.yml +++ /dev/null @@ -1,3 +0,0 @@ -minor_changes: - - memcached cache plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9320). - - redis cache plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9320). diff --git a/changelogs/fragments/9321-fstr-callback-plugins.yml b/changelogs/fragments/9321-fstr-callback-plugins.yml deleted file mode 100644 index d79d3cbfa0..0000000000 --- a/changelogs/fragments/9321-fstr-callback-plugins.yml +++ /dev/null @@ -1,22 +0,0 @@ -minor_changes: - - cgroup_memory_recap callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). - - context_demo callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). - - counter_enabled callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). - - dense callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). - - diy callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). - - elastic callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). - - jabber callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). - - log_plays callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). - - loganalytics callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). - - logdna callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). - - logentries callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). - - mail callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). - - nrdp callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). - - opentelemetry callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). - - say callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). - - selective callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). - - slack callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). - - splunk callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). - - timestamp callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). - - unixy callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). - - yaml callback plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9321). diff --git a/changelogs/fragments/9322-fstr-connection-plugins.yml b/changelogs/fragments/9322-fstr-connection-plugins.yml deleted file mode 100644 index 4b3e264cfb..0000000000 --- a/changelogs/fragments/9322-fstr-connection-plugins.yml +++ /dev/null @@ -1,11 +0,0 @@ -minor_changes: - - chroot connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). - - funcd connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). - - incus connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). - - iocage connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). - - jail connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). - - lxc connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). - - lxd connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). - - qubes connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). - - saltstack connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). - - zone connection plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9322). diff --git a/changelogs/fragments/9323-fstr-inventory-plugins.yml b/changelogs/fragments/9323-fstr-inventory-plugins.yml deleted file mode 100644 index 26fa87209b..0000000000 --- a/changelogs/fragments/9323-fstr-inventory-plugins.yml +++ /dev/null @@ -1,13 +0,0 @@ -minor_changes: - - cobbler inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). - - gitlab_runners inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). - - icinga2 inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). - - linode inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). - - lxd inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). - - nmap inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). - - online inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). - - opennebula inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). - - scaleway inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). - - stackpath_compute inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). - - virtualbox inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). - - xen_orchestra inventory plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9323). diff --git a/changelogs/fragments/9324-fstr-lookup-plugins.yml b/changelogs/fragments/9324-fstr-lookup-plugins.yml deleted file mode 100644 index a448ae0d48..0000000000 --- a/changelogs/fragments/9324-fstr-lookup-plugins.yml +++ /dev/null @@ -1,29 +0,0 @@ -minor_changes: - - bitwarden lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - chef_databag lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - collection_version lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - consul_kv lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - credstash lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - cyberarkpassword lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - dependent lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - dig lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - dnstxt lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - dsv lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - etcd lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - etcd3 lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - filetree lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - github_app_access_token lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - hiera lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - keyring lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - lastpass lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - lmdb_kv lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - manifold lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - merge_variables lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - onepassword lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - onepassword_doc lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - passwordstore lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - random_pet lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - redis lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - revbitspss lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - shelvefile lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). - - tss lookup plugin - use f-strings instead of interpolations or ``format`` (https://github.com/ansible-collections/community.general/pull/9324). diff --git a/changelogs/fragments/9334-qubes-conn.yml b/changelogs/fragments/9334-qubes-conn.yml deleted file mode 100644 index 3faa8d7981..0000000000 --- a/changelogs/fragments/9334-qubes-conn.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - qubes connection plugin - fix the printing of debug information (https://github.com/ansible-collections/community.general/pull/9334). diff --git a/changelogs/fragments/9363-dig-nonameservers.yml b/changelogs/fragments/9363-dig-nonameservers.yml deleted file mode 100644 index daa48febec..0000000000 --- a/changelogs/fragments/9363-dig-nonameservers.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - "dig lookup plugin - correctly handle ``NoNameserver`` exception (https://github.com/ansible-collections/community.general/pull/9363, https://github.com/ansible-collections/community.general/issues/9362)." diff --git a/changelogs/fragments/9379-refactor.yml b/changelogs/fragments/9379-refactor.yml deleted file mode 100644 index b2c68aa8b1..0000000000 --- a/changelogs/fragments/9379-refactor.yml +++ /dev/null @@ -1,25 +0,0 @@ -minor_changes: - - "shutdown action plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." - - "redis cache plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." - - "logentries callback plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." - - "slack callback plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." - - "chroot connection plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." - - "from_csv filter plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." - - "from_ini filter plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." - - "to_ini filter plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." - - "cobbler inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." - - "gitlab_runners inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." - - "iocage inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." - - "lxd inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." - - "nmap inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." - - "opennebula inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." - - "scaleway inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." - - "virtualbox inventory plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." - - "cyberarkpassword lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." - - "dig lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." - - "dnstxt lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." - - "etcd3 lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." - - "lmdb_kv lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." - - "manifold lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." - - "onepassword lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." - - "tss lookup plugin - clean up string conversions (https://github.com/ansible-collections/community.general/pull/9379)." diff --git a/changelogs/fragments/9387-pacemaker-cluster-cmd.yml b/changelogs/fragments/9387-pacemaker-cluster-cmd.yml deleted file mode 100644 index d9cc4c35a4..0000000000 --- a/changelogs/fragments/9387-pacemaker-cluster-cmd.yml +++ /dev/null @@ -1,3 +0,0 @@ -minor_changes: - - pacemaker_cluster - using safer mechanism to run external command (https://github.com/ansible-collections/community.general/pull/9471). - - pacemaker_cluster - remove unused code (https://github.com/ansible-collections/community.general/pull/9471). diff --git a/changelogs/fragments/9403-redfish-add-get-accountservice.yml b/changelogs/fragments/9403-redfish-add-get-accountservice.yml deleted file mode 100644 index a57ecfec61..0000000000 --- a/changelogs/fragments/9403-redfish-add-get-accountservice.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - redfish_info - add command ``GetAccountServiceConfig`` to get full information about AccountService configuration (https://github.com/ansible-collections/community.general/pull/9403). diff --git a/changelogs/fragments/9425-gitlab-instance-raw-variable.yml b/changelogs/fragments/9425-gitlab-instance-raw-variable.yml deleted file mode 100644 index c9d6ec7d4b..0000000000 --- a/changelogs/fragments/9425-gitlab-instance-raw-variable.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - gitlab_instance_variable - add support for ``raw`` variables suboption (https://github.com/ansible-collections/community.general/pull/9425). diff --git a/changelogs/fragments/9432-deprecate-pure.yml b/changelogs/fragments/9432-deprecate-pure.yml deleted file mode 100644 index 21cc8f8633..0000000000 --- a/changelogs/fragments/9432-deprecate-pure.yml +++ /dev/null @@ -1,3 +0,0 @@ -deprecated_features: - - purestorage doc fragments - the doc fragment is deprecated and will be removed from community.general 12.0.0. The modules using this were removed in community.general 3.0.0 (https://github.com/ansible-collections/community.general/pull/9432). - - pure module utils - the module utils is deprecated and will be removed from community.general 12.0.0. The modules using this were removed in community.general 3.0.0 (https://github.com/ansible-collections/community.general/pull/9432). diff --git a/changelogs/fragments/9443-slack-prepend_hash.yml b/changelogs/fragments/9443-slack-prepend_hash.yml deleted file mode 100644 index 98151ba51e..0000000000 --- a/changelogs/fragments/9443-slack-prepend_hash.yml +++ /dev/null @@ -1,3 +0,0 @@ -deprecated_features: - - "slack - the default value ``auto`` of the ``prepend_hash`` option is deprecated and will change to ``never`` in community.general 12.0.0 - (https://github.com/ansible-collections/community.general/pull/9443)." diff --git a/changelogs/fragments/9449-manageiq-alert-profiles-reqs.yml b/changelogs/fragments/9449-manageiq-alert-profiles-reqs.yml deleted file mode 100644 index 710cf672cc..0000000000 --- a/changelogs/fragments/9449-manageiq-alert-profiles-reqs.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - manageiq_alert_profiles - improve handling of parameter requirements (https://github.com/ansible-collections/community.general/pull/9449). diff --git a/changelogs/fragments/9451-facter-deprecation.yml b/changelogs/fragments/9451-facter-deprecation.yml deleted file mode 100644 index 63924e9358..0000000000 --- a/changelogs/fragments/9451-facter-deprecation.yml +++ /dev/null @@ -1,2 +0,0 @@ -deprecated_features: - - facter - module is deprecated and will be removed in community.general 12.0.0, use ``community.general.facter_facts`` instead (https://github.com/ansible-collections/community.general/pull/9451). diff --git a/changelogs/fragments/9456-yaml-callback-deprecation.yml b/changelogs/fragments/9456-yaml-callback-deprecation.yml deleted file mode 100644 index 47c0708c20..0000000000 --- a/changelogs/fragments/9456-yaml-callback-deprecation.yml +++ /dev/null @@ -1,2 +0,0 @@ -deprecated_features: - - yaml callback plugin - deprecate plugin in favor of ``result_format=yaml`` in plugin ``ansible.bulitin.default`` (https://github.com/ansible-collections/community.general/pull/9456). diff --git a/changelogs/fragments/9457-apache2-mod-proxy-revamp.yml b/changelogs/fragments/9457-apache2-mod-proxy-revamp.yml deleted file mode 100644 index e85b4b61da..0000000000 --- a/changelogs/fragments/9457-apache2-mod-proxy-revamp.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - apache2_mod_proxy - code simplification, no change in functionality (https://github.com/ansible-collections/community.general/pull/9457). diff --git a/changelogs/fragments/9482-opentelemetry-python-37.yml b/changelogs/fragments/9482-opentelemetry-python-37.yml deleted file mode 100644 index 3cc291265f..0000000000 --- a/changelogs/fragments/9482-opentelemetry-python-37.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - opentelemetry callback plugin - remove code handling Python versions prior to 3.7 (https://github.com/ansible-collections/community.general/pull/9482). diff --git a/changelogs/fragments/9483-sensu-deprecation.yml b/changelogs/fragments/9483-sensu-deprecation.yml deleted file mode 100644 index daa219202d..0000000000 --- a/changelogs/fragments/9483-sensu-deprecation.yml +++ /dev/null @@ -1,6 +0,0 @@ -deprecated_features: - - sensu_check - module is deprecated and will be removed in community.general 13.0.0, use collection ``sensu.sensu_go`` instead (https://github.com/ansible-collections/community.general/pull/9483). - - sensu_client - module is deprecated and will be removed in community.general 13.0.0, use collection ``sensu.sensu_go`` instead (https://github.com/ansible-collections/community.general/pull/9483). - - sensu_handler - module is deprecated and will be removed in community.general 13.0.0, use collection ``sensu.sensu_go`` instead (https://github.com/ansible-collections/community.general/pull/9483). - - sensu_silence - module is deprecated and will be removed in community.general 13.0.0, use collection ``sensu.sensu_go`` instead (https://github.com/ansible-collections/community.general/pull/9483). - - sensu_subscription - module is deprecated and will be removed in community.general 13.0.0, use collection ``sensu.sensu_go`` instead (https://github.com/ansible-collections/community.general/pull/9483). diff --git a/changelogs/fragments/9487-atomic-deprecation.yml b/changelogs/fragments/9487-atomic-deprecation.yml deleted file mode 100644 index 80897cdccc..0000000000 --- a/changelogs/fragments/9487-atomic-deprecation.yml +++ /dev/null @@ -1,4 +0,0 @@ -deprecated_features: - - atomic_container - module is deprecated and will be removed in community.general 13.0.0 (https://github.com/ansible-collections/community.general/pull/9487). - - atomic_host - module is deprecated and will be removed in community.general 13.0.0 (https://github.com/ansible-collections/community.general/pull/9487). - - atomic_image - module is deprecated and will be removed in community.general 13.0.0 (https://github.com/ansible-collections/community.general/pull/9487). diff --git a/changelogs/fragments/9490-htpasswd-permissions.yml b/changelogs/fragments/9490-htpasswd-permissions.yml deleted file mode 100644 index 71d174814e..0000000000 --- a/changelogs/fragments/9490-htpasswd-permissions.yml +++ /dev/null @@ -1,3 +0,0 @@ -bugfixes: - - "htpasswd - report changes when file permissions are adjusted - (https://github.com/ansible-collections/community.general/issues/9485, https://github.com/ansible-collections/community.general/pull/9490)." diff --git a/changelogs/fragments/9494-keycloak-modules-retry-request-on-authentication-error.yaml b/changelogs/fragments/9494-keycloak-modules-retry-request-on-authentication-error.yaml deleted file mode 100644 index 7e5c71ade1..0000000000 --- a/changelogs/fragments/9494-keycloak-modules-retry-request-on-authentication-error.yaml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - keycloak_* modules - ``refresh_token`` parameter added. When multiple authentication parameters are provided (``token``, ``refresh_token``, and ``auth_username``/``auth_password``), modules will now automatically retry requests upon authentication errors (401), using in order the token, refresh token, and username/password (https://github.com/ansible-collections/community.general/pull/9494). diff --git a/changelogs/fragments/9499-typetalk-deprecation.yml b/changelogs/fragments/9499-typetalk-deprecation.yml new file mode 100644 index 0000000000..8323bbe959 --- /dev/null +++ b/changelogs/fragments/9499-typetalk-deprecation.yml @@ -0,0 +1,2 @@ +deprecated_features: + - typetalk - module is deprecated and will be removed in community.general 13.0.0 (https://github.com/ansible-collections/community.general/pull/9499). diff --git a/changelogs/fragments/9503-opentelemetry-remove-unused-code.yml b/changelogs/fragments/9503-opentelemetry-remove-unused-code.yml deleted file mode 100644 index 1381f02554..0000000000 --- a/changelogs/fragments/9503-opentelemetry-remove-unused-code.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - opentelemetry callback plugin - remove code handling Python versions prior to 3.7 (https://github.com/ansible-collections/community.general/pull/9503). diff --git a/changelogs/fragments/9539-iocage-inventory-dhcp.yml b/changelogs/fragments/9539-iocage-inventory-dhcp.yml deleted file mode 100644 index 2432669d25..0000000000 --- a/changelogs/fragments/9539-iocage-inventory-dhcp.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - iocage inventory plugin - the plugin parses the IP4 tab of the jails list and put the elements into the new variable ``iocage_ip4_dict``. In multiple interface format the variable ``iocage_ip4`` keeps the comma-separated list of IP4 (https://github.com/ansible-collections/community.general/issues/9538). diff --git a/changelogs/fragments/9546-fix-handling-of-tap-homebrew-packages.yml b/changelogs/fragments/9546-fix-handling-of-tap-homebrew-packages.yml deleted file mode 100644 index a8e3f33393..0000000000 --- a/changelogs/fragments/9546-fix-handling-of-tap-homebrew-packages.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - homebrew - fix incorrect handling of homebrew modules when a tap is requested (https://github.com/ansible-collections/community.general/pull/9546, https://github.com/ansible-collections/community.general/issues/9533). \ No newline at end of file diff --git a/changelogs/fragments/9547-one_template-filter.yml b/changelogs/fragments/9547-one_template-filter.yml deleted file mode 100644 index f67575d640..0000000000 --- a/changelogs/fragments/9547-one_template-filter.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - one_template - adds ``filter`` option for retrieving templates which are not owned by the user (https://github.com/ansible-collections/community.general/pull/9547, https://github.com/ansible-collections/community.general/issues/9278). diff --git a/changelogs/fragments/9554-add-cpanm-option_with-recommends-and-suggests.yml b/changelogs/fragments/9554-add-cpanm-option_with-recommends-and-suggests.yml deleted file mode 100644 index 5cdaf24e9e..0000000000 --- a/changelogs/fragments/9554-add-cpanm-option_with-recommends-and-suggests.yml +++ /dev/null @@ -1,3 +0,0 @@ -minor_changes: - - cpanm - enable usage of option ``--with-recommends`` (https://github.com/ansible-collections/community.general/issues/9554, https://github.com/ansible-collections/community.general/pull/9555). - - cpanm - enable usage of option ``--with-suggests`` (https://github.com/ansible-collections/community.general/pull/9555). diff --git a/changelogs/fragments/9570-feat-nmcli-add-fail-over-mac-parameter.yml b/changelogs/fragments/9570-feat-nmcli-add-fail-over-mac-parameter.yml deleted file mode 100644 index c46526e2f6..0000000000 --- a/changelogs/fragments/9570-feat-nmcli-add-fail-over-mac-parameter.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - nmcli - add a option ``fail_over_mac`` (https://github.com/ansible-collections/community.general/issues/9570, https://github.com/ansible-collections/community.general/pull/9571). \ No newline at end of file diff --git a/changelogs/fragments/9573-iocage-inventory-sudo.yml b/changelogs/fragments/9573-iocage-inventory-sudo.yml deleted file mode 100644 index f636f34055..0000000000 --- a/changelogs/fragments/9573-iocage-inventory-sudo.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - iocage inventory plugin - the new parameter ``sudo`` of the plugin lets the command ``iocage list -l`` to run as root on the iocage host. This is needed to get the IPv4 of a running DHCP jail (https://github.com/ansible-collections/community.general/issues/9572, https://github.com/ansible-collections/community.general/pull/9573). diff --git a/changelogs/fragments/9577-mh-delegate-debug.yml b/changelogs/fragments/9577-mh-delegate-debug.yml deleted file mode 100644 index 9d50f68806..0000000000 --- a/changelogs/fragments/9577-mh-delegate-debug.yml +++ /dev/null @@ -1,6 +0,0 @@ -minor_changes: - - MH module utils - delegate ``debug`` to the underlying ``AnsibleModule`` instance or issues a warning if an attribute already exists with that name (https://github.com/ansible-collections/community.general/pull/9577). -deprecated_features: - - > - MH module utils - attribute ``debug`` definition in subclasses of MH is now deprecated, as that name will become a delegation to ``AnsibleModule`` in - community.general 12.0.0, and any such attribute will be overridden by that delegation in that version (https://github.com/ansible-collections/community.general/pull/9577). diff --git a/changelogs/fragments/9578-redhat_subscription-no-remove-on-unregister.yml b/changelogs/fragments/9578-redhat_subscription-no-remove-on-unregister.yml deleted file mode 100644 index 1403b2faa1..0000000000 --- a/changelogs/fragments/9578-redhat_subscription-no-remove-on-unregister.yml +++ /dev/null @@ -1,7 +0,0 @@ -bugfixes: - - | - redhat_subscription - do not try to unsubscribe (i.e. remove subscriptions) - when unregistering a system: newer versions of subscription-manager, as - available in EL 10 and Fedora 41+, do not support entitlements anymore, and - thus unsubscribing will fail - (https://github.com/ansible-collections/community.general/pull/9578). diff --git a/changelogs/fragments/9579-with-open.yml b/changelogs/fragments/9579-with-open.yml deleted file mode 100644 index 449ba8b1b1..0000000000 --- a/changelogs/fragments/9579-with-open.yml +++ /dev/null @@ -1,11 +0,0 @@ -minor_changes: - - known_hosts - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). - - cloud_init_data_facts - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). - - cronvar - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). - - crypttab - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). - - parted - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). - - pulp_repo - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). - - redhat_subscription - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). - - solaris_zone - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). - - sorcery - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). - - timezone - open file using ``open()`` as a context manager (https://github.com/ansible-collections/community.general/pull/9579). diff --git a/changelogs/fragments/9582-add-support-for-vrrp.yml b/changelogs/fragments/9582-add-support-for-vrrp.yml deleted file mode 100644 index 473ccbf258..0000000000 --- a/changelogs/fragments/9582-add-support-for-vrrp.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - ufw - add support for ``vrrp`` protocol (https://github.com/ansible-collections/community.general/issues/9562, https://github.com/ansible-collections/community.general/pull/9582). diff --git a/changelogs/fragments/9583-py3-imports-actionbecomecachecallback.yml b/changelogs/fragments/9583-py3-imports-actionbecomecachecallback.yml deleted file mode 100644 index 3838e52ae9..0000000000 --- a/changelogs/fragments/9583-py3-imports-actionbecomecachecallback.yml +++ /dev/null @@ -1,43 +0,0 @@ -minor_changes: - - iptables_state action plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - shutdown action plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - doas become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - dzdo become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - ksu become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - machinectl become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - pbrun become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - pfexec become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - pmrun become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - run0 become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - sesu become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - sudosu become plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - memcached cache plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - pickle cache plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - redis cache plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - yaml cache plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - cgroup_memory_recap callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - context_demo callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - counter_enabled callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - default_without_diff callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - dense callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - diy callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - elastic callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - jabber callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - log_plays callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - loganalytics callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - logdna callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - logentries callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - logstash callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - mail callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - nrdp callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - null callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - opentelemetry callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - say callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - selective callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - slack callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - splunk callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - sumologic callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - syslog_json callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - timestamp callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - unixy callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). - - yaml callback plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9583). diff --git a/changelogs/fragments/9584-py3-imports-connectioninventory.yml b/changelogs/fragments/9584-py3-imports-connectioninventory.yml deleted file mode 100644 index 4fbd215258..0000000000 --- a/changelogs/fragments/9584-py3-imports-connectioninventory.yml +++ /dev/null @@ -1,24 +0,0 @@ -minor_changes: - - chroot connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - funcd connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - incus connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - iocage connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - jail connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - lxc connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - lxd connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - qubes connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - saltstack connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - zone connection plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - cobbler inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - gitlab_runners inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - icinga2 inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - iocage inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - linode inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - lxd inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - nmap inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - online inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - opennebula inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - scaleway inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - stackpath_compute inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - virtualbox inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). - - xen_orchestra inventory plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9584). diff --git a/changelogs/fragments/9585-py3-imports-filter.yml b/changelogs/fragments/9585-py3-imports-filter.yml deleted file mode 100644 index 88644996b2..0000000000 --- a/changelogs/fragments/9585-py3-imports-filter.yml +++ /dev/null @@ -1,22 +0,0 @@ -minor_changes: - - counter filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - crc32 filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - dict filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - dict_kv filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - from_csv filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - from_ini filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - groupby_as_dict filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - hashids filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - jc filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - json_query filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - keep_keys filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - lists filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - lists_mergeby filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - random_mac filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - remove_keys filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - replace_keys filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - reveal_ansible_type filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - time filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - to_ini filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - unicode_normalize filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). - - version_sort filter plugin - adjust standard preamble for Python 3 (https://github.com/ansible-collections/community.general/pull/9585). diff --git a/changelogs/fragments/9586-allow-transition-id-jira.yml b/changelogs/fragments/9586-allow-transition-id-jira.yml deleted file mode 100644 index 3c10231376..0000000000 --- a/changelogs/fragments/9586-allow-transition-id-jira.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - jira - transition operation now has ``status_id`` to directly reference wanted transition (https://github.com/ansible-collections/community.general/pull/9602). diff --git a/changelogs/fragments/9598-snap-version.yml b/changelogs/fragments/9598-snap-version.yml deleted file mode 100644 index d6b5ebb67c..0000000000 --- a/changelogs/fragments/9598-snap-version.yml +++ /dev/null @@ -1,3 +0,0 @@ -minor_changes: - - snap - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9598). - - snap_alias - add return value ``version`` (https://github.com/ansible-collections/community.general/pull/9598). diff --git a/changelogs/fragments/9599-apache2-mod-proxy-revamp1.yml b/changelogs/fragments/9599-apache2-mod-proxy-revamp1.yml deleted file mode 100644 index 8f72117d52..0000000000 --- a/changelogs/fragments/9599-apache2-mod-proxy-revamp1.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - apache2_mod_proxy - refactor repeated code into method (https://github.com/ansible-collections/community.general/pull/9599). diff --git a/changelogs/fragments/9600-apache2-mod-proxy-revamp2.yml b/changelogs/fragments/9600-apache2-mod-proxy-revamp2.yml deleted file mode 100644 index c4e5eea2d3..0000000000 --- a/changelogs/fragments/9600-apache2-mod-proxy-revamp2.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - apache2_mod_proxy - change type of ``state`` to a list of strings. No change for the users (https://github.com/ansible-collections/community.general/pull/9600). diff --git a/changelogs/fragments/9608-apache2-mod-proxy-revamp3.yml b/changelogs/fragments/9608-apache2-mod-proxy-revamp3.yml deleted file mode 100644 index 4641ae1d9e..0000000000 --- a/changelogs/fragments/9608-apache2-mod-proxy-revamp3.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - apache2_mod_proxy - improve readability when using results from ``fecth_url()`` (https://github.com/ansible-collections/community.general/pull/9608). diff --git a/changelogs/fragments/9609-apache2-mod-proxy-revamp4.yml b/changelogs/fragments/9609-apache2-mod-proxy-revamp4.yml deleted file mode 100644 index 009a2a582d..0000000000 --- a/changelogs/fragments/9609-apache2-mod-proxy-revamp4.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - apache2_mod_proxy - better handling regexp extraction (https://github.com/ansible-collections/community.general/pull/9609). diff --git a/changelogs/fragments/9612-apache2-mod-proxy-revamp5.yml b/changelogs/fragments/9612-apache2-mod-proxy-revamp5.yml deleted file mode 100644 index 57fdccbf3e..0000000000 --- a/changelogs/fragments/9612-apache2-mod-proxy-revamp5.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - apache2_mod_proxy - use ``deps`` to handle dependencies (https://github.com/ansible-collections/community.general/pull/9612). diff --git a/changelogs/fragments/9614-apache2-mod-proxy-revamp7.yml b/changelogs/fragments/9614-apache2-mod-proxy-revamp7.yml deleted file mode 100644 index e808413318..0000000000 --- a/changelogs/fragments/9614-apache2-mod-proxy-revamp7.yml +++ /dev/null @@ -1,3 +0,0 @@ -minor_changes: - - apache2_mod_proxy - simplified and improved string manipulation (https://github.com/ansible-collections/community.general/pull/9614). - - apache2_mod_proxy - remove unused parameter and code from ``Balancer`` constructor (https://github.com/ansible-collections/community.general/pull/9614). diff --git a/changelogs/fragments/9621-keycloak_client-sanitize-saml-encryption-key.yml b/changelogs/fragments/9621-keycloak_client-sanitize-saml-encryption-key.yml deleted file mode 100644 index 5d3401e430..0000000000 --- a/changelogs/fragments/9621-keycloak_client-sanitize-saml-encryption-key.yml +++ /dev/null @@ -1,2 +0,0 @@ -security_fixes: - - keycloak_client - Sanitize ``saml.encryption.private.key`` so it does not show in the logs (https://github.com/ansible-collections/community.general/pull/9621). \ No newline at end of file diff --git a/changelogs/fragments/9623-pipx-global-latest.yml b/changelogs/fragments/9623-pipx-global-latest.yml deleted file mode 100644 index c939ea5847..0000000000 --- a/changelogs/fragments/9623-pipx-global-latest.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - pipx - honor option ``global`` when ``state=latest`` (https://github.com/ansible-collections/community.general/pull/9623). diff --git a/changelogs/fragments/9625-onepassword_doc.yml b/changelogs/fragments/9625-onepassword_doc.yml deleted file mode 100644 index e4c4cd5b65..0000000000 --- a/changelogs/fragments/9625-onepassword_doc.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - "onepassword_doc lookup plugin - ensure that 1Password Connect support also works for this plugin (https://github.com/ansible-collections/community.general/pull/9625)." diff --git a/changelogs/fragments/9633-onepassword_ssh_key.yml b/changelogs/fragments/9633-onepassword_ssh_key.yml deleted file mode 100644 index bd4676319e..0000000000 --- a/changelogs/fragments/9633-onepassword_ssh_key.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - "onepassword_ssh_key - refactor to move code to lookup class (https://github.com/ansible-collections/community.general/pull/9633)." diff --git a/changelogs/fragments/9644-kc_client-test-improvement-and-fix.yaml b/changelogs/fragments/9644-kc_client-test-improvement-and-fix.yaml deleted file mode 100644 index 63cba99198..0000000000 --- a/changelogs/fragments/9644-kc_client-test-improvement-and-fix.yaml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - keycloak_client - fix and improve existing tests. The module showed a diff without actual changes, solved by improving the ``normalise_cr()`` function (https://github.com/ansible-collections/community.general/pull/9644). diff --git a/changelogs/fragments/9646-hpilo-fix-idempotency.yml b/changelogs/fragments/9646-hpilo-fix-idempotency.yml deleted file mode 100644 index 074fce62fe..0000000000 --- a/changelogs/fragments/9646-hpilo-fix-idempotency.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - "hpilo_boot - add option to get an idempotent behavior while powering on server, resulting in success instead of failure when using ``state: boot_once`` option (https://github.com/ansible-collections/community.general/pull/9646)." diff --git a/changelogs/fragments/9649-cloudflare_dns-fix-crash-when-deleting-record.yml b/changelogs/fragments/9649-cloudflare_dns-fix-crash-when-deleting-record.yml deleted file mode 100644 index c345947575..0000000000 --- a/changelogs/fragments/9649-cloudflare_dns-fix-crash-when-deleting-record.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - cloudflare_dns - fix crash when deleting a DNS record or when updating a record with ``solo=true`` (https://github.com/ansible-collections/community.general/issues/9652, https://github.com/ansible-collections/community.general/pull/9649). diff --git a/changelogs/fragments/9651-iocage-inventory-hooks.yml b/changelogs/fragments/9651-iocage-inventory-hooks.yml deleted file mode 100644 index 268348ba3c..0000000000 --- a/changelogs/fragments/9651-iocage-inventory-hooks.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - iocage inventory plugin - the new parameter ``hooks_results`` of the plugin is a list of files inside a jail that provide configuration parameters for the inventory. The inventory plugin reads the files from the jails and put the contents into the items of created variable ``iocage_hooks`` (https://github.com/ansible-collections/community.general/issues/9650, https://github.com/ansible-collections/community.general/pull/9651). diff --git a/changelogs/fragments/9657-lldp-handling-attributes-defined-multiple-times.yml b/changelogs/fragments/9657-lldp-handling-attributes-defined-multiple-times.yml deleted file mode 100644 index 364013afc8..0000000000 --- a/changelogs/fragments/9657-lldp-handling-attributes-defined-multiple-times.yml +++ /dev/null @@ -1,4 +0,0 @@ -bugfixes: - - lldp - fix crash caused by certain lldpctl output where an attribute is defined as branch and leaf (https://github.com/ansible-collections/community.general/pull/9657). -minor_changes: - - lldp - adds ``multivalues`` parameter to control behavior when lldpctl outputs an attribute multiple times (https://github.com/ansible-collections/community.general/pull/9657). diff --git a/changelogs/fragments/9658-add-vrf-commands-to-nmcli-module.yml b/changelogs/fragments/9658-add-vrf-commands-to-nmcli-module.yml deleted file mode 100644 index a62fc823c5..0000000000 --- a/changelogs/fragments/9658-add-vrf-commands-to-nmcli-module.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - nmcli - adds VRF support with new ``type`` value ``vrf`` and new ``slave_type`` value ``vrf`` as well as new ``table`` parameter (https://github.com/ansible-collections/community.general/pull/9658, https://github.com/ansible-collections/community.general/issues/8014). diff --git a/changelogs/fragments/9659-lxd_connection-nonroot-user.yml b/changelogs/fragments/9659-lxd_connection-nonroot-user.yml deleted file mode 100644 index 760921f054..0000000000 --- a/changelogs/fragments/9659-lxd_connection-nonroot-user.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - lxd connection plugin - adds ``remote_user`` and ``lxd_become_method`` parameters for allowing a non-root user to connect to an LXD instance (https://github.com/ansible-collections/community.general/pull/9659). diff --git a/changelogs/fragments/9665-more-resilient-handling-of-homebrew-packages-names.yml b/changelogs/fragments/9665-more-resilient-handling-of-homebrew-packages-names.yml deleted file mode 100644 index 4e79dd6ea2..0000000000 --- a/changelogs/fragments/9665-more-resilient-handling-of-homebrew-packages-names.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - homebrew - make package name parsing more resilient (https://github.com/ansible-collections/community.general/pull/9665, https://github.com/ansible-collections/community.general/issues/9641). diff --git a/changelogs/fragments/9691-keycloak-module-utils-replace-missing-return-in-get_role_composites.yml b/changelogs/fragments/9691-keycloak-module-utils-replace-missing-return-in-get_role_composites.yml deleted file mode 100644 index bf48f5f609..0000000000 --- a/changelogs/fragments/9691-keycloak-module-utils-replace-missing-return-in-get_role_composites.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - keycloak module utils - replaces missing return in get_role_composites method which caused it to return None instead of composite roles (https://github.com/ansible-collections/community.general/issues/9678, https://github.com/ansible-collections/community.general/pull/9691). diff --git a/changelogs/fragments/9692-update-more-than-10-keycloak-sub-groups.yml b/changelogs/fragments/9692-update-more-than-10-keycloak-sub-groups.yml deleted file mode 100644 index 6253dd716a..0000000000 --- a/changelogs/fragments/9692-update-more-than-10-keycloak-sub-groups.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - keycloak - update more than 10 sub-groups (https://github.com/ansible-collections/community.general/issues/9690, https://github.com/ansible-collections/community.general/pull/9692). diff --git a/changelogs/fragments/9694-ipa-host-certificate-revoked.yml b/changelogs/fragments/9694-ipa-host-certificate-revoked.yml deleted file mode 100644 index 71dcbb2a17..0000000000 --- a/changelogs/fragments/9694-ipa-host-certificate-revoked.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - ipa_host - module revoked existing host certificates even if ``user_certificate`` was not given (https://github.com/ansible-collections/community.general/pull/9694). diff --git a/changelogs/fragments/9695-xml-close-file.yml b/changelogs/fragments/9695-xml-close-file.yml deleted file mode 100644 index d2a1843278..0000000000 --- a/changelogs/fragments/9695-xml-close-file.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - xml - ensure file descriptor is closed (https://github.com/ansible-collections/community.general/pull/9695). diff --git a/changelogs/fragments/9697-zfs-facts-type.yml b/changelogs/fragments/9697-zfs-facts-type.yml deleted file mode 100644 index b738d3ae9f..0000000000 --- a/changelogs/fragments/9697-zfs-facts-type.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - zfs_facts - parameter ``type`` now accepts multple values as documented (https://github.com/ansible-collections/community.general/issues/5909, https://github.com/ansible-collections/community.general/pull/9697). diff --git a/changelogs/fragments/9698-lvg-remove-extra-pvs-parameter.yml b/changelogs/fragments/9698-lvg-remove-extra-pvs-parameter.yml deleted file mode 100644 index 51c0423e8b..0000000000 --- a/changelogs/fragments/9698-lvg-remove-extra-pvs-parameter.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - lvg - add ``remove_extra_pvs`` parameter to control if ansible should remove physical volumes which are not in the ``pvs`` parameter (https://github.com/ansible-collections/community.general/pull/9698). diff --git a/changelogs/fragments/9728-bitwarden-collection-name-filter.yml b/changelogs/fragments/9728-bitwarden-collection-name-filter.yml deleted file mode 100644 index f96710072f..0000000000 --- a/changelogs/fragments/9728-bitwarden-collection-name-filter.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - bitwarden lookup plugin - add new option ``collection_name`` to filter results by collection name, and new option ``result_count`` to validate number of results (https://github.com/ansible-collections/community.general/pull/9728). \ No newline at end of file diff --git a/changelogs/fragments/9729-redfish-fullpowercycle-command.yml b/changelogs/fragments/9729-redfish-fullpowercycle-command.yml deleted file mode 100644 index 2d9974c3d6..0000000000 --- a/changelogs/fragments/9729-redfish-fullpowercycle-command.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - redfish_command - add ``PowerFullPowerCycle`` to power command options (https://github.com/ansible-collections/community.general/pull/9729). diff --git a/changelogs/fragments/9733-profitbrick-deprecation.yml b/changelogs/fragments/9733-profitbrick-deprecation.yml deleted file mode 100644 index 094f2672a4..0000000000 --- a/changelogs/fragments/9733-profitbrick-deprecation.yml +++ /dev/null @@ -1,6 +0,0 @@ -deprecated_features: - - profitbricks - module is deprecated and will be removed in community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/9733). - - profitbricks_datacenter - module is deprecated and will be removed in community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/9733). - - profitbricks_nic - module is deprecated and will be removed in community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/9733). - - profitbricks_volume - module is deprecated and will be removed in community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/9733). - - profitbricks_volume_attachments - module is deprecated and will be removed in community.general 11.0.0 (https://github.com/ansible-collections/community.general/pull/9733). diff --git a/changelogs/fragments/9739-keycloak_client-compare-before-desired-directly.yml b/changelogs/fragments/9739-keycloak_client-compare-before-desired-directly.yml deleted file mode 100644 index 1d1a3da737..0000000000 --- a/changelogs/fragments/9739-keycloak_client-compare-before-desired-directly.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - keycloak_client - in check mode, detect whether the lists in before client (for example redirect URI list) contain items that the lists in the desired client do not contain (https://github.com/ansible-collections/community.general/pull/9739). \ No newline at end of file diff --git a/changelogs/fragments/9743-incus_connection-nonroot-user.yml b/changelogs/fragments/9743-incus_connection-nonroot-user.yml deleted file mode 100644 index f1a7aa9b5f..0000000000 --- a/changelogs/fragments/9743-incus_connection-nonroot-user.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - incus connection plugin - adds ``remote_user`` and ``incus_become_method`` parameters for allowing a non-root user to connect to an Incus instance (https://github.com/ansible-collections/community.general/pull/9743). diff --git a/changelogs/fragments/9753-jira-add-client-certificate-auth.yml b/changelogs/fragments/9753-jira-add-client-certificate-auth.yml deleted file mode 100644 index 8eeb5d01d7..0000000000 --- a/changelogs/fragments/9753-jira-add-client-certificate-auth.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - jira - adds ``client_cert`` and ``client_key`` parameters for supporting client certificate authentification when connecting to Jira (https://github.com/ansible-collections/community.general/pull/9753). \ No newline at end of file diff --git a/changelogs/fragments/9762-apache2_mod_proxy.yml b/changelogs/fragments/9762-apache2_mod_proxy.yml deleted file mode 100644 index 423577905e..0000000000 --- a/changelogs/fragments/9762-apache2_mod_proxy.yml +++ /dev/null @@ -1,5 +0,0 @@ -bugfixes: - - "apache2_mod_proxy - make compatible with Python 3 (https://github.com/ansible-collections/community.general/pull/9762)." - - "apache2_mod_proxy - passing the cluster's page as referer for the member's pages. This makes the module actually work again for halfway modern Apache versions. - According to some comments founds on the net the referer was required since at least 2019 for some versions of Apache 2 - (https://github.com/ansible-collections/community.general/pull/9762)." diff --git a/changelogs/fragments/9768-keycloak_realm-remove-id-requirement.yaml b/changelogs/fragments/9768-keycloak_realm-remove-id-requirement.yaml deleted file mode 100644 index 592ac472d9..0000000000 --- a/changelogs/fragments/9768-keycloak_realm-remove-id-requirement.yaml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - keycloak_realm - remove ID requirement when creating a realm to allow Keycloak generating its own realm ID (https://github.com/ansible-collections/community.general/pull/9768). \ No newline at end of file diff --git a/changelogs/fragments/9774-fix-elasticsearch_plugin-proxy-settings.yml b/changelogs/fragments/9774-fix-elasticsearch_plugin-proxy-settings.yml deleted file mode 100644 index d610032bc4..0000000000 --- a/changelogs/fragments/9774-fix-elasticsearch_plugin-proxy-settings.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - "elasticsearch_plugin - fix ``ERROR: D is not a recognized option`` issue when configuring proxy settings (https://github.com/ansible-collections/community.general/pull/9774, https://github.com/ansible-collections/community.general/issues/9773)." \ No newline at end of file diff --git a/changelogs/fragments/9777-homebrew-fix-crash-when-packages-include-tap.yml b/changelogs/fragments/9777-homebrew-fix-crash-when-packages-include-tap.yml deleted file mode 100644 index a7649988bc..0000000000 --- a/changelogs/fragments/9777-homebrew-fix-crash-when-packages-include-tap.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - homebrew - fix crash when package names include tap (https://github.com/ansible-collections/community.general/issues/9777, https://github.com/ansible-collections/community.general/pull/9803). diff --git a/changelogs/fragments/9778-redhat_subscription-ensure-to-enable-content.yml b/changelogs/fragments/9778-redhat_subscription-ensure-to-enable-content.yml deleted file mode 100644 index 7163865b6e..0000000000 --- a/changelogs/fragments/9778-redhat_subscription-ensure-to-enable-content.yml +++ /dev/null @@ -1,7 +0,0 @@ -bugfixes: - - | - redhat_subscription - use the "enable_content" option (when available) when - registering using D-Bus, to ensure that subscription-manager enables the - content on registration; this is particular important on EL 10+ and Fedora - 41+ - (https://github.com/ansible-collections/community.general/pull/9778). diff --git a/changelogs/fragments/9787-xoa_allow_using_names_in_inventory.yml b/changelogs/fragments/9787-xoa_allow_using_names_in_inventory.yml deleted file mode 100644 index 161e94f148..0000000000 --- a/changelogs/fragments/9787-xoa_allow_using_names_in_inventory.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - xen_orchestra inventory plugin - add ``use_vm_uuid`` and ``use_host_uuid`` boolean options to allow switching over to using VM/Xen name labels instead of UUIDs as item names (https://github.com/ansible-collections/community.general/pull/9787). diff --git a/changelogs/fragments/9818-cloudflare-dns-exhausted-response.yml b/changelogs/fragments/9818-cloudflare-dns-exhausted-response.yml deleted file mode 100644 index a60f3145b4..0000000000 --- a/changelogs/fragments/9818-cloudflare-dns-exhausted-response.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - cloudlare_dns - handle exhausted response stream in case of HTTP errors to show nice error message to the user (https://github.com/ansible-collections/community.general/issues/9782, https://github.com/ansible-collections/community.general/pull/9818). diff --git a/changelogs/fragments/9821-systemd_info-add-wildcards.yml b/changelogs/fragments/9821-systemd_info-add-wildcards.yml deleted file mode 100644 index a1349f8533..0000000000 --- a/changelogs/fragments/9821-systemd_info-add-wildcards.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - systemd_info - add wildcard expression support in ``unitname`` option (https://github.com/ansible-collections/community.general/pull/9821). \ No newline at end of file diff --git a/changelogs/fragments/9824-redfish-implement-obtaining-powerrestorepolicy.yml b/changelogs/fragments/9824-redfish-implement-obtaining-powerrestorepolicy.yml deleted file mode 100644 index da8e391cb7..0000000000 --- a/changelogs/fragments/9824-redfish-implement-obtaining-powerrestorepolicy.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - redfish_info - add command ``GetPowerRestorePolicy`` to get the desired power state of the system when power is restored (https://github.com/ansible-collections/community.general/pull/9824). diff --git a/changelogs/fragments/9833-data-tagging.yml b/changelogs/fragments/9833-data-tagging.yml deleted file mode 100644 index a3f0cb2d25..0000000000 --- a/changelogs/fragments/9833-data-tagging.yml +++ /dev/null @@ -1,9 +0,0 @@ -bugfixes: - - "dependent look plugin - make compatible with ansible-core's Data Tagging feature (https://github.com/ansible-collections/community.general/pull/9833)." - - "reveal_ansible_type filter plugin and ansible_type test plugin - make compatible with ansible-core's Data Tagging feature (https://github.com/ansible-collections/community.general/pull/9833)." - - "diy callback plugin - make compatible with ansible-core's Data Tagging feature (https://github.com/ansible-collections/community.general/pull/9833)." - - "yaml callback plugin - use ansible-core internals to avoid breakage with Data Tagging (https://github.com/ansible-collections/community.general/pull/9833)." -known_issues: - - "reveal_ansible_type filter plugin and ansible_type test plugin - note that ansible-core's Data Tagging feature implements new aliases, - such as ``_AnsibleTaggedStr`` for ``str``, ``_AnsibleTaggedInt`` for ``int``, and ``_AnsibleTaggedFloat`` for ``float`` - (https://github.com/ansible-collections/community.general/pull/9833)." diff --git a/changelogs/fragments/9836-option-for-http-agent-for-user-to-callback-slack.yml b/changelogs/fragments/9836-option-for-http-agent-for-user-to-callback-slack.yml deleted file mode 100644 index 0a1af56fc2..0000000000 --- a/changelogs/fragments/9836-option-for-http-agent-for-user-to-callback-slack.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - slack callback plugin - add ``http_agent`` option to enable the user to set a custom user agent for slack callback plugin (https://github.com/ansible-collections/community.general/issues/9813, https://github.com/ansible-collections/community.general/pull/9836). diff --git a/changelogs/fragments/9837-redfish-implement-setting-powerrestorepolicy.yml b/changelogs/fragments/9837-redfish-implement-setting-powerrestorepolicy.yml deleted file mode 100644 index d4b1f505e1..0000000000 --- a/changelogs/fragments/9837-redfish-implement-setting-powerrestorepolicy.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - redfish_config - add command ``SetPowerRestorePolicy`` to set the desired power state of the system when power is restored (https://github.com/ansible-collections/community.general/pull/9837). diff --git a/changelogs/fragments/9845-consul_token_idempotency.yml b/changelogs/fragments/9845-consul_token_idempotency.yml deleted file mode 100644 index 6fe536bbd0..0000000000 --- a/changelogs/fragments/9845-consul_token_idempotency.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - consul_token - fix idempotency when ``policies`` or ``roles`` are supplied by name (https://github.com/ansible-collections/community.general/issues/9841, https://github.com/ansible-collections/community.general/pull/9845). diff --git a/changelogs/fragments/9849-nmap_dns_servers.yml b/changelogs/fragments/9849-nmap_dns_servers.yml deleted file mode 100644 index d4b0eef27f..0000000000 --- a/changelogs/fragments/9849-nmap_dns_servers.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- -minor_changes: - - nmap inventory plugin - adds ``dns_servers`` option for specifying DNS servers for name resolution. Accepts hostnames or IP addresses in the same format as the ``exclude`` option (https://github.com/ansible-collections/community.general/pull/9849). diff --git a/changelogs/fragments/9880-nmcli-fix-reorder-same-dns-nameservers-search-suffixes.yml b/changelogs/fragments/9880-nmcli-fix-reorder-same-dns-nameservers-search-suffixes.yml deleted file mode 100644 index cefa79f387..0000000000 --- a/changelogs/fragments/9880-nmcli-fix-reorder-same-dns-nameservers-search-suffixes.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - "nmcli - enable changing only the order of DNS servers or search suffixes (https://github.com/ansible-collections/community.general/issues/8724, https://github.com/ansible-collections/community.general/pull/9880)." diff --git a/changelogs/fragments/9882-fix-payload-to-match-rocketchat-740-requirement.yml b/changelogs/fragments/9882-fix-payload-to-match-rocketchat-740-requirement.yml deleted file mode 100644 index 8d3c76d963..0000000000 --- a/changelogs/fragments/9882-fix-payload-to-match-rocketchat-740-requirement.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - rocketchat - option ``is_pre740`` has been added to control the format of the payload. For Rocket.Chat 7.4.0 or newer, it must be set to ``false`` (https://github.com/ansible-collections/community.general/pull/9882). diff --git a/changelogs/fragments/9891-systemd_info-add_timer.yml b/changelogs/fragments/9891-systemd_info-add_timer.yml deleted file mode 100644 index e6239c0dfa..0000000000 --- a/changelogs/fragments/9891-systemd_info-add_timer.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - systemd_info - extend support to timer units (https://github.com/ansible-collections/community.general/pull/9891). \ No newline at end of file diff --git a/changelogs/fragments/9892-vmadm-add-new-options.yml b/changelogs/fragments/9892-vmadm-add-new-options.yml deleted file mode 100644 index 0e2be951d8..0000000000 --- a/changelogs/fragments/9892-vmadm-add-new-options.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - vmadm - add new options ``flexible_disk_size`` and ``owner_uuid`` (https://github.com/ansible-collections/community.general/pull/9892). diff --git a/changelogs/fragments/9893-cmdrunner-as-fixed-args.yml b/changelogs/fragments/9893-cmdrunner-as-fixed-args.yml deleted file mode 100644 index 109b552385..0000000000 --- a/changelogs/fragments/9893-cmdrunner-as-fixed-args.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - CmdRunner module utils - the convenience method ``cmd_runner_fmt.as_fixed()`` now accepts multiple arguments as a list (https://github.com/ansible-collections/community.general/pull/9893). diff --git a/changelogs/fragments/9898-keycloak_user-supports-subgroups.yaml b/changelogs/fragments/9898-keycloak_user-supports-subgroups.yaml deleted file mode 100644 index 092ba686e5..0000000000 --- a/changelogs/fragments/9898-keycloak_user-supports-subgroups.yaml +++ /dev/null @@ -1,9 +0,0 @@ -minor_changes: - - keycloak module_utils - user groups can now be referenced by their name, like ``staff``, or their path, like - ``/staff/engineering``. - The path syntax allows users to reference subgroups, which is not possible otherwise - (https://github.com/ansible-collections/community.general/pull/9898). - - keycloak_user module - user groups can now be referenced by their name, like ``staff``, or their path, like - ``/staff/engineering``. - The path syntax allows users to reference subgroups, which is not possible otherwise - (https://github.com/ansible-collections/community.general/pull/9898). diff --git a/changelogs/fragments/9950-pacman_key-verify-key-validity.yml b/changelogs/fragments/9950-pacman_key-verify-key-validity.yml deleted file mode 100644 index 7a0568c05a..0000000000 --- a/changelogs/fragments/9950-pacman_key-verify-key-validity.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- -minor_changes: - - pacman_key - support verifying that keys are trusted and not expired (https://github.com/ansible-collections/community.general/issues/9949, https://github.com/ansible-collections/community.general/pull/9950). diff --git a/changelogs/fragments/9951-mod-php-identifier.yml b/changelogs/fragments/9951-mod-php-identifier.yml deleted file mode 100644 index 29d88091db..0000000000 --- a/changelogs/fragments/9951-mod-php-identifier.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - apache2_module - added workaround for new PHP module name, from ``php7_module`` to ``php_module`` (https://github.com/ansible-collections/community.general/pull/9951). diff --git a/changelogs/fragments/9953-gitlab-project-members-support-owner-level.yml b/changelogs/fragments/9953-gitlab-project-members-support-owner-level.yml deleted file mode 100644 index 64cde71053..0000000000 --- a/changelogs/fragments/9953-gitlab-project-members-support-owner-level.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - gitlab_project_members - extend choices parameter ``access_level`` by missing upstream valid value ``owner`` (https://github.com/ansible-collections/community.general/pull/9953). diff --git a/changelogs/fragments/9959-update-opennebula-onevm-updateconf-params.yml b/changelogs/fragments/9959-update-opennebula-onevm-updateconf-params.yml deleted file mode 100644 index db3484ef08..0000000000 --- a/changelogs/fragments/9959-update-opennebula-onevm-updateconf-params.yml +++ /dev/null @@ -1,14 +0,0 @@ -minor_changes: - - | - one_vm - update allowed values for ``updateconf`` to include new parameters as per the latest OpenNebula API documentation. - Added parameters: - - * ``OS``: ``FIRMWARE``; - * ``CPU_MODEL``: ``MODEL``, ``FEATURES``; - * ``FEATURES``: ``VIRTIO_BLK_QUEUES``, ``VIRTIO_SCSI_QUEUES``, ``IOTHREADS``; - * ``GRAPHICS``: ``PORT``, ``COMMAND``; - * ``VIDEO``: ``ATS``, ``IOMMU``, ``RESOLUTION``, ``TYPE``, ``VRAM``; - * ``RAW``: ``VALIDATE``; - * ``BACKUP_CONFIG``: ``FS_FREEZE``, ``KEEP_LAST``, ``BACKUP_VOLATILE``, ``MODE``, ``INCREMENT_MODE``. - - (https://github.com/ansible-collections/community.general/pull/9959). \ No newline at end of file diff --git a/changelogs/fragments/9960-gitlab_project-add-build_timeout-option.yml b/changelogs/fragments/9960-gitlab_project-add-build_timeout-option.yml deleted file mode 100644 index 4178484509..0000000000 --- a/changelogs/fragments/9960-gitlab_project-add-build_timeout-option.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - gitlab_project - add option ``build_timeout`` (https://github.com/ansible-collections/community.general/pull/9960). diff --git a/changelogs/fragments/9962-nmcli-add-infiniband-mac-support.yml b/changelogs/fragments/9962-nmcli-add-infiniband-mac-support.yml deleted file mode 100644 index 0942788868..0000000000 --- a/changelogs/fragments/9962-nmcli-add-infiniband-mac-support.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - nmcli - add support for Infiniband MAC setting when ``type`` is ``infiniband`` (https://github.com/ansible-collections/community.general/pull/9962). diff --git a/changelogs/fragments/9964-redfish-tls.yml b/changelogs/fragments/9964-redfish-tls.yml deleted file mode 100644 index edb8e942ff..0000000000 --- a/changelogs/fragments/9964-redfish-tls.yml +++ /dev/null @@ -1,7 +0,0 @@ -minor_changes: - - "redfish module utils - add ``REDFISH_COMMON_ARGUMENT_SPEC``, a corresponding ``redfish`` docs fragment, and support for its ``validate_certs``, ``ca_path``, and ``ciphers`` options (https://github.com/ansible-collections/community.general/issues/3686, https://github.com/ansible-collections/community.general/pull/9964)." - - "idrac_redfish_command, idrac_redfish_config, idrac_redfish_info - add ``validate_certs``, ``ca_path``, and ``ciphers`` options to configure TLS/SSL (https://github.com/ansible-collections/community.general/issues/3686, https://github.com/ansible-collections/community.general/pull/9964)." - - "ilo_redfish_command, ilo_redfish_config, ilo_redfish_info - add ``validate_certs``, ``ca_path``, and ``ciphers`` options to configure TLS/SSL (https://github.com/ansible-collections/community.general/issues/3686, https://github.com/ansible-collections/community.general/pull/9964)." - - "redfish_command, redfish_config, redfish_info - add ``validate_certs`` and ``ca_path`` options to configure TLS/SSL (https://github.com/ansible-collections/community.general/issues/3686, https://github.com/ansible-collections/community.general/pull/9964)." - - "wdc_redfish_command, wdc_redfish_info - add ``validate_certs``, ``ca_path``, and ``ciphers`` options to configure TLS/SSL (https://github.com/ansible-collections/community.general/issues/3686, https://github.com/ansible-collections/community.general/pull/9964)." - - "xcc_redfish_command - add ``validate_certs``, ``ca_path``, and ``ciphers`` options to configure TLS/SSL (https://github.com/ansible-collections/community.general/issues/3686, https://github.com/ansible-collections/community.general/pull/9964)." diff --git a/changelogs/fragments/9965-fix-duplicate-jsonify-payload-for-rocketchat-pre740.yml b/changelogs/fragments/9965-fix-duplicate-jsonify-payload-for-rocketchat-pre740.yml deleted file mode 100644 index 3364b4acc8..0000000000 --- a/changelogs/fragments/9965-fix-duplicate-jsonify-payload-for-rocketchat-pre740.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - rocketchat - fix duplicate JSON conversion for Rocket.Chat < 7.4.0 (https://github.com/ansible-collections/community.general/pull/9965). diff --git a/changelogs/fragments/9970-pkcs12_alias_cert_alias_optional.yml b/changelogs/fragments/9970-pkcs12_alias_cert_alias_optional.yml deleted file mode 100644 index aff7b126c3..0000000000 --- a/changelogs/fragments/9970-pkcs12_alias_cert_alias_optional.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - java_cert - the module no longer fails if the optional parameters ``pkcs12_alias`` and ``cert_alias`` are not provided (https://github.com/ansible-collections/community.general/pull/9970). diff --git a/changelogs/fragments/9972-zypper-skip-post-errors.yml b/changelogs/fragments/9972-zypper-skip-post-errors.yml deleted file mode 100644 index 097ec67df0..0000000000 --- a/changelogs/fragments/9972-zypper-skip-post-errors.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - zypper - adds ``skip_post_errors`` that allows to skip RPM post-install errors (Zypper return code 107) (https://github.com/ansible-collections/community.general/issues/9972). diff --git a/changelogs/fragments/9975-inventory-cobbler-as-rendered.yml b/changelogs/fragments/9975-inventory-cobbler-as-rendered.yml deleted file mode 100644 index d99dd0f27a..0000000000 --- a/changelogs/fragments/9975-inventory-cobbler-as-rendered.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - cobbler inventory plugin - add ``facts_level`` option to allow requesting fully rendered variables for Cobbler systems (https://github.com/ansible-collections/community.general/issues/9419, https://github.com/ansible-collections/community.general/pull/9975). diff --git a/changelogs/fragments/9976-keycloak_client-fix-idempotency-regression.yml b/changelogs/fragments/9976-keycloak_client-fix-idempotency-regression.yml deleted file mode 100644 index 593298d303..0000000000 --- a/changelogs/fragments/9976-keycloak_client-fix-idempotency-regression.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - keycloak_client - fix the idempotency regression by normalizing the Keycloak response for ``after_client`` (https://github.com/ansible-collections/community.general/issues/9905, https://github.com/ansible-collections/community.general/pull/9976). diff --git a/changelogs/fragments/9987-keycloak-auth-flow-fix-config.yaml b/changelogs/fragments/9987-keycloak-auth-flow-fix-config.yaml deleted file mode 100644 index b7df120f4a..0000000000 --- a/changelogs/fragments/9987-keycloak-auth-flow-fix-config.yaml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - keycloak_authentication - fix authentification config duplication for Keycloak < 26.2.0 (https://github.com/ansible-collections/community.general/pull/9987). \ No newline at end of file diff --git a/changelogs/fragments/9992-filtertypeerror.yml b/changelogs/fragments/9992-filtertypeerror.yml deleted file mode 100644 index ccb2ff8c0c..0000000000 --- a/changelogs/fragments/9992-filtertypeerror.yml +++ /dev/null @@ -1,2 +0,0 @@ -bugfixes: - - "hashids and unicode_normalize filter plugins - avoid deprecated ``AnsibleFilterTypeError`` on ansible-core 2.19 (https://github.com/ansible-collections/community.general/pull/9992)." diff --git a/changelogs/fragments/ansible-core-support.yml b/changelogs/fragments/ansible-core-support.yml deleted file mode 100644 index 295cd6f113..0000000000 --- a/changelogs/fragments/ansible-core-support.yml +++ /dev/null @@ -1,8 +0,0 @@ -removed_features: - - "Dropped support for ansible-core 2.15. The collection now requires ansible-core 2.16 or newer. This means that on the controller, Python 3.10+ is required. On the target side, Python 2.7 and Python 3.6+ are supported (https://github.com/ansible-collections/community.general/pull/10160, https://github.com/ansible-collections/community.general/pull/10192)." -minor_changes: - - "cartesian lookup plugin - removed compatibility code for ansible-core < 2.14 (https://github.com/ansible-collections/community.general/pull/10160)." - - "dependent lookup plugin - removed compatibility code for ansible-core < 2.14 (https://github.com/ansible-collections/community.general/pull/10160)." - - "flattened lookup plugin - removed compatibility code for ansible-core < 2.14 (https://github.com/ansible-collections/community.general/pull/10160)." - - "redfish module utils - removed compatibility code for ansible-core < 2.14 (https://github.com/ansible-collections/community.general/pull/10160)." - - "maven_artifact - removed compatibility code for ansible-core < 2.12 (https://github.com/ansible-collections/community.general/pull/10192)." diff --git a/changelogs/fragments/deprecations.yml b/changelogs/fragments/deprecations.yml deleted file mode 100644 index a848bf1e75..0000000000 --- a/changelogs/fragments/deprecations.yml +++ /dev/null @@ -1,17 +0,0 @@ -removed_features: - - "stackpath_compute inventory plugin - the plugin was removed since the company and the service were sunset in June 2024 (https://github.com/ansible-collections/community.general/pull/10126)." - - "manifold lookup plugin - the plugin was removed since the company was acquired in 2021 and service was ceased afterwards (https://github.com/ansible-collections/community.general/pull/10126)." - - "clc_* modules and doc fragment - the modules were removed since CenturyLink Cloud services went EOL in September 2023 (https://github.com/ansible-collections/community.general/pull/10126)." - - "hipchat - the module was removed since the hipchat service has been discontinued and the self-hosted variant has been End of Life since 2020 (https://github.com/ansible-collections/community.general/pull/10126)." - - "profitbrick* modules - the modules were removed since the supporting library is unsupported since 2021 (https://github.com/ansible-collections/community.general/pull/10126)." - - "redfish_utils module utils - the ``_init_session`` method has been removed (https://github.com/ansible-collections/community.general/pull/10126)." - - "django_manage - the ``ack_venv_creation_deprecation`` option has been removed. It had no effect anymore anyway (https://github.com/ansible-collections/community.general/pull/10126)." - - "apt_rpm - the ``present`` and ``installed`` states are no longer equivalent to ``latest``, but to ``present_not_latest`` (https://github.com/ansible-collections/community.general/pull/10126)." - - "git_config - it is no longer allowed to use ``state=present`` with no value to read the config value. Use the ``community.general.git_config_info`` module instead (https://github.com/ansible-collections/community.general/pull/10126)." - - "git_config - the ``list_all`` option has been removed. Use the ``community.general.git_config_info`` module instead (https://github.com/ansible-collections/community.general/pull/10126)." - - "mh.mixins.deps module utils - this module utils has been removed. Use the ``deps`` module utils instead (https://github.com/ansible-collections/community.general/pull/10126)." - - "mh.mixins.vars module utils - this module utils has been removed. Use ``VarDict`` from the ``vardict`` module utils instead (https://github.com/ansible-collections/community.general/pull/10126)." - - "mh.module_helper module utils - ``VarDict`` is now imported from the ``vardict`` module utils and no longer from the removed ``mh.mixins.vars`` module utils (https://github.com/ansible-collections/community.general/pull/10126)." - - "mh.module_helper module utils - ``AnsibleModule`` and ``VarsMixin`` are no longer provided (https://github.com/ansible-collections/community.general/pull/10126)." - - "mh.module_helper module utils - the attributes ``use_old_vardict`` and ``mute_vardict_deprecation`` from ``ModuleHelper`` have been removed. We suggest to remove them from your modules if you no longer support community.general < 11.0.0 (https://github.com/ansible-collections/community.general/pull/10126)." - - "module_helper module utils - ``StateMixin``, ``DependencyCtxMgr``, ``VarMeta``, ``VarDict``, and ``VarsMixin`` are no longer provided (https://github.com/ansible-collections/community.general/pull/10126)." diff --git a/changelogs/fragments/dnf_versionlock.yml b/changelogs/fragments/dnf_versionlock.yml deleted file mode 100644 index 35a53ff134..0000000000 --- a/changelogs/fragments/dnf_versionlock.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- -bugfixes: - - dnf_versionlock - add support for dnf5 (https://github.com/ansible-collections/community.general/issues/9556). diff --git a/changelogs/fragments/homebrew_cask.yml b/changelogs/fragments/homebrew_cask.yml deleted file mode 100644 index 623a982455..0000000000 --- a/changelogs/fragments/homebrew_cask.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- -bugfixes: - - homebrew_cask - handle unusual brew version strings (https://github.com/ansible-collections/community.general/issues/8432, https://github.com/ansible-collections/community.general/pull/9881). diff --git a/changelogs/fragments/logstash.yml b/changelogs/fragments/logstash.yml new file mode 100644 index 0000000000..1c7ec89b7d --- /dev/null +++ b/changelogs/fragments/logstash.yml @@ -0,0 +1,3 @@ +--- +bugfixes: + - logstash callback plugin - remove reference to Python 2 library (https://github.com/ansible-collections/community.general/pull/10345). diff --git a/changelogs/fragments/proxmox-removal.yml b/changelogs/fragments/proxmox-removal.yml deleted file mode 100644 index 11affae252..0000000000 --- a/changelogs/fragments/proxmox-removal.yml +++ /dev/null @@ -1,7 +0,0 @@ -removed_features: - - "The Proxmox content (modules and plugins) has been moved to the `new collection community.proxmox `__. - Since community.general 11.0.0, these modules and plugins have been replaced by deprecated redirections to community.proxmox. - You need to explicitly install community.proxmox, for example with ``ansible-galaxy collection install community.proxmox``, - or by installing a new enough version of the Ansible community package. - We suggest to update your roles and playbooks to use the new FQCNs as soon as possible to avoid getting deprecation messages - (https://github.com/ansible-collections/community.general/pull/10110)." diff --git a/changelogs/fragments/ssh_config_add_dynamicforward_option.yml b/changelogs/fragments/ssh_config_add_dynamicforward_option.yml deleted file mode 100644 index 0252c94c46..0000000000 --- a/changelogs/fragments/ssh_config_add_dynamicforward_option.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - ssh_config - add ``dynamicforward`` option (https://github.com/ansible-collections/community.general/pull/9192). \ No newline at end of file diff --git a/changelogs/fragments/ssh_config_add_other_options.yml b/changelogs/fragments/ssh_config_add_other_options.yml deleted file mode 100644 index 032bd2c073..0000000000 --- a/changelogs/fragments/ssh_config_add_other_options.yml +++ /dev/null @@ -1,2 +0,0 @@ -minor_changes: - - ssh_config - add ``other_options`` option (https://github.com/ansible-collections/community.general/issues/8053, https://github.com/ansible-collections/community.general/pull/9684). \ No newline at end of file diff --git a/changelogs/fragments/sudoers.yml b/changelogs/fragments/sudoers.yml deleted file mode 100644 index f16a007de9..0000000000 --- a/changelogs/fragments/sudoers.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- -bugfixes: - - sudoers - display stdout and stderr raised while failed validation (https://github.com/ansible-collections/community.general/issues/9674, https://github.com/ansible-collections/community.general/pull/9871). diff --git a/docs/docsite/extra-docs.yml b/docs/docsite/extra-docs.yml index 156e93309d..4594ab4c2d 100644 --- a/docs/docsite/extra-docs.yml +++ b/docs/docsite/extra-docs.yml @@ -8,9 +8,10 @@ sections: toctree: - filter_guide - test_guide - - title: Cloud Guides + - title: Technology Guides toctree: - guide_alicloud + - guide_iocage - guide_online - guide_packet - guide_scaleway diff --git a/docs/docsite/rst/filter_guide.rst b/docs/docsite/rst/filter_guide.rst index 1c6468ddec..da8a90af3c 100644 --- a/docs/docsite/rst/filter_guide.rst +++ b/docs/docsite/rst/filter_guide.rst @@ -8,7 +8,7 @@ community.general Filter Guide ============================== -The :ref:`community.general collection ` offers several useful filter plugins. +The :anscollection:`community.general collection ` offers several useful filter plugins. .. toctree:: :maxdepth: 2 diff --git a/docs/docsite/rst/guide_iocage.rst b/docs/docsite/rst/guide_iocage.rst new file mode 100644 index 0000000000..67eb0e8a99 --- /dev/null +++ b/docs/docsite/rst/guide_iocage.rst @@ -0,0 +1,15 @@ +.. + Copyright (c) Ansible Project + GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) + SPDX-License-Identifier: GPL-3.0-or-later + +.. _ansible_collections.community.general.docsite.guide_iocage: + +************ +Iocage Guide +************ + +.. toctree:: + :maxdepth: 1 + + guide_iocage_inventory diff --git a/docs/docsite/rst/guide_iocage_inventory.rst b/docs/docsite/rst/guide_iocage_inventory.rst new file mode 100644 index 0000000000..4a410c35db --- /dev/null +++ b/docs/docsite/rst/guide_iocage_inventory.rst @@ -0,0 +1,31 @@ +.. + Copyright (c) Ansible Project + GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) + SPDX-License-Identifier: GPL-3.0-or-later + +.. _ansible_collections.community.general.docsite.guide_iocage.guide_iocage_inventory: + +community.general.iocage inventory plugin +========================================= + +The inventory plugin :ansplugin:`community.general.iocage#inventory` gets the inventory hosts from the iocage jail manager. + +See: + +* `iocage - A FreeBSD Jail Manager `_ +* `man iocage `_ +* `Jails and Containers `_ + +.. note:: + The output of the examples is YAML formatted. See the option :ansopt:`ansible.builtin.default#callback:result_format`. + +.. toctree:: + :caption: Table of Contents + :maxdepth: 1 + + guide_iocage_inventory_basics + guide_iocage_inventory_dhcp + guide_iocage_inventory_hooks + guide_iocage_inventory_properties + guide_iocage_inventory_tags + guide_iocage_inventory_aliases diff --git a/docs/docsite/rst/guide_iocage_inventory_aliases.rst b/docs/docsite/rst/guide_iocage_inventory_aliases.rst new file mode 100644 index 0000000000..431403d733 --- /dev/null +++ b/docs/docsite/rst/guide_iocage_inventory_aliases.rst @@ -0,0 +1,200 @@ +.. + Copyright (c) Ansible Project + GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) + SPDX-License-Identifier: GPL-3.0-or-later + +.. _ansible_collections.community.general.docsite.guide_iocage.guide_iocage_inventory.guide_iocage_inventory_aliases: + +Aliases +------- + +Quoting :ref:`inventory_aliases`: + + The ``inventory_hostname`` is the unique identifier for a host in Ansible, this can be an IP or a hostname, but also just an 'alias' or short name for the host. + +As root at the iocage host, stop and destroy all jails: + +.. code-block:: console + + shell> iocage stop ALL + * Stopping srv_1 + + Executing prestop OK + + Stopping services OK + + Tearing down VNET OK + + Removing devfs_ruleset: 1000 OK + + Removing jail process OK + + Executing poststop OK + * Stopping srv_2 + + Executing prestop OK + + Stopping services OK + + Tearing down VNET OK + + Removing devfs_ruleset: 1001 OK + + Removing jail process OK + + Executing poststop OK + * Stopping srv_3 + + Executing prestop OK + + Stopping services OK + + Tearing down VNET OK + + Removing devfs_ruleset: 1002 OK + + Removing jail process OK + + Executing poststop OK + ansible_client is not running! + + shell> iocage destroy -f srv_1 srv_2 srv_3 + Destroying srv_1 + Destroying srv_2 + Destroying srv_3 + +Create three VNET jails with a DHCP interface from the template *ansible_client*. Use the option ``--count``: + +.. code-block:: console + + shell> iocage create --short --template ansible_client --count 3 bpf=1 dhcp=1 vnet=1 + 1c11de2d successfully created! + 9d94cc9e successfully created! + 052b9557 successfully created! + +The names are random. Start the jails: + +.. code-block:: console + + shell> iocage start ALL + No default gateway found for ipv6. + * Starting 052b9557 + + Started OK + + Using devfs_ruleset: 1000 (iocage generated default) + + Configuring VNET OK + + Using IP options: vnet + + Starting services OK + + Executing poststart OK + + DHCP Address: 10.1.0.137/24 + No default gateway found for ipv6. + * Starting 1c11de2d + + Started OK + + Using devfs_ruleset: 1001 (iocage generated default) + + Configuring VNET OK + + Using IP options: vnet + + Starting services OK + + Executing poststart OK + + DHCP Address: 10.1.0.146/24 + No default gateway found for ipv6. + * Starting 9d94cc9e + + Started OK + + Using devfs_ruleset: 1002 (iocage generated default) + + Configuring VNET OK + + Using IP options: vnet + + Starting services OK + + Executing poststart OK + + DHCP Address: 10.1.0.115/24 + Please convert back to a jail before trying to start ansible_client + +List the jails: + +.. code-block:: console + + shell> iocage list -l + +-----+----------+------+-------+------+-----------------+--------------------+-----+----------------+----------+ + | JID | NAME | BOOT | STATE | TYPE | RELEASE | IP4 | IP6 | TEMPLATE | BASEJAIL | + +=====+==========+======+=======+======+=================+====================+=====+================+==========+ + | 207 | 052b9557 | off | up | jail | 14.2-RELEASE-p3 | epair0b|10.1.0.137 | - | ansible_client | no | + +-----+----------+------+-------+------+-----------------+--------------------+-----+----------------+----------+ + | 208 | 1c11de2d | off | up | jail | 14.2-RELEASE-p3 | epair0b|10.1.0.146 | - | ansible_client | no | + +-----+----------+------+-------+------+-----------------+--------------------+-----+----------------+----------+ + | 209 | 9d94cc9e | off | up | jail | 14.2-RELEASE-p3 | epair0b|10.1.0.115 | - | ansible_client | no | + +-----+----------+------+-------+------+-----------------+--------------------+-----+----------------+----------+ + +Set notes. The tag *alias* will be used to create inventory aliases: + +.. code-block:: console + + shell> iocage set notes="vmm=iocage_02 project=foo alias=srv_1" 052b9557 + notes: none -> vmm=iocage_02 project=foo alias=srv_1 + shell> iocage set notes="vmm=iocage_02 project=foo alias=srv_2" 1c11de2d + notes: none -> vmm=iocage_02 project=foo alias=srv_2 + shell> iocage set notes="vmm=iocage_02 project=bar alias=srv_3" 9d94cc9e + notes: none -> vmm=iocage_02 project=bar alias=srv_3 + +Update the inventory configuration. Set the option +:ansopt:`community.general.iocage#inventory:inventory_hostname_tag` to :ansval:`alias`. This tag keeps the +value of the alias. The option :ansopt:`community.general.iocage#inventory:get_properties` must be +enabled. For example, ``hosts/02_iocage.yml`` contains: + +.. code-block:: yaml + + plugin: community.general.iocage + host: 10.1.0.73 + user: admin + get_properties: true + inventory_hostname_tag: alias + hooks_results: + - /var/db/dhclient-hook.address.epair0b + compose: + ansible_host: (iocage_hooks.0 == '-') | ternary(iocage_ip4, iocage_hooks.0) + iocage_tags: dict(iocage_properties.notes | split | map('split', '=')) + keyed_groups: + - prefix: vmm + key: iocage_tags.vmm + - prefix: project + key: iocage_tags.project + +Display tags and groups. Create a playbook ``pb-test-groups.yml`` with the following content: + +.. code-block:: yaml+jinja + + - hosts: all + remote_user: admin + + vars: + + ansible_python_interpreter: auto_silent + + tasks: + + - debug: + var: iocage_tags + + - debug: + msg: | + {% for group in groups %} + {{ group }}: {{ groups[group] }} + {% endfor %} + run_once: true + +Run the playbook: + +.. code-block:: console + + shell> ansible-playbook -i hosts/02_iocage.yml pb-test-groups.yml + + PLAY [all] ********************************************************************************************************** + + TASK [debug] ******************************************************************************************************** + ok: [srv_1] => + iocage_tags: + alias: srv_1 + project: foo + vmm: iocage_02 + ok: [srv_2] => + iocage_tags: + alias: srv_2 + project: foo + vmm: iocage_02 + ok: [srv_3] => + iocage_tags: + alias: srv_3 + project: bar + vmm: iocage_02 + + TASK [debug] ******************************************************************************************************** + ok: [srv_1] => + msg: |- + all: ['srv_1', 'srv_2', 'srv_3'] + ungrouped: [] + vmm_iocage_02: ['srv_1', 'srv_2', 'srv_3'] + project_foo: ['srv_1', 'srv_2'] + project_bar: ['srv_3'] + + PLAY RECAP ********************************************************************************************************** + srv_1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + srv_2 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + srv_3 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 diff --git a/docs/docsite/rst/guide_iocage_inventory_basics.rst b/docs/docsite/rst/guide_iocage_inventory_basics.rst new file mode 100644 index 0000000000..f198edc4f4 --- /dev/null +++ b/docs/docsite/rst/guide_iocage_inventory_basics.rst @@ -0,0 +1,128 @@ +.. + Copyright (c) Ansible Project + GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) + SPDX-License-Identifier: GPL-3.0-or-later + +.. _ansible_collections.community.general.docsite.guide_iocage.guide_iocage_inventory.guide_iocage_inventory_basics: + +Basics +------ + +As root at the iocage host, create three VNET jails with a DHCP interface from the template +*ansible_client*: + +.. code-block:: console + + shell> iocage create --template ansible_client --name srv_1 bpf=1 dhcp=1 vnet=1 + srv_1 successfully created! + shell> iocage create --template ansible_client --name srv_2 bpf=1 dhcp=1 vnet=1 + srv_2 successfully created! + shell> iocage create --template ansible_client --name srv_3 bpf=1 dhcp=1 vnet=1 + srv_3 successfully created! + +See: `Configuring a VNET Jail `_. + +As admin at the controller, list the jails: + +.. code-block:: console + + shell> ssh admin@10.1.0.73 iocage list -l + +------+-------+------+-------+------+-----------------+--------------------+-----+----------------+----------+ + | JID | NAME | BOOT | STATE | TYPE | RELEASE | IP4 | IP6 | TEMPLATE | BASEJAIL | + +======+=======+======+=======+======+=================+====================+=====+================+==========+ + | None | srv_1 | off | down | jail | 14.2-RELEASE-p3 | DHCP (not running) | - | ansible_client | no | + +------+-------+------+-------+------+-----------------+--------------------+-----+----------------+----------+ + | None | srv_2 | off | down | jail | 14.2-RELEASE-p3 | DHCP (not running) | - | ansible_client | no | + +------+-------+------+-------+------+-----------------+--------------------+-----+----------------+----------+ + | None | srv_3 | off | down | jail | 14.2-RELEASE-p3 | DHCP (not running) | - | ansible_client | no | + +------+-------+------+-------+------+-----------------+--------------------+-----+----------------+----------+ + +Create the inventory file ``hosts/02_iocage.yml`` + +.. code-block:: yaml + + plugin: community.general.iocage + host: 10.1.0.73 + user: admin + +Display the inventory: + +.. code-block:: console + + shell> ansible-inventory -i hosts/02_iocage.yml --list --yaml + all: + children: + ungrouped: + hosts: + srv_1: + iocage_basejail: 'no' + iocage_boot: 'off' + iocage_ip4: '-' + iocage_ip4_dict: + ip4: [] + msg: DHCP (not running) + iocage_ip6: '-' + iocage_jid: None + iocage_release: 14.2-RELEASE-p3 + iocage_state: down + iocage_template: ansible_client + iocage_type: jail + srv_2: + iocage_basejail: 'no' + iocage_boot: 'off' + iocage_ip4: '-' + iocage_ip4_dict: + ip4: [] + msg: DHCP (not running) + iocage_ip6: '-' + iocage_jid: None + iocage_release: 14.2-RELEASE-p3 + iocage_state: down + iocage_template: ansible_client + iocage_type: jail + srv_3: + iocage_basejail: 'no' + iocage_boot: 'off' + iocage_ip4: '-' + iocage_ip4_dict: + ip4: [] + msg: DHCP (not running) + iocage_ip6: '-' + iocage_jid: None + iocage_release: 14.2-RELEASE-p3 + iocage_state: down + iocage_template: ansible_client + iocage_type: jail + +Optionally, create shared IP jails: + +.. code-block:: console + + shell> iocage create --template ansible_client --name srv_1 ip4_addr="em0|10.1.0.101/24" + srv_1 successfully created! + shell> iocage create --template ansible_client --name srv_2 ip4_addr="em0|10.1.0.102/24" + srv_2 successfully created! + shell> iocage create --template ansible_client --name srv_3 ip4_addr="em0|10.1.0.103/24" + srv_3 successfully created! + shell> iocage list -l + +------+-------+------+-------+------+-----------------+-------------------+-----+----------------+----------+ + | JID | NAME | BOOT | STATE | TYPE | RELEASE | IP4 | IP6 | TEMPLATE | BASEJAIL | + +======+=======+======+=======+======+=================+===================+=====+================+==========+ + | None | srv_1 | off | down | jail | 14.2-RELEASE-p3 | em0|10.1.0.101/24 | - | ansible_client | no | + +------+-------+------+-------+------+-----------------+-------------------+-----+----------------+----------+ + | None | srv_2 | off | down | jail | 14.2-RELEASE-p3 | em0|10.1.0.102/24 | - | ansible_client | no | + +------+-------+------+-------+------+-----------------+-------------------+-----+----------------+----------+ + | None | srv_3 | off | down | jail | 14.2-RELEASE-p3 | em0|10.1.0.103/24 | - | ansible_client | no | + +------+-------+------+-------+------+-----------------+-------------------+-----+----------------+----------+ + +See: `Configuring a Shared IP Jail `_ + +If iocage needs environment variable(s), use the option :ansopt:`community.general.iocage#inventory:env`. For example, + +.. code-block:: yaml + + plugin: community.general.iocage + host: 10.1.0.73 + user: admin + env: + CRYPTOGRAPHY_OPENSSL_NO_LEGACY: 1 diff --git a/docs/docsite/rst/guide_iocage_inventory_dhcp.rst b/docs/docsite/rst/guide_iocage_inventory_dhcp.rst new file mode 100644 index 0000000000..3c37366ca6 --- /dev/null +++ b/docs/docsite/rst/guide_iocage_inventory_dhcp.rst @@ -0,0 +1,175 @@ +.. + Copyright (c) Ansible Project + GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) + SPDX-License-Identifier: GPL-3.0-or-later + +.. _ansible_collections.community.general.docsite.guide_iocage.guide_iocage_inventory.guide_iocage_inventory_dhcp: + +DHCP +---- + +As root at the iocage host, start the jails: + +.. code-block:: console + + shell> iocage start ALL + No default gateway found for ipv6. + * Starting srv_1 + + Started OK + + Using devfs_ruleset: 1000 (iocage generated default) + + Configuring VNET OK + + Using IP options: vnet + + Starting services OK + + Executing poststart OK + + DHCP Address: 10.1.0.183/24 + No default gateway found for ipv6. + * Starting srv_2 + + Started OK + + Using devfs_ruleset: 1001 (iocage generated default) + + Configuring VNET OK + + Using IP options: vnet + + Starting services OK + + Executing poststart OK + + DHCP Address: 10.1.0.204/24 + No default gateway found for ipv6. + * Starting srv_3 + + Started OK + + Using devfs_ruleset: 1002 (iocage generated default) + + Configuring VNET OK + + Using IP options: vnet + + Starting services OK + + Executing poststart OK + + DHCP Address: 10.1.0.169/24 + Please convert back to a jail before trying to start ansible_client + +List the jails: + +.. code-block:: console + + shell> iocage list -l + +-----+-------+------+-------+------+-----------------+--------------------+-----+----------------+----------+ + | JID | NAME | BOOT | STATE | TYPE | RELEASE | IP4 | IP6 | TEMPLATE | BASEJAIL | + +=====+=======+======+=======+======+=================+====================+=====+================+==========+ + | 204 | srv_1 | off | up | jail | 14.2-RELEASE-p3 | epair0b|10.1.0.183 | - | ansible_client | no | + +-----+-------+------+-------+------+-----------------+--------------------+-----+----------------+----------+ + | 205 | srv_2 | off | up | jail | 14.2-RELEASE-p3 | epair0b|10.1.0.204 | - | ansible_client | no | + +-----+-------+------+-------+------+-----------------+--------------------+-----+----------------+----------+ + | 206 | srv_3 | off | up | jail | 14.2-RELEASE-p3 | epair0b|10.1.0.169 | - | ansible_client | no | + +-----+-------+------+-------+------+-----------------+--------------------+-----+----------------+----------+ + +As admin at the controller, list the jails. The IP4 tab says "... address requires root": + +.. code-block:: console + + shell> ssh admin@10.1.0.73 iocage list -l + +-----+-------+------+-------+------+-----------------+-----------------------------------------+-----+----------------+----------+ + | JID | NAME | BOOT | STATE | TYPE | RELEASE | IP4 | IP6 | TEMPLATE | BASEJAIL | + +=====+=======+======+=======+======+=================+=========================================+=====+================+==========+ + | 204 | srv_1 | off | up | jail | 14.2-RELEASE-p3 | DHCP (running -- address requires root) | - | ansible_client | no | + +-----+-------+------+-------+------+-----------------+-----------------------------------------+-----+----------------+----------+ + | 205 | srv_2 | off | up | jail | 14.2-RELEASE-p3 | DHCP (running -- address requires root) | - | ansible_client | no | + +-----+-------+------+-------+------+-----------------+-----------------------------------------+-----+----------------+----------+ + | 206 | srv_3 | off | up | jail | 14.2-RELEASE-p3 | DHCP (running -- address requires root) | - | ansible_client | no | + +-----+-------+------+-------+------+-----------------+-----------------------------------------+-----+----------------+----------+ + +Use sudo if enabled: + +.. code-block:: console + + shell> ssh admin@10.1.0.73 sudo iocage list -l + +-----+-------+------+-------+------+-----------------+--------------------+-----+----------------+----------+ + | JID | NAME | BOOT | STATE | TYPE | RELEASE | IP4 | IP6 | TEMPLATE | BASEJAIL | + +=====+=======+======+=======+======+=================+====================+=====+================+==========+ + | 204 | srv_1 | off | up | jail | 14.2-RELEASE-p3 | epair0b|10.1.0.183 | - | ansible_client | no | + +-----+-------+------+-------+------+-----------------+--------------------+-----+----------------+----------+ + | 205 | srv_2 | off | up | jail | 14.2-RELEASE-p3 | epair0b|10.1.0.204 | - | ansible_client | no | + +-----+-------+------+-------+------+-----------------+--------------------+-----+----------------+----------+ + | 206 | srv_3 | off | up | jail | 14.2-RELEASE-p3 | epair0b|10.1.0.169 | - | ansible_client | no | + +-----+-------+------+-------+------+-----------------+--------------------+-----+----------------+----------+ + +Create the inventory file ``hosts/02_iocage.yml``. Use the option +:ansopt:`community.general.iocage#inventory:sudo`: + +.. code-block:: yaml + + plugin: community.general.iocage + host: 10.1.0.73 + user: admin + sudo: true + +Display the inventory: + +.. code-block:: console + + shell> ansible-inventory -i hosts/02_iocage.yml --list --yaml + all: + children: + ungrouped: + hosts: + srv_1: + iocage_basejail: 'no' + iocage_boot: 'off' + iocage_ip4: 10.1.0.183 + iocage_ip4_dict: + ip4: + - ifc: epair0b + ip: 10.1.0.183 + mask: '-' + msg: '' + iocage_ip6: '-' + iocage_jid: '204' + iocage_release: 14.2-RELEASE-p3 + iocage_state: up + iocage_template: ansible_client + iocage_type: jail + srv_2: + iocage_basejail: 'no' + iocage_boot: 'off' + iocage_ip4: 10.1.0.204 + iocage_ip4_dict: + ip4: + - ifc: epair0b + ip: 10.1.0.204 + mask: '-' + msg: '' + iocage_ip6: '-' + iocage_jid: '205' + iocage_release: 14.2-RELEASE-p3 + iocage_state: up + iocage_template: ansible_client + iocage_type: jail + srv_3: + iocage_basejail: 'no' + iocage_boot: 'off' + iocage_ip4: 10.1.0.169 + iocage_ip4_dict: + ip4: + - ifc: epair0b + ip: 10.1.0.169 + mask: '-' + msg: '' + iocage_ip6: '-' + iocage_jid: '206' + iocage_release: 14.2-RELEASE-p3 + iocage_state: up + iocage_template: ansible_client + iocage_type: jail + +Note: If the option :ansopt:`community.general.iocage#inventory:env` is used and :ansopt:`community.general.iocage#inventory:sudo` is enabled, enable also :ansopt:`community.general.iocage#inventory:sudo_preserve_env`. For example, + +.. code-block:: yaml + + plugin: community.general.iocage + host: 10.1.0.73 + user: admin + env: + CRYPTOGRAPHY_OPENSSL_NO_LEGACY: 1 + sudo: true + sudo_preserve_env: true + +In this case, make sure the sudo tag ``SETENV`` is used: + +.. code-block:: console + + shell> ssh admin@10.1.0.73 sudo cat /usr/local/etc/sudoers | grep admin + admin ALL=(ALL) NOPASSWD:SETENV: ALL diff --git a/docs/docsite/rst/guide_iocage_inventory_hooks.rst b/docs/docsite/rst/guide_iocage_inventory_hooks.rst new file mode 100644 index 0000000000..45364fc798 --- /dev/null +++ b/docs/docsite/rst/guide_iocage_inventory_hooks.rst @@ -0,0 +1,187 @@ +.. + Copyright (c) Ansible Project + GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) + SPDX-License-Identifier: GPL-3.0-or-later + +.. _ansible_collections.community.general.docsite.guide_iocage.guide_iocage_inventory.guide_iocage_inventory_hooks: + +Hooks +----- + +The iocage utility internally opens a console to a jail to get the jail's DHCP address. This +requires root. If you run the command ``iocage list -l`` as unprivileged user, you'll see the +message ``DHCP (running -- address requires root)``. If you are not granted the root privilege, use +``/etc/dhclient-exit-hooks``. For example, in the jail *srv_1*, create the file +``/zroot/iocage/jails/srv_1/root/etc/dhclient-exit-hooks`` + +.. code-block:: shell + + case "$reason" in + "BOUND"|"REBIND"|"REBOOT"|"RENEW") + echo $new_ip_address > /var/db/dhclient-hook.address.$interface + ;; + esac + +where ``/zroot/iocage`` is the activated pool. + +.. code-block:: console + + shell> zfs list | grep /zroot/iocage + zroot/iocage 4.69G 446G 5.08M /zroot/iocage + zroot/iocage/download 927M 446G 384K /zroot/iocage/download + zroot/iocage/download/14.1-RELEASE 465M 446G 465M /zroot/iocage/download/14.1-RELEASE + zroot/iocage/download/14.2-RELEASE 462M 446G 462M /zroot/iocage/download/14.2-RELEASE + zroot/iocage/images 384K 446G 384K /zroot/iocage/images + zroot/iocage/jails 189M 446G 480K /zroot/iocage/jails + zroot/iocage/jails/srv_1 62.9M 446G 464K /zroot/iocage/jails/srv_1 + zroot/iocage/jails/srv_1/root 62.4M 446G 3.53G /zroot/iocage/jails/srv_1/root + zroot/iocage/jails/srv_2 62.8M 446G 464K /zroot/iocage/jails/srv_2 + zroot/iocage/jails/srv_2/root 62.3M 446G 3.53G /zroot/iocage/jails/srv_2/root + zroot/iocage/jails/srv_3 62.8M 446G 464K /zroot/iocage/jails/srv_3 + zroot/iocage/jails/srv_3/root 62.3M 446G 3.53G /zroot/iocage/jails/srv_3/root + zroot/iocage/log 688K 446G 688K /zroot/iocage/log + zroot/iocage/releases 2.93G 446G 384K /zroot/iocage/releases + zroot/iocage/releases/14.2-RELEASE 2.93G 446G 384K /zroot/iocage/releases/14.2-RELEASE + zroot/iocage/releases/14.2-RELEASE/root 2.93G 446G 2.88G /zroot/iocage/releases/14.2-RELEASE/root + zroot/iocage/templates 682M 446G 416K /zroot/iocage/templates + zroot/iocage/templates/ansible_client 681M 446G 432K /zroot/iocage/templates/ansible_client + zroot/iocage/templates/ansible_client/root 681M 446G 3.53G /zroot/iocage/templates/ansible_client/root + +See: `man dhclient-script `_ + +Create the inventory configuration. Use the option :ansopt:`community.general.iocage#inventory:hooks_results` instead of :ansopt:`community.general.iocage#inventory:sudo`: + +.. code-block:: console + + shell> cat hosts/02_iocage.yml + +.. code-block:: yaml + + plugin: community.general.iocage + host: 10.1.0.73 + user: admin + hooks_results: + - /var/db/dhclient-hook.address.epair0b + +.. note:: + + The option :ansopt:`community.general.iocage#inventory:hooks_results` expects the poolname to be mounted to ``/poolname``. For example, if you + activate the pool iocage, this plugin expects to find the :ansopt:`community.general.iocage#inventory:hooks_results` items in the path + /iocage/iocage/jails//root. If you mount the poolname to a different path, the easiest + remedy is to create a symlink. + +As admin at the controller, display the inventory: + +.. code-block:: console + + shell> ansible-inventory -i hosts/02_iocage.yml --list --yaml + all: + children: + ungrouped: + hosts: + srv_1: + iocage_basejail: 'no' + iocage_boot: 'off' + iocage_hooks: + - 10.1.0.183 + iocage_ip4: '-' + iocage_ip4_dict: + ip4: [] + msg: DHCP (running -- address requires root) + iocage_ip6: '-' + iocage_jid: '204' + iocage_release: 14.2-RELEASE-p3 + iocage_state: up + iocage_template: ansible_client + iocage_type: jail + srv_2: + iocage_basejail: 'no' + iocage_boot: 'off' + iocage_hooks: + - 10.1.0.204 + iocage_ip4: '-' + iocage_ip4_dict: + ip4: [] + msg: DHCP (running -- address requires root) + iocage_ip6: '-' + iocage_jid: '205' + iocage_release: 14.2-RELEASE-p3 + iocage_state: up + iocage_template: ansible_client + iocage_type: jail + srv_3: + iocage_basejail: 'no' + iocage_boot: 'off' + iocage_hooks: + - 10.1.0.169 + iocage_ip4: '-' + iocage_ip4_dict: + ip4: [] + msg: DHCP (running -- address requires root) + iocage_ip6: '-' + iocage_jid: '206' + iocage_release: 14.2-RELEASE-p3 + iocage_state: up + iocage_template: ansible_client + iocage_type: jail + +Compose the variable ``ansible_host``. For example, ``hosts/02_iocage.yml`` could look like: + +.. code-block:: yaml+jinja + + plugin: community.general.iocage + host: 10.1.0.73 + user: admin + hooks_results: + - /var/db/dhclient-hook.address.epair0b + compose: + ansible_host: (iocage_hooks.0 == '-') | ternary(iocage_ip4, iocage_hooks.0) + +Test the jails. Create a playbook ``pb-test-uname.yml``: + +.. code-block:: yaml + + - hosts: all + remote_user: admin + + vars: + + ansible_python_interpreter: auto_silent + + tasks: + + - command: uname -a + register: out + + - debug: + var: out.stdout + +See: :ref:`working_with_bsd` + +Run the playbook: + +.. code-block:: console + + shell> ansible-playbook -i hosts/02_iocage.yml pb-test-uname.yml + + PLAY [all] ********************************************************************************************************** + + TASK [command] ****************************************************************************************************** + changed: [srv_3] + changed: [srv_1] + changed: [srv_2] + + TASK [debug] ******************************************************************************************************** + ok: [srv_1] => + out.stdout: FreeBSD srv-1 14.2-RELEASE-p1 FreeBSD 14.2-RELEASE-p1 GENERIC amd64 + ok: [srv_3] => + out.stdout: FreeBSD srv-3 14.2-RELEASE-p1 FreeBSD 14.2-RELEASE-p1 GENERIC amd64 + ok: [srv_2] => + out.stdout: FreeBSD srv-2 14.2-RELEASE-p1 FreeBSD 14.2-RELEASE-p1 GENERIC amd64 + + PLAY RECAP ********************************************************************************************************** + srv_1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + srv_2 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + srv_3 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + +Note: This playbook and the inventory configuration works also for the *Shared IP Jails*. diff --git a/docs/docsite/rst/guide_iocage_inventory_properties.rst b/docs/docsite/rst/guide_iocage_inventory_properties.rst new file mode 100644 index 0000000000..d044f2e7f2 --- /dev/null +++ b/docs/docsite/rst/guide_iocage_inventory_properties.rst @@ -0,0 +1,201 @@ +.. + Copyright (c) Ansible Project + GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) + SPDX-License-Identifier: GPL-3.0-or-later + +.. _ansible_collections.community.general.docsite.guide_iocage.guide_iocage_inventory.guide_iocage_inventory_properties: + +Properties +---------- + +Optionally, in the inventory file ``hosts/02_iocage.yml``, get the iocage properties. Enable +:ansopt:`community.general.iocage#inventory:get_properties`: + +.. code-block:: yaml+jinja + + plugin: community.general.iocage + host: 10.1.0.73 + user: admin + get_properties: true + hooks_results: + - /var/db/dhclient-hook.address.epair0b + compose: + ansible_host: (iocage_hooks.0 == '-') | ternary(iocage_ip4, iocage_hooks.0) + +Display the properties. Create the playbook ``pb-test-properties.yml``: + +.. code-block:: yaml + + - hosts: all + remote_user: admin + + vars: + + ansible_python_interpreter: auto_silent + + tasks: + + - debug: + var: iocage_properties + +Run the playbook. Limit the inventory to *srv_3*: + +.. code-block:: console + + shell> ansible-playbook -i hosts/02_iocage.yml -l srv_3 pb-test-properties.yml + + PLAY [all] ********************************************************************************************************** + + TASK [debug] ******************************************************************************************************** + ok: [srv_3] => + iocage_properties: + CONFIG_VERSION: '33' + allow_chflags: '0' + allow_mlock: '0' + allow_mount: '1' + allow_mount_devfs: '0' + allow_mount_fdescfs: '0' + allow_mount_fusefs: '0' + allow_mount_linprocfs: '0' + allow_mount_linsysfs: '0' + allow_mount_nullfs: '0' + allow_mount_procfs: '0' + allow_mount_tmpfs: '0' + allow_mount_zfs: '0' + allow_nfsd: '0' + allow_quotas: '0' + allow_raw_sockets: '0' + allow_set_hostname: '1' + allow_socket_af: '0' + allow_sysvipc: '0' + allow_tun: '0' + allow_vmm: '0' + assign_localhost: '0' + available: readonly + basejail: '0' + boot: '0' + bpf: '1' + children_max: '0' + cloned_release: 14.2-RELEASE + comment: none + compression: 'on' + compressratio: readonly + coredumpsize: 'off' + count: '1' + cpuset: 'off' + cputime: 'off' + datasize: 'off' + dedup: 'off' + defaultrouter: auto + defaultrouter6: auto + depends: none + devfs_ruleset: '4' + dhcp: '1' + enforce_statfs: '2' + exec_clean: '1' + exec_created: /usr/bin/true + exec_fib: '0' + exec_jail_user: root + exec_poststart: /usr/bin/true + exec_poststop: /usr/bin/true + exec_prestart: /usr/bin/true + exec_prestop: /usr/bin/true + exec_start: /bin/sh /etc/rc + exec_stop: /bin/sh /etc/rc.shutdown + exec_system_jail_user: '0' + exec_system_user: root + exec_timeout: '60' + host_domainname: none + host_hostname: srv-3 + host_hostuuid: srv_3 + host_time: '1' + hostid: ea2ba7d1-4fcd-f13f-82e4-8b32c0a03403 + hostid_strict_check: '0' + interfaces: vnet0:bridge0 + ip4: new + ip4_addr: none + ip4_saddrsel: '1' + ip6: new + ip6_addr: none + ip6_saddrsel: '1' + ip_hostname: '0' + jail_zfs: '0' + jail_zfs_dataset: iocage/jails/srv_3/data + jail_zfs_mountpoint: none + last_started: '2025-06-11 04:29:23' + localhost_ip: none + login_flags: -f root + mac_prefix: 02a098 + maxproc: 'off' + memorylocked: 'off' + memoryuse: 'off' + min_dyn_devfs_ruleset: '1000' + mount_devfs: '1' + mount_fdescfs: '1' + mount_linprocfs: '0' + mount_procfs: '0' + mountpoint: readonly + msgqqueued: 'off' + msgqsize: 'off' + nat: '0' + nat_backend: ipfw + nat_forwards: none + nat_interface: none + nat_prefix: '172.16' + nmsgq: 'off' + notes: none + nsem: 'off' + nsemop: 'off' + nshm: 'off' + nthr: 'off' + openfiles: 'off' + origin: readonly + owner: root + pcpu: 'off' + plugin_name: none + plugin_repository: none + priority: '99' + pseudoterminals: 'off' + quota: none + readbps: 'off' + readiops: 'off' + release: 14.2-RELEASE-p3 + reservation: none + resolver: /etc/resolv.conf + rlimits: 'off' + rtsold: '0' + securelevel: '2' + shmsize: 'off' + source_template: ansible_client + stacksize: 'off' + state: up + stop_timeout: '30' + swapuse: 'off' + sync_state: none + sync_target: none + sync_tgt_zpool: none + sysvmsg: new + sysvsem: new + sysvshm: new + template: '0' + type: jail + used: readonly + vmemoryuse: 'off' + vnet: '1' + vnet0_mac: 02a0983da05d 02a0983da05e + vnet0_mtu: auto + vnet1_mac: none + vnet1_mtu: auto + vnet2_mac: none + vnet2_mtu: auto + vnet3_mac: none + vnet3_mtu: auto + vnet_default_interface: auto + vnet_default_mtu: '1500' + vnet_interfaces: none + wallclock: 'off' + writebps: 'off' + writeiops: 'off' + + PLAY RECAP ********************************************************************************************************** + srv_3 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 diff --git a/docs/docsite/rst/guide_iocage_inventory_tags.rst b/docs/docsite/rst/guide_iocage_inventory_tags.rst new file mode 100644 index 0000000000..afb645198c --- /dev/null +++ b/docs/docsite/rst/guide_iocage_inventory_tags.rst @@ -0,0 +1,117 @@ +.. + Copyright (c) Ansible Project + GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) + SPDX-License-Identifier: GPL-3.0-or-later + +.. _ansible_collections.community.general.docsite.guide_iocage.guide_iocage_inventory.guide_iocage_inventory_tags: + +Tags +---- + +Quoting `man iocage `_ + +.. code-block:: text + + PROPERTIES + ... + notes="any string" + Custom notes for miscellaneous tagging. + Default: none + Source: local + +We will use the format `notes="tag1=value1 tag2=value2 ..."`. + +.. note:: + + The iocage tags have nothing to do with the :ref:`tags`. + +As root at the iocage host, set notes. For example, + +.. code-block:: console + + shell> iocage set notes="vmm=iocage_02 project=foo" srv_1 + notes: none -> vmm=iocage_02 project=foo + shell> iocage set notes="vmm=iocage_02 project=foo" srv_2 + notes: none -> vmm=iocage_02 project=foo + shell> iocage set notes="vmm=iocage_02 project=bar" srv_3 + notes: none -> vmm=iocage_02 project=bar + +Update the inventory configuration. Compose a dictionary *iocage_tags* and create groups. The option +:ansopt:`community.general.iocage#inventory:get_properties` must be enabled. +For example, ``hosts/02_iocage.yml`` could look like: + +.. code-block:: yaml + + plugin: community.general.iocage + host: 10.1.0.73 + user: admin + get_properties: true + hooks_results: + - /var/db/dhclient-hook.address.epair0b + compose: + ansible_host: (iocage_hooks.0 == '-') | ternary(iocage_ip4, iocage_hooks.0) + iocage_tags: dict(iocage_properties.notes | split | map('split', '=')) + keyed_groups: + - prefix: vmm + key: iocage_tags.vmm + - prefix: project + key: iocage_tags.project + +Display tags and groups. Create a playbook ``pb-test-groups.yml``: + +.. code-block:: yaml+jinja + + - hosts: all + remote_user: admin + + vars: + + ansible_python_interpreter: auto_silent + + tasks: + + - debug: + var: iocage_tags + + - debug: + msg: | + {% for group in groups %} + {{ group }}: {{ groups[group] }} + {% endfor %} + run_once: true + +Run the playbook: + +.. code-block:: console + + shell> ansible-playbook -i hosts/02_iocage.yml pb-test-groups.yml + + PLAY [all] ********************************************************************************************************** + + TASK [debug] ******************************************************************************************************** + ok: [srv_1] => + iocage_tags: + project: foo + vmm: iocage_02 + ok: [srv_2] => + iocage_tags: + project: foo + vmm: iocage_02 + ok: [srv_3] => + iocage_tags: + project: bar + vmm: iocage_02 + + TASK [debug] ******************************************************************************************************** + ok: [srv_1] => + msg: |- + all: ['srv_1', 'srv_2', 'srv_3'] + ungrouped: [] + vmm_iocage_02: ['srv_1', 'srv_2', 'srv_3'] + project_foo: ['srv_1', 'srv_2'] + project_bar: ['srv_3'] + + PLAY RECAP ********************************************************************************************************** + srv_1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + srv_2 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 + srv_3 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 diff --git a/docs/docsite/rst/guide_vardict.rst b/docs/docsite/rst/guide_vardict.rst index f65b09055b..1beef0c57f 100644 --- a/docs/docsite/rst/guide_vardict.rst +++ b/docs/docsite/rst/guide_vardict.rst @@ -51,7 +51,7 @@ And by the time the module is about to exit: That makes the return value of the module: -.. code-block:: javascript +.. code-block:: json { "abc": 123, diff --git a/docs/docsite/rst/test_guide.rst b/docs/docsite/rst/test_guide.rst index 7a261c7552..a1f5723df4 100644 --- a/docs/docsite/rst/test_guide.rst +++ b/docs/docsite/rst/test_guide.rst @@ -8,7 +8,7 @@ community.general Test (Plugin) Guide ===================================== -The :ref:`community.general collection ` offers currently one test plugin. +The :anscollection:`community.general collection ` offers currently one test plugin. .. contents:: Topics diff --git a/galaxy.yml b/galaxy.yml index a51b7f2569..a39ffcc7e5 100644 --- a/galaxy.yml +++ b/galaxy.yml @@ -5,7 +5,7 @@ namespace: community name: general -version: 11.0.0 +version: 11.2.0 readme: README.md authors: - Ansible (https://github.com/ansible) diff --git a/meta/runtime.yml b/meta/runtime.yml index 174493bc72..4efdc68688 100644 --- a/meta/runtime.yml +++ b/meta/runtime.yml @@ -116,6 +116,10 @@ plugin_routing: deprecation: removal_version: 13.0.0 warning_text: Project Atomic was sunset by the end of 2019. + catapult: + deprecation: + removal_version: 13.0.0 + warning_text: DNS fails to resolve the API endpoint used by the module since Oct 2024. See https://github.com/ansible-collections/community.general/issues/10318 for details. cisco_spark: redirect: community.general.cisco_webex clc_alert_policy: @@ -954,6 +958,10 @@ plugin_routing: warning_text: This module relied on HTTPS APIs that do not exist anymore, and any new development in the direction of providing an alternative should happen in the context of the google.cloud collection. + typetalk: + deprecation: + removal_version: 13.0.0 + warning_text: The typetalk service will be discontinued on Dec 2025. vertica_facts: tombstone: removal_version: 3.0.0 diff --git a/plugins/become/doas.py b/plugins/become/doas.py index 13aef19874..b7b82a0f80 100644 --- a/plugins/become/doas.py +++ b/plugins/become/doas.py @@ -72,7 +72,7 @@ options: prompt_l10n: description: - List of localized strings to match for prompt detection. - - If empty we will use the built in one. + - If empty the plugin uses the built-in one. type: list elements: string default: [] diff --git a/plugins/become/ksu.py b/plugins/become/ksu.py index 1c936e46da..be56fd6128 100644 --- a/plugins/become/ksu.py +++ b/plugins/become/ksu.py @@ -73,7 +73,7 @@ options: prompt_l10n: description: - List of localized strings to match for prompt detection. - - If empty we will use the built in one. + - If empty the plugin uses the built-in one. type: list elements: string default: [] diff --git a/plugins/become/machinectl.py b/plugins/become/machinectl.py index 81a9d06f86..4f608939f1 100644 --- a/plugins/become/machinectl.py +++ b/plugins/become/machinectl.py @@ -71,10 +71,10 @@ options: - section: machinectl_become_plugin key: password notes: - - When not using this plugin with user V(root), it only works correctly with a polkit rule which will alter the behaviour - of machinectl. This rule must alter the prompt behaviour to ask directly for the user credentials, if the user is allowed - to perform the action (take a look at the examples section). If such a rule is not present the plugin only work if it - is used in context with the root user, because then no further prompt will be shown by machinectl. + - When not using this plugin with user V(root), it only works correctly with a polkit rule which alters the behaviour + of C(machinectl). This rule must alter the prompt behaviour to ask directly for the user credentials, if the user is allowed + to perform the action (take a look at the examples section). If such a rule is not present the plugin only works if it + is used in context with the root user, because then no further prompt is shown by C(machinectl). """ EXAMPLES = r""" diff --git a/plugins/become/pfexec.py b/plugins/become/pfexec.py index 65690f359b..9faf1ffc63 100644 --- a/plugins/become/pfexec.py +++ b/plugins/become/pfexec.py @@ -6,7 +6,7 @@ from __future__ import annotations DOCUMENTATION = r""" name: pfexec -short_description: profile based execution +short_description: Profile based execution description: - This become plugins allows your remote/login user to execute commands as another user using the C(pfexec) utility. author: Ansible Core Team diff --git a/plugins/become/run0.py b/plugins/become/run0.py index 39e4667e7a..dce7c22448 100644 --- a/plugins/become/run0.py +++ b/plugins/become/run0.py @@ -61,7 +61,7 @@ options: - name: ANSIBLE_RUN0_FLAGS type: string notes: - - This plugin will only work when a C(polkit) rule is in place. + - This plugin only works when a C(polkit) rule is in place. """ EXAMPLES = r""" diff --git a/plugins/cache/pickle.py b/plugins/cache/pickle.py index 7dae0f2d85..1e9ffcb264 100644 --- a/plugins/cache/pickle.py +++ b/plugins/cache/pickle.py @@ -17,7 +17,7 @@ options: _uri: required: true description: - - Path in which the cache plugin will save the files. + - Path in which the cache plugin saves the files. env: - name: ANSIBLE_CACHE_PLUGIN_CONNECTION ini: diff --git a/plugins/cache/yaml.py b/plugins/cache/yaml.py index 676423d3b6..8bf61f6898 100644 --- a/plugins/cache/yaml.py +++ b/plugins/cache/yaml.py @@ -17,7 +17,7 @@ options: _uri: required: true description: - - Path in which the cache plugin will save the files. + - Path in which the cache plugin saves the files. env: - name: ANSIBLE_CACHE_PLUGIN_CONNECTION ini: diff --git a/plugins/callback/context_demo.py b/plugins/callback/context_demo.py index 28be2882b6..e846aa2786 100644 --- a/plugins/callback/context_demo.py +++ b/plugins/callback/context_demo.py @@ -10,7 +10,7 @@ DOCUMENTATION = r""" author: Unknown (!UNKNOWN) name: context_demo type: aggregate -short_description: demo callback that adds play/task context +short_description: Demo callback that adds play/task context description: - Displays some play and task context along with normal output. - This is mostly for demo purposes. diff --git a/plugins/callback/counter_enabled.py b/plugins/callback/counter_enabled.py index 15fc85a01b..2377d46585 100644 --- a/plugins/callback/counter_enabled.py +++ b/plugins/callback/counter_enabled.py @@ -12,11 +12,11 @@ DOCUMENTATION = r""" author: Unknown (!UNKNOWN) name: counter_enabled type: stdout -short_description: adds counters to the output items (tasks and hosts/task) +short_description: Adds counters to the output items (tasks and hosts/task) description: - Use this callback when you need a kind of progress bar on a large environments. - - You will know how many tasks has the playbook to run, and which one is actually running. - - You will know how many hosts may run a task, and which of them is actually running. + - You can see how many tasks has the playbook to run, and which one is actually running. + - You can see how many hosts may run a task, and which of them is actually running. extends_documentation_fragment: - default_callback requirements: diff --git a/plugins/callback/dense.py b/plugins/callback/dense.py index 67cad4fd8f..1fd68b5d60 100644 --- a/plugins/callback/dense.py +++ b/plugins/callback/dense.py @@ -9,11 +9,11 @@ from __future__ import annotations DOCUMENTATION = r""" name: dense type: stdout -short_description: minimal stdout output +short_description: Minimal stdout output extends_documentation_fragment: - default_callback description: - - When in verbose mode it will act the same as the default callback. + - When in verbose mode it acts the same as the default callback. author: - Dag Wieers (@dagwieers) requirements: @@ -263,12 +263,8 @@ class CallbackModule(CallbackModule_default): sys.stdout.write(colors[self.hosts[name]['state']] + name + vt100.reset) sys.stdout.flush() -# if result._result.get('diff', False): -# sys.stdout.write('\n' + vt100.linewrap) sys.stdout.write(vt100.linewrap) -# self.keep = True - def _display_task_banner(self): if not self.shown_title: self.shown_title = True @@ -312,12 +308,12 @@ class CallbackModule(CallbackModule_default): delegated_vars = result._result.get('_ansible_delegated_vars', None) if delegated_vars: - sys.stdout.write(f"{vt100.reset + result._host.get_name()}>{colors[status]}{delegated_vars['ansible_host']}") + sys.stdout.write(f"{vt100.reset}{result._host.get_name()}>{colors[status]}{delegated_vars['ansible_host']}") else: sys.stdout.write(result._host.get_name()) sys.stdout.write(f": {dump}\n") - sys.stdout.write(vt100.reset + vt100.save + vt100.clearline) + sys.stdout.write(f"{vt100.reset}{vt100.save}{vt100.clearline}") sys.stdout.flush() if status == 'changed': diff --git a/plugins/callback/diy.py b/plugins/callback/diy.py index a4369daadd..f84789d010 100644 --- a/plugins/callback/diy.py +++ b/plugins/callback/diy.py @@ -23,15 +23,15 @@ notes: that is available using the other various execution contexts, such as playbook, play, task, and so on so forth. - Options being set by their respective variable input can only be set using the variable if the variable was set in a context that is available to the respective callback. Use the C(ansible_callback_diy) dictionary to see what is available to a - callback. Additionally, C(ansible_callback_diy.top_level_var_names) will output the top level variable names available + callback. Additionally, C(ansible_callback_diy.top_level_var_names) outputs the top level variable names available to the callback. - Each option value is rendered as a template before being evaluated. This allows for the dynamic usage of an option. For - example, C("{{ 'yellow' if ansible_callback_diy.result.is_changed else 'bright green' }}"). - - 'B(Condition) for all C(msg) options: if value C(is None or omit), then the option is not being used. B(Effect): use - of the C(default) callback plugin for output.' - - 'B(Condition) for all C(msg) options: if value C(is not None and not omit and length is not greater than 0), then the + example, V("{{ 'yellow' if ansible_callback_diy.result.is_changed else 'bright green' }}"). + - 'B(Condition) for all C(msg) options: if value V(is None or omit), then the option is not being used. B(Effect): use of + the C(default) callback plugin for output.' + - 'B(Condition) for all C(msg) options: if value V(is not None and not omit and length is not greater than 0), then the option is being used without output. B(Effect): suppress output.' - - 'B(Condition) for all C(msg) options: if value C(is not None and not omit and length is greater than 0), then the option + - 'B(Condition) for all C(msg) options: if value V(is not None and not omit and length is greater than 0), then the option is being used with output. B(Effect): render value as template and output.' - 'Valid color values: V(black), V(bright gray), V(blue), V(white), V(green), V(bright blue), V(cyan), V(bright green), V(red), V(bright cyan), V(purple), V(bright red), V(yellow), V(bright purple), V(dark gray), V(bright yellow), V(magenta), diff --git a/plugins/callback/jabber.py b/plugins/callback/jabber.py index 10aa866142..c5a0881e14 100644 --- a/plugins/callback/jabber.py +++ b/plugins/callback/jabber.py @@ -10,7 +10,7 @@ DOCUMENTATION = r""" author: Unknown (!UNKNOWN) name: jabber type: notification -short_description: post task events to a Jabber server +short_description: Post task events to a Jabber server description: - The chatty part of ChatOps with a Hipchat server as a target. - This callback plugin sends status updates to a HipChat channel during playbook execution. @@ -36,7 +36,7 @@ options: env: - name: JABBER_PASS to: - description: Chat identifier that will receive the message. + description: Chat identifier that receives the message. type: str required: true env: diff --git a/plugins/callback/log_plays.py b/plugins/callback/log_plays.py index 483976acae..3de6c0bec0 100644 --- a/plugins/callback/log_plays.py +++ b/plugins/callback/log_plays.py @@ -10,7 +10,7 @@ DOCUMENTATION = r""" author: Unknown (!UNKNOWN) name: log_plays type: notification -short_description: write playbook output to log file +short_description: Write playbook output to log file description: - This callback writes playbook output to a file per host in the C(/var/log/ansible/hosts) directory. requirements: @@ -19,7 +19,7 @@ requirements: options: log_folder: default: /var/log/ansible/hosts - description: The folder where log files will be created. + description: The folder where log files are created. type: str env: - name: ANSIBLE_LOG_FOLDER diff --git a/plugins/callback/loganalytics.py b/plugins/callback/loganalytics.py index bd3ca4018d..bd6b89fde1 100644 --- a/plugins/callback/loganalytics.py +++ b/plugins/callback/loganalytics.py @@ -11,7 +11,7 @@ type: notification short_description: Posts task results to Azure Log Analytics author: "Cyrus Li (@zhcli) " description: - - This callback plugin will post task results in JSON formatted to an Azure Log Analytics workspace. + - This callback plugin posts task results in JSON formatted to an Azure Log Analytics workspace. - Credits to authors of splunk callback plugin. version_added: "2.4.0" requirements: diff --git a/plugins/callback/logdna.py b/plugins/callback/logdna.py index 90fe6d4465..9ceb6547b2 100644 --- a/plugins/callback/logdna.py +++ b/plugins/callback/logdna.py @@ -11,7 +11,7 @@ name: logdna type: notification short_description: Sends playbook logs to LogDNA description: - - This callback will report logs from playbook actions, tasks, and events to LogDNA (U(https://app.logdna.com)). + - This callback reports logs from playbook actions, tasks, and events to LogDNA (U(https://app.logdna.com)). requirements: - LogDNA Python Library (U(https://github.com/logdna/python)) - whitelisting in configuration diff --git a/plugins/callback/logentries.py b/plugins/callback/logentries.py index bc5d7e03ce..796398d6b6 100644 --- a/plugins/callback/logentries.py +++ b/plugins/callback/logentries.py @@ -11,7 +11,7 @@ name: logentries type: notification short_description: Sends events to Logentries description: - - This callback plugin will generate JSON objects and send them to Logentries using TCP for auditing/debugging purposes. + - This callback plugin generates JSON objects and send them to Logentries using TCP for auditing/debugging purposes. requirements: - whitelisting in configuration - certifi (Python library) diff --git a/plugins/callback/logstash.py b/plugins/callback/logstash.py index 9d299e50ed..8b5acc6b9f 100644 --- a/plugins/callback/logstash.py +++ b/plugins/callback/logstash.py @@ -12,7 +12,7 @@ name: logstash type: notification short_description: Sends events to Logstash description: - - This callback will report facts and task events to Logstash U(https://www.elastic.co/products/logstash). + - This callback reports facts and task events to Logstash U(https://www.elastic.co/products/logstash). requirements: - whitelisting in configuration - logstash (Python library) @@ -127,9 +127,7 @@ class CallbackModule(CallbackBase): if not HAS_LOGSTASH: self.disabled = True - self._display.warning("The required python-logstash/python3-logstash is not installed. " - "pip install python-logstash for Python 2" - "pip install python3-logstash for Python 3") + self._display.warning("The required python3-logstash is not installed.") self.start_time = now() @@ -182,7 +180,7 @@ class CallbackModule(CallbackBase): data['status'] = "OK" data['ansible_playbook'] = playbook._file_name - if (self.ls_format_version == "v2"): + if self.ls_format_version == "v2": self.logger.info( "START PLAYBOOK | %s", data['ansible_playbook'], extra=data ) @@ -207,7 +205,7 @@ class CallbackModule(CallbackBase): data['ansible_playbook_duration'] = runtime.total_seconds() data['ansible_result'] = json.dumps(summarize_stat) # deprecated field - if (self.ls_format_version == "v2"): + if self.ls_format_version == "v2": self.logger.info( "FINISH PLAYBOOK | %s", json.dumps(summarize_stat), extra=data ) @@ -226,7 +224,7 @@ class CallbackModule(CallbackBase): data['ansible_play_id'] = self.play_id data['ansible_play_name'] = self.play_name - if (self.ls_format_version == "v2"): + if self.ls_format_version == "v2": self.logger.info("START PLAY | %s", self.play_name, extra=data) else: self.logger.info("ansible play", extra=data) @@ -251,7 +249,7 @@ class CallbackModule(CallbackBase): data['ansible_task'] = task_name data['ansible_facts'] = self._dump_results(result._result) - if (self.ls_format_version == "v2"): + if self.ls_format_version == "v2": self.logger.info( "SETUP FACTS | %s", self._dump_results(result._result), extra=data ) @@ -272,7 +270,7 @@ class CallbackModule(CallbackBase): data['ansible_task_id'] = self.task_id data['ansible_result'] = self._dump_results(result._result) - if (self.ls_format_version == "v2"): + if self.ls_format_version == "v2": self.logger.info( "TASK OK | %s | RESULT | %s", task_name, self._dump_results(result._result), extra=data @@ -293,7 +291,7 @@ class CallbackModule(CallbackBase): data['ansible_task_id'] = self.task_id data['ansible_result'] = self._dump_results(result._result) - if (self.ls_format_version == "v2"): + if self.ls_format_version == "v2": self.logger.info("TASK SKIPPED | %s", task_name, extra=data) else: self.logger.info("ansible skipped", extra=data) @@ -307,7 +305,7 @@ class CallbackModule(CallbackBase): data['ansible_play_name'] = self.play_name data['imported_file'] = imported_file - if (self.ls_format_version == "v2"): + if self.ls_format_version == "v2": self.logger.info("IMPORT | %s", imported_file, extra=data) else: self.logger.info("ansible import", extra=data) @@ -321,7 +319,7 @@ class CallbackModule(CallbackBase): data['ansible_play_name'] = self.play_name data['imported_file'] = missing_file - if (self.ls_format_version == "v2"): + if self.ls_format_version == "v2": self.logger.info("NOT IMPORTED | %s", missing_file, extra=data) else: self.logger.info("ansible import", extra=data) @@ -345,7 +343,7 @@ class CallbackModule(CallbackBase): data['ansible_result'] = self._dump_results(result._result) self.errors += 1 - if (self.ls_format_version == "v2"): + if self.ls_format_version == "v2": self.logger.error( "TASK FAILED | %s | HOST | %s | RESULT | %s", task_name, self.hostname, @@ -368,7 +366,7 @@ class CallbackModule(CallbackBase): data['ansible_result'] = self._dump_results(result._result) self.errors += 1 - if (self.ls_format_version == "v2"): + if self.ls_format_version == "v2": self.logger.error( "UNREACHABLE | %s | HOST | %s | RESULT | %s", task_name, self.hostname, @@ -391,7 +389,7 @@ class CallbackModule(CallbackBase): data['ansible_result'] = self._dump_results(result._result) self.errors += 1 - if (self.ls_format_version == "v2"): + if self.ls_format_version == "v2": self.logger.error( "ASYNC FAILED | %s | HOST | %s | RESULT | %s", task_name, self.hostname, diff --git a/plugins/callback/mail.py b/plugins/callback/mail.py index 80bef26044..d05982cd61 100644 --- a/plugins/callback/mail.py +++ b/plugins/callback/mail.py @@ -11,7 +11,7 @@ name: mail type: notification short_description: Sends failure events through email description: - - This callback will report failures through email. + - This callback reports failures through email. author: - Dag Wieers (@dagwieers) requirements: @@ -212,7 +212,8 @@ class CallbackModule(CallbackBase): if self.itembody: body += self.itembody elif result._result.get('failed_when_result') is True: - fail_cond = self.indent('failed_when:\n- ' + '\n- '.join(result._task.failed_when)) + fail_cond_list = '\n- '.join(result._task.failed_when) + fail_cond = self.indent(f"failed_when:\n- {fail_cond_list}") body += f"due to the following condition:\n\n{fail_cond}\n\n" elif result._result.get('msg'): body += self.body_blob(result._result['msg'], 'message') diff --git a/plugins/callback/null.py b/plugins/callback/null.py index b59389e39a..0527c1c467 100644 --- a/plugins/callback/null.py +++ b/plugins/callback/null.py @@ -12,7 +12,7 @@ name: 'null' type: stdout requirements: - set as main display callback -short_description: do not display stuff to screen +short_description: Do not display stuff to screen description: - This callback prevents outputting events to screen. """ diff --git a/plugins/callback/opentelemetry.py b/plugins/callback/opentelemetry.py index c46234b724..80f24924b9 100644 --- a/plugins/callback/opentelemetry.py +++ b/plugins/callback/opentelemetry.py @@ -35,8 +35,8 @@ options: - Whether to enable this callback only if the given environment variable exists and it is set to V(true). - This is handy when you use Configuration as Code and want to send distributed traces if running in the CI rather when running Ansible locally. - - For such, it evaluates the given O(enable_from_environment) value as environment variable and if set to true this - plugin will be enabled. + - For such, it evaluates the given O(enable_from_environment) value as environment variable and if set to V(true) this + plugin is enabled. env: - name: ANSIBLE_OPENTELEMETRY_ENABLE_FROM_ENVIRONMENT ini: diff --git a/plugins/callback/print_task.py b/plugins/callback/print_task.py index 7407b0e803..809baddb95 100644 --- a/plugins/callback/print_task.py +++ b/plugins/callback/print_task.py @@ -6,7 +6,7 @@ from __future__ import (absolute_import, division, print_function) __metaclass__ = type -DOCUMENTATION = r''' +DOCUMENTATION = r""" name: print_task type: aggregate short_description: Prints playbook task snippet to job output @@ -15,14 +15,14 @@ description: version_added: 10.7.0 requirements: - enable in configuration -''' +""" -EXAMPLES = r''' -ansible.cfg: > - # Enable plugin - [defaults] - callbacks_enabled=community.general.print_task -''' +EXAMPLES = r""" +ansible.cfg: |- + # Enable plugin + [defaults] + callbacks_enabled=community.general.print_task +""" from yaml import load, dump diff --git a/plugins/callback/say.py b/plugins/callback/say.py index e6da490ec7..8a4e93f353 100644 --- a/plugins/callback/say.py +++ b/plugins/callback/say.py @@ -14,9 +14,9 @@ type: notification requirements: - whitelisting in configuration - the C(/usr/bin/say) command line program (standard on macOS) or C(espeak) command line program -short_description: notify using software speech synthesizer +short_description: Notify using software speech synthesizer description: - - This plugin will use the C(say) or C(espeak) program to "speak" about play events. + - This plugin uses C(say) or C(espeak) to "speak" about play events. """ import platform diff --git a/plugins/callback/selective.py b/plugins/callback/selective.py index 9cc805d3cd..53d40671bc 100644 --- a/plugins/callback/selective.py +++ b/plugins/callback/selective.py @@ -12,7 +12,7 @@ name: selective type: stdout requirements: - set as main display callback -short_description: only print certain tasks +short_description: Only print certain tasks description: - This callback only prints tasks that have been tagged with C(print_action) or that have failed. This allows operators to focus on the tasks that provide value only. diff --git a/plugins/callback/splunk.py b/plugins/callback/splunk.py index 1870bfc1d0..c385050d67 100644 --- a/plugins/callback/splunk.py +++ b/plugins/callback/splunk.py @@ -11,7 +11,7 @@ type: notification short_description: Sends task result events to Splunk HTTP Event Collector author: "Stuart Hirst (!UNKNOWN) " description: - - This callback plugin will send task results as JSON formatted events to a Splunk HTTP collector. + - This callback plugin sends task results as JSON formatted events to a Splunk HTTP collector. - The companion Splunk Monitoring & Diagnostics App is available here U(https://splunkbase.splunk.com/app/4023/). - Credit to "Ryan Currah (@ryancurrah)" for original source upon which this is based. requirements: diff --git a/plugins/callback/sumologic.py b/plugins/callback/sumologic.py index c12c852db9..7a762c30e8 100644 --- a/plugins/callback/sumologic.py +++ b/plugins/callback/sumologic.py @@ -11,7 +11,7 @@ type: notification short_description: Sends task result events to Sumologic author: "Ryan Currah (@ryancurrah)" description: - - This callback plugin will send task results as JSON formatted events to a Sumologic HTTP collector source. + - This callback plugin sends task results as JSON formatted events to a Sumologic HTTP collector source. requirements: - Whitelisting this callback plugin - 'Create a HTTP collector source in Sumologic and specify a custom timestamp format of V(yyyy-MM-dd HH:mm:ss ZZZZ) and diff --git a/plugins/callback/syslog_json.py b/plugins/callback/syslog_json.py index 9e5c78c90c..cab3973be1 100644 --- a/plugins/callback/syslog_json.py +++ b/plugins/callback/syslog_json.py @@ -12,12 +12,12 @@ name: syslog_json type: notification requirements: - whitelist in configuration -short_description: sends JSON events to syslog +short_description: Sends JSON events to syslog description: - This plugin logs ansible-playbook and ansible runs to a syslog server in JSON format. options: server: - description: Syslog server that will receive the event. + description: Syslog server that receives the event. type: str env: - name: SYSLOG_SERVER diff --git a/plugins/callback/tasks_only.py b/plugins/callback/tasks_only.py new file mode 100644 index 0000000000..f64c4c57db --- /dev/null +++ b/plugins/callback/tasks_only.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2025, Felix Fontein +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +from __future__ import annotations + +DOCUMENTATION = r""" +author: Felix Fontein (@felixfontein) +name: tasks_only +type: stdout +version_added: 11.1.0 +short_description: Only show tasks +description: + - Removes play start and stats marker from P(ansible.builtin.default#callback)'s output. + - Can be used to generate output for documentation examples. + For this, the O(number_of_columns) option should be set to an explicit value. +extends_documentation_fragment: + - default_callback +options: + number_of_columns: + description: + - Sets the number of columns for Ansible's display. + type: int + env: + - name: ANSIBLE_COLLECTIONS_TASKS_ONLY_NUMBER_OF_COLUMNS +""" + +EXAMPLES = r""" +--- +# Enable callback in ansible.cfg: +ansible_config: |- + [defaults] + stdout_callback = community.general.tasks_only + +--- +# Enable callback with environment variables: +environment_variable: |- + ANSIBLE_STDOUT_CALLBACK=community.general.tasks_only +""" + +from ansible.plugins.callback.default import CallbackModule as Default + + +class CallbackModule(Default): + CALLBACK_VERSION = 2.0 + CALLBACK_TYPE = 'stdout' + CALLBACK_NAME = 'community.general.tasks_only' + + def v2_playbook_on_play_start(self, play): + pass + + def v2_playbook_on_stats(self, stats): + pass + + def set_options(self, *args, **kwargs): + result = super(CallbackModule, self).set_options(*args, **kwargs) + self.number_of_columns = self.get_option("number_of_columns") + if self.number_of_columns is not None: + self._display.columns = self.number_of_columns + return result diff --git a/plugins/callback/unixy.py b/plugins/callback/unixy.py index 48f9b2d1f0..8fd8c10c94 100644 --- a/plugins/callback/unixy.py +++ b/plugins/callback/unixy.py @@ -11,7 +11,7 @@ DOCUMENTATION = r""" name: unixy type: stdout author: Al Bowles (@akatch) -short_description: condensed Ansible output +short_description: Condensed Ansible output description: - Consolidated Ansible output in the style of LINUX/UNIX startup logs. extends_documentation_fragment: diff --git a/plugins/callback/yaml.py b/plugins/callback/yaml.py index d11dfd0c0a..f02840c9c6 100644 --- a/plugins/callback/yaml.py +++ b/plugins/callback/yaml.py @@ -119,6 +119,9 @@ except ImportError: def transform_recursively(value, transform): + # Since 2.19.0b7, this should no longer be needed: + # https://github.com/ansible/ansible/issues/85325 + # https://github.com/ansible/ansible/pull/85389 if isinstance(value, Mapping): return {transform(k): transform(v) for k, v in value.items()} if isinstance(value, Sequence) and not isinstance(value, (str, bytes)): diff --git a/plugins/connection/incus.py b/plugins/connection/incus.py index 842ad8f924..4f73d05532 100644 --- a/plugins/connection/incus.py +++ b/plugins/connection/incus.py @@ -52,7 +52,7 @@ options: remote_user: description: - User to login/authenticate as. - - Can be set from the CLI via the C(--user) or C(-u) options. + - Can be set from the CLI with the C(--user) or C(-u) options. type: string default: root vars: @@ -155,11 +155,35 @@ class Connection(ConnectionBase): stdout = to_text(stdout) stderr = to_text(stderr) - if stderr == "Error: Instance is not running.\n": - raise AnsibleConnectionFailure(f"instance not running: {self._instance()}") + if stderr.startswith("Error: ") and stderr.rstrip().endswith( + ": Instance is not running" + ): + raise AnsibleConnectionFailure( + f"instance not running: {self._instance()} (remote={self.get_option('remote')}, project={self.get_option('project')})" + ) - if stderr == "Error: Instance not found\n": - raise AnsibleConnectionFailure(f"instance not found: {self._instance()}") + if stderr.startswith("Error: ") and stderr.rstrip().endswith( + ": Instance not found" + ): + raise AnsibleConnectionFailure( + f"instance not found: {self._instance()} (remote={self.get_option('remote')}, project={self.get_option('project')})" + ) + + if ( + stderr.startswith("Error: ") + and ": User does not have permission " in stderr + ): + raise AnsibleConnectionFailure( + f"instance access denied: {self._instance()} (remote={self.get_option('remote')}, project={self.get_option('project')})" + ) + + if ( + stderr.startswith("Error: ") + and ": User does not have entitlement " in stderr + ): + raise AnsibleConnectionFailure( + f"instance access denied: {self._instance()} (remote={self.get_option('remote')}, project={self.get_option('project')})" + ) return process.returncode, stdout, stderr diff --git a/plugins/connection/lxd.py b/plugins/connection/lxd.py index 2670ed1b5f..2cc774a1d4 100644 --- a/plugins/connection/lxd.py +++ b/plugins/connection/lxd.py @@ -52,7 +52,7 @@ options: remote_user: description: - User to login/authenticate as. - - Can be set from the CLI via the C(--user) or C(-u) options. + - Can be set from the CLI with the C(--user) or C(-u) options. type: string default: root vars: diff --git a/plugins/connection/wsl.py b/plugins/connection/wsl.py index 06c0652312..92ffec52b3 100644 --- a/plugins/connection/wsl.py +++ b/plugins/connection/wsl.py @@ -11,11 +11,11 @@ from __future__ import annotations DOCUMENTATION = r""" author: Rui Lopes (@rgl) name: wsl -short_description: Run tasks in WSL distribution using wsl.exe CLI via SSH +short_description: Run tasks in WSL distribution using wsl.exe CLI using SSH requirements: - paramiko description: - - Run commands or put/fetch files to an existing WSL distribution using wsl.exe CLI via SSH. + - Run commands or put/fetch files to an existing WSL distribution using wsl.exe CLI using SSH. - Uses the Python SSH implementation (Paramiko) to connect to the WSL host. version_added: "10.6.0" options: @@ -50,7 +50,7 @@ options: remote_user: description: - User to login/authenticate as. - - Can be set from the CLI via the C(--user) or C(-u) options. + - Can be set from the CLI with the C(--user) or C(-u) options. type: string vars: - name: ansible_user @@ -69,7 +69,7 @@ options: password: description: - Secret used to either login the SSH server or as a passphrase for SSH keys that require it. - - Can be set from the CLI via the C(--ask-pass) option. + - Can be set from the CLI with the C(--ask-pass) option. type: string vars: - name: ansible_password @@ -109,7 +109,7 @@ options: proxy_command: default: "" description: - - Proxy information for running the connection via a jumphost. + - Proxy information for running the connection through a jumphost. - This option is supported by paramiko version 1.9.0 or newer. type: string env: @@ -128,7 +128,8 @@ options: key: record_host_keys type: boolean host_key_checking: - description: "Set this to V(false) if you want to avoid host key checking by the underlying tools Ansible uses to connect to the host." + description: "Set this to V(false) if you want to avoid host key checking by the underlying tools Ansible uses to connect + to the host." type: boolean default: true env: @@ -157,8 +158,7 @@ options: type: float default: 30 description: - - Configures, in seconds, the amount of time to wait for the SSH - banner to be presented. + - Configures, in seconds, the amount of time to wait for the SSH banner to be presented. - This option is supported by paramiko version 1.15.0 or newer. ini: - section: paramiko_connection @@ -227,20 +227,20 @@ options: - name: ansible_paramiko_user_known_hosts_file wsl_distribution: description: - - WSL distribution name + - WSL distribution name. type: string required: true vars: - name: wsl_distribution wsl_user: description: - - WSL distribution user + - WSL distribution user. type: string vars: - name: wsl_user become_user: description: - - WSL distribution user + - WSL distribution user. type: string default: root vars: @@ -248,7 +248,7 @@ options: - name: ansible_become_user become: description: - - whether to use the user defined by ansible_become_user. + - Whether to use the user defined by O(become_user). type: bool default: false vars: @@ -315,6 +315,7 @@ import pathlib import shlex import socket import tempfile +import traceback import typing as t from ansible.errors import ( @@ -323,9 +324,8 @@ from ansible.errors import ( AnsibleError, ) from ansible_collections.community.general.plugins.module_utils._filelock import FileLock, LockTimeout +from ansible_collections.community.general.plugins.module_utils.version import LooseVersion from ansible.module_utils.common.text.converters import to_bytes, to_native, to_text -from ansible.module_utils.compat.paramiko import PARAMIKO_IMPORT_ERR, paramiko -from ansible.module_utils.compat.version import LooseVersion from ansible.playbook.play_context import PlayContext from ansible.plugins.connection import ConnectionBase from ansible.utils.display import Display @@ -333,8 +333,15 @@ from ansible.utils.path import makedirs_safe from binascii import hexlify from subprocess import list2cmdline +try: + import paramiko + PARAMIKO_IMPORT_ERR = None +except ImportError: + paramiko = None + PARAMIKO_IMPORT_ERR = traceback.format_exc() -if t.TYPE_CHECKING and paramiko: + +if t.TYPE_CHECKING and PARAMIKO_IMPORT_ERR is None: from paramiko import MissingHostKeyPolicy from paramiko.client import SSHClient from paramiko.pkey import PKey @@ -437,7 +444,7 @@ class Connection(ConnectionBase): def _connect(self) -> Connection: """ activates the connection object """ - if paramiko is None: + if PARAMIKO_IMPORT_ERR is not None: raise AnsibleError(f'paramiko is not installed: {to_native(PARAMIKO_IMPORT_ERR)}') port = self.get_option('port') @@ -522,8 +529,10 @@ class Connection(ConnectionBase): if u'PID check failed' in msg: raise AnsibleError('paramiko version issue, please upgrade paramiko on the machine running ansible') elif u'Private key file is encrypted' in msg: - msg = f'ssh {self.get_option("remote_user")}@{self.get_options("remote_addr")}:{port} : ' + \ + msg = ( + f'ssh {self.get_option("remote_user")}@{self.get_options("remote_addr")}:{port} : ' f'{msg}\nTo connect as a different user, use -u .' + ) raise AnsibleConnectionFailure(msg) else: raise AnsibleConnectionFailure(msg) @@ -656,7 +665,7 @@ class Connection(ConnectionBase): chan.shutdown_write() except socket.timeout: - raise AnsibleError('ssh timed out waiting for privilege escalation.\n' + to_text(become_output)) + raise AnsibleError(f'ssh timed out waiting for privilege escalation.\n{to_text(become_output)}') stdout = b''.join(chan.makefile('rb', bufsize)) stderr = b''.join(chan.makefile_stderr('rb', bufsize)) diff --git a/plugins/doc_fragments/alicloud.py b/plugins/doc_fragments/alicloud.py index 3b810852b7..cf7255b465 100644 --- a/plugins/doc_fragments/alicloud.py +++ b/plugins/doc_fragments/alicloud.py @@ -16,31 +16,31 @@ options: alicloud_access_key: description: - Alibaba Cloud access key. If not set then the value of environment variable E(ALICLOUD_ACCESS_KEY), E(ALICLOUD_ACCESS_KEY_ID) - will be used instead. + is used instead. aliases: ['access_key_id', 'access_key'] type: str alicloud_secret_key: description: - Alibaba Cloud secret key. If not set then the value of environment variable E(ALICLOUD_SECRET_KEY), E(ALICLOUD_SECRET_ACCESS_KEY) - will be used instead. + is used instead. aliases: ['secret_access_key', 'secret_key'] type: str alicloud_region: description: - The Alibaba Cloud region to use. If not specified then the value of environment variable E(ALICLOUD_REGION), E(ALICLOUD_REGION_ID) - will be used instead. + is used instead. aliases: ['region', 'region_id'] required: true type: str alicloud_security_token: description: - The Alibaba Cloud security token. If not specified then the value of environment variable E(ALICLOUD_SECURITY_TOKEN) - will be used instead. + is used instead. aliases: ['security_token'] type: str alicloud_assume_role: description: - - If provided with a role ARN, Ansible will attempt to assume this role using the supplied credentials. + - If provided with a role ARN, Ansible attempts to assume this role using the supplied credentials. - The nested assume_role block supports C(alicloud_assume_role_arn), C(alicloud_assume_role_session_name), C(alicloud_assume_role_session_expiration) and C(alicloud_assume_role_policy). type: dict @@ -48,7 +48,7 @@ options: alicloud_assume_role_arn: description: - The Alibaba Cloud C(role_arn). The ARN of the role to assume. If ARN is set to an empty string, it does not perform - role switching. It supports environment variable E(ALICLOUD_ASSUME_ROLE_ARN). ansible will execute with provided credentials. + role switching. It supports environment variable E(ALICLOUD_ASSUME_ROLE_ARN). Ansible executes with provided credentials. aliases: ['assume_role_arn'] type: str alicloud_assume_role_session_name: @@ -68,7 +68,7 @@ options: description: - The RAM Role Name attached on a ECS instance for API operations. You can retrieve this from the 'Access Control' section of the Alibaba Cloud console. - - If you are running Ansible from an ECS instance with RAM Instance using RAM Role, Ansible will just access the metadata + - If you are running Ansible from an ECS instance with RAM Instance using RAM Role, Ansible just accesses the metadata U(http://100.100.100.200/latest/meta-data/ram/security-credentials/) to obtain the STS credential. This is a preferred approach over any other when running in ECS as you can avoid hard coding credentials. Instead these are leased on-the-fly by Ansible which reduces the chance of leakage. @@ -83,7 +83,7 @@ options: description: - This is the path to the shared credentials file. It can also be sourced from the E(ALICLOUD_SHARED_CREDENTIALS_FILE) environment variable. - - If this is not set and a profile is specified, C(~/.aliyun/config.json) will be used. + - If this is not set and a profile is specified, C(~/.aliyun/config.json) is used. type: str author: - "He Guimin (@xiaozhu36)" diff --git a/plugins/doc_fragments/attributes.py b/plugins/doc_fragments/attributes.py index d6cc2b8c25..18b02575c4 100644 --- a/plugins/doc_fragments/attributes.py +++ b/plugins/doc_fragments/attributes.py @@ -17,7 +17,7 @@ attributes: check_mode: description: Can run in C(check_mode) and return changed status prediction without modifying target. diff_mode: - description: Will return details on what has changed (or possibly needs changing in C(check_mode)), when in diff mode. + description: Returns details on what has changed (or possibly needs changing in C(check_mode)), when in diff mode. """ PLATFORM = r""" @@ -57,7 +57,7 @@ attributes: options: {} attributes: facts: - description: Action returns an C(ansible_facts) dictionary that will update existing host facts. + description: Action returns an C(ansible_facts) dictionary that updates existing host facts. """ # Should be used together with the standard fragment and the FACTS fragment diff --git a/plugins/doc_fragments/bitbucket.py b/plugins/doc_fragments/bitbucket.py index e8b9ea4df8..65c4c47b51 100644 --- a/plugins/doc_fragments/bitbucket.py +++ b/plugins/doc_fragments/bitbucket.py @@ -16,17 +16,17 @@ options: client_id: description: - The OAuth consumer key. - - If not set the environment variable E(BITBUCKET_CLIENT_ID) will be used. + - If not set the environment variable E(BITBUCKET_CLIENT_ID) is used. type: str client_secret: description: - The OAuth consumer secret. - - If not set the environment variable E(BITBUCKET_CLIENT_SECRET) will be used. + - If not set the environment variable E(BITBUCKET_CLIENT_SECRET) is used. type: str user: description: - The username. - - If not set the environment variable E(BITBUCKET_USERNAME) will be used. + - If not set the environment variable E(BITBUCKET_USERNAME) is used. - O(ignore:username) is an alias of O(user) since community.general 6.0.0. It was an alias of O(workspace) before. type: str version_added: 4.0.0 @@ -34,7 +34,7 @@ options: password: description: - The App password. - - If not set the environment variable E(BITBUCKET_PASSWORD) will be used. + - If not set the environment variable E(BITBUCKET_PASSWORD) is used. type: str version_added: 4.0.0 notes: diff --git a/plugins/doc_fragments/dimensiondata.py b/plugins/doc_fragments/dimensiondata.py index ece97addf0..890c4d741e 100644 --- a/plugins/doc_fragments/dimensiondata.py +++ b/plugins/doc_fragments/dimensiondata.py @@ -28,12 +28,12 @@ options: mcp_user: description: - The username used to authenticate to the CloudControl API. - - If not specified, will fall back to E(MCP_USER) from environment variable or C(~/.dimensiondata). + - If not specified, falls back to E(MCP_USER) from environment variable or C(~/.dimensiondata). type: str mcp_password: description: - The password used to authenticate to the CloudControl API. - - If not specified, will fall back to E(MCP_PASSWORD) from environment variable or C(~/.dimensiondata). + - If not specified, falls back to E(MCP_PASSWORD) from environment variable or C(~/.dimensiondata). - Required if O(mcp_user) is specified. type: str location: @@ -43,7 +43,7 @@ options: required: true validate_certs: description: - - If V(false), SSL certificates will not be validated. + - If V(false), SSL certificates are not validated. - This should only be used on private instances of the CloudControl API that use self-signed certificates. type: bool default: true diff --git a/plugins/doc_fragments/django.py b/plugins/doc_fragments/django.py index 3dcdb40171..5d01c8323e 100644 --- a/plugins/doc_fragments/django.py +++ b/plugins/doc_fragments/django.py @@ -18,13 +18,13 @@ options: settings: description: - Specifies the settings module to use. - - The value will be passed as is to the C(--settings) argument in C(django-admin). + - The value is passed as is to the C(--settings) argument in C(django-admin). type: str required: true pythonpath: description: - Adds the given filesystem path to the Python import search path. - - The value will be passed as is to the C(--pythonpath) argument in C(django-admin). + - The value is passed as is to the C(--pythonpath) argument in C(django-admin). type: path traceback: description: diff --git a/plugins/doc_fragments/hwc.py b/plugins/doc_fragments/hwc.py index 3d478beb59..ea54c80c09 100644 --- a/plugins/doc_fragments/hwc.py +++ b/plugins/doc_fragments/hwc.py @@ -55,5 +55,5 @@ notes: - For authentication, you can set domain using the E(ANSIBLE_HWC_DOMAIN) environment variable. - For authentication, you can set project using the E(ANSIBLE_HWC_PROJECT) environment variable. - For authentication, you can set region using the E(ANSIBLE_HWC_REGION) environment variable. - - Environment variables values will only be used if the playbook values are not set. + - Environment variables values are only used when the playbook values are not set. """ diff --git a/plugins/doc_fragments/influxdb.py b/plugins/doc_fragments/influxdb.py index 9cf47d340a..5dbebea846 100644 --- a/plugins/doc_fragments/influxdb.py +++ b/plugins/doc_fragments/influxdb.py @@ -20,13 +20,13 @@ options: default: localhost username: description: - - Username that will be used to authenticate against InfluxDB server. + - Username that is used to authenticate against InfluxDB server. type: str default: root aliases: [login_username] password: description: - - Password that will be used to authenticate against InfluxDB server. + - Password that is used to authenticate against InfluxDB server. type: str default: root aliases: [login_password] @@ -44,7 +44,7 @@ options: version_added: '0.2.0' validate_certs: description: - - If set to V(false), the SSL certificates will not be validated. + - If set to V(false), the SSL certificates are not validated. - This should only set to V(false) used on personally controlled sites using self-signed certificates. type: bool default: true @@ -55,11 +55,11 @@ options: default: false timeout: description: - - Number of seconds Requests will wait for client to establish a connection. + - Number of seconds Requests waits for client to establish a connection. type: int retries: description: - - Number of retries client will try before aborting. + - Number of retries client performs before aborting. - V(0) indicates try until success. - Only available when using C(python-influxdb) >= 4.1.0. type: int diff --git a/plugins/doc_fragments/ipa.py b/plugins/doc_fragments/ipa.py index 0edb947aa5..63ea94b465 100644 --- a/plugins/doc_fragments/ipa.py +++ b/plugins/doc_fragments/ipa.py @@ -16,43 +16,43 @@ options: ipa_port: description: - Port of FreeIPA / IPA server. - - If the value is not specified in the task, the value of environment variable E(IPA_PORT) will be used instead. + - If the value is not specified in the task, the value of environment variable E(IPA_PORT) is used instead. - If both the environment variable E(IPA_PORT) and the value are not specified in the task, then default value is set. type: int default: 443 ipa_host: description: - IP or hostname of IPA server. - - If the value is not specified in the task, the value of environment variable E(IPA_HOST) will be used instead. - - If both the environment variable E(IPA_HOST) and the value are not specified in the task, then DNS will be used to - try to discover the FreeIPA server. + - If the value is not specified in the task, the value of environment variable E(IPA_HOST) is used instead. + - If both the environment variable E(IPA_HOST) and the value are not specified in the task, then DNS is used to try + to discover the FreeIPA server. - The relevant entry needed in FreeIPA is the C(ipa-ca) entry. - If neither the DNS entry, nor the environment E(IPA_HOST), nor the value are available in the task, then the default - value will be used. + value is used. type: str default: ipa.example.com ipa_user: description: - Administrative account used on IPA server. - - If the value is not specified in the task, the value of environment variable E(IPA_USER) will be used instead. + - If the value is not specified in the task, the value of environment variable E(IPA_USER) is used instead. - If both the environment variable E(IPA_USER) and the value are not specified in the task, then default value is set. type: str default: admin ipa_pass: description: - Password of administrative user. - - If the value is not specified in the task, the value of environment variable E(IPA_PASS) will be used instead. + - If the value is not specified in the task, the value of environment variable E(IPA_PASS) is used instead. - Note that if the C(urllib_gssapi) library is available, it is possible to use GSSAPI to authenticate to FreeIPA. - - If the environment variable E(KRB5CCNAME) is available, the module will use this kerberos credentials cache to authenticate + - If the environment variable E(KRB5CCNAME) is available, the module uses this Kerberos credentials cache to authenticate to the FreeIPA server. - - If the environment variable E(KRB5_CLIENT_KTNAME) is available, and E(KRB5CCNAME) is not; the module will use this - kerberos keytab to authenticate. + - If the environment variable E(KRB5_CLIENT_KTNAME) is available, and E(KRB5CCNAME) is not; the module uses this Kerberos + keytab to authenticate. - If GSSAPI is not available, the usage of O(ipa_pass) is required. type: str ipa_prot: description: - Protocol used by IPA server. - - If the value is not specified in the task, the value of environment variable E(IPA_PROT) will be used instead. + - If the value is not specified in the task, the value of environment variable E(IPA_PROT) is used instead. - If both the environment variable E(IPA_PROT) and the value are not specified in the task, then default value is set. type: str choices: [http, https] @@ -60,7 +60,7 @@ options: validate_certs: description: - This only applies if O(ipa_prot) is V(https). - - If set to V(false), the SSL certificates will not be validated. + - If set to V(false), the SSL certificates are not validated. - This should only set to V(false) used on personally controlled sites using self-signed certificates. type: bool default: true @@ -68,7 +68,7 @@ options: description: - Specifies idle timeout (in seconds) for the connection. - For bulk operations, you may want to increase this in order to avoid timeout from IPA server. - - If the value is not specified in the task, the value of environment variable E(IPA_TIMEOUT) will be used instead. + - If the value is not specified in the task, the value of environment variable E(IPA_TIMEOUT) is used instead. - If both the environment variable E(IPA_TIMEOUT) and the value are not specified in the task, then default value is set. type: int diff --git a/plugins/doc_fragments/ldap.py b/plugins/doc_fragments/ldap.py index 4dd5fd097f..abdb32adb7 100644 --- a/plugins/doc_fragments/ldap.py +++ b/plugins/doc_fragments/ldap.py @@ -14,9 +14,9 @@ class ModuleDocFragment(object): # Standard LDAP documentation fragment DOCUMENTATION = r""" notes: - - The default authentication settings will attempt to use a SASL EXTERNAL bind over a UNIX domain socket. This works well - with the default Ubuntu install for example, which includes a C(cn=peercred,cn=external,cn=auth) ACL rule allowing root - to modify the server configuration. If you need to use a simple bind to access your server, pass the credentials in O(bind_dn) + - The default authentication settings attempts to use a SASL EXTERNAL bind over a UNIX domain socket. This works well with + the default Ubuntu install for example, which includes a C(cn=peercred,cn=external,cn=auth) ACL rule allowing root to + modify the server configuration. If you need to use a simple bind to access your server, pass the credentials in O(bind_dn) and O(bind_pw). options: bind_dn: @@ -76,7 +76,7 @@ options: default: false validate_certs: description: - - If set to V(false), SSL certificates will not be validated. + - If set to V(false), SSL certificates are not validated. - This should only be used on sites using self-signed certificates. type: bool default: true @@ -90,9 +90,9 @@ options: xorder_discovery: description: - Set the behavior on how to process Xordered DNs. - - V(enable) will perform a C(ONELEVEL) search below the superior RDN to find the matching DN. - - V(disable) will always use the DN unmodified (as passed by the O(dn) parameter). - - V(auto) will only perform a search if the first RDN does not contain an index number (C({x})). + - V(enable) performs a C(ONELEVEL) search below the superior RDN to find the matching DN. + - V(disable) always uses the DN unmodified (as passed by the O(dn) parameter). + - V(auto) only performs a search if the first RDN does not contain an index number (C({x})). type: str choices: ['enable', 'auto', 'disable'] default: auto diff --git a/plugins/doc_fragments/onepassword.py b/plugins/doc_fragments/onepassword.py index a67c9e4dc1..6fb0e252c6 100644 --- a/plugins/doc_fragments/onepassword.py +++ b/plugins/doc_fragments/onepassword.py @@ -18,8 +18,8 @@ options: aliases: ['vault_password'] type: str section: - description: Item section containing the field to retrieve (case-insensitive). If absent will return first match from - any section. + description: Item section containing the field to retrieve (case-insensitive). If absent, returns first match from any + section. domain: description: Domain of 1Password. default: '1password.com' @@ -42,7 +42,7 @@ options: - Only works with 1Password CLI version 2 or later. type: str vault: - description: Vault containing the item to retrieve (case-insensitive). If absent will search all vaults. + description: Vault containing the item to retrieve (case-insensitive). If absent, searches all vaults. type: str connect_host: description: The host for 1Password Connect. Must be used in combination with O(connect_token). @@ -65,10 +65,9 @@ options: - name: OP_SERVICE_ACCOUNT_TOKEN version_added: 8.2.0 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), C(~/.config/op/config) or C(~/.config/.op/config) exists), then only the O(master_password) - is required. You may optionally specify O(subdomain) in this scenario, otherwise the last used subdomain will be used - by C(op). + - This lookup uses an existing 1Password session if one exists. If not, and you have already performed an initial sign in + (meaning C(~/.op/config), C(~/.config/op/config) or C(~/.config/.op/config) exists), then only the O(master_password) + is required. You may optionally specify O(subdomain) in this scenario, otherwise the last used subdomain is used by C(op). - This lookup can perform an initial login by providing O(subdomain), O(username), O(secret_key), and O(master_password). - Can target a specific account by providing the O(account_id). - Due to the B(very) sensitive nature of these credentials, it is B(highly) recommended that you only pass in the minimal diff --git a/plugins/doc_fragments/oneview.py b/plugins/doc_fragments/oneview.py index 3caabe4512..366e3e3e42 100644 --- a/plugins/doc_fragments/oneview.py +++ b/plugins/doc_fragments/oneview.py @@ -17,8 +17,8 @@ options: description: - Path to a JSON configuration file containing the OneView client configuration. The configuration file is optional and when used should be present in the host running the ansible commands. If the file path is not provided, the configuration - will be loaded from environment variables. For links to example configuration files or how to use the environment - variables verify the notes section. + is loaded from environment variables. For links to example configuration files or how to use the environment variables + verify the notes section. type: path api_version: description: @@ -49,16 +49,16 @@ notes: U(https://github.com/HewlettPackard/oneview-ansible/blob/master/examples/oneview_config-rename.json).' - 'Check how to use environment variables for configuration at: U(https://github.com/HewlettPackard/oneview-ansible#environment-variables).' - 'Additional Playbooks for the HPE OneView Ansible modules can be found at: U(https://github.com/HewlettPackard/oneview-ansible/tree/master/examples).' - - 'The OneView API version used will directly affect returned and expected fields in resources. Information on setting the - desired API version and can be found at: U(https://github.com/HewlettPackard/oneview-ansible#setting-your-oneview-version).' + - 'The OneView API version used directly affects returned and expected fields in resources. Information on setting the desired + API version and can be found at: U(https://github.com/HewlettPackard/oneview-ansible#setting-your-oneview-version).' """ VALIDATEETAG = r""" options: validate_etag: description: - - When the ETag Validation is enabled, the request will be conditionally processed only if the current ETag for the - resource matches the ETag provided in the data. + - When the ETag Validation is enabled, the request is conditionally processed only if the current ETag for the resource + matches the ETag provided in the data. type: bool default: true """ diff --git a/plugins/doc_fragments/openswitch.py b/plugins/doc_fragments/openswitch.py index f0e9e87c3d..30b477fbe7 100644 --- a/plugins/doc_fragments/openswitch.py +++ b/plugins/doc_fragments/openswitch.py @@ -21,8 +21,8 @@ options: port: description: - Specifies the port to use when building the connection to the remote device. This value applies to either O(transport=cli) - or O(transport=rest). The port value will default to the appropriate transport common port if none is provided in - the task. (cli=22, http=80, https=443). Note this argument does not affect the SSH transport. + or O(transport=rest). The port value defaults to the appropriate transport common port if none is provided in the + task. (cli=22, http=80, https=443). Note this argument does not affect the SSH transport. type: int default: 0 (use common port) username: @@ -30,25 +30,24 @@ options: - Configures the username to use to authenticate the connection to the remote device. This value is used to authenticate either the CLI login or the eAPI authentication depending on which transport is used. Note this argument does not affect the SSH transport. If the value is not specified in the task, the value of environment variable E(ANSIBLE_NET_USERNAME) - will be used instead. + is used instead. type: str password: description: - Specifies the password to use to authenticate the connection to the remote device. This is a common argument used for either O(transport=cli) or O(transport=rest). Note this argument does not affect the SSH transport. If the value - is not specified in the task, the value of environment variable E(ANSIBLE_NET_PASSWORD) will be used instead. + is not specified in the task, the value of environment variable E(ANSIBLE_NET_PASSWORD) is used instead. type: str timeout: description: - Specifies the timeout in seconds for communicating with the network device for either connecting or sending commands. - If the timeout is exceeded before the operation is completed, the module will error. + If the timeout is exceeded before the operation is completed, the module fails. type: int default: 10 ssh_keyfile: description: - Specifies the SSH key to use to authenticate the connection to the remote device. This argument is only used for O(transport=cli). - If the value is not specified in the task, the value of environment variable E(ANSIBLE_NET_SSH_KEYFILE) will be used - instead. + If the value is not specified in the task, the value of environment variable E(ANSIBLE_NET_SSH_KEYFILE) is used instead. type: path transport: description: diff --git a/plugins/doc_fragments/oracle.py b/plugins/doc_fragments/oracle.py index 702b77f02f..08b2948bf3 100644 --- a/plugins/doc_fragments/oracle.py +++ b/plugins/doc_fragments/oracle.py @@ -54,9 +54,9 @@ options: auth_type: description: - The type of authentication to use for making API requests. By default O(auth_type=api_key) based authentication is - performed and the API key (see O(api_user_key_file)) in your config file will be used. If this 'auth_type' module - option is not specified, the value of the E(OCI_ANSIBLE_AUTH_TYPE), if any, is used. Use O(auth_type=instance_principal) - to use instance principal based authentication when running ansible playbooks within an OCI compute instance. + performed and the API key (see O(api_user_key_file)) in your config file is used. If O(auth_type) is not specified, + the value of the E(OCI_ANSIBLE_AUTH_TYPE), if any, is used. Use O(auth_type=instance_principal) to use instance principal + based authentication when running ansible playbooks within an OCI compute instance. choices: ['api_key', 'instance_principal'] default: 'api_key' type: str diff --git a/plugins/doc_fragments/pipx.py b/plugins/doc_fragments/pipx.py index aff8e90c75..dde13f6dd3 100644 --- a/plugins/doc_fragments/pipx.py +++ b/plugins/doc_fragments/pipx.py @@ -13,13 +13,13 @@ class ModuleDocFragment(object): options: global: description: - - The module will pass the C(--global) argument to C(pipx), to execute actions in global scope. + - The module passes the C(--global) argument to C(pipx), to execute actions in global scope. type: bool default: false executable: description: - Path to the C(pipx) installed in the system. - - If not specified, the module will use C(python -m pipx) to run the tool, using the same Python interpreter as ansible + - If not specified, the module uses C(python -m pipx) to run the tool, using the same Python interpreter as ansible itself. type: path requirements: @@ -27,8 +27,8 @@ requirements: notes: - This module does not install the C(pipx) python package, however that can be easily done with the module M(ansible.builtin.pip). - This module does not require C(pipx) to be in the shell C(PATH), but it must be loadable by Python as a module. - - This module will honor C(pipx) environment variables such as but not limited to E(PIPX_HOME) and E(PIPX_BIN_DIR) passed - using the R(environment Ansible keyword, playbooks_environment). + - This module honors C(pipx) environment variables such as but not limited to E(PIPX_HOME) and E(PIPX_BIN_DIR) passed using + the R(environment Ansible keyword, playbooks_environment). seealso: - name: C(pipx) command manual page description: Manual page for the command. diff --git a/plugins/doc_fragments/redfish.py b/plugins/doc_fragments/redfish.py index f2e6b37485..a20e064988 100644 --- a/plugins/doc_fragments/redfish.py +++ b/plugins/doc_fragments/redfish.py @@ -15,7 +15,7 @@ class ModuleDocFragment(object): options: validate_certs: description: - - If V(false), TLS/SSL certificates will not be validated. + - If V(false), TLS/SSL certificates are not validated. - Set this to V(true) to enable certificate checking. Should be used together with O(ca_path). type: bool default: false diff --git a/plugins/doc_fragments/redis.py b/plugins/doc_fragments/redis.py index 149c018d79..c7bb88b81d 100644 --- a/plugins/doc_fragments/redis.py +++ b/plugins/doc_fragments/redis.py @@ -45,7 +45,7 @@ options: default: true ca_certs: description: - - Path to root certificates file. If not set and O(tls) is set to V(true), certifi ca-certificates will be used. + - Path to root certificates file. If not set and O(tls) is set to V(true), certifi's CA certificates are used. type: str client_cert_file: description: diff --git a/plugins/doc_fragments/utm.py b/plugins/doc_fragments/utm.py index 3b2118485e..32c18e93b8 100644 --- a/plugins/doc_fragments/utm.py +++ b/plugins/doc_fragments/utm.py @@ -49,8 +49,8 @@ options: state: description: - The desired state of the object. - - V(present) will create or update an object. - - V(absent) will delete an object if it was present. + - V(present) creates or updates an object. + - V(absent) deletes an object if present. type: str choices: [absent, present] default: present diff --git a/plugins/doc_fragments/xenserver.py b/plugins/doc_fragments/xenserver.py index d1377e8964..f4e0946219 100644 --- a/plugins/doc_fragments/xenserver.py +++ b/plugins/doc_fragments/xenserver.py @@ -15,28 +15,27 @@ options: hostname: description: - The hostname or IP address of the XenServer host or XenServer pool master. - - If the value is not specified in the task, the value of environment variable E(XENSERVER_HOST) will be used instead. + - If the value is not specified in the task, the value of environment variable E(XENSERVER_HOST) is used instead. type: str default: localhost aliases: [host, pool] username: description: - The username to use for connecting to XenServer. - - If the value is not specified in the task, the value of environment variable E(XENSERVER_USER) will be used instead. + - If the value is not specified in the task, the value of environment variable E(XENSERVER_USER) is used instead. type: str default: root aliases: [admin, user] password: description: - The password to use for connecting to XenServer. - - If the value is not specified in the task, the value of environment variable E(XENSERVER_PASSWORD) will be used instead. + - If the value is not specified in the task, the value of environment variable E(XENSERVER_PASSWORD) is used instead. type: str aliases: [pass, pwd] validate_certs: description: - Allows connection when SSL certificates are not valid. Set to V(false) when certificates are not trusted. - - If the value is not specified in the task, the value of environment variable E(XENSERVER_VALIDATE_CERTS) will be used - instead. + - If the value is not specified in the task, the value of environment variable E(XENSERVER_VALIDATE_CERTS) is used instead. type: bool default: true """ diff --git a/plugins/filter/jc.py b/plugins/filter/jc.py index 48d53bcbd3..6a2feb93f0 100644 --- a/plugins/filter/jc.py +++ b/plugins/filter/jc.py @@ -143,11 +143,11 @@ def jc_filter(data, parser, quiet=True, raw=False): # old API (jc v1.17.7 and lower) else: - jc_parser = importlib.import_module('jc.parsers.' + parser) + jc_parser = importlib.import_module(f'jc.parsers.{parser}') return jc_parser.parse(data, quiet=quiet, raw=raw) except Exception as e: - raise AnsibleFilterError('Error in jc filter plugin: %s' % e) + raise AnsibleFilterError(f'Error in jc filter plugin: {e}') class FilterModule(object): diff --git a/plugins/filter/replace_keys.py b/plugins/filter/replace_keys.py index d47468bd3c..69fe02832b 100644 --- a/plugins/filter/replace_keys.py +++ b/plugins/filter/replace_keys.py @@ -34,7 +34,7 @@ options: description: - A key or key pattern to change. - The interpretation of O(target[].before) depends on O(matching_parameter). - - For a key that matches multiple O(target[].before)s, the B(first) matching O(target[].after) will be used. + - For a key that matches multiple O(target[].before)s, the B(first) matching O(target[].after) is used. type: str after: description: A matching key change to. diff --git a/plugins/filter/to_prettytable.py b/plugins/filter/to_prettytable.py index 249c830230..269ac318ff 100644 --- a/plugins/filter/to_prettytable.py +++ b/plugins/filter/to_prettytable.py @@ -30,17 +30,14 @@ options: elements: string column_alignments: description: - - >- - Dictionary where keys are column names and values are alignment settings. - Valid alignment values are C(left), C(center), C(right), C(l), C(c), or C(r). - - >- - For example, V({'name': 'left', 'id': 'right'}) will align the C(name) column to the left - and the C(id) column to the right. + - Dictionary where keys are column names and values are alignment settings. Valid alignment values are C(left), C(center), + C(right), C(l), C(c), or C(r). + - "For example, V({'name': 'left', 'id': 'right'}) aligns the C(name) column to the left and the C(id) column to the + right." type: dictionary """ EXAMPLES = r""" ---- - name: Set a list of users ansible.builtin.set_fact: users: diff --git a/plugins/inventory/cobbler.py b/plugins/inventory/cobbler.py index 3526093b8c..677e1a3ad5 100644 --- a/plugins/inventory/cobbler.py +++ b/plugins/inventory/cobbler.py @@ -12,14 +12,17 @@ short_description: Cobbler inventory source version_added: 1.0.0 description: - Get inventory hosts from the cobbler service. - - "Uses a configuration file as an inventory source, it must end in C(.cobbler.yml) or C(.cobbler.yaml) and have a C(plugin: cobbler) entry." - - Adds the primary IP addresses to C(cobbler_ipv4_address) and C(cobbler_ipv6_address) host variables if defined in Cobbler. The primary IP address is - defined as the management interface if defined, or the interface who's DNS name matches the hostname of the system, or else the first interface found. + - 'Uses a configuration file as an inventory source, it must end in C(.cobbler.yml) or C(.cobbler.yaml) and have a C(plugin: + cobbler) entry.' + - Adds the primary IP addresses to C(cobbler_ipv4_address) and C(cobbler_ipv6_address) host variables if defined in Cobbler. + The primary IP address is defined as the management interface if defined, or the interface who's DNS name matches the + hostname of the system, or else the first interface found. extends_documentation_fragment: - inventory_cache options: plugin: - description: The name of this plugin, it should always be set to V(community.general.cobbler) for this plugin to recognize it as its own. + description: The name of this plugin, it should always be set to V(community.general.cobbler) for this plugin to recognize + it as its own. type: string required: true choices: ['cobbler', 'community.general.cobbler'] @@ -72,7 +75,7 @@ options: include_profiles: description: - Profiles to include from inventory. - - If specified, all other profiles will be excluded. + - If specified, all other profiles are excluded. - O(exclude_profiles) is ignored if O(include_profiles) is specified. type: list default: [] @@ -81,7 +84,8 @@ options: inventory_hostname: description: - What to use for the ansible inventory hostname. - - By default the networking hostname is used if defined, otherwise the DNS name of the management or first non-static interface. + - By default the networking hostname is used if defined, otherwise the DNS name of the management or first non-static + interface. - If set to V(system), the cobbler system name is used. type: str choices: ['hostname', 'system'] @@ -99,20 +103,20 @@ options: description: Prefix to apply to cobbler groups. default: cobbler_ want_facts: - description: Toggle, if V(true) the plugin will retrieve all host facts from the server. + description: Toggle, if V(true) the plugin retrieves all host facts from the server. type: boolean default: true want_ip_addresses: description: - - Toggle, if V(true) the plugin will add a C(cobbler_ipv4_addresses) and C(cobbler_ipv6_addresses) dictionary to the defined O(group) mapping - interface DNS names to IP addresses. + - Toggle, if V(true) the plugin adds a C(cobbler_ipv4_addresses) and C(cobbler_ipv6_addresses) dictionary to the + defined O(group) mapping interface DNS names to IP addresses. type: boolean default: true version_added: 7.1.0 facts_level: description: - - "Set to V(normal) to gather only system-level variables." - - "Set to V(as_rendered) to gather all variables as rolled up by Cobbler." + - Set to V(normal) to gather only system-level variables. + - Set to V(as_rendered) to gather all variables as rolled up by Cobbler. type: string choices: ['normal', 'as_rendered'] default: normal diff --git a/plugins/inventory/gitlab_runners.py b/plugins/inventory/gitlab_runners.py index 192be319a7..7a10b553a2 100644 --- a/plugins/inventory/gitlab_runners.py +++ b/plugins/inventory/gitlab_runners.py @@ -11,7 +11,7 @@ DOCUMENTATION = r""" name: gitlab_runners author: - Stefan Heitmüller (@morph027) -short_description: Ansible dynamic inventory plugin for GitLab runners. +short_description: Ansible dynamic inventory plugin for GitLab runners requirements: - python-gitlab > 1.8.0 extends_documentation_fragment: @@ -21,7 +21,7 @@ description: - Uses a YAML configuration file gitlab_runners.[yml|yaml]. options: plugin: - description: The name of this plugin, it should always be set to 'gitlab_runners' for this plugin to recognize it as its own. + description: The name of this plugin, it should always be set to V(gitlab_runners) for this plugin to recognize it as its own. type: str required: true choices: @@ -44,14 +44,14 @@ options: - private_token - access_token filter: - description: filter runners from GitLab API + description: Filter runners from GitLab API. env: - name: GITLAB_FILTER version_added: 1.0.0 type: str choices: ['active', 'paused', 'online', 'specific', 'shared'] verbose_output: - description: Toggle to (not) include all available nodes metadata + description: Toggle to (not) include all available nodes metadata. type: bool default: true """ diff --git a/plugins/inventory/icinga2.py b/plugins/inventory/icinga2.py index feb2d10d8a..64d77b437d 100644 --- a/plugins/inventory/icinga2.py +++ b/plugins/inventory/icinga2.py @@ -14,8 +14,7 @@ author: - Cliff Hults (@BongoEADGC6) description: - Get inventory hosts from the Icinga2 API. - - "Uses a configuration file as an inventory source, it must end in - C(.icinga2.yml) or C(.icinga2.yaml)." + - Uses a configuration file as an inventory source, it must end in C(.icinga2.yml) or C(.icinga2.yaml). extends_documentation_fragment: - constructed options: @@ -46,7 +45,7 @@ options: required: true host_filter: description: - - An Icinga2 API valid host filter. Leave blank for no filtering + - An Icinga2 API valid host filter. Leave blank for no filtering. type: string required: false validate_certs: @@ -291,11 +290,11 @@ class InventoryModule(BaseInventoryPlugin, Constructable): self.group_by_hostgroups = self.get_option('group_by_hostgroups') if self.templar.is_template(self.icinga2_url): - self.icinga2_url = self.templar.template(variable=self.icinga2_url, disable_lookups=False) + self.icinga2_url = self.templar.template(variable=self.icinga2_url) if self.templar.is_template(self.icinga2_user): - self.icinga2_user = self.templar.template(variable=self.icinga2_user, disable_lookups=False) + self.icinga2_user = self.templar.template(variable=self.icinga2_user) if self.templar.is_template(self.icinga2_password): - self.icinga2_password = self.templar.template(variable=self.icinga2_password, disable_lookups=False) + self.icinga2_password = self.templar.template(variable=self.icinga2_password) self.icinga2_url = f"{self.icinga2_url.rstrip('/')}/v1" diff --git a/plugins/inventory/iocage.py b/plugins/inventory/iocage.py index 8e296b571a..603003d617 100644 --- a/plugins/inventory/iocage.py +++ b/plugins/inventory/iocage.py @@ -8,29 +8,25 @@ from __future__ import annotations DOCUMENTATION = r""" name: iocage -short_description: iocage inventory source +short_description: C(iocage) inventory source version_added: 10.2.0 author: - Vladimir Botka (@vbotka) requirements: - iocage >= 1.8 description: - - Get inventory hosts from the iocage jail manager running on O(host). - - By default, O(host) is V(localhost). If O(host) is not V(localhost) it - is expected that the user running Ansible on the controller can - connect to the O(host) account O(user) with SSH non-interactively and - execute the command C(iocage list). - - Uses a configuration file as an inventory source, it must end - in C(.iocage.yml) or C(.iocage.yaml). + - Get inventory hosts from the C(iocage) jail manager running on O(host). + - By default, O(host) is V(localhost). If O(host) is not V(localhost) it is expected that the user running Ansible on the + controller can connect to the O(host) account O(user) with SSH non-interactively and execute the command C(iocage list). + - Uses a configuration file as an inventory source, it must end in C(.iocage.yml) or C(.iocage.yaml). extends_documentation_fragment: - ansible.builtin.constructed - ansible.builtin.inventory_cache options: plugin: description: - - The name of this plugin, it should always be set to - V(community.general.iocage) for this plugin to recognize - it as its own. + - The name of this plugin, it should always be set to V(community.general.iocage) for this plugin to recognize it as + its own. required: true choices: ['community.general.iocage'] type: str @@ -40,10 +36,8 @@ options: default: localhost user: description: - - C(iocage) user. - It is expected that the O(user) is able to connect to the - O(host) with SSH and execute the command C(iocage list). - This option is not required if O(host) is V(localhost). + - C(iocage) user. It is expected that the O(user) is able to connect to the O(host) with SSH and execute the command + C(iocage list). This option is not required if O(host=localhost). type: str sudo: description: @@ -61,8 +55,7 @@ options: version_added: 10.3.0 get_properties: description: - - Get jails' properties. - Creates dictionary C(iocage_properties) for each added host. + - Get jails' properties. Creates dictionary C(iocage_properties) for each added host. type: bool default: false env: @@ -84,7 +77,7 @@ options: description: - The name of the tag in the C(iocage properties notes) that contains the jails alias. - By default, the C(iocage list -l) column C(NAME) is used to name the jail. - - This option requires the notes format C("t1=v1 t2=v2 ...") + - This option requires the notes format C("t1=v1 t2=v2 ..."). - The option O(get_properties) must be enabled. type: str version_added: 11.0.0 @@ -95,21 +88,16 @@ options: default: false version_added: 11.0.0 notes: - - You might want to test the command C(ssh user@host iocage list -l) on - the controller before using this inventory plugin with O(user) specified - and with O(host) other than V(localhost). - - If you run this inventory plugin on V(localhost) C(ssh) is not used. - In this case, test the command C(iocage list -l). + - You might want to test the command C(ssh user@host iocage list -l) on the controller before using this inventory plugin + with O(user) specified and with O(host) other than V(localhost). + - If you run this inventory plugin on V(localhost) C(ssh) is not used. In this case, test the command C(iocage list -l). - This inventory plugin creates variables C(iocage_*) for each added host. - - The values of these variables are collected from the output of the - command C(iocage list -l). + - The values of these variables are collected from the output of the command C(iocage list -l). - The names of these variables correspond to the output columns. - The column C(NAME) is used to name the added host. - - The option O(hooks_results) expects the C(poolname) of a jail is mounted to - C(/poolname). For example, if you activate the pool C(iocage) this plugin - expects to find the O(hooks_results) items in the path - C(/iocage/iocage/jails//root). If you mount the C(poolname) to a - different path the easiest remedy is to create a symlink. + - The option O(hooks_results) expects the C(poolname) of a jail is mounted to C(/poolname). For example, if you activate + the pool C(iocage) this plugin expects to find the O(hooks_results) items in the path C(/iocage/iocage/jails//root). + If you mount the C(poolname) to a different path the easiest remedy is to create a symlink. """ EXAMPLES = r""" @@ -350,7 +338,7 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable): for hostname, host_vars in results['_meta']['hostvars'].items(): iocage_hooks = [] for hook in hooks_results: - path = "/" + iocage_pool + "/iocage/jails/" + hostname + "/root" + hook + path = f"/{iocage_pool}/iocage/jails/{hostname}/root{hook}" cmd_cat_hook = cmd.copy() cmd_cat_hook.append('cat') cmd_cat_hook.append(path) diff --git a/plugins/inventory/linode.py b/plugins/inventory/linode.py index 3e7ddc5a82..bf6faba07a 100644 --- a/plugins/inventory/linode.py +++ b/plugins/inventory/linode.py @@ -9,15 +9,14 @@ DOCUMENTATION = r""" name: linode author: - Luke Murphy (@decentral1se) -short_description: Ansible dynamic inventory plugin for Linode. +short_description: Ansible dynamic inventory plugin for Linode requirements: - linode_api4 >= 2.0.0 description: - Reads inventories from the Linode API v4. - Uses a YAML configuration file that ends with linode.(yml|yaml). - Linode labels are used by default as the hostnames. - - The default inventory groups are built from groups (deprecated by - Linode) and not tags. + - The default inventory groups are built from groups (deprecated by Linode) and not tags. extends_documentation_fragment: - constructed - inventory_cache @@ -150,7 +149,7 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable): access_token = self.get_option('access_token') if self.templar.is_template(access_token): - access_token = self.templar.template(variable=access_token, disable_lookups=False) + access_token = self.templar.template(variable=access_token) if access_token is None: raise AnsibleError(( diff --git a/plugins/inventory/lxd.py b/plugins/inventory/lxd.py index b1492d663c..efdca6563e 100644 --- a/plugins/inventory/lxd.py +++ b/plugins/inventory/lxd.py @@ -48,20 +48,19 @@ options: version_added: 8.0.0 server_check_hostname: description: - - This option controls if the server's hostname is checked as part of the HTTPS connection verification. - This can be useful to disable, if for example, the server certificate provided (see O(server_cert) option) - does not cover a name matching the one used to communicate with the server. Such mismatch is common as LXD - generates self-signed server certificates by default. + - This option controls if the server's hostname is checked as part of the HTTPS connection verification. This can be + useful to disable, if for example, the server certificate provided (see O(server_cert) option) does not cover a name + matching the one used to communicate with the server. Such mismatch is common as LXD generates self-signed server + certificates by default. type: bool default: true version_added: 8.0.0 trust_password: description: - The client trusted password. - - You need to set this password on the lxd server before - running this module using the following command - C(lxc config set core.trust_password ) - See U(https://documentation.ubuntu.com/lxd/en/latest/authentication/#adding-client-certificates-using-a-trust-password). + - You need to set this password on the lxd server before running this module using the following command C(lxc config + set core.trust_password ) See + U(https://documentation.ubuntu.com/lxd/en/latest/authentication/#adding-client-certificates-using-a-trust-password). - If O(trust_password) is set, this module send a request for authentication before sending any requests. type: str state: @@ -85,7 +84,7 @@ options: prefered_instance_network_interface: description: - If an instance has multiple network interfaces, select which one is the preferred as pattern. - - Combined with the first number that can be found e.g. 'eth' + 0. + - Combined with the first number that can be found, for example C(eth) + C(0). - The option has been renamed from O(prefered_container_network_interface) to O(prefered_instance_network_interface) in community.general 3.8.0. The old name still works as an alias. type: str @@ -101,7 +100,8 @@ options: choices: ['inet', 'inet6'] groupby: description: - - Create groups by the following keywords C(location), C(network_range), C(os), C(pattern), C(profile), C(release), C(type), C(vlanid). + - Create groups by the following keywords C(location), C(network_range), C(os), C(pattern), C(profile), C(release), + C(type), C(vlanid). - See example for syntax. type: dict """ diff --git a/plugins/inventory/nmap.py b/plugins/inventory/nmap.py index f8a792964c..3339d66b46 100644 --- a/plugins/inventory/nmap.py +++ b/plugins/inventory/nmap.py @@ -18,7 +18,7 @@ requirements: - nmap CLI installed options: plugin: - description: token that ensures this is a source file for the 'nmap' plugin. + description: Token that ensures this is a source file for the P(community.general.nmap#inventory) plugin. type: string required: true choices: ['nmap', 'community.general.nmap'] @@ -46,8 +46,8 @@ options: port: description: - Only scan specific port or port range (C(-p)). - - For example, you could pass V(22) for a single port, V(1-65535) for a range of ports, - or V(U:53,137,T:21-25,139,8080,S:9) to check port 53 with UDP, ports 21-25 with TCP, port 9 with SCTP, and ports 137, 139, and 8080 with all. + - For example, you could pass V(22) for a single port, V(1-65535) for a range of ports, or V(U:53,137,T:21-25,139,8080,S:9) + to check port 53 with UDP, ports 21-25 with TCP, port 9 with SCTP, and ports 137, 139, and 8080 with all. type: string version_added: 6.5.0 ports: @@ -55,23 +55,23 @@ options: type: boolean default: true ipv4: - description: use IPv4 type addresses + description: Use IPv4 type addresses. type: boolean default: true ipv6: - description: use IPv6 type addresses + description: Use IPv6 type addresses. type: boolean default: true udp_scan: description: - - Scan via UDP. + - Scan using UDP. - Depending on your system you might need O(sudo=true) for this to work. type: boolean default: false version_added: 6.1.0 icmp_timestamp: description: - - Scan via ICMP Timestamp (C(-PP)). + - Scan using ICMP Timestamp (C(-PP)). - Depending on your system you might need O(sudo=true) for this to work. type: boolean default: false @@ -98,7 +98,7 @@ options: version_added: 7.4.0 notes: - At least one of O(ipv4) or O(ipv6) is required to be V(true); both can be V(true), but they cannot both be V(false). - - 'TODO: add OS fingerprinting' + - 'TODO: add OS fingerprinting.' """ EXAMPLES = r""" --- diff --git a/plugins/inventory/online.py b/plugins/inventory/online.py index e88deb4012..8b4821a009 100644 --- a/plugins/inventory/online.py +++ b/plugins/inventory/online.py @@ -14,7 +14,7 @@ description: - Get inventory hosts from Scaleway (previously Online SAS or Online.net). options: plugin: - description: token that ensures this is a source file for the 'online' plugin. + description: Token that ensures this is a source file for the P(community.general.online#inventory) plugin. type: string required: true choices: ['online', 'community.general.online'] diff --git a/plugins/inventory/opennebula.py b/plugins/inventory/opennebula.py index 7bf6ccf224..8ced301dd1 100644 --- a/plugins/inventory/opennebula.py +++ b/plugins/inventory/opennebula.py @@ -16,8 +16,7 @@ extends_documentation_fragment: - constructed description: - Get inventory hosts from OpenNebula cloud. - - Uses an YAML configuration file ending with either C(opennebula.yml) or C(opennebula.yaml) - to set parameter values. + - Uses an YAML configuration file ending with either C(opennebula.yml) or C(opennebula.yaml) to set parameter values. - Uses O(api_authfile), C(~/.one/one_auth), or E(ONE_AUTH) pointing to a OpenNebula credentials file. options: plugin: @@ -28,8 +27,7 @@ options: api_url: description: - URL of the OpenNebula RPC server. - - It is recommended to use HTTPS so that the username/password are not - transferred over the network unencrypted. + - It is recommended to use HTTPS so that the username/password are not transferred over the network unencrypted. - If not set then the value of the E(ONE_URL) environment variable is used. env: - name: ONE_URL @@ -37,8 +35,8 @@ options: type: string api_username: description: - - Name of the user to login into the OpenNebula RPC server. If not set - then the value of the E(ONE_USERNAME) environment variable is used. + - Name of the user to login into the OpenNebula RPC server. If not set then the value of the E(ONE_USERNAME) environment + variable is used. env: - name: ONE_USERNAME type: string @@ -52,8 +50,8 @@ options: type: string api_authfile: description: - - If both O(api_username) or O(api_password) are not set, then it will try - authenticate with ONE auth file. Default path is C(~/.one/one_auth). + - If both O(api_username) or O(api_password) are not set, then it tries to authenticate with ONE auth file. Default + path is C(~/.one/one_auth). - Set environment variable E(ONE_AUTH) to override this path. env: - name: ONE_AUTH @@ -71,7 +69,7 @@ options: description: Only return servers filtered by this label. type: string group_by_labels: - description: Create host groups by vm labels + description: Create host groups by VM labels. type: bool default: true """ diff --git a/plugins/inventory/scaleway.py b/plugins/inventory/scaleway.py index 488bbbe084..c730049833 100644 --- a/plugins/inventory/scaleway.py +++ b/plugins/inventory/scaleway.py @@ -37,13 +37,14 @@ options: scw_profile: description: - The config profile to use in config file. - - By default uses the one specified as C(active_profile) in the config file, or falls back to V(default) if that is not defined. + - By default uses the one specified as C(active_profile) in the config file, or falls back to V(default) if that is + not defined. type: string version_added: 4.4.0 oauth_token: description: - Scaleway OAuth token. - - If not explicitly defined or in environment variables, it will try to lookup in the scaleway-cli configuration file + - If not explicitly defined or in environment variables, it tries to lookup in the C(scaleway-cli) configuration file (C($SCW_CONFIG_PATH), C($XDG_CONFIG_HOME/scw/config.yaml), or C(~/.config/scw/config.yaml)). - More details on L(how to generate token, https://www.scaleway.com/en/docs/generate-api-keys/). type: string @@ -65,10 +66,8 @@ options: - hostname - id variables: - description: 'Set individual variables: keys are variable names and - values are templates. Any value returned by the - L(Scaleway API, https://developer.scaleway.com/#servers-server-get) - can be used.' + description: 'Set individual variables: keys are variable names and values are templates. Any value returned by the L(Scaleway + API, https://developer.scaleway.com/#servers-server-get) can be used.' type: dict """ diff --git a/plugins/inventory/virtualbox.py b/plugins/inventory/virtualbox.py index d94cd64110..2eb52a617c 100644 --- a/plugins/inventory/virtualbox.py +++ b/plugins/inventory/virtualbox.py @@ -8,47 +8,48 @@ from __future__ import annotations DOCUMENTATION = r""" author: Unknown (!UNKNOWN) name: virtualbox -short_description: virtualbox inventory source +short_description: Virtualbox inventory source description: - Get inventory hosts from the local virtualbox installation. - Uses a YAML configuration file that ends with virtualbox.(yml|yaml) or vbox.(yml|yaml). - The inventory_hostname is always the 'Name' of the virtualbox instance. - Groups can be assigned to the VMs using C(VBoxManage). Multiple groups can be assigned by using V(/) as a delimeter. - - A separate parameter, O(enable_advanced_group_parsing) is exposed to change grouping behaviour. See the parameter documentation for details. + - A separate parameter, O(enable_advanced_group_parsing) is exposed to change grouping behaviour. See the parameter documentation + for details. extends_documentation_fragment: - constructed - inventory_cache options: plugin: - description: token that ensures this is a source file for the 'virtualbox' plugin + description: Token that ensures this is a source file for the P(community.general.virtualbox#inventory) plugin. type: string required: true choices: ['virtualbox', 'community.general.virtualbox'] running_only: - description: toggles showing all vms vs only those currently running + description: Toggles showing all VMs instead of only those currently running. type: boolean default: false settings_password_file: - description: provide a file containing the settings password (equivalent to --settingspwfile) + description: Provide a file containing the settings password (equivalent to C(--settingspwfile)). type: string network_info_path: - description: property path to query for network information (ansible_host) + description: Property path to query for network information (C(ansible_host)). type: string default: "/VirtualBox/GuestInfo/Net/0/V4/IP" query: - description: create vars from virtualbox properties + description: Create vars from virtualbox properties. type: dictionary default: {} enable_advanced_group_parsing: description: - - The default group parsing rule (when this setting is set to V(false)) is to split the VirtualBox VM's group based on the V(/) character and - assign the resulting list elements as an Ansible Group. - - Setting O(enable_advanced_group_parsing=true) changes this behaviour to match VirtualBox's interpretation of groups according to - U(https://www.virtualbox.org/manual/UserManual.html#gui-vmgroups). - Groups are now split using the V(,) character, and the V(/) character indicates nested groups. - - When enabled, a VM that's been configured using V(VBoxManage modifyvm "vm01" --groups "/TestGroup/TestGroup2,/TestGroup3") will result in - the group C(TestGroup2) being a child group of C(TestGroup); and - the VM being a part of C(TestGroup2) and C(TestGroup3). + - The default group parsing rule (when this setting is set to V(false)) is to split the VirtualBox VM's group based + on the V(/) character and assign the resulting list elements as an Ansible Group. + - Setting O(enable_advanced_group_parsing=true) changes this behaviour to match VirtualBox's interpretation of groups + according to U(https://www.virtualbox.org/manual/UserManual.html#gui-vmgroups). Groups are now split using the V(,) + character, and the V(/) character indicates nested groups. + - When enabled, a VM that's been configured using V(VBoxManage modifyvm "vm01" --groups "/TestGroup/TestGroup2,/TestGroup3") + results in the group C(TestGroup2) being a child group of C(TestGroup); and the VM being a part of C(TestGroup2) + and C(TestGroup3). default: false type: bool version_added: 9.2.0 diff --git a/plugins/inventory/xen_orchestra.py b/plugins/inventory/xen_orchestra.py index ce45b161c9..e6d828845a 100644 --- a/plugins/inventory/xen_orchestra.py +++ b/plugins/inventory/xen_orchestra.py @@ -31,7 +31,7 @@ options: description: - API host to XOA API. - If the value is not specified in the inventory configuration, the value of environment variable E(ANSIBLE_XO_HOST) - will be used instead. + is used instead. type: str env: - name: ANSIBLE_XO_HOST @@ -39,7 +39,7 @@ options: description: - Xen Orchestra user. - If the value is not specified in the inventory configuration, the value of environment variable E(ANSIBLE_XO_USER) - will be used instead. + is used instead. required: true type: str env: @@ -48,7 +48,7 @@ options: description: - Xen Orchestra password. - If the value is not specified in the inventory configuration, the value of environment variable E(ANSIBLE_XO_PASSWORD) - will be used instead. + is used instead. required: true type: str env: @@ -224,7 +224,7 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable): vm_name_list.append(vm['name_label']) else: vm_duplicate_count = vm_name_list.count(vm['name_label']) - entry_name = vm['name_label'] + "_" + str(vm_duplicate_count) + entry_name = f"{vm['name_label']}_{vm_duplicate_count}" vm_name_list.append(vm['name_label']) else: entry_name = uuid @@ -284,7 +284,7 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable): host_name_list.append(host['name_label']) else: host_duplicate_count = host_name_list.count(host['name_label']) - entry_name = host['name_label'] + "_" + str(host_duplicate_count) + entry_name = f"{host['name_label']}_{host_duplicate_count}" host_name_list.append(host['name_label']) else: entry_name = host['uuid'] diff --git a/plugins/lookup/bitwarden.py b/plugins/lookup/bitwarden.py index 13bf43b0d4..7d65792b7f 100644 --- a/plugins/lookup/bitwarden.py +++ b/plugins/lookup/bitwarden.py @@ -57,7 +57,7 @@ options: version_added: 8.4.0 result_count: description: - - Number of results expected for the lookup query. Task will fail if O(result_count) is set but does not match the number + - Number of results expected for the lookup query. Task fails if O(result_count) is set but does not match the number of query results. Leave empty to skip this check. type: int version_added: 10.4.0 diff --git a/plugins/lookup/cartesian.py b/plugins/lookup/cartesian.py index b41f7d8b5d..f2ad576907 100644 --- a/plugins/lookup/cartesian.py +++ b/plugins/lookup/cartesian.py @@ -9,7 +9,7 @@ __metaclass__ = type DOCUMENTATION = r""" author: Unknown (!UNKNOWN) name: cartesian -short_description: returns the cartesian product of lists +short_description: Returns the cartesian product of lists description: - Takes the input lists and returns a list that represents the product of the input lists. - It is clearer with an example, it turns [1, 2, 3], [a, b] into [1, a], [1, b], [2, a], [2, b], [3, a], [3, b]. diff --git a/plugins/lookup/chef_databag.py b/plugins/lookup/chef_databag.py index f3302c6e31..8fe53744ee 100644 --- a/plugins/lookup/chef_databag.py +++ b/plugins/lookup/chef_databag.py @@ -9,7 +9,7 @@ __metaclass__ = type DOCUMENTATION = r""" author: Unknown (!UNKNOWN) name: chef_databag -short_description: fetches data from a Chef Databag +short_description: Fetches data from a Chef Databag description: - 'This is a lookup plugin to provide access to chef data bags using the pychef package. It interfaces with the chef server API using the same methods to find a knife or chef-client config file to load parameters from, starting from either the diff --git a/plugins/lookup/collection_version.py b/plugins/lookup/collection_version.py index 2ed8a0c466..142c516df5 100644 --- a/plugins/lookup/collection_version.py +++ b/plugins/lookup/collection_version.py @@ -49,8 +49,8 @@ RETURN = r""" _raw: description: - The version number of the collections listed as input. - - If a collection can not be found, it will return the value provided in O(result_not_found). By default, this is V(none). - - If a collection can be found, but the version not identified, it will return the value provided in O(result_no_version). + - If a collection can not be found, it returns the value provided in O(result_not_found). By default, this is V(none). + - If a collection can be found, but the version not identified, it returns the value provided in O(result_no_version). By default, this is V(*). This can happen for collections installed from git which do not have a version number in V(galaxy.yml). type: list elements: str diff --git a/plugins/lookup/consul_kv.py b/plugins/lookup/consul_kv.py index 349b7f3db2..f57b3da891 100644 --- a/plugins/lookup/consul_kv.py +++ b/plugins/lookup/consul_kv.py @@ -24,7 +24,7 @@ options: elements: string recurse: type: boolean - description: If true, will retrieve all the values that have the given key as prefix. + description: If V(true), retrieves all the values that have the given key as prefix. default: false index: description: @@ -42,14 +42,14 @@ options: type: str description: - The target to connect to, must be a resolvable address. - - Will be determined from E(ANSIBLE_CONSUL_URL) if that is set. + - It is determined from E(ANSIBLE_CONSUL_URL) if that is set. ini: - section: lookup_consul key: host port: description: - The port of the target host to connect to. - - If you use E(ANSIBLE_CONSUL_URL) this value will be used from there. + - If you use E(ANSIBLE_CONSUL_URL) this value is used from there. type: int default: 8500 scheme: @@ -57,7 +57,7 @@ options: type: str description: - Whether to use http or https. - - If you use E(ANSIBLE_CONSUL_URL) this value will be used from there. + - If you use E(ANSIBLE_CONSUL_URL) this value is used from there. validate_certs: default: true description: Whether to verify the TLS connection or not. diff --git a/plugins/lookup/credstash.py b/plugins/lookup/credstash.py index 4273aa184a..a170b13d03 100644 --- a/plugins/lookup/credstash.py +++ b/plugins/lookup/credstash.py @@ -9,7 +9,7 @@ __metaclass__ = type DOCUMENTATION = r""" author: Unknown (!UNKNOWN) name: credstash -short_description: retrieve secrets from Credstash on AWS +short_description: Retrieve secrets from Credstash on AWS requirements: - credstash (python library) description: diff --git a/plugins/lookup/cyberarkpassword.py b/plugins/lookup/cyberarkpassword.py index a3a1468049..63834dce9b 100644 --- a/plugins/lookup/cyberarkpassword.py +++ b/plugins/lookup/cyberarkpassword.py @@ -9,7 +9,7 @@ __metaclass__ = type DOCUMENTATION = r""" author: Unknown (!UNKNOWN) name: cyberarkpassword -short_description: get secrets from CyberArk AIM +short_description: Get secrets from CyberArk AIM requirements: - CyberArk AIM tool installed description: @@ -39,8 +39,8 @@ options: description: For extra_params values please check parameters for clipasswordsdk in CyberArk's "Credential Provider and ASCP Implementation Guide". notes: - - For Ansible on Windows, please change the -parameters (C(-p), C(-d), and C(-o)) to /parameters (C(/p), C(/d), and C(/o)) and change the - location of C(CLIPasswordSDK.exe). + - For Ansible on Windows, please change the -parameters (C(-p), C(-d), and C(-o)) to /parameters (C(/p), C(/d), and C(/o)) + and change the location of C(CLIPasswordSDK.exe). """ EXAMPLES = r""" diff --git a/plugins/lookup/dependent.py b/plugins/lookup/dependent.py index b243ee8e1f..18d2a000d9 100644 --- a/plugins/lookup/dependent.py +++ b/plugins/lookup/dependent.py @@ -197,7 +197,10 @@ class LookupModule(LookupBase): result = [] if len(terms) > 0: - templar = Templar(loader=self._templar._loader) + if HAS_DATATAGGING: + templar = self._templar.copy_with_new_env(available_variables={}) + else: + templar = Templar(loader=self._templar._loader) data = [] vars_so_far = set() for index, term in enumerate(terms): diff --git a/plugins/lookup/dig.py b/plugins/lookup/dig.py index d958cf186f..07fc287d71 100644 --- a/plugins/lookup/dig.py +++ b/plugins/lookup/dig.py @@ -9,7 +9,7 @@ __metaclass__ = type DOCUMENTATION = r""" name: dig author: Jan-Piet Mens (@jpmens) -short_description: query DNS using the dnspython library +short_description: Query DNS using the dnspython library requirements: - dnspython (python library, http://www.dnspython.org/) description: @@ -21,10 +21,10 @@ description: - In addition to (default) A record, it is also possible to specify a different record type that should be queried. This can be done by either passing-in additional parameter of format qtype=TYPE to the dig lookup, or by appending /TYPE to the FQDN being queried. - - If multiple values are associated with the requested record, the results will be returned as a comma-separated list. In + - If multiple values are associated with the requested record, the results are returned as a comma-separated list. In such cases you may want to pass option C(wantlist=true) to the lookup call, or alternatively use C(query) instead of C(lookup), - which will result in the record values being returned as a list over which you can iterate later on. - - By default, the lookup will rely on system-wide configured DNS servers for performing the query. It is also possible to + which results in the record values being returned as a list over which you can iterate later on. + - By default, the lookup relies on system-wide configured DNS servers for performing the query. It is also possible to explicitly specify DNS servers to query using the @DNS_SERVER_1,DNS_SERVER_2,...,DNS_SERVER_N notation. This needs to be passed-in as an additional parameter to the lookup. options: @@ -75,16 +75,16 @@ options: fail_on_error: description: - Abort execution on lookup errors. - - The default for this option will likely change to V(true) in the future. The current default, V(false), is used for - backwards compatibility, and will result in empty strings or the string V(NXDOMAIN) in the result in case of errors. + - The default for this option is likely to change to V(true) in the future. The current default, V(false), is used for + backwards compatibility, and results in empty strings or the string V(NXDOMAIN) in the result in case of errors. default: false type: bool version_added: 5.4.0 real_empty: description: - Return empty result without empty strings, and return empty list instead of V(NXDOMAIN). - - The default for this option will likely change to V(true) in the future. - - This option will be forced to V(true) if multiple domains to be queried are specified. + - The default for this option is likely to change to V(true) in the future. + - This option is forced to V(true) if multiple domains to be queried are specified. default: false type: bool version_added: 6.0.0 @@ -104,10 +104,9 @@ options: type: int version_added: 9.5.0 notes: - - V(ALL) is not a record in itself, merely the listed fields are available for any record results you retrieve in the form of - a dictionary. - - While the plugin supports anything which C(dnspython) supports out of the box, only a subset can be converted - into a dictionary. + - V(ALL) is not a record in itself, merely the listed fields are available for any record results you retrieve in the form + of a dictionary. + - While the plugin supports anything which C(dnspython) supports out of the box, only a subset can be converted into a dictionary. - If you need to obtain the AAAA record (IPv6 address), you must specify the record type explicitly. Syntax for specifying the record type is shown in the examples below. - The trailing dot in most of the examples listed is purely optional, but is specified for completeness/correctness sake. diff --git a/plugins/lookup/dnstxt.py b/plugins/lookup/dnstxt.py index eb24a63e99..fb0a5d5138 100644 --- a/plugins/lookup/dnstxt.py +++ b/plugins/lookup/dnstxt.py @@ -9,7 +9,7 @@ __metaclass__ = type DOCUMENTATION = r""" name: dnstxt author: Jan-Piet Mens (@jpmens) -short_description: query a domain(s)'s DNS txt fields +short_description: Query a domain(s)'s DNS txt fields requirements: - dns/dns.resolver (python library) description: @@ -23,7 +23,7 @@ options: real_empty: description: - Return empty result without empty strings, and return empty list instead of V(NXDOMAIN). - - The default for this option will likely change to V(true) in the future. + - The default for this option is likely to change to V(true) in the future. default: false type: bool version_added: 6.0.0 diff --git a/plugins/lookup/etcd.py b/plugins/lookup/etcd.py index d8c708bfc8..d8d992e79f 100644 --- a/plugins/lookup/etcd.py +++ b/plugins/lookup/etcd.py @@ -12,7 +12,7 @@ DOCUMENTATION = r""" author: - Jan-Piet Mens (@jpmens) name: etcd -short_description: get info from an etcd server +short_description: Get info from an etcd server description: - Retrieves data from an etcd server. options: diff --git a/plugins/lookup/filetree.py b/plugins/lookup/filetree.py index fd064cb4e6..24e0c20eea 100644 --- a/plugins/lookup/filetree.py +++ b/plugins/lookup/filetree.py @@ -9,11 +9,11 @@ __metaclass__ = type DOCUMENTATION = r""" name: filetree author: Dag Wieers (@dagwieers) -short_description: recursively match all files in a directory tree +short_description: Recursively match all files in a directory tree description: - This lookup enables you to template a complete tree of files on a target system while retaining permissions and ownership. - Supports directories, files and symlinks, including SELinux and other file properties. - - If you provide more than one path, it will implement a first_found logic, and will not process entries it already processed + - If you provide more than one path, it implements a first_found logic, and does not process entries it already processed in previous paths. This enables merging different trees in order of importance, or add role_vars to specific paths to influence different instances of the same role. options: diff --git a/plugins/lookup/flattened.py b/plugins/lookup/flattened.py index 4b703458cc..de4a21fbdd 100644 --- a/plugins/lookup/flattened.py +++ b/plugins/lookup/flattened.py @@ -9,9 +9,9 @@ __metaclass__ = type DOCUMENTATION = r""" name: flattened author: Serge van Ginderachter (!UNKNOWN) -short_description: return single list completely flattened +short_description: Return single list completely flattened description: - - Given one or more lists, this lookup will flatten any list elements found recursively until only 1 list is left. + - Given one or more lists, this lookup flattens any list elements found recursively until only 1 list is left. options: _terms: description: Lists to flatten. @@ -19,7 +19,7 @@ options: elements: raw required: true notes: - - Unlike the P(ansible.builtin.items#lookup) lookup which only flattens 1 level, this plugin will continue to flatten until + - Unlike the P(ansible.builtin.items#lookup) lookup which only flattens 1 level, this plugin continues to flatten until it cannot find lists anymore. - Aka highlander plugin, there can only be one (list). """ diff --git a/plugins/lookup/hiera.py b/plugins/lookup/hiera.py index 7aacad4e26..27f133d78a 100644 --- a/plugins/lookup/hiera.py +++ b/plugins/lookup/hiera.py @@ -10,7 +10,7 @@ DOCUMENTATION = r""" author: - Juan Manuel Parrilla (@jparrill) name: hiera -short_description: get info from hiera data +short_description: Get info from hiera data requirements: - hiera (command line utility) description: diff --git a/plugins/lookup/keyring.py b/plugins/lookup/keyring.py index 2cbc2ea8c2..75d808e736 100644 --- a/plugins/lookup/keyring.py +++ b/plugins/lookup/keyring.py @@ -13,7 +13,7 @@ author: - Samuel Boucher (!UNKNOWN) requirements: - keyring (python library) -short_description: grab secrets from the OS keyring +short_description: Grab secrets from the OS keyring description: - Allows you to access data stored in the OS provided keyring/keychain. """ diff --git a/plugins/lookup/lastpass.py b/plugins/lookup/lastpass.py index 28b9af3466..2633848937 100644 --- a/plugins/lookup/lastpass.py +++ b/plugins/lookup/lastpass.py @@ -13,7 +13,7 @@ author: requirements: - lpass (command line utility) - must have already logged into LastPass -short_description: fetch data from LastPass +short_description: Fetch data from LastPass description: - Use the lpass command line utility to fetch specific fields from LastPass. options: diff --git a/plugins/lookup/lmdb_kv.py b/plugins/lookup/lmdb_kv.py index d44aac55c3..b3728abb17 100644 --- a/plugins/lookup/lmdb_kv.py +++ b/plugins/lookup/lmdb_kv.py @@ -11,7 +11,7 @@ name: lmdb_kv author: - Jan-Piet Mens (@jpmens) version_added: '0.2.0' -short_description: fetch data from LMDB +short_description: Fetch data from LMDB description: - This lookup returns a list of results from an LMDB DB corresponding to a list of items given to it. requirements: diff --git a/plugins/lookup/merge_variables.py b/plugins/lookup/merge_variables.py index f3f185a164..ffe76c3ea0 100644 --- a/plugins/lookup/merge_variables.py +++ b/plugins/lookup/merge_variables.py @@ -12,7 +12,7 @@ author: - Mark Ettema (@m-a-r-k-e) - Alexander Petrenz (@alpex8) name: merge_variables -short_description: merge variables whose names match a given pattern +short_description: Merge variables whose names match a given pattern description: - This lookup returns the merged result of all variables in scope that match the given prefixes, suffixes, or regular expressions, optionally. @@ -20,8 +20,8 @@ version_added: 6.5.0 options: _terms: description: - - Depending on the value of O(pattern_type), this is a list of prefixes, suffixes, or regular expressions that will - be used to match all variables that should be merged. + - Depending on the value of O(pattern_type), this is a list of prefixes, suffixes, or regular expressions that is used + to match all variables that should be merged. required: true type: list elements: str @@ -45,11 +45,11 @@ options: type: raw override: description: - - Return an error, print a warning or ignore it when a key will be overwritten. + - Return an error, print a warning or ignore it when a key is overwritten. - The default behavior V(error) makes the plugin fail when a key would be overwritten. - When V(warn) and V(ignore) are used, note that it is important to know that the variables are sorted by name before - being merged. Keys for later variables in this order will overwrite keys of the same name for variables earlier in - this order. To avoid potential confusion, better use O(override=error) whenever possible. + being merged. Keys for later variables in this order overwrite keys of the same name for variables earlier in this + order. To avoid potential confusion, better use O(override=error) whenever possible. type: str default: 'error' choices: @@ -111,8 +111,7 @@ example_b: "{{ lookup('community.general.merge_variables', '^.+__test_list$', in RETURN = r""" _raw: - description: In case the search matches list items, a list will be returned. In case the search matches dicts, a dict will - be returned. + description: In case the search matches list items, a list is returned. In case the search matches dicts, a dict is returned. type: raw elements: raw """ diff --git a/plugins/lookup/onepassword.py b/plugins/lookup/onepassword.py index d30234f14d..3dc589eaaf 100644 --- a/plugins/lookup/onepassword.py +++ b/plugins/lookup/onepassword.py @@ -41,7 +41,6 @@ extends_documentation_fragment: """ EXAMPLES = r""" ---- # These examples only work when already signed in to 1Password - name: Retrieve password for KITT when already signed in to 1Password ansible.builtin.debug: diff --git a/plugins/lookup/passwordstore.py b/plugins/lookup/passwordstore.py index 54e89d6f8f..8f87e87034 100644 --- a/plugins/lookup/passwordstore.py +++ b/plugins/lookup/passwordstore.py @@ -11,7 +11,7 @@ DOCUMENTATION = r""" name: passwordstore author: - Patrick Deelman (!UNKNOWN) -short_description: manage passwords with passwordstore.org's pass utility +short_description: Manage passwords with passwordstore.org's pass utility description: - Enables Ansible to retrieve, create or update passwords from the passwordstore.org pass utility. It can also retrieve, create or update YAML style keys stored as multilines in the passwordfile. @@ -55,7 +55,7 @@ options: subkey: description: - By default return a specific subkey of the password. When set to V(password), always returns the first line. - - With O(overwrite=true), it will create the subkey and return it. + - With O(overwrite=true), it creates the subkey and returns it. type: str default: password userpass: @@ -77,10 +77,10 @@ options: description: - List of preference about what to do if the password file is missing. - If O(create=true), the value for this option is ignored and assumed to be V(create). - - If set to V(error), the lookup will error out if the passname does not exist. - - If set to V(create), the passname will be created with the provided length O(length) if it does not exist. - - If set to V(empty) or V(warn), will return a V(none) in case the passname does not exist. When using C(lookup) and - not C(query), this will be translated to an empty string. + - If set to V(error), the lookup fails out if the passname does not exist. + - If set to V(create), the passname is created with the provided length O(length) if it does not exist. + - If set to V(empty) or V(warn), it returns a V(none) in case the passname does not exist. When using C(lookup) and + not C(query), this is translated to an empty string. version_added: 3.1.0 type: str default: error @@ -146,8 +146,8 @@ options: missing_subkey: description: - Preference about what to do if the password subkey is missing. - - If set to V(error), the lookup will error out if the subkey does not exist. - - If set to V(empty) or V(warn), will return a V(none) in case the subkey does not exist. + - If set to V(error), the lookup fails out if the subkey does not exist. + - If set to V(empty) or V(warn), it returns a V(none) in case the subkey does not exist. version_added: 8.6.0 type: str default: empty diff --git a/plugins/lookup/random_pet.py b/plugins/lookup/random_pet.py index ff51fc8b31..8f9b3cbd00 100644 --- a/plugins/lookup/random_pet.py +++ b/plugins/lookup/random_pet.py @@ -27,7 +27,7 @@ options: length: description: - The maximal length of every component of the pet name. - - Values below 3 will be set to 3 by petname. + - Values below V(3) are set to V(3) by petname. default: 6 type: int prefix: diff --git a/plugins/lookup/random_string.py b/plugins/lookup/random_string.py index bd72916d92..4b227d3dca 100644 --- a/plugins/lookup/random_string.py +++ b/plugins/lookup/random_string.py @@ -41,9 +41,9 @@ options: special: description: - Include special characters in the string. - - Special characters are taken from Python standard library C(string). - See L(the documentation of string.punctuation,https://docs.python.org/3/library/string.html#string.punctuation) - for which characters will be used. + - Special characters are taken from Python standard library C(string). See L(the documentation of + string.punctuation,https://docs.python.org/3/library/string.html#string.punctuation) + for which characters are used. - The choice of special characters can be changed to setting O(override_special). default: true type: bool diff --git a/plugins/lookup/redis.py b/plugins/lookup/redis.py index 3c8ff07a23..bb5a122da3 100644 --- a/plugins/lookup/redis.py +++ b/plugins/lookup/redis.py @@ -11,7 +11,7 @@ name: redis author: - Jan-Piet Mens (@jpmens) - Ansible Core Team -short_description: fetch data from Redis +short_description: Fetch data from Redis description: - This lookup returns a list of results from a Redis DB corresponding to a list of items given to it. requirements: diff --git a/plugins/lookup/revbitspss.py b/plugins/lookup/revbitspss.py index c40140671d..6b31963f4a 100644 --- a/plugins/lookup/revbitspss.py +++ b/plugins/lookup/revbitspss.py @@ -19,18 +19,18 @@ requirements: options: _terms: description: - - This will be an array of keys for secrets which you want to fetch from RevBits PAM. + - This is an array of keys for secrets which you want to fetch from RevBits PAM. required: true type: list elements: string base_url: description: - - This will be the base URL of the server, for example V(https://server-url-here). + - This is the base URL of the server, for example V(https://server-url-here). required: true type: string api_key: description: - - This will be the API key for authentication. You can get it from the RevBits PAM secret manager module. + - This is the API key for authentication. You can get it from the RevBits PAM secret manager module. required: true type: string """ @@ -39,7 +39,7 @@ RETURN = r""" _list: description: - The JSON responses which you can access with defined keys. - - If you are fetching secrets named as UUID, PASSWORD it will gives you the dict of all secrets. + - If you are fetching secrets named as UUID, PASSWORD it returns the dict of all secrets. type: list elements: dict """ diff --git a/plugins/lookup/shelvefile.py b/plugins/lookup/shelvefile.py index 4921e050a0..f4142f67c6 100644 --- a/plugins/lookup/shelvefile.py +++ b/plugins/lookup/shelvefile.py @@ -9,7 +9,7 @@ __metaclass__ = type DOCUMENTATION = r""" name: shelvefile author: Alejandro Guirao (!UNKNOWN) -short_description: read keys from Python shelve file +short_description: Read keys from Python shelve file description: - Read keys from Python shelve file. options: diff --git a/plugins/lookup/tss.py b/plugins/lookup/tss.py index 6a97d4b29c..3d73fcbe99 100644 --- a/plugins/lookup/tss.py +++ b/plugins/lookup/tss.py @@ -33,14 +33,14 @@ options: fetch_secret_ids_from_folder: description: - Boolean flag which indicates whether secret IDs are in a folder is fetched by folder ID or not. - - V(true) then the terms will be considered as a folder IDs. Otherwise (default), they are considered as secret IDs. + - V(true) then the terms are considered as a folder IDs. Otherwise (default), they are considered as secret IDs. required: false type: bool version_added: 7.1.0 fetch_attachments: description: - - Boolean flag which indicates whether attached files will get downloaded or not. - - The download will only happen if O(file_download_path) has been provided. + - Boolean flag which indicates whether attached files are downloaded or not. + - The download only happens if O(file_download_path) has been provided. required: false type: bool version_added: 7.0.0 diff --git a/plugins/module_utils/identity/keycloak/keycloak.py b/plugins/module_utils/identity/keycloak/keycloak.py index 45216a9302..e053eca305 100644 --- a/plugins/module_utils/identity/keycloak/keycloak.py +++ b/plugins/module_utils/identity/keycloak/keycloak.py @@ -248,6 +248,29 @@ def _request_token_using_refresh_token(module_params): return _token_request(module_params, payload) +def _request_token_using_client_credentials(module_params): + """ Obtains connection header with token for the authentication, + using the provided auth_client_id and auth_client_secret by grant_type + client_credentials. Ensure that the used client uses client authorization + with service account roles enabled and required service roles assigned. + :param module_params: parameters of the module. Must include 'auth_client_id' + and 'auth_client_secret'.. + :return: connection header + """ + client_id = module_params.get('auth_client_id') + client_secret = module_params.get('auth_client_secret') + + temp_payload = { + 'grant_type': 'client_credentials', + 'client_id': client_id, + 'client_secret': client_secret, + } + # Remove empty items, for instance missing client_secret + payload = {k: v for k, v in temp_payload.items() if v is not None} + + return _token_request(module_params, payload) + + def get_token(module_params): """ Obtains connection header with token for the authentication, token already given or obtained from credentials @@ -257,7 +280,13 @@ def get_token(module_params): token = module_params.get('token') if token is None: - token = _request_token_using_credentials(module_params) + auth_client_id = module_params.get('auth_client_id') + auth_client_secret = module_params.get('auth_client_secret') + auth_username = module_params.get('auth_username') + if auth_client_id is not None and auth_client_secret is not None and auth_username is None: + token = _request_token_using_client_credentials(module_params) + else: + token = _request_token_using_credentials(module_params) return { 'Authorization': 'Bearer ' + token, @@ -387,6 +416,21 @@ class KeycloakAPI(object): r = make_request_catching_401() + if isinstance(r, Exception): + # Try to re-auth with client_id and client_secret, if available + auth_client_id = self.module.params.get('auth_client_id') + auth_client_secret = self.module.params.get('auth_client_secret') + if auth_client_id is not None and auth_client_secret is not None: + try: + token = _request_token_using_client_credentials(self.module.params) + self.restheaders['Authorization'] = 'Bearer ' + token + + r = make_request_catching_401() + except KeycloakError as e: + # Token refresh returns 400 if token is expired/invalid, so continue on if we get a 400 + if e.authError is not None and e.authError.code != 400: + raise e + if isinstance(r, Exception): # Either no re-auth options were available, or they all failed raise r @@ -1917,7 +1961,7 @@ class KeycloakAPI(object): and composite["name"] == existing_composite["name"]): composite_found = True break - if (not composite_found and ('state' not in composite or composite['state'] == 'present')): + if not composite_found and ('state' not in composite or composite['state'] == 'present'): if "client_id" in composite and composite['client_id'] is not None: client_roles = self.get_client_roles(clientid=composite['client_id'], realm=realm) for client_role in client_roles: diff --git a/plugins/module_utils/pacemaker.py b/plugins/module_utils/pacemaker.py index df13cfebd1..f0f54cce9d 100644 --- a/plugins/module_utils/pacemaker.py +++ b/plugins/module_utils/pacemaker.py @@ -14,7 +14,12 @@ _state_map = { "absent": "remove", "status": "status", "enabled": "enable", - "disabled": "disable" + "disabled": "disable", + "online": "start", + "offline": "stop", + "maintenance": "set", + "config": "config", + "cleanup": "cleanup", } @@ -38,20 +43,19 @@ def fmt_resource_argument(value): def get_pacemaker_maintenance_mode(runner): - with runner("config") as ctx: - rc, out, err = ctx.run() + with runner("cli_action config") as ctx: + rc, out, err = ctx.run(cli_action="property") maintenance_mode_output = list(filter(lambda string: "maintenance-mode=true" in string.lower(), out.splitlines())) return bool(maintenance_mode_output) -def pacemaker_runner(module, cli_action=None, **kwargs): +def pacemaker_runner(module, **kwargs): runner_command = ['pcs'] - if cli_action: - runner_command.append(cli_action) runner = CmdRunner( module, command=runner_command, arg_formats=dict( + cli_action=cmd_runner_fmt.as_list(), state=cmd_runner_fmt.as_map(_state_map), name=cmd_runner_fmt.as_list(), resource_type=cmd_runner_fmt.as_func(fmt_resource_type), @@ -59,6 +63,7 @@ def pacemaker_runner(module, cli_action=None, **kwargs): resource_operation=cmd_runner_fmt.as_func(fmt_resource_operation), resource_meta=cmd_runner_fmt.stack(cmd_runner_fmt.as_opt_val)("meta"), resource_argument=cmd_runner_fmt.as_func(fmt_resource_argument), + apply_all=cmd_runner_fmt.as_bool("--all"), wait=cmd_runner_fmt.as_opt_eq_val("--wait"), config=cmd_runner_fmt.as_fixed("config"), force=cmd_runner_fmt.as_bool("--force"), diff --git a/plugins/module_utils/python_runner.py b/plugins/module_utils/python_runner.py index b65867c61e..a8e9e651be 100644 --- a/plugins/module_utils/python_runner.py +++ b/plugins/module_utils/python_runner.py @@ -19,7 +19,7 @@ class PythonRunner(CmdRunner): self.venv = venv self.has_venv = venv is not None - if (os.path.isabs(python) or '/' in python): + if os.path.isabs(python) or '/' in python: self.python = python elif self.has_venv: if path_prefix is None: diff --git a/plugins/modules/aerospike_migrations.py b/plugins/modules/aerospike_migrations.py index 9a6084a6a1..d9440fdb4e 100644 --- a/plugins/modules/aerospike_migrations.py +++ b/plugins/modules/aerospike_migrations.py @@ -29,7 +29,6 @@ options: host: description: - Which host do we use as seed for info connection. - required: false type: str default: localhost port: @@ -70,7 +69,7 @@ options: type: bool min_cluster_size: description: - - Check will return bad until cluster size is met or until tries is exhausted. + - Check fails until cluster size is met or until tries is exhausted. required: false type: int default: 1 @@ -94,10 +93,10 @@ options: default: migrate_rx_partitions_remaining target_cluster_size: description: - - When all aerospike builds in the cluster are greater than version 4.3, then the C(cluster-stable) info command will - be used. Inside this command, you can optionally specify what the target cluster size is - but it is not necessary. + - When all aerospike builds in the cluster are greater than version 4.3, then the C(cluster-stable) info command is + used. Inside this command, you can optionally specify what the target cluster size is - but it is not necessary. You can still rely on O(min_cluster_size) if you do not want to use this option. - - If this option is specified on a cluster that has at least one host <4.3 then it will be ignored until the min version + - If this option is specified on a cluster that has at least one host <4.3 then it is ignored until the min version reaches 4.3. required: false type: int @@ -180,19 +179,19 @@ else: def run_module(): """run ansible module""" module_args = dict( - host=dict(type='str', required=False, default='localhost'), - port=dict(type='int', required=False, default=3000), - connect_timeout=dict(type='int', required=False, default=1000), - consecutive_good_checks=dict(type='int', required=False, default=3), - sleep_between_checks=dict(type='int', required=False, default=60), - tries_limit=dict(type='int', required=False, default=300), + host=dict(type='str', default='localhost'), + port=dict(type='int', default=3000), + connect_timeout=dict(type='int', default=1000), + consecutive_good_checks=dict(type='int', default=3), + sleep_between_checks=dict(type='int', default=60), + tries_limit=dict(type='int', default=300), local_only=dict(type='bool', required=True), - min_cluster_size=dict(type='int', required=False, default=1), - target_cluster_size=dict(type='int', required=False, default=None), - fail_on_cluster_change=dict(type='bool', required=False, default=True), - migrate_tx_key=dict(type='str', required=False, no_log=False, + min_cluster_size=dict(type='int', default=1), + target_cluster_size=dict(type='int'), + fail_on_cluster_change=dict(type='bool', default=True), + migrate_tx_key=dict(type='str', no_log=False, default="migrate_tx_partitions_remaining"), - migrate_rx_key=dict(type='str', required=False, no_log=False, + migrate_rx_key=dict(type='str', no_log=False, default="migrate_rx_partitions_remaining") ) diff --git a/plugins/modules/airbrake_deployment.py b/plugins/modules/airbrake_deployment.py index d772062da4..0fe04f21d6 100644 --- a/plugins/modules/airbrake_deployment.py +++ b/plugins/modules/airbrake_deployment.py @@ -71,7 +71,7 @@ options: type: str validate_certs: description: - - If V(false), SSL certificates for the target URL will not be validated. This should only be used on personally controlled + - If V(false), SSL certificates for the target URL is not validated. This should only be used on personally controlled sites using self-signed certificates. required: false default: true @@ -114,11 +114,11 @@ def main(): project_id=dict(required=True, no_log=True, type='str'), project_key=dict(required=True, no_log=True, type='str'), environment=dict(required=True, type='str'), - user=dict(required=False, type='str'), - repo=dict(required=False, type='str'), - revision=dict(required=False, type='str'), - version=dict(required=False, type='str'), - url=dict(required=False, default='https://api.airbrake.io/api/v4/projects/', type='str'), + user=dict(type='str'), + repo=dict(type='str'), + revision=dict(type='str'), + version=dict(type='str'), + url=dict(default='https://api.airbrake.io/api/v4/projects/', type='str'), validate_certs=dict(default=True, type='bool'), ), supports_check_mode=True, diff --git a/plugins/modules/aix_filesystem.py b/plugins/modules/aix_filesystem.py index 8934d583ff..92a734e8ac 100644 --- a/plugins/modules/aix_filesystem.py +++ b/plugins/modules/aix_filesystem.py @@ -47,7 +47,7 @@ options: description: - Logical volume (LV) device name or remote export device to create a NFS file system. - It is used to create a file system on an already existing logical volume or the exported NFS file system. - - If not mentioned a new logical volume name will be created following AIX standards (LVM). + - If not mentioned a new logical volume name is created following AIX standards (LVM). type: str fs_type: description: @@ -81,14 +81,14 @@ options: size: description: - Specifies the file system size. - - For already V(present) it will be resized. - - 512-byte blocks, Megabytes or Gigabytes. If the value has M specified it will be in Megabytes. If the value has G - specified it will be in Gigabytes. - - If no M or G the value will be 512-byte blocks. - - If "+" is specified in begin of value, the value will be added. - - If "-" is specified in begin of value, the value will be removed. - - If "+" or "-" is not specified, the total value will be the specified. - - Size will respects the LVM AIX standards. + - For already present it resizes the filesystem. + - 512-byte blocks, megabytes or gigabytes. If the value has M specified it is in megabytes. If the value has G specified + it is in gigabytes. + - If no M or G the value is 512-byte blocks. + - If V(+) is specified in begin of value, the value is added. + - If V(-) is specified in begin of value, the value is removed. + - If neither V(+) nor V(-) is specified, then the total value is the specified. + - Size respects the LVM AIX standards. type: str state: description: @@ -165,16 +165,6 @@ EXAMPLES = r""" state: absent """ -RETURN = r""" -changed: - description: Return changed for aix_filesystems actions as true or false. - returned: always - type: bool -msg: - description: Return message regarding the action. - returned: always - type: str -""" from ansible.module_utils.basic import AnsibleModule from ansible_collections.community.general.plugins.module_utils._mount import ismount diff --git a/plugins/modules/aix_inittab.py b/plugins/modules/aix_inittab.py index 0c32f91e7f..ece4e95547 100644 --- a/plugins/modules/aix_inittab.py +++ b/plugins/modules/aix_inittab.py @@ -112,16 +112,6 @@ name: returned: always type: str sample: startmyservice -msg: - description: Action done with the C(inittab) entry. - returned: changed - type: str - sample: changed inittab entry startmyservice -changed: - description: Whether the C(inittab) changed or not. - returned: always - type: bool - sample: true """ # Import necessary libraries diff --git a/plugins/modules/aix_lvg.py b/plugins/modules/aix_lvg.py index 29c0b7d3f9..c41e21124e 100644 --- a/plugins/modules/aix_lvg.py +++ b/plugins/modules/aix_lvg.py @@ -36,7 +36,7 @@ options: description: - List of comma-separated devices to use as physical devices in this volume group. - Required when creating or extending (V(present) state) the volume group. - - If not informed reducing (V(absent) state) the volume group will be removed. + - If not informed reducing (V(absent) state) the volume group is removed. type: list elements: str state: @@ -57,7 +57,7 @@ options: choices: [big, normal, scalable] default: normal notes: - - AIX will permit remove VG only if all LV/Filesystems are not busy. + - AIX allows removing VG only if all LV/Filesystems are not busy. - Module does not modify PP size for already present volume group. """ diff --git a/plugins/modules/ali_instance.py b/plugins/modules/ali_instance.py index 1a66850e14..050794d55c 100644 --- a/plugins/modules/ali_instance.py +++ b/plugins/modules/ali_instance.py @@ -45,8 +45,7 @@ options: type: str availability_zone: description: - - Aliyun availability zone ID in which to launch the instance. If it is not specified, it will be allocated by system - automatically. + - Aliyun availability zone ID in which to launch the instance. If it is not specified, it is allocated by system automatically. aliases: ['alicloud_zone', 'zone_id'] type: str image_id: @@ -109,7 +108,7 @@ options: version_added: '0.2.0' password: description: - - The password to login instance. After rebooting instances, modified password will take effect. + - The password to login instance. After rebooting instances, modified password is effective. type: str system_disk_category: description: @@ -140,7 +139,7 @@ options: description: - O(count) determines how many instances based on a specific tag criteria should be present. This can be expressed in multiple ways and is shown in the EXAMPLES section. The specified count_tag must already exist or be passed in as - the O(tags) option. If it is not specified, it will be replaced by O(instance_name). + the O(tags) option. If it is not specified, it is replaced by O(instance_name). type: str allocate_public_ip: description: @@ -172,8 +171,7 @@ options: type: int instance_ids: description: - - A list of instance IDs. It is required when need to operate existing instances. If it is specified, O(count) will - lose efficacy. + - A list of instance IDs. It is required when need to operate existing instances. If it is specified, O(count) is ignored. type: list elements: str force: @@ -203,7 +201,7 @@ options: user_data: description: - User-defined data to customize the startup behaviors of an ECS instance and to pass data into an ECS instance. It - only will take effect when launching the new ECS instances. + only takes effect when launching the new ECS instances. required: false type: str ram_role_name: @@ -226,7 +224,7 @@ options: version_added: '0.2.0' period_unit: description: - - The duration unit that you will buy the resource. It is valid when O(instance_charge_type=PrePaid). + - The duration unit that you are buying the resource. It is valid when O(instance_charge_type=PrePaid). choices: ['Month', 'Week'] default: 'Month' type: str @@ -424,7 +422,7 @@ instances: type: str sample: 42.10.2.2 expired_time: - description: The time the instance will expire. + description: The time the instance expires. returned: always type: str sample: "2099-12-31T15:59Z" @@ -615,7 +613,7 @@ ids: description: List of ECS instance IDs. returned: always type: list - sample: [i-12345er, i-3245fs] + sample: ["i-12345er", "i-3245fs"] """ import re diff --git a/plugins/modules/ali_instance_info.py b/plugins/modules/ali_instance_info.py index 00e77b1ab2..7be5b8cda6 100644 --- a/plugins/modules/ali_instance_info.py +++ b/plugins/modules/ali_instance_info.py @@ -167,7 +167,7 @@ instances: type: str sample: 42.10.2.2 expired_time: - description: The time the instance will expire. + description: The time the instance expires. returned: always type: str sample: "2099-12-31T15:59Z" @@ -341,7 +341,7 @@ ids: description: List of ECS instance IDs. returned: always type: list - sample: [i-12345er, i-3245fs] + sample: ["i-12345er", "i-3245fs"] """ from ansible.module_utils.basic import AnsibleModule, missing_required_lib diff --git a/plugins/modules/android_sdk.py b/plugins/modules/android_sdk.py index b90da54d69..a9bffa50ea 100644 --- a/plugins/modules/android_sdk.py +++ b/plugins/modules/android_sdk.py @@ -28,8 +28,8 @@ version_added: 10.2.0 options: accept_licenses: description: - - If this is set to V(true), the module will try to accept license prompts generated by C(sdkmanager) during package - installation. Otherwise, every license prompt will be rejected. + - If this is set to V(true), the module attempts to accept license prompts generated by C(sdkmanager) during package + installation. Otherwise, every license prompt is rejected. type: bool default: false name: @@ -64,16 +64,16 @@ requirements: notes: - For some of the packages installed by C(sdkmanager) is it necessary to accept licenses. Usually it is done through command line prompt in a form of a Y/N question when a licensed package is requested to be installed. If there are several packages - requested for installation and at least two of them belong to different licenses, the C(sdkmanager) tool will prompt for - these licenses in a loop. In order to install packages, the module must be able to answer these license prompts. Currently, + requested for installation and at least two of them belong to different licenses, the C(sdkmanager) tool prompts for these + licenses in a loop. In order to install packages, the module must be able to answer these license prompts. Currently, it is only possible to answer one license prompt at a time, meaning that instead of installing multiple packages as a - single invocation of the C(sdkmanager --install) command, it will be done by executing the command independently for each - package. This makes sure that at most only one license prompt will need to be answered. At the time of writing this module, - a C(sdkmanager)'s package may belong to at most one license type that needs to be accepted. However, if this changes in - the future, the module may hang as there might be more prompts generated by the C(sdkmanager) tool which the module will - not be able to answer. If this becomes the case, file an issue and in the meantime, consider accepting all the licenses - in advance, as it is described in the C(sdkmanager) L(documentation,https://developer.android.com/tools/sdkmanager#accept-licenses), - for instance, using the M(ansible.builtin.command) module. + single invocation of the C(sdkmanager --install) command, it is done by executing the command independently for each package. + This makes sure that at most only one license prompt needs to be answered. At the time of writing this module, a C(sdkmanager)'s + package may belong to at most one license type that needs to be accepted. However, if this changes in the future, the + module may hang as there might be more prompts generated by the C(sdkmanager) tool which the module is unable to answer. + If this becomes the case, file an issue and in the meantime, consider accepting all the licenses in advance, as it is + described in the C(sdkmanager) L(documentation,https://developer.android.com/tools/sdkmanager#accept-licenses), for instance, + using the M(ansible.builtin.command) module. seealso: - name: sdkmanager tool documentation description: Detailed information of how to install and use sdkmanager command line tool. @@ -126,13 +126,13 @@ installed: description: A list of packages that have been installed. returned: when packages have changed type: list - sample: ['build-tools;34.0.0', 'platform-tools'] + sample: ["build-tools;34.0.0", "platform-tools"] removed: description: A list of packages that have been removed. returned: when packages have changed type: list - sample: ['build-tools;34.0.0', 'platform-tools'] + sample: ["build-tools;34.0.0", "platform-tools"] """ from ansible_collections.community.general.plugins.module_utils.mh.module_helper import StateModuleHelper diff --git a/plugins/modules/ansible_galaxy_install.py b/plugins/modules/ansible_galaxy_install.py index ec094090a1..4712ca9a3c 100644 --- a/plugins/modules/ansible_galaxy_install.py +++ b/plugins/modules/ansible_galaxy_install.py @@ -18,8 +18,8 @@ description: - This module allows the installation of Ansible collections or roles using C(ansible-galaxy). notes: - Support for B(Ansible 2.9/2.10) was removed in community.general 8.0.0. - - The module will try and run using the C(C.UTF-8) locale. If that fails, it will try C(en_US.UTF-8). If that one also fails, - the module will fail. + - The module tries to run using the C(C.UTF-8) locale. If that fails, it tries C(en_US.UTF-8). If that one also fails, the + module fails. seealso: - name: C(ansible-galaxy) command manual page description: Manual page for the command. @@ -37,10 +37,10 @@ attributes: options: state: description: - - If O(state=present) then the collection or role will be installed. Note that the collections and roles are not updated + - If O(state=present) then the collection or role is installed. Note that the collections and roles are not updated with this option. - - Currently the O(state=latest) is ignored unless O(type=collection), and it will ensure the collection is installed - and updated to the latest available version. + - Currently the O(state=latest) is ignored unless O(type=collection), and it ensures the collection is installed and + updated to the latest available version. - Please note that O(force=true) can be used to perform upgrade regardless of O(type). type: str choices: [present, latest] @@ -71,7 +71,7 @@ options: dest: description: - The path to the directory containing your collections or roles, according to the value of O(type). - - Please notice that C(ansible-galaxy) will not install collections with O(type=both), when O(requirements_file) contains + - Please notice that C(ansible-galaxy) does not install collections with O(type=both), when O(requirements_file) contains both roles and collections and O(dest) is specified. type: path no_deps: @@ -83,7 +83,7 @@ options: force: description: - Force overwriting existing roles and/or collections. - - It can be used for upgrading, but the module output will always report C(changed=true). + - It can be used for upgrading, but the module output always reports C(changed=true). - Using O(force=true) is mandatory when downgrading. type: bool default: false diff --git a/plugins/modules/apache2_module.py b/plugins/modules/apache2_module.py index 2007b5d1f1..99db968670 100644 --- a/plugins/modules/apache2_module.py +++ b/plugins/modules/apache2_module.py @@ -113,22 +113,6 @@ result: description: Message about action taken. returned: always type: str -warnings: - description: List of warning messages. - returned: when needed - type: list -rc: - description: Return code of underlying command. - returned: failed - type: int -stdout: - description: The stdout of underlying command. - returned: failed - type: str -stderr: - description: The stderr of underlying command. - returned: failed - type: str """ import re @@ -164,12 +148,12 @@ def _module_is_enabled(module): if module.params['ignore_configcheck']: if 'AH00534' in stderr and 'mpm_' in module.params['name']: if module.params['warn_mpm_absent']: - module.warnings.append( + module.warn( "No MPM module loaded! apache2 reload AND other module actions" " will fail if no MPM module is loaded immediately." ) else: - module.warnings.append(error_msg) + module.warn(error_msg) return False else: module.fail_json(msg=error_msg) @@ -224,9 +208,7 @@ def _set_state(module, state): if _module_is_enabled(module) != want_enabled: if module.check_mode: - module.exit_json(changed=True, - result=success_msg, - warnings=module.warnings) + module.exit_json(changed=True, result=success_msg) a2mod_binary_path = module.get_bin_path(a2mod_binary) if a2mod_binary_path is None: @@ -241,9 +223,7 @@ def _set_state(module, state): result, stdout, stderr = module.run_command(a2mod_binary_cmd + [name]) if _module_is_enabled(module) == want_enabled: - module.exit_json(changed=True, - result=success_msg, - warnings=module.warnings) + module.exit_json(changed=True, result=success_msg) else: msg = ( 'Failed to set module {name} to {state}:\n' @@ -261,9 +241,7 @@ def _set_state(module, state): stdout=stdout, stderr=stderr) else: - module.exit_json(changed=False, - result=success_msg, - warnings=module.warnings) + module.exit_json(changed=False, result=success_msg) def main(): @@ -279,8 +257,6 @@ def main(): supports_check_mode=True, ) - module.warnings = [] - name = module.params['name'] if name == 'cgi' and _run_threaded(module): module.fail_json(msg="Your MPM seems to be threaded. No automatic actions on module cgi possible.") diff --git a/plugins/modules/apk.py b/plugins/modules/apk.py index 7f1f83ce56..7ad5d5908e 100644 --- a/plugins/modules/apk.py +++ b/plugins/modules/apk.py @@ -47,8 +47,8 @@ options: version_added: 1.0.0 repository: description: - - A package repository or multiple repositories. Unlike with the underlying apk command, this list will override the - system repositories rather than supplement them. + - A package repository or multiple repositories. Unlike with the underlying apk command, this list overrides the system + repositories rather than supplement them. type: list elements: str state: @@ -79,7 +79,7 @@ options: version_added: 5.4.0 notes: - O(name) and O(upgrade) are mutually exclusive. - - When used with a C(loop:) each package will be processed individually, it is much more efficient to pass the list directly + - When used with a C(loop:) each package is processed individually, it is much more efficient to pass the list directly to the O(name) option. """ @@ -164,7 +164,7 @@ packages: description: A list of packages that have been changed. returned: when packages have changed type: list - sample: ['package', 'other-package'] + sample: ["package", "other-package"] """ import re @@ -351,6 +351,9 @@ def main(): p = module.params + if all(not name.strip() for name in p['name']): + module.fail_json(msg="Package name(s) cannot be empty or whitespace-only") + if p['no_cache']: APK_PATH = "%s --no-cache" % (APK_PATH, ) diff --git a/plugins/modules/apt_rpm.py b/plugins/modules/apt_rpm.py index c792dc2c57..1dcca5815c 100644 --- a/plugins/modules/apt_rpm.py +++ b/plugins/modules/apt_rpm.py @@ -36,8 +36,8 @@ options: description: - Indicates the desired package state. - The states V(latest) and V(present_not_latest) have been added in community.general 8.6.0. - - Please note before community.general 11.0.0, V(present) and V(installed) were equivalent to V(latest). - This changed in community.general 11.0.0. Now they are equivalent to V(present_not_latest). + - Please note before community.general 11.0.0, V(present) and V(installed) were equivalent to V(latest). This changed + in community.general 11.0.0. Now they are equivalent to V(present_not_latest). choices: - absent - present diff --git a/plugins/modules/archive.py b/plugins/modules/archive.py index 4e4b6368ce..65b397c255 100644 --- a/plugins/modules/archive.py +++ b/plugins/modules/archive.py @@ -43,7 +43,7 @@ options: - The file name of the destination archive. The parent directory must exists on the remote host. - This is required when O(path) refers to multiple files by either specifying a glob, a directory or multiple paths in a list. - - If the destination archive already exists, it will be truncated and overwritten. + - If the destination archive already exists, it is truncated and overwritten. type: path exclude_path: description: diff --git a/plugins/modules/awall.py b/plugins/modules/awall.py index b95f36ea8d..0bc4ca1d79 100644 --- a/plugins/modules/awall.py +++ b/plugins/modules/awall.py @@ -40,7 +40,7 @@ options: description: - Activate the new firewall rules. - Can be run with other steps or on its own. - - Idempotency is affected if O(activate=true), as the module will always report a changed state. + - Idempotency is affected if O(activate=true), as the module always reports a changed state. type: bool default: false notes: diff --git a/plugins/modules/beadm.py b/plugins/modules/beadm.py index 3d9d8ca651..0c200661f1 100644 --- a/plugins/modules/beadm.py +++ b/plugins/modules/beadm.py @@ -32,7 +32,7 @@ options: aliases: ["be"] snapshot: description: - - If specified, the new boot environment will be cloned from the given snapshot or inactive boot environment. + - If specified, the new boot environment is cloned from the given snapshot or inactive boot environment. type: str description: description: diff --git a/plugins/modules/bearychat.py b/plugins/modules/bearychat.py index 1dec1bce68..e738d83d36 100644 --- a/plugins/modules/bearychat.py +++ b/plugins/modules/bearychat.py @@ -33,7 +33,7 @@ options: - Message to send. markdown: description: - - If V(true), text will be parsed as markdown. + - If V(true), text is parsed as markdown. default: true type: bool channel: diff --git a/plugins/modules/bigpanda.py b/plugins/modules/bigpanda.py index aef9c15c92..81e2085b7d 100644 --- a/plugins/modules/bigpanda.py +++ b/plugins/modules/bigpanda.py @@ -75,7 +75,7 @@ options: default: "https://api.bigpanda.io" validate_certs: description: - - If V(false), SSL certificates for the target URL will not be validated. This should only be used on personally controlled + - If V(false), SSL certificates for the target URL are not validated. This should only be used on personally controlled sites using self-signed certificates. required: false default: true @@ -150,14 +150,14 @@ def main(): version=dict(required=True), token=dict(required=True, no_log=True), state=dict(required=True, choices=['started', 'finished', 'failed']), - hosts=dict(required=False, aliases=['host']), - env=dict(required=False), - owner=dict(required=False), - description=dict(required=False), - deployment_message=dict(required=False), - source_system=dict(required=False, default='ansible'), + hosts=dict(aliases=['host']), + env=dict(), + owner=dict(), + description=dict(), + deployment_message=dict(), + source_system=dict(default='ansible'), validate_certs=dict(default=True, type='bool'), - url=dict(required=False, default='https://api.bigpanda.io'), + url=dict(default='https://api.bigpanda.io'), ), supports_check_mode=True, ) diff --git a/plugins/modules/bitbucket_pipeline_known_host.py b/plugins/modules/bitbucket_pipeline_known_host.py index f5594dc8ac..eb8b22b4f0 100644 --- a/plugins/modules/bitbucket_pipeline_known_host.py +++ b/plugins/modules/bitbucket_pipeline_known_host.py @@ -13,8 +13,7 @@ module: bitbucket_pipeline_known_host short_description: Manages Bitbucket pipeline known hosts description: - Manages Bitbucket pipeline known hosts under the "SSH Keys" menu. - - The host fingerprint will be retrieved automatically, but in case of an error, one can use O(key) field to specify it - manually. + - The host fingerprint is retrieved automatically, but in case of an error, one can use O(key) field to specify it manually. author: - Evgeniy Krysanov (@catcombo) extends_documentation_fragment: diff --git a/plugins/modules/bootc_manage.py b/plugins/modules/bootc_manage.py index 44444960df..da92c02b06 100644 --- a/plugins/modules/bootc_manage.py +++ b/plugins/modules/bootc_manage.py @@ -20,7 +20,7 @@ options: state: description: - Control whether to apply the latest image or switch the image. - - B(Note:) This will not reboot the system. + - B(Note:) This does not reboot the system. - Please use M(ansible.builtin.reboot) to reboot the system. required: true type: str @@ -57,7 +57,7 @@ from ansible.module_utils.common.locale import get_best_parsable_locale def main(): argument_spec = dict( state=dict(type='str', required=True, choices=['switch', 'latest']), - image=dict(type='str', required=False), + image=dict(type='str'), ) module = AnsibleModule( argument_spec=argument_spec, diff --git a/plugins/modules/bower.py b/plugins/modules/bower.py index 3e7ebdaecc..547152fa98 100644 --- a/plugins/modules/bower.py +++ b/plugins/modules/bower.py @@ -187,13 +187,13 @@ class Bower(object): def main(): arg_spec = dict( - name=dict(default=None), + name=dict(), offline=dict(default=False, type='bool'), production=dict(default=False, type='bool'), path=dict(required=True, type='path'), - relative_execpath=dict(default=None, required=False, type='path'), + relative_execpath=dict(type='path'), state=dict(default='present', choices=['present', 'absent', 'latest', ]), - version=dict(default=None), + version=dict(), ) module = AnsibleModule( argument_spec=arg_spec diff --git a/plugins/modules/btrfs_info.py b/plugins/modules/btrfs_info.py index 0e432dfaff..9467fb782d 100644 --- a/plugins/modules/btrfs_info.py +++ b/plugins/modules/btrfs_info.py @@ -64,7 +64,7 @@ filesystems: mountpoints: description: Paths where the subvolume is mounted on the targeted host. type: list - sample: ['/home'] + sample: ["/home"] parent: description: The identifier of this subvolume's parent. type: int diff --git a/plugins/modules/btrfs_subvolume.py b/plugins/modules/btrfs_subvolume.py index 7e085d6103..3c34ef4680 100644 --- a/plugins/modules/btrfs_subvolume.py +++ b/plugins/modules/btrfs_subvolume.py @@ -64,9 +64,9 @@ options: no change is required. Warning, this option does not yet verify that the target subvolume was generated from a snapshot of the requested source. - V(clobber) - If a subvolume already exists at the requested location, delete it first. This option is not idempotent - and will result in a new snapshot being generated on every execution. + and results in a new snapshot being generated on every execution. - V(error) - If a subvolume already exists at the requested location, return an error. This option is not idempotent - and will result in an error on replay of the module. + and results in an error on replay of the module. type: str choices: [skip, clobber, error] default: skip @@ -80,8 +80,8 @@ options: notes: - If any or all of the options O(filesystem_device), O(filesystem_label) or O(filesystem_uuid) parameters are provided, there is expected to be a matching btrfs filesystem. If none are provided and only a single btrfs filesystem exists or - only a single btrfs filesystem is mounted, that filesystem will be used; otherwise, the module will take no action and - return an error. + only a single btrfs filesystem is mounted, that filesystem is used; otherwise, the module takes no action and returns an + error. extends_documentation_fragment: - community.general.attributes @@ -180,7 +180,7 @@ filesystem: mountpoints: description: Paths where the subvolume is mounted on the targeted host. type: list - sample: ['/home'] + sample: ["/home"] parent: description: The identifier of this subvolume's parent. type: int @@ -644,16 +644,16 @@ class BtrfsSubvolumeModule(object): def run_module(): module_args = dict( - automount=dict(type='bool', required=False, default=False), - default=dict(type='bool', required=False, default=False), - filesystem_device=dict(type='path', required=False), - filesystem_label=dict(type='str', required=False), - filesystem_uuid=dict(type='str', required=False), + automount=dict(type='bool', default=False), + default=dict(type='bool', default=False), + filesystem_device=dict(type='path'), + filesystem_label=dict(type='str'), + filesystem_uuid=dict(type='str'), name=dict(type='str', required=True), recursive=dict(type='bool', default=False), - state=dict(type='str', required=False, default='present', choices=['present', 'absent']), - snapshot_source=dict(type='str', required=False), - snapshot_conflict=dict(type='str', required=False, default='skip', choices=['skip', 'clobber', 'error']) + state=dict(type='str', default='present', choices=['present', 'absent']), + snapshot_source=dict(type='str'), + snapshot_conflict=dict(type='str', default='skip', choices=['skip', 'clobber', 'error']) ) module = AnsibleModule( diff --git a/plugins/modules/bundler.py b/plugins/modules/bundler.py index bfd7fe7ec1..6bf2556110 100644 --- a/plugins/modules/bundler.py +++ b/plugins/modules/bundler.py @@ -36,13 +36,13 @@ options: type: path description: - The directory to execute the bundler commands from. This directory needs to contain a valid Gemfile or .bundle/ directory. - - If not specified, it will default to the temporary working directory. + - If not specified, it defaults to the temporary working directory. exclude_groups: type: list elements: str description: - A list of Gemfile groups to exclude during operations. This only applies when O(state=present). Bundler considers - this a 'remembered' property for the Gemfile and will automatically exclude groups in future operations even if O(exclude_groups) + this a 'remembered' property for the Gemfile and automatically excludes groups in future operations even if O(exclude_groups) is not set. clean: description: @@ -53,7 +53,7 @@ options: type: path description: - Only applies if O(state=present). The path to the gemfile to use to install gems. - - If not specified it will default to the Gemfile in current directory. + - If not specified it defaults to the Gemfile in current directory. local: description: - If set only installs gems from the cache on the target host. @@ -61,8 +61,8 @@ options: default: false deployment_mode: description: - - Only applies if O(state=present). If set it will install gems in C(./vendor/bundle) instead of the default location. - Requires a C(Gemfile.lock) file to have been created prior. + - Only applies if O(state=present). If set it installs gems in C(./vendor/bundle) instead of the default location. Requires + a C(Gemfile.lock) file to have been created prior. type: bool default: false user_install: @@ -75,12 +75,12 @@ options: description: - Only applies if O(state=present). Specifies the directory to install the gems into. If O(chdir) is set then this path is relative to O(chdir). - - If not specified the default RubyGems gem paths will be used. + - If not specified the default RubyGems gem paths are used. binstub_directory: type: path description: - Only applies if O(state=present). Specifies the directory to install any gem bins files to. When executed the bin - files will run within the context of the Gemfile and fail if any required gem dependencies are not installed. If O(chdir) + files run within the context of the Gemfile and fail if any required gem dependencies are not installed. If O(chdir) is set then this path is relative to O(chdir). extra_args: type: str @@ -131,18 +131,18 @@ def get_bundler_executable(module): def main(): module = AnsibleModule( argument_spec=dict( - executable=dict(default=None, required=False), - state=dict(default='present', required=False, choices=['present', 'latest']), - chdir=dict(default=None, required=False, type='path'), - exclude_groups=dict(default=None, required=False, type='list', elements='str'), - clean=dict(default=False, required=False, type='bool'), - gemfile=dict(default=None, required=False, type='path'), - local=dict(default=False, required=False, type='bool'), - deployment_mode=dict(default=False, required=False, type='bool'), - user_install=dict(default=True, required=False, type='bool'), - gem_path=dict(default=None, required=False, type='path'), - binstub_directory=dict(default=None, required=False, type='path'), - extra_args=dict(default=None, required=False), + executable=dict(), + state=dict(default='present', choices=['present', 'latest']), + chdir=dict(type='path'), + exclude_groups=dict(type='list', elements='str'), + clean=dict(default=False, type='bool'), + gemfile=dict(type='path'), + local=dict(default=False, type='bool'), + deployment_mode=dict(default=False, type='bool'), + user_install=dict(default=True, type='bool'), + gem_path=dict(type='path'), + binstub_directory=dict(type='path'), + extra_args=dict(), ), supports_check_mode=True ) diff --git a/plugins/modules/bzr.py b/plugins/modules/bzr.py index 7a4512a5dd..76ae917802 100644 --- a/plugins/modules/bzr.py +++ b/plugins/modules/bzr.py @@ -42,12 +42,12 @@ options: type: str force: description: - - If V(true), any modified files in the working tree will be discarded. + - If V(true), any modified files in the working tree is discarded. type: bool default: false executable: description: - - Path to bzr executable to use. If not supplied, the normal mechanism for resolving binary paths will be used. + - Path to C(bzr) executable to use. If not supplied, the normal mechanism for resolving binary paths is used. type: str """ diff --git a/plugins/modules/campfire.py b/plugins/modules/campfire.py index 6d9d2f5e18..128790c372 100644 --- a/plugins/modules/campfire.py +++ b/plugins/modules/campfire.py @@ -14,7 +14,7 @@ module: campfire short_description: Send a message to Campfire description: - Send a message to Campfire. - - Messages with newlines will result in a "Paste" message being sent. + - Messages with newlines result in a "Paste" message being sent. extends_documentation_fragment: - community.general.attributes attributes: @@ -137,8 +137,7 @@ def main(): token=dict(required=True, no_log=True), room=dict(required=True), msg=dict(required=True), - notify=dict(required=False, - choices=["56k", "bell", "bezos", "bueller", + notify=dict(choices=["56k", "bell", "bezos", "bueller", "clowntown", "cottoneyejoe", "crickets", "dadgummit", "dangerzone", "danielsan", "deeper", "drama", diff --git a/plugins/modules/capabilities.py b/plugins/modules/capabilities.py index 088c15e4f6..b3143df0a4 100644 --- a/plugins/modules/capabilities.py +++ b/plugins/modules/capabilities.py @@ -40,10 +40,10 @@ options: choices: [absent, present] default: present notes: - - The capabilities system will automatically transform operators and flags into the effective set, so for example, C(cap_foo=ep) - will probably become C(cap_foo+ep). - - This module does not attempt to determine the final operator and flags to compare, so you will want to ensure that your - capabilities argument matches the final capabilities. + - The capabilities system automatically transforms operators and flags into the effective set, so for example, C(cap_foo=ep) + probably becomes C(cap_foo+ep). + - This module does not attempt to determine the final operator and flags to compare, so you want to ensure that your capabilities + argument matches the final capabilities. author: - Nate Coraor (@natefoo) """ diff --git a/plugins/modules/cargo.py b/plugins/modules/cargo.py index 4ad4b84396..c00983fade 100644 --- a/plugins/modules/cargo.py +++ b/plugins/modules/cargo.py @@ -28,7 +28,7 @@ options: executable: description: - Path to the C(cargo) installed in the system. - - If not specified, the module will look C(cargo) in E(PATH). + - If not specified, the module looks for C(cargo) in E(PATH). type: path version_added: 7.5.0 name: @@ -39,11 +39,11 @@ options: required: true path: description: The base path where to install the Rust packages. Cargo automatically appends V(/bin). In other words, V(/usr/local) - will become V(/usr/local/bin). + becomes V(/usr/local/bin). type: path version: - description: The version to install. If O(name) contains multiple values, the module will try to install all of them in - this version. + description: The version to install. If O(name) contains multiple values, the module tries to install all of them in this + version. type: str required: false locked: @@ -247,14 +247,14 @@ class Cargo(object): def main(): arg_spec = dict( - executable=dict(default=None, type="path"), + executable=dict(type="path"), name=dict(required=True, type="list", elements="str"), - path=dict(default=None, type="path"), + path=dict(type="path"), state=dict(default="present", choices=["present", "absent", "latest"]), - version=dict(default=None, type="str"), + version=dict(type="str"), locked=dict(default=False, type="bool"), - directory=dict(default=None, type="path"), - features=dict(default=[], required=False, type="list", elements="str"), + directory=dict(type="path"), + features=dict(default=[], type="list", elements="str"), ) module = AnsibleModule(argument_spec=arg_spec, supports_check_mode=True) diff --git a/plugins/modules/catapult.py b/plugins/modules/catapult.py index 5329c90f54..448de5d13d 100644 --- a/plugins/modules/catapult.py +++ b/plugins/modules/catapult.py @@ -16,6 +16,12 @@ module: catapult short_description: Send a sms / mms using the catapult bandwidth API description: - Allows notifications to be sent using SMS / MMS using the catapult bandwidth API. +deprecated: + removed_in: 13.0.0 + why: >- + DNS fails to resolve the API endpoint used by the module since Oct 2024. + See L(the associated issue, https://github.com/ansible-collections/community.general/issues/10318) for details. + alternative: There is none. extends_documentation_fragment: - community.general.attributes attributes: @@ -89,14 +95,6 @@ EXAMPLES = r""" api_secret: "{{ api_secret }}" """ -RETURN = r""" -changed: - description: Whether the API accepted the message. - returned: always - type: bool - sample: true -""" - import json @@ -132,7 +130,7 @@ def main(): user_id=dict(required=True), api_token=dict(required=True, no_log=True), api_secret=dict(required=True, no_log=True), - media=dict(default=None, required=False), + media=dict(), ), ) diff --git a/plugins/modules/cisco_webex.py b/plugins/modules/cisco_webex.py index 14b8716846..f957f4121d 100644 --- a/plugins/modules/cisco_webex.py +++ b/plugins/modules/cisco_webex.py @@ -177,7 +177,7 @@ def main(): argument_spec=dict( recipient_type=dict(required=True, choices=['roomId', 'toPersonEmail', 'toPersonId']), recipient_id=dict(required=True, no_log=True), - msg_type=dict(required=False, default='text', aliases=['message_type'], choices=['text', 'markdown']), + msg_type=dict(default='text', aliases=['message_type'], choices=['text', 'markdown']), personal_token=dict(required=True, no_log=True, aliases=['token']), msg=dict(required=True), ), diff --git a/plugins/modules/cloud_init_data_facts.py b/plugins/modules/cloud_init_data_facts.py index dd9825858e..544a663e5c 100644 --- a/plugins/modules/cloud_init_data_facts.py +++ b/plugins/modules/cloud_init_data_facts.py @@ -50,38 +50,41 @@ cloud_init_data_facts: description: Facts of result and status. returned: success type: dict - sample: '{ - "status": { + sample: + { + "status": { "v1": { - "datasource": "DataSourceCloudStack", - "errors": [] - }, - "result": { - "v1": { - "datasource": "DataSourceCloudStack", - "init": { - "errors": [], - "finished": 1522066377.0185432, - "start": 1522066375.2648022 - }, - "init-local": { - "errors": [], - "finished": 1522066373.70919, - "start": 1522066373.4726632 - }, - "modules-config": { - "errors": [], - "finished": 1522066380.9097016, - "start": 1522066379.0011985 - }, - "modules-final": { - "errors": [], - "finished": 1522066383.56594, - "start": 1522066382.3449218 - }, - "stage": null + "datasource": "DataSourceCloudStack", + "errors": [] } - }' + }, + "result": { + "v1": { + "datasource": "DataSourceCloudStack", + "init": { + "errors": [], + "finished": 1522066377.0185432, + "start": 1522066375.2648022 + }, + "init-local": { + "errors": [], + "finished": 1522066373.70919, + "start": 1522066373.4726632 + }, + "modules-config": { + "errors": [], + "finished": 1522066380.9097016, + "start": 1522066379.0011985 + }, + "modules-final": { + "errors": [], + "finished": 1522066383.56594, + "start": 1522066382.3449218 + }, + "stage": null + } + } + } """ import os diff --git a/plugins/modules/cloudflare_dns.py b/plugins/modules/cloudflare_dns.py index 0fd0f5ffcc..fafca00b50 100644 --- a/plugins/modules/cloudflare_dns.py +++ b/plugins/modules/cloudflare_dns.py @@ -127,7 +127,7 @@ options: description: - Whether the record should be the only one for that record type and record name. - Only use with O(state=present). - - This will delete all other records with the same record name and type. + - This deletes all other records with the same record name and type. type: bool state: description: @@ -157,8 +157,9 @@ options: - The type of DNS record to create. Required if O(state=present). - Support for V(SPF) has been removed from community.general 9.0.0 since that record type is no longer supported by CloudFlare. + - Support for V(PTR) has been added in community.general 11.1.0. type: str - choices: [A, AAAA, CNAME, DS, MX, NS, SRV, SSHFP, TLSA, CAA, TXT] + choices: [A, AAAA, CNAME, DS, MX, NS, SRV, SSHFP, TLSA, CAA, TXT, PTR] value: description: - The record value. @@ -311,6 +312,14 @@ EXAMPLES = r""" algorithm: 8 hash_type: 2 value: B4EB5AC4467D2DFB3BAF9FB9961DC1B6FED54A58CDFAA3E465081EC86F89BFAB + +- name: Create PTR record "1.2.0.192.in-addr.arpa" with value "test.example.com" + community.general.cloudflare_dns: + zone: 2.0.192.in-addr.arpa + record: 1 + type: PTR + value: test.example.com + state: present """ RETURN = r""" @@ -369,10 +378,7 @@ record: description: Extra Cloudflare-specific information about the record. returned: success type: dict - sample: - { - "auto_added": false - } + sample: {"auto_added": false} modified_on: description: Record modification date. returned: success @@ -403,7 +409,7 @@ record: returned: success type: list elements: str - sample: ['production', 'app'] + sample: ["production", "app"] version_added: 10.1.0 tags_modified_on: description: When the record tags were last modified. Omitted if there are no tags. @@ -442,9 +448,11 @@ from ansible.module_utils.urls import fetch_url def lowercase_string(param): - if not isinstance(param, str): - return param - return param.lower() + return param.lower() if isinstance(param, str) else param + + +def join_str(sep, *args): + return sep.join([str(arg) for arg in args]) class CloudflareAPI(object): @@ -490,29 +498,29 @@ class CloudflareAPI(object): if (self.type == 'AAAA') and (self.value is not None): self.value = self.value.lower() - if (self.type == 'SRV'): + if self.type == 'SRV': if (self.proto is not None) and (not self.proto.startswith('_')): - self.proto = '_' + self.proto + self.proto = '_{0}'.format(self.proto) if (self.service is not None) and (not self.service.startswith('_')): - self.service = '_' + self.service + self.service = '_{0}'.format(self.service) - if (self.type == 'TLSA'): + if self.type == 'TLSA': if (self.proto is not None) and (not self.proto.startswith('_')): - self.proto = '_' + self.proto + self.proto = '_{0}'.format(self.proto) if (self.port is not None): - self.port = '_' + str(self.port) + self.port = '_{0}'.format(self.port) if not self.record.endswith(self.zone): - self.record = self.record + '.' + self.zone + self.record = join_str('.', self.record, self.zone) - if (self.type == 'DS'): + if self.type == 'DS': if self.record == self.zone: self.module.fail_json(msg="DS records only apply to subdomains.") def _cf_simple_api_call(self, api_call, method='GET', payload=None): if self.api_token: headers = { - 'Authorization': 'Bearer ' + self.api_token, + 'Authorization': 'Bearer {0}'.format(self.api_token), 'Content-Type': 'application/json', } else: @@ -612,7 +620,7 @@ class CloudflareAPI(object): else: raw_api_call = api_call while next_page <= pagination['total_pages']: - raw_api_call += '?' + '&'.join(parameters) + raw_api_call += '?{0}'.format('&'.join(parameters)) result, status = self._cf_simple_api_call(raw_api_call, method, payload) data += result['result'] next_page += 1 @@ -637,8 +645,8 @@ class CloudflareAPI(object): name = self.zone param = '' if name: - param = '?' + urlencode({'name': name}) - zones, status = self._cf_api_call('/zones' + param) + param = '?{0}'.format(urlencode({'name': name})) + zones, status = self._cf_api_call('/zones{0}'.format(param)) return zones def get_dns_records(self, zone_name=None, type=None, record=None, value=''): @@ -663,48 +671,40 @@ class CloudflareAPI(object): if value: query['content'] = value if query: - api_call += '?' + urlencode(query) + api_call += '?{0}'.format(urlencode(query)) records, status = self._cf_api_call(api_call) return records - def delete_dns_records(self, **kwargs): - params = {} - for param in ['port', 'proto', 'service', 'solo', 'type', 'record', 'value', 'weight', 'zone', - 'algorithm', 'cert_usage', 'hash_type', 'selector', 'key_tag', 'flag', 'tag']: - if param in kwargs: - params[param] = kwargs[param] - else: - params[param] = getattr(self, param) - + def delete_dns_records(self, solo): records = [] - content = params['value'] - search_record = params['record'] - if params['type'] == 'SRV': - if not (params['value'] is None or params['value'] == ''): - content = str(params['weight']) + '\t' + str(params['port']) + '\t' + params['value'] - search_record = params['service'] + '.' + params['proto'] + '.' + params['record'] - elif params['type'] == 'DS': - if not (params['value'] is None or params['value'] == ''): - content = str(params['key_tag']) + '\t' + str(params['algorithm']) + '\t' + str(params['hash_type']) + '\t' + params['value'] - elif params['type'] == 'SSHFP': - if not (params['value'] is None or params['value'] == ''): - content = str(params['algorithm']) + ' ' + str(params['hash_type']) + ' ' + params['value'].upper() - elif params['type'] == 'TLSA': - if not (params['value'] is None or params['value'] == ''): - content = str(params['cert_usage']) + '\t' + str(params['selector']) + '\t' + str(params['hash_type']) + '\t' + params['value'] - search_record = params['port'] + '.' + params['proto'] + '.' + params['record'] - if params['solo']: + content = self.value + search_record = self.record + if self.type == 'SRV': + if not (self.value is None or self.value == ''): + content = join_str('\t', self.weight, self.port, self.value) + search_record = join_str('.', self.service, self.proto, self.record) + elif self.type == 'DS': + if not (self.value is None or self.value == ''): + content = join_str('\t', self.key_tag, self.algorithm, self.hash_type, self.value) + elif self.type == 'SSHFP': + if not (self.value is None or self.value == ''): + content = join_str(' ', self.algorithm, self.hash_type, self.value.upper()) + elif self.type == 'TLSA': + if not (self.value is None or self.value == ''): + content = join_str('\t', self.cert_usage, self.selector, self.hash_type, self.value) + search_record = join_str('.', self.port, self.proto, self.record) + if solo: search_value = None else: search_value = content - zone_id = self._get_zone_id(params['zone']) - records = self.get_dns_records(params['zone'], params['type'], search_record, search_value) + zone_id = self._get_zone_id(self.zone) + records = self.get_dns_records(self.zone, self.type, search_record, search_value) for rr in records: - if params['solo']: - if not ((rr['type'] == params['type']) and (rr['name'] == search_record) and (rr['content'] == content)): + if solo: + if not ((rr['type'] == self.type) and (rr['name'] == search_record) and (rr['content'] == content)): self.changed = True if not self.module.check_mode: result, info = self._cf_api_call('/zones/{0}/dns_records/{1}'.format(zone_id, rr['id']), 'DELETE') @@ -714,156 +714,146 @@ class CloudflareAPI(object): result, info = self._cf_api_call('/zones/{0}/dns_records/{1}'.format(zone_id, rr['id']), 'DELETE') return self.changed - def ensure_dns_record(self, **kwargs): - params = {} - for param in ['port', 'priority', 'proto', 'proxied', 'service', 'ttl', 'type', 'record', 'value', 'weight', 'zone', - 'algorithm', 'cert_usage', 'hash_type', 'selector', 'key_tag', 'flag', 'tag', 'tags', 'comment']: - if param in kwargs: - params[param] = kwargs[param] - else: - params[param] = getattr(self, param) - - search_value = params['value'] - search_record = params['record'] + def ensure_dns_record(self): + search_value = self.value + search_record = self.record new_record = None - if (params['type'] is None) or (params['record'] is None): - self.module.fail_json(msg="You must provide a type and a record to create a new record") - if (params['type'] in ['A', 'AAAA', 'CNAME', 'TXT', 'MX', 'NS']): - if not params['value']: + if self.type in ['A', 'AAAA', 'CNAME', 'TXT', 'MX', 'NS', 'PTR']: + if not self.value: self.module.fail_json(msg="You must provide a non-empty value to create this record type") # there can only be one CNAME per record # ignoring the value when searching for existing # CNAME records allows us to update the value if it # changes - if params['type'] == 'CNAME': + if self.type == 'CNAME': search_value = None new_record = { - "type": params['type'], - "name": params['record'], - "content": params['value'], - "ttl": params['ttl'] + "type": self.type, + "name": self.record, + "content": self.value, + "ttl": self.ttl } - if (params['type'] in ['A', 'AAAA', 'CNAME']): - new_record["proxied"] = params["proxied"] + if self.type in ['A', 'AAAA', 'CNAME']: + new_record["proxied"] = self.proxied - if params['type'] == 'MX': - for attr in [params['priority'], params['value']]: + if self.type == 'MX': + for attr in [self.priority, self.value]: if (attr is None) or (attr == ''): self.module.fail_json(msg="You must provide priority and a value to create this record type") new_record = { - "type": params['type'], - "name": params['record'], - "content": params['value'], - "priority": params['priority'], - "ttl": params['ttl'] + "type": self.type, + "name": self.record, + "content": self.value, + "priority": self.priority, + "ttl": self.ttl } - if params['type'] == 'SRV': - for attr in [params['port'], params['priority'], params['proto'], params['service'], params['weight'], params['value']]: + if self.type == 'SRV': + for attr in [self.port, self.priority, self.proto, self.service, self.weight, self.value]: if (attr is None) or (attr == ''): self.module.fail_json(msg="You must provide port, priority, proto, service, weight and a value to create this record type") srv_data = { - "target": params['value'], - "port": params['port'], - "weight": params['weight'], - "priority": params['priority'], + "target": self.value, + "port": self.port, + "weight": self.weight, + "priority": self.priority, } new_record = { - "type": params['type'], - "name": params['service'] + '.' + params['proto'] + '.' + params['record'], - "ttl": params['ttl'], + "type": self.type, + "name": join_str('.', self.service, self.proto, self.record), + "ttl": self.ttl, 'data': srv_data, } - search_value = str(params['weight']) + '\t' + str(params['port']) + '\t' + params['value'] - search_record = params['service'] + '.' + params['proto'] + '.' + params['record'] + search_value = join_str('\t', self.weight, self.port, self.value) + search_record = join_str('.', self.service, self.proto, self.record) - if params['type'] == 'DS': - for attr in [params['key_tag'], params['algorithm'], params['hash_type'], params['value']]: + if self.type == 'DS': + for attr in [self.key_tag, self.algorithm, self.hash_type, self.value]: if (attr is None) or (attr == ''): self.module.fail_json(msg="You must provide key_tag, algorithm, hash_type and a value to create this record type") ds_data = { - "key_tag": params['key_tag'], - "algorithm": params['algorithm'], - "digest_type": params['hash_type'], - "digest": params['value'], + "key_tag": self.key_tag, + "algorithm": self.algorithm, + "digest_type": self.hash_type, + "digest": self.value, } new_record = { - "type": params['type'], - "name": params['record'], + "type": self.type, + "name": self.record, 'data': ds_data, - "ttl": params['ttl'], + "ttl": self.ttl, } - search_value = str(params['key_tag']) + '\t' + str(params['algorithm']) + '\t' + str(params['hash_type']) + '\t' + params['value'] + search_value = join_str('\t', self.key_tag, self.algorithm, self.hash_type, self.value) - if params['type'] == 'SSHFP': - for attr in [params['algorithm'], params['hash_type'], params['value']]: + if self.type == 'SSHFP': + for attr in [self.algorithm, self.hash_type, self.value]: if (attr is None) or (attr == ''): self.module.fail_json(msg="You must provide algorithm, hash_type and a value to create this record type") sshfp_data = { - "fingerprint": params['value'].upper(), - "type": params['hash_type'], - "algorithm": params['algorithm'], + "fingerprint": self.value.upper(), + "type": self.hash_type, + "algorithm": self.algorithm, } new_record = { - "type": params['type'], - "name": params['record'], + "type": self.type, + "name": self.record, 'data': sshfp_data, - "ttl": params['ttl'], + "ttl": self.ttl, } - search_value = str(params['algorithm']) + ' ' + str(params['hash_type']) + ' ' + params['value'] + search_value = join_str(' ', self.algorithm, self.hash_type, self.value) - if params['type'] == 'TLSA': - for attr in [params['port'], params['proto'], params['cert_usage'], params['selector'], params['hash_type'], params['value']]: + if self.type == 'TLSA': + for attr in [self.port, self.proto, self.cert_usage, self.selector, self.hash_type, self.value]: if (attr is None) or (attr == ''): self.module.fail_json(msg="You must provide port, proto, cert_usage, selector, hash_type and a value to create this record type") - search_record = params['port'] + '.' + params['proto'] + '.' + params['record'] + search_record = join_str('.', self.port, self.proto, self.record) tlsa_data = { - "usage": params['cert_usage'], - "selector": params['selector'], - "matching_type": params['hash_type'], - "certificate": params['value'], + "usage": self.cert_usage, + "selector": self.selector, + "matching_type": self.hash_type, + "certificate": self.value, } new_record = { - "type": params['type'], + "type": self.type, "name": search_record, 'data': tlsa_data, - "ttl": params['ttl'], + "ttl": self.ttl, } - search_value = str(params['cert_usage']) + '\t' + str(params['selector']) + '\t' + str(params['hash_type']) + '\t' + params['value'] + search_value = join_str('\t', self.cert_usage, self.selector, self.hash_type, self.value) - if params['type'] == 'CAA': - for attr in [params['flag'], params['tag'], params['value']]: - if (attr is None) or (attr == ''): + if self.type == 'CAA': + for attr in [self.flag, self.tag, self.value]: + if attr == '': self.module.fail_json(msg="You must provide flag, tag and a value to create this record type") caa_data = { - "flags": params['flag'], - "tag": params['tag'], - "value": params['value'], + "flags": self.flag, + "tag": self.tag, + "value": self.value, } new_record = { - "type": params['type'], - "name": params['record'], + "type": self.type, + "name": self.record, 'data': caa_data, - "ttl": params['ttl'], + "ttl": self.ttl, } search_value = None - new_record['comment'] = params['comment'] or None - new_record['tags'] = params['tags'] or [] + new_record['comment'] = self.comment or None + new_record['tags'] = self.tags or [] - zone_id = self._get_zone_id(params['zone']) - records = self.get_dns_records(params['zone'], params['type'], search_record, search_value) + zone_id = self._get_zone_id(self.zone) + records = self.get_dns_records(self.zone, self.type, search_record, search_value) # in theory this should be impossible as cloudflare does not allow # the creation of duplicate records but lets cover it anyways if len(records) > 1: # As Cloudflare API cannot filter record containing quotes # CAA records must be compared locally - if params['type'] == 'CAA': + if self.type == 'CAA': for rr in records: if rr['data']['flags'] == caa_data['flags'] and rr['data']['tag'] == caa_data['tag'] and rr['data']['value'] == caa_data['value']: return rr, self.changed @@ -873,16 +863,16 @@ class CloudflareAPI(object): if len(records) == 1: cur_record = records[0] do_update = False - if (params['ttl'] is not None) and (cur_record['ttl'] != params['ttl']): + if (self.ttl is not None) and (cur_record['ttl'] != self.ttl): do_update = True - if (params['priority'] is not None) and ('priority' in cur_record) and (cur_record['priority'] != params['priority']): + if (self.priority is not None) and ('priority' in cur_record) and (cur_record['priority'] != self.priority): do_update = True - if ('proxied' in new_record) and ('proxied' in cur_record) and (cur_record['proxied'] != params['proxied']): + if ('proxied' in new_record) and ('proxied' in cur_record) and (cur_record['proxied'] != self.proxied): do_update = True if ('data' in new_record) and ('data' in cur_record): - if (cur_record['data'] != new_record['data']): + if cur_record['data'] != new_record['data']: do_update = True - if (params['type'] == 'CNAME') and (cur_record['content'] != new_record['content']): + if (self.type == 'CNAME') and (cur_record['content'] != new_record['content']): do_update = True if cur_record['comment'] != new_record['comment']: do_update = True @@ -908,14 +898,9 @@ class CloudflareAPI(object): def main(): module = AnsibleModule( argument_spec=dict( - api_token=dict( - type="str", - required=False, - no_log=True, - fallback=(env_fallback, ["CLOUDFLARE_TOKEN"]), - ), - account_api_key=dict(type='str', required=False, no_log=True, aliases=['account_api_token']), - account_email=dict(type='str', required=False), + api_token=dict(type="str", no_log=True, fallback=(env_fallback, ["CLOUDFLARE_TOKEN"])), + account_api_key=dict(type='str', no_log=True, aliases=['account_api_token']), + account_email=dict(type='str'), algorithm=dict(type='int'), cert_usage=dict(type='int', choices=[0, 1, 2, 3]), comment=dict(type='str'), @@ -935,7 +920,7 @@ def main(): state=dict(type='str', default='present', choices=['absent', 'present']), timeout=dict(type='int', default=30), ttl=dict(type='int', default=1), - type=dict(type='str', choices=['A', 'AAAA', 'CNAME', 'DS', 'MX', 'NS', 'SRV', 'SSHFP', 'TLSA', 'CAA', 'TXT']), + type=dict(type='str', choices=['A', 'AAAA', 'CNAME', 'DS', 'MX', 'NS', 'SRV', 'SSHFP', 'TLSA', 'CAA', 'TXT', 'PTR']), value=dict(type='str', aliases=['content']), weight=dict(type='int', default=1), zone=dict(type='str', required=True, aliases=['domain']), @@ -944,20 +929,21 @@ def main(): required_if=[ ('state', 'present', ['record', 'type', 'value']), ('state', 'absent', ['record']), - ('type', 'SRV', ['proto', 'service']), + ('type', 'SRV', ['proto', 'service', 'value']), ('type', 'TLSA', ['proto', 'port']), - ('type', 'CAA', ['flag', 'tag']), + ('type', 'CAA', ['flag', 'tag', 'value']), + ], + required_together=[ + ('account_api_key', 'account_email'), + ], + required_one_of=[ + ['api_token', 'account_api_key'], ], ) - if not module.params['api_token'] and not (module.params['account_api_key'] and module.params['account_email']): - module.fail_json(msg="Either api_token or account_api_key and account_email params are required.") if module.params['type'] == 'SRV': - if not ((module.params['weight'] is not None and module.params['port'] is not None - and not (module.params['value'] is None or module.params['value'] == '')) - or (module.params['weight'] is None and module.params['port'] is None - and (module.params['value'] is None or module.params['value'] == ''))): - module.fail_json(msg="For SRV records the params weight, port and value all need to be defined, or not at all.") + if not module.params['value'] == '': + module.fail_json(msg="For SRV records the params weight, port and value all need to be defined.") if module.params['type'] == 'SSHFP': if not ((module.params['algorithm'] is not None and module.params['hash_type'] is not None @@ -974,11 +960,8 @@ def main(): module.fail_json(msg="For TLSA records the params cert_usage, selector, hash_type and value all need to be defined, or not at all.") if module.params['type'] == 'CAA': - if not ((module.params['flag'] is not None and module.params['tag'] is not None - and not (module.params['value'] is None or module.params['value'] == '')) - or (module.params['flag'] is None and module.params['tag'] is None - and (module.params['value'] is None or module.params['value'] == ''))): - module.fail_json(msg="For CAA records the params flag, tag and value all need to be defined, or not at all.") + if not module.params['value'] == '': + module.fail_json(msg="For CAA records the params flag, tag and value all need to be defined.") if module.params['type'] == 'DS': if not ((module.params['key_tag'] is not None and module.params['algorithm'] is not None and module.params['hash_type'] is not None diff --git a/plugins/modules/cobbler_sync.py b/plugins/modules/cobbler_sync.py index 95a3241b98..b1c92a1690 100644 --- a/plugins/modules/cobbler_sync.py +++ b/plugins/modules/cobbler_sync.py @@ -42,12 +42,12 @@ options: type: str use_ssl: description: - - If V(false), an HTTP connection will be used instead of the default HTTPS connection. + - If V(false), an HTTP connection is used instead of the default HTTPS connection. type: bool default: true validate_certs: description: - - If V(false), SSL certificates will not be validated. + - If V(false), SSL certificates are not validated. - This should only set to V(false) when used on personally controlled sites using self-signed certificates. type: bool default: true diff --git a/plugins/modules/cobbler_system.py b/plugins/modules/cobbler_system.py index 83714dbc69..a1a400928e 100644 --- a/plugins/modules/cobbler_system.py +++ b/plugins/modules/cobbler_system.py @@ -42,12 +42,12 @@ options: type: str use_ssl: description: - - If V(false), an HTTP connection will be used instead of the default HTTPS connection. + - If V(false), an HTTP connection is used instead of the default HTTPS connection. type: bool default: true validate_certs: description: - - If V(false), SSL certificates will not be validated. + - If V(false), SSL certificates are not validated. - This should only set to V(false) when used on personally controlled sites using self-signed certificates. type: bool default: true diff --git a/plugins/modules/composer.py b/plugins/modules/composer.py index 6c935bfe75..735b4d2d36 100644 --- a/plugins/modules/composer.py +++ b/plugins/modules/composer.py @@ -17,7 +17,7 @@ author: short_description: Dependency Manager for PHP description: - Composer is a tool for dependency management in PHP. It allows you to declare the dependent libraries your project needs - and it will install them in your project for you. + and it installs them in your project for you. extends_documentation_fragment: - community.general.attributes attributes: @@ -45,7 +45,7 @@ options: type: path description: - Directory of your project (see C(--working-dir)). This is required when the command is not run globally. - - Will be ignored if O(global_command=true). + - This is ignored if O(global_command=true). global_command: description: - Runs the specified command globally. diff --git a/plugins/modules/consul.py b/plugins/modules/consul.py index 645ffe5bbd..9c36ba65f2 100644 --- a/plugins/modules/consul.py +++ b/plugins/modules/consul.py @@ -21,8 +21,8 @@ description: name and ID respectively by appending V(service:) Node level checks require a O(check_name) and optionally a O(check_id). - Currently, there is no complete way to retrieve the script, interval or TTL metadata for a registered check. Without this metadata it is not possible to tell if the data supplied with ansible represents a change to a check. As a result this - does not attempt to determine changes and will always report a changed occurred. An API method is planned to supply this - metadata so at that stage change management will be added. + does not attempt to determine changes and it always reports a changed occurred. An API method is planned to supply this + metadata so at that stage change management is to be added. - See U(http://consul.io) for more details. requirements: - python-consul @@ -83,25 +83,25 @@ options: service_address: type: str description: - - The address to advertise that the service will be listening on. This value will be passed as the C(address) parameter - to Consul's C(/v1/agent/service/register) API method, so refer to the Consul API documentation for further details. + - The address to advertise that the service is listening on. This value is passed as the C(address) parameter to Consul's + C(/v1/agent/service/register) API method, so refer to the Consul API documentation for further details. tags: type: list elements: str description: - - Tags that will be attached to the service registration. + - Tags that are attached to the service registration. script: type: str description: - - The script/command that will be run periodically to check the health of the service. + - The script/command that is run periodically to check the health of the service. - Requires O(interval) to be provided. - Mutually exclusive with O(ttl), O(tcp) and O(http). interval: type: str description: - - The interval at which the service check will be run. This is a number with a V(s) or V(m) suffix to signify the units - of seconds or minutes, for example V(15s) or V(1m). If no suffix is supplied V(s) will be used by default, for example - V(10) will be V(10s). + - The interval at which the service check is run. This is a number with a V(s) or V(m) suffix to signify the units of + seconds or minutes, for example V(15s) or V(1m). If no suffix is supplied V(s) is used by default, for example V(10) + is V(10s). - Required if one of the parameters O(script), O(http), or O(tcp) is specified. check_id: type: str @@ -122,25 +122,25 @@ options: ttl: type: str description: - - Checks can be registered with a TTL instead of a O(script) and O(interval) this means that the service will check - in with the agent before the TTL expires. If it does not the check will be considered failed. Required if registering - a check and the script an interval are missing Similar to the interval this is a number with a V(s) or V(m) suffix - to signify the units of seconds or minutes, for example V(15s) or V(1m). If no suffix is supplied V(s) will be used - by default, for example V(10) will be V(10s). + - Checks can be registered with a TTL instead of a O(script) and O(interval) this means that the service checks in with + the agent before the TTL expires. If it does not the check is considered failed. Required if registering a check and + the script an interval are missing Similar to the interval this is a number with a V(s) or V(m) suffix to signify + the units of seconds or minutes, for example V(15s) or V(1m). If no suffix is supplied V(s) is used by default, for + example V(10) is equivalent to V(10s). - Mutually exclusive with O(script), O(tcp) and O(http). tcp: type: str description: - - Checks can be registered with a TCP port. This means that Consul will check if the connection attempt to that port - is successful (that is, the port is currently accepting connections). The format is V(host:port), for example V(localhost:80). + - Checks can be registered with a TCP port. This means that Consul checks if the connection attempt to that port is + successful (that is, the port is currently accepting connections). The format is V(host:port), for example V(localhost:80). - Requires O(interval) to be provided. - Mutually exclusive with O(script), O(ttl) and O(http). version_added: '1.3.0' http: type: str description: - - Checks can be registered with an HTTP endpoint. This means that Consul will check that the http endpoint returns a - successful HTTP status. + - Checks can be registered with an HTTP endpoint. This means that Consul checks that the http endpoint returns a successful + HTTP status. - Requires O(interval) to be provided. - Mutually exclusive with O(script), O(ttl) and O(tcp). timeout: @@ -148,7 +148,7 @@ options: description: - A custom HTTP check timeout. The Consul default is 10 seconds. Similar to the interval this is a number with a V(s) or V(m) suffix to signify the units of seconds or minutes, for example V(15s) or V(1m). If no suffix is supplied V(s) - will be used by default, for example V(10) will be V(10s). + is used by default, for example V(10) is equivalent to V(10s). token: type: str description: diff --git a/plugins/modules/consul_acl_bootstrap.py b/plugins/modules/consul_acl_bootstrap.py index 7002c3d549..ba6adf2dd3 100644 --- a/plugins/modules/consul_acl_bootstrap.py +++ b/plugins/modules/consul_acl_bootstrap.py @@ -50,7 +50,7 @@ RETURN = r""" result: description: - The bootstrap result as returned by the Consul HTTP API. - - B(Note:) If O(bootstrap_secret) has been specified the C(SecretID) and C(ID) will not contain the secret but C(VALUE_SPECIFIED_IN_NO_LOG_PARAMETER). + - B(Note:) If O(bootstrap_secret) has been specified the C(SecretID) and C(ID) do not contain the secret but C(VALUE_SPECIFIED_IN_NO_LOG_PARAMETER). If you pass O(bootstrap_secret), make sure your playbook/role does not depend on this return value! returned: changed type: dict diff --git a/plugins/modules/consul_agent_check.py b/plugins/modules/consul_agent_check.py index ca1639063c..51d9715e88 100644 --- a/plugins/modules/consul_agent_check.py +++ b/plugins/modules/consul_agent_check.py @@ -17,9 +17,9 @@ description: - Allows the addition, modification and deletion of checks in a Consul cluster using the agent. For more details on using and configuring Checks, see U(https://developer.hashicorp.com/consul/api-docs/agent/check). - Currently, there is no complete way to retrieve the script, interval or TTL metadata for a registered check. Without this - metadata it is not possible to tell if the data supplied with ansible represents a change to a check. As a result this - does not attempt to determine changes and will always report a changed occurred. An API method is planned to supply this - metadata so at that stage change management will be added. + metadata it is not possible to tell if the data supplied with ansible represents a change to a check. As a result, the + module does not attempt to determine changes and it always reports a changed occurred. An API method is planned to supply + this metadata so at that stage change management is to be added. author: - Michael Ilg (@Ilgmi) extends_documentation_fragment: @@ -36,8 +36,8 @@ attributes: diff_mode: support: partial details: - - In check mode the diff will show the object as it is defined in the module options and not the object structure of - the Consul API. + - In check mode the diff shows the object as it is defined in the module options and not the object structure of the + Consul API. options: state: description: @@ -52,13 +52,13 @@ options: id: description: - Specifies a unique ID for this check on the node. This defaults to the O(name) parameter, but it may be necessary - to provide an ID for uniqueness. This value will return in the response as "CheckId". + to provide an ID for uniqueness. This value is returned in the response as V(CheckId). type: str interval: description: - - The interval at which the service check will be run. This is a number with a V(s) or V(m) suffix to signify the units - of seconds or minutes, for example V(15s) or V(1m). If no suffix is supplied V(s) will be used by default, for example - V(10) will be V(10s). + - The interval at which the service check is run. This is a number with a V(s) or V(m) suffix to signify the units of + seconds or minutes, for example V(15s) or V(1m). If no suffix is supplied V(s) is used by default, for example V(10) + is equivalent to V(10s). - Required if one of the parameters O(args), O(http), or O(tcp) is specified. type: str notes: @@ -74,11 +74,11 @@ options: elements: str ttl: description: - - Checks can be registered with a TTL instead of a O(args) and O(interval) this means that the service will check in - with the agent before the TTL expires. If it does not the check will be considered failed. Required if registering - a check and the script an interval are missing Similar to the interval this is a number with a V(s) or V(m) suffix - to signify the units of seconds or minutes, for example V(15s) or V(1m). If no suffix is supplied V(s) will be used - by default, for example V(10) will be V(10s). + - Checks can be registered with a TTL instead of a O(args) and O(interval) this means that the service checks in with + the agent before the TTL expires. If it does not the check is considered failed. Required if registering a check and + the script an interval are missing Similar to the interval this is a number with a V(s) or V(m) suffix to signify + the units of seconds or minutes, for example V(15s) or V(1m). If no suffix is supplied V(s) is used by default, for + example V(10) is equivalent to V(10s). - Mutually exclusive with O(args), O(tcp) and O(http). type: str tcp: @@ -91,8 +91,8 @@ options: version_added: '1.3.0' http: description: - - Checks can be registered with an HTTP endpoint. This means that Consul will check that the http endpoint returns a - successful HTTP status. + - Checks can be registered with an HTTP endpoint. This means that Consul checks that the HTTP endpoint returns a successful + HTTP status. - Requires O(interval) to be provided. - Mutually exclusive with O(args), O(ttl) and O(tcp). type: str @@ -100,7 +100,7 @@ options: description: - A custom HTTP check timeout. The Consul default is 10 seconds. Similar to the interval this is a number with a V(s) or V(m) suffix to signify the units of seconds or minutes, for example V(15s) or V(1m). If no suffix is supplied V(s) - will be used by default, for example V(10) will be V(10s). + is used by default, for example V(10) is equivalent to V(10s). type: str service_id: description: diff --git a/plugins/modules/consul_agent_service.py b/plugins/modules/consul_agent_service.py index bd28dfd2c3..882e45dceb 100644 --- a/plugins/modules/consul_agent_service.py +++ b/plugins/modules/consul_agent_service.py @@ -31,7 +31,7 @@ attributes: diff_mode: support: partial details: - - In check mode the diff will miss operational attributes. + - In check mode the diff misses operational attributes. options: state: description: @@ -50,13 +50,13 @@ options: type: str tags: description: - - Tags that will be attached to the service registration. + - Tags that are attached to the service registration. type: list elements: str address: description: - - The address to advertise that the service will be listening on. This value will be passed as the C(address) parameter - to Consul's C(/v1/agent/service/register) API method, so refer to the Consul API documentation for further details. + - The address to advertise that the service listens on. This value is passed as the C(address) parameter to Consul's + C(/v1/agent/service/register) API method, so refer to the Consul API documentation for further details. type: str meta: description: diff --git a/plugins/modules/consul_auth_method.py b/plugins/modules/consul_auth_method.py index a5cfd3b305..4658f906e3 100644 --- a/plugins/modules/consul_auth_method.py +++ b/plugins/modules/consul_auth_method.py @@ -29,7 +29,7 @@ attributes: diff_mode: support: partial details: - - In check mode the diff will miss operational attributes. + - In check mode the diff misses operational attributes. options: state: description: @@ -71,7 +71,7 @@ options: config: description: - The raw configuration to use for the chosen auth method. - - Contents will vary depending upon the type chosen. + - Contents vary depending upon the O(type) chosen. - Required when the auth method is created. type: dict """ diff --git a/plugins/modules/consul_binding_rule.py b/plugins/modules/consul_binding_rule.py index 698ba5913f..0a4531fdf7 100644 --- a/plugins/modules/consul_binding_rule.py +++ b/plugins/modules/consul_binding_rule.py @@ -29,7 +29,7 @@ attributes: diff_mode: support: partial details: - - In check mode the diff will miss operational attributes. + - In check mode the diff misses operational attributes. options: state: description: diff --git a/plugins/modules/consul_kv.py b/plugins/modules/consul_kv.py index 8152dd5c25..2987e71a86 100644 --- a/plugins/modules/consul_kv.py +++ b/plugins/modules/consul_kv.py @@ -36,12 +36,12 @@ options: state: description: - The action to take with the supplied key and value. If the state is V(present) and O(value) is set, the key contents - will be set to the value supplied and C(changed) will be set to V(true) only if the value was different to the current - contents. If the state is V(present) and O(value) is not set, the existing value associated to the key will be returned. - The state V(absent) will remove the key/value pair, again C(changed) will be set to V(true) only if the key actually - existed prior to the removal. An attempt can be made to obtain or free the lock associated with a key/value pair with - the states V(acquire) or V(release) respectively. A valid session must be supplied to make the attempt C(changed) - will be V(true) if the attempt is successful, V(false) otherwise. + is set to the value supplied and C(changed) is set to V(true) only if the value was different to the current contents. + If the state is V(present) and O(value) is not set, the existing value associated to the key is returned. The state + V(absent) is used to remove the key/value pair, again C(changed) is set to V(true) only if the key actually existed + prior to the removal. An attempt can be made to obtain or free the lock associated with a key/value pair with the + states V(acquire) or V(release) respectively. A valid session must be supplied to make the attempt C(changed) is V(true) + if the attempt is successful, V(false) otherwise. type: str choices: [absent, acquire, present, release] default: present @@ -73,9 +73,8 @@ options: type: str cas: description: - - Used when acquiring a lock with a session. If the O(cas) is V(0), then Consul will only put the key if it does not - already exist. If the O(cas) value is non-zero, then the key is only set if the index matches the ModifyIndex of that - key. + - Used when acquiring a lock with a session. If the O(cas) is V(0), then Consul only puts the key if it does not already + exist. If the O(cas) value is non-zero, then the key is only set if the index matches the ModifyIndex of that key. type: str flags: description: @@ -103,8 +102,7 @@ options: default: true datacenter: description: - - The name of the datacenter to query. If unspecified, the query will default to the datacenter of the Consul agent - on O(host). + - The name of the datacenter to query. If unspecified, the query defaults to the datacenter of the Consul agent on O(host). type: str version_added: 10.0.0 """ @@ -302,7 +300,7 @@ def main(): module = AnsibleModule( argument_spec=dict( cas=dict(type='str'), - datacenter=dict(type='str', default=None), + datacenter=dict(type='str'), flags=dict(type='str'), key=dict(type='str', required=True, no_log=False), host=dict(type='str', default='localhost'), diff --git a/plugins/modules/consul_policy.py b/plugins/modules/consul_policy.py index c9758780b2..e009e44434 100644 --- a/plugins/modules/consul_policy.py +++ b/plugins/modules/consul_policy.py @@ -31,7 +31,7 @@ attributes: support: partial version_added: 8.3.0 details: - - In check mode the diff will miss operational attributes. + - In check mode the diff misses operational attributes. action_group: version_added: 8.3.0 options: @@ -132,7 +132,7 @@ from ansible_collections.community.general.plugins.module_utils.consul import ( _ARGUMENT_SPEC = { "name": dict(required=True), - "description": dict(required=False, type="str"), + "description": dict(type="str"), "rules": dict(type="str"), "valid_datacenters": dict(type="list", elements="str"), "state": dict(default="present", choices=["present", "absent"]), diff --git a/plugins/modules/consul_role.py b/plugins/modules/consul_role.py index 5e22496660..4efbef699a 100644 --- a/plugins/modules/consul_role.py +++ b/plugins/modules/consul_role.py @@ -29,7 +29,7 @@ attributes: diff_mode: support: partial details: - - In check mode the diff will miss operational attributes. + - In check mode the diff misses operational attributes. version_added: 8.3.0 action_group: version_added: 8.3.0 @@ -48,15 +48,15 @@ options: description: description: - Description of the role. - - If not specified, the assigned description will not be changed. + - If not specified, the assigned description is not changed. type: str policies: type: list elements: dict description: - List of policies to attach to the role. Each policy is a dict. - - If the parameter is left blank, any policies currently assigned will not be changed. - - Any empty array (V([])) will clear any policies previously set. + - If the parameter is left blank, any policies currently assigned are not changed. + - Any empty array (V([])) clears any policies previously set. suboptions: name: description: @@ -90,8 +90,8 @@ options: elements: dict description: - List of service identities to attach to the role. - - If not specified, any service identities currently assigned will not be changed. - - If the parameter is an empty array (V([])), any node identities assigned will be unassigned. + - If not specified, any service identities currently assigned are not changed. + - If the parameter is an empty array (V([])), any node identities assigned are unassigned. suboptions: service_name: description: @@ -106,9 +106,9 @@ options: - name datacenters: description: - - The datacenters the policies will be effective. - - This will result in effective policy only being valid in this datacenter. - - If an empty array (V([])) is specified, the policies will valid in all datacenters. + - The datacenters where the policies are effective. + - This results in effective policy only being valid in this datacenter. + - If an empty array (V([])) is specified, the policies are valid in all datacenters. - Including those which do not yet exist but may in the future. type: list elements: str @@ -117,8 +117,8 @@ options: elements: dict description: - List of node identities to attach to the role. - - If not specified, any node identities currently assigned will not be changed. - - If the parameter is an empty array (V([])), any node identities assigned will be unassigned. + - If not specified, any node identities currently assigned are not changed. + - If the parameter is an empty array (V([])), any node identities assigned are unassigned. suboptions: node_name: description: @@ -134,7 +134,7 @@ options: datacenter: description: - The nodes datacenter. - - This will result in effective policy only being valid in this datacenter. + - This results in effective policy only being valid in this datacenter. type: str required: true """ diff --git a/plugins/modules/consul_session.py b/plugins/modules/consul_session.py index a72136ad66..637b09aff2 100644 --- a/plugins/modules/consul_session.py +++ b/plugins/modules/consul_session.py @@ -57,7 +57,7 @@ options: default: 15 node: description: - - The name of the node that with which the session will be associated. By default this is the name of the agent. + - The name of the node that with which the session is associated. By default this is the name of the agent. type: str datacenter: description: @@ -65,8 +65,8 @@ options: type: str checks: description: - - Checks that will be used to verify the session health. If all the checks fail, the session will be invalidated and - any locks associated with the session will be release and can be acquired once the associated lock delay has expired. + - Checks that are used to verify the session health. If all the checks fail, the session is invalidated and any locks + associated with the session are released and can be acquired once the associated lock delay has expired. type: list elements: str behavior: diff --git a/plugins/modules/consul_token.py b/plugins/modules/consul_token.py index b525b2dc2a..1e5aa19f4c 100644 --- a/plugins/modules/consul_token.py +++ b/plugins/modules/consul_token.py @@ -29,7 +29,7 @@ attributes: diff_mode: support: partial details: - - In check mode the diff will miss operational attributes. + - In check mode the diff misses operational attributes. action_group: version_added: 8.3.0 options: @@ -41,11 +41,11 @@ options: type: str accessor_id: description: - - Specifies a UUID to use as the token's Accessor ID. If not specified a UUID will be generated for this field. + - Specifies a UUID to use as the token's Accessor ID. If not specified a UUID is generated for this field. type: str secret_id: description: - - Specifies a UUID to use as the token's Secret ID. If not specified a UUID will be generated for this field. + - Specifies a UUID to use as the token's Secret ID. If not specified a UUID is generated for this field. type: str description: description: @@ -56,8 +56,8 @@ options: elements: dict description: - List of policies to attach to the token. Each policy is a dict. - - If the parameter is left blank, any policies currently assigned will not be changed. - - Any empty array (V([])) will clear any policies previously set. + - If the parameter is left blank, any policies currently assigned are not changed. + - Any empty array (V([])) clears any policies previously set. suboptions: name: description: @@ -74,8 +74,8 @@ options: elements: dict description: - List of roles to attach to the token. Each role is a dict. - - If the parameter is left blank, any roles currently assigned will not be changed. - - Any empty array (V([])) will clear any roles previously set. + - If the parameter is left blank, any roles currently assigned are not changed. + - Any empty array (V([])) clears any roles previously set. suboptions: name: description: @@ -108,8 +108,8 @@ options: elements: dict description: - List of service identities to attach to the token. - - If not specified, any service identities currently assigned will not be changed. - - If the parameter is an empty array (V([])), any node identities assigned will be unassigned. + - If not specified, any service identities currently assigned are not changed. + - If the parameter is an empty array (V([])), any node identities assigned are unassigned. suboptions: service_name: description: @@ -120,8 +120,8 @@ options: required: true datacenters: description: - - The datacenters the token will be effective. - - If an empty array (V([])) is specified, the token will valid in all datacenters. + - The datacenters where the token is effective. + - If an empty array (V([])) is specified, the token is valid in all datacenters. - Including those which do not yet exist but may in the future. type: list elements: str @@ -130,8 +130,8 @@ options: elements: dict description: - List of node identities to attach to the token. - - If not specified, any node identities currently assigned will not be changed. - - If the parameter is an empty array (V([])), any node identities assigned will be unassigned. + - If not specified, any node identities currently assigned are not changed. + - If the parameter is an empty array (V([])), any node identities assigned are unassigned. suboptions: node_name: description: @@ -143,7 +143,7 @@ options: datacenter: description: - The nodes datacenter. - - This will result in effective token only being valid in this datacenter. + - This results in effective token only being valid in this datacenter. type: str required: true local: @@ -152,7 +152,7 @@ options: type: bool expiration_ttl: description: - - This is a convenience field and if set will initialize the C(expiration_time). Can be specified in the form of V(60s) + - This is a convenience field and if set it initializes the C(expiration_time). Can be specified in the form of V(60s) or V(5m) (that is, 60 seconds or 5 minutes, respectively). Ingored when the token is updated! type: str """ diff --git a/plugins/modules/copr.py b/plugins/modules/copr.py index 739092b8af..940fc0eedd 100644 --- a/plugins/modules/copr.py +++ b/plugins/modules/copr.py @@ -494,8 +494,8 @@ def run_module(): name=dict(type="str", required=True), state=dict(type="str", choices=["enabled", "disabled", "absent"], default="enabled"), chroot=dict(type="str"), - includepkgs=dict(type='list', elements="str", required=False), - excludepkgs=dict(type='list', elements="str", required=False), + includepkgs=dict(type='list', elements="str"), + excludepkgs=dict(type='list', elements="str"), ) module = AnsibleModule(argument_spec=module_args, supports_check_mode=True) params = module.params diff --git a/plugins/modules/cpanm.py b/plugins/modules/cpanm.py index 4fa0c25917..482183c0e0 100644 --- a/plugins/modules/cpanm.py +++ b/plugins/modules/cpanm.py @@ -59,16 +59,18 @@ options: install_recommendations: description: - If V(true), installs dependencies declared as recommends per META spec. - - If V(false), it ensures the dependencies declared as recommends are not installed, overriding any decision made earlier in E(PERL_CPANM_OPT). - - If parameter is not set, C(cpanm) will use its existing defaults. + - If V(false), it ensures the dependencies declared as recommends are not installed, overriding any decision made earlier + in E(PERL_CPANM_OPT). + - If parameter is not set, C(cpanm) uses its existing defaults. - When these dependencies fail to install, cpanm continues the installation, since they are just recommendation. type: bool version_added: 10.3.0 install_suggestions: description: - If V(true), installs dependencies declared as suggests per META spec. - - If V(false), it ensures the dependencies declared as suggests are not installed, overriding any decision made earlier in E(PERL_CPANM_OPT). - - If parameter is not set, C(cpanm) will use its existing defaults. + - If V(false), it ensures the dependencies declared as suggests are not installed, overriding any decision made earlier + in E(PERL_CPANM_OPT). + - If parameter is not set, C(cpanm) uses its existing defaults. - When these dependencies fail to install, cpanm continues the installation, since they are just suggestion. type: bool version_added: 10.3.0 @@ -97,14 +99,13 @@ options: notes: - Please note that U(http://search.cpan.org/dist/App-cpanminus/bin/cpanm, cpanm) must be installed on the remote host. - 'This module now comes with a choice of execution O(mode): V(compatibility) or V(new).' - - 'O(mode=compatibility): When using V(compatibility) mode, the module will keep backward compatibility. This was the default + - 'O(mode=compatibility): When using V(compatibility) mode, the module keeps backward compatibility. This was the default mode before community.general 9.0.0. O(name) must be either a module name or a distribution file. If the perl module given - by O(name) is installed (at the exact O(version) when specified), then nothing happens. Otherwise, it will be installed - using the C(cpanm) executable. O(name) cannot be an URL, or a git URL. C(cpanm) version specifiers do not work in this - mode.' - - 'O(mode=new): When using V(new) mode, the module will behave differently. The O(name) parameter may refer to a module - name, a distribution file, a HTTP URL or a git repository URL as described in C(cpanminus) documentation. C(cpanm) version - specifiers are recognized. This is the default mode from community.general 9.0.0 onwards.' + by O(name) is installed (at the exact O(version) when specified), then nothing happens. Otherwise, it is installed using + the C(cpanm) executable. O(name) cannot be an URL, or a git URL. C(cpanm) version specifiers do not work in this mode.' + - 'O(mode=new): When using V(new) mode, the module behaves differently. The O(name) parameter may refer to a module name, + a distribution file, a HTTP URL or a git repository URL as described in C(cpanminus) documentation. C(cpanm) version specifiers + are recognized. This is the default mode from community.general 9.0.0 onwards.' seealso: - name: C(cpanm) command manual page description: Manual page for the command. diff --git a/plugins/modules/cronvar.py b/plugins/modules/cronvar.py index 4f00aef07c..5f7d02bfc3 100644 --- a/plugins/modules/cronvar.py +++ b/plugins/modules/cronvar.py @@ -43,12 +43,12 @@ options: type: str insertafter: description: - - If specified, the variable will be inserted after the variable specified. + - If specified, the variable is inserted after the variable specified. - Used with O(state=present). type: str insertbefore: description: - - Used with O(state=present). If specified, the variable will be inserted just before the variable specified. + - Used with O(state=present). If specified, the variable is inserted just before the variable specified. type: str state: description: @@ -135,6 +135,9 @@ class CronVar(object): self.cron_file = cron_file else: self.cron_file = os.path.join('/etc/cron.d', cron_file) + parent_dir = os.path.dirname(self.cron_file) + if parent_dir and not os.path.isdir(parent_dir): + module.fail_json(msg="Parent directory '{}' does not exist for cron_file: '{}'".format(parent_dir, cron_file)) else: self.cron_file = None @@ -393,6 +396,8 @@ def main(): old_value = cronvar.find_variable(name) if ensure_present: + if value == "" and old_value != "": + value = '""' if old_value is None: cronvar.add_variable(name, value, insertbefore, insertafter) changed = True diff --git a/plugins/modules/crypttab.py b/plugins/modules/crypttab.py index 05a5afb082..5749d75cec 100644 --- a/plugins/modules/crypttab.py +++ b/plugins/modules/crypttab.py @@ -24,14 +24,14 @@ options: name: description: - Name of the encrypted block device as it appears in the C(/etc/crypttab) file, or optionally prefixed with V(/dev/mapper/), - as it appears in the filesystem. V(/dev/mapper/) will be stripped from O(name). + as it appears in the filesystem. V(/dev/mapper/) is stripped from O(name). type: str required: true state: description: - Use V(present) to add a line to C(/etc/crypttab) or update its definition if already present. - Use V(absent) to remove a line with matching O(name). - - Use V(opts_present) to add options to those already present; options with different values will be updated. + - Use V(opts_present) to add options to those already present; options with different values are updated. - Use V(opts_absent) to remove options from the existing set. type: str required: true @@ -73,6 +73,14 @@ EXAMPLES = r""" opts: discard loop: '{{ ansible_mounts }}' when: "'/dev/mapper/luks-' in item.device" + +- name: Add entry to /etc/crypttab for luks-home with password file + community.general.crypttab: + name: luks-home + backing_device: UUID=123e4567-e89b-12d3-a456-426614174000 + password: /root/keys/luks-home.key + opts: discard,cipher=aes-cbc-essiv:sha256 + state: present """ import os @@ -116,7 +124,7 @@ def main(): ('backing_device', backing_device), ('password', password), ('opts', opts)): - if (arg is not None and (' ' in arg or '\t' in arg or arg == '')): + if arg is not None and (' ' in arg or '\t' in arg or arg == ''): module.fail_json(msg="invalid '%s': contains white space or is empty" % arg_name, **module.params) diff --git a/plugins/modules/datadog_downtime.py b/plugins/modules/datadog_downtime.py index 1bc57e2958..9e48410014 100644 --- a/plugins/modules/datadog_downtime.py +++ b/plugins/modules/datadog_downtime.py @@ -175,18 +175,18 @@ def main(): module = AnsibleModule( argument_spec=dict( api_key=dict(required=True, no_log=True), - api_host=dict(required=False, default="https://api.datadoghq.com"), + api_host=dict(default="https://api.datadoghq.com"), app_key=dict(required=True, no_log=True), - state=dict(required=False, choices=["present", "absent"], default="present"), - monitor_tags=dict(required=False, type="list", elements="str"), - scope=dict(required=False, type="list", elements="str"), - monitor_id=dict(required=False, type="int"), - downtime_message=dict(required=False, no_log=True), - start=dict(required=False, type="int"), - end=dict(required=False, type="int"), - timezone=dict(required=False, type="str"), - rrule=dict(required=False, type="str"), - id=dict(required=False, type="int"), + state=dict(choices=["present", "absent"], default="present"), + monitor_tags=dict(type="list", elements="str"), + scope=dict(type="list", elements="str"), + monitor_id=dict(type="int"), + downtime_message=dict(no_log=True), + start=dict(type="int"), + end=dict(type="int"), + timezone=dict(type="str"), + rrule=dict(type="str"), + id=dict(type="int"), ) ) diff --git a/plugins/modules/datadog_event.py b/plugins/modules/datadog_event.py index 97be0c9b16..fd75ea81de 100644 --- a/plugins/modules/datadog_event.py +++ b/plugins/modules/datadog_event.py @@ -16,7 +16,7 @@ __metaclass__ = type DOCUMENTATION = r""" module: datadog_event -short_description: Posts events to Datadog service +short_description: Posts events to Datadog service description: - Allows to post events to Datadog (www.datadoghq.com) service. - Uses http://docs.datadoghq.com/api/#events API. @@ -89,8 +89,8 @@ options: - An arbitrary string to use for aggregation. validate_certs: description: - - If V(false), SSL certificates will not be validated. This should only be used on personally controlled sites using - self-signed certificates. + - If V(false), SSL certificates are not validated. This should only be used on personally controlled sites using self-signed + certificates. type: bool default: true """ diff --git a/plugins/modules/datadog_monitor.py b/plugins/modules/datadog_monitor.py index eec0db0d32..f778d2444d 100644 --- a/plugins/modules/datadog_monitor.py +++ b/plugins/modules/datadog_monitor.py @@ -92,26 +92,26 @@ options: type: dict 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. + - Each scope is muted until the given POSIX timestamp or forever if the value is V(None). notify_no_data: description: - - Whether this monitor will notify when data stops reporting. + - Whether this monitor notifies when data stops reporting. type: bool default: false no_data_timeframe: description: - - The number of minutes before a monitor will notify when data stops reporting. + - The number of minutes before a monitor notifies when data stops reporting. - Must be at least 2x the monitor timeframe for metric alerts or 2 minutes for service checks. - If not specified, it defaults to 2x timeframe for metric, 2 minutes for service. type: str timeout_h: description: - - The number of hours of the monitor not reporting data before it will automatically resolve from a triggered state. + - The number of hours of the monitor not reporting data before it automatically resolves from a triggered state. type: str renotify_interval: description: - - The number of minutes after the last notification before a monitor will re-notify on the current status. - - It will only re-notify if it is not resolved. + - The number of minutes after the last notification before a monitor re-notifies on the current status. + - It only re-notifies if it is not resolved. type: str escalation_message: description: @@ -120,7 +120,7 @@ options: type: str notify_audit: description: - - Whether tagged users will be notified on changes to this monitor. + - Whether tagged users are notified on changes to this monitor. type: bool default: false thresholds: @@ -138,7 +138,7 @@ options: require_full_window: description: - Whether this monitor needs a full window of data before it gets evaluated. - - We highly recommend you set this to False for sparse metrics, otherwise some evaluations will be skipped. + - We highly recommend you set this to V(false) for sparse metrics, otherwise some evaluations are skipped. type: bool new_host_delay: description: @@ -153,7 +153,7 @@ options: id: description: - The ID of the alert. - - If set, will be used instead of the name to locate the alert. + - If set, it is used instead of O(name) to locate the alert. type: str include_tags: description: @@ -275,14 +275,14 @@ def main(): renotify_interval=dict(), escalation_message=dict(), notify_audit=dict(default=False, type='bool'), - thresholds=dict(type='dict', default=None), - tags=dict(type='list', elements='str', default=None), + thresholds=dict(type='dict'), + tags=dict(type='list', elements='str'), locked=dict(default=False, type='bool'), require_full_window=dict(type='bool'), new_host_delay=dict(), evaluation_delay=dict(), id=dict(), - include_tags=dict(required=False, default=True, type='bool'), + include_tags=dict(default=True, type='bool'), priority=dict(type='int'), notification_preset_name=dict(choices=['show_all', 'hide_query', 'hide_handles', 'hide_all']), renotify_occurrences=dict(type='int'), @@ -435,7 +435,7 @@ def mute_monitor(module): module.fail_json(msg="Monitor %s not found!" % module.params['name']) elif monitor['options']['silenced']: module.fail_json(msg="Monitor is already muted. Datadog does not allow to modify muted alerts, consider unmuting it first.") - elif (module.params['silenced'] is not None and len(set(monitor['options']['silenced']) ^ set(module.params['silenced'])) == 0): + elif module.params['silenced'] is not None and len(set(monitor['options']['silenced']) ^ set(module.params['silenced'])) == 0: module.exit_json(changed=False) try: if module.params['silenced'] is None or module.params['silenced'] == "": diff --git a/plugins/modules/dconf.py b/plugins/modules/dconf.py index 319d6770f2..762c443130 100644 --- a/plugins/modules/dconf.py +++ b/plugins/modules/dconf.py @@ -17,10 +17,10 @@ short_description: Modify and read dconf database description: - This module allows modifications and reading of C(dconf) database. The module is implemented as a wrapper around C(dconf) tool. Please see the dconf(1) man page for more details. - - Since C(dconf) requires a running D-Bus session to change values, the module will try to detect an existing session and - reuse it, or run the tool using C(dbus-run-session). + - Since C(dconf) requires a running D-Bus session to change values, the module tries to detect an existing session and reuse + it, or run the tool using C(dbus-run-session). requirements: - - Optionally the C(gi.repository) Python library (usually included in the OS on hosts which have C(dconf)); this will become + - Optionally the C(gi.repository) Python library (usually included in the OS on hosts which have C(dconf)); this is to become a non-optional requirement in a future major release of community.general. notes: - This module depends on C(psutil) Python library (version 4.0.0 and upwards), C(dconf), C(dbus-send), and C(dbus-run-session) @@ -28,7 +28,7 @@ notes: - This module uses the C(gi.repository) Python library when available for accurate comparison of values in C(dconf) to values specified in Ansible code. C(gi.repository) is likely to be present on most systems which have C(dconf) but may not be present everywhere. When it is missing, a simple string comparison between values is used, and there may be false positives, - that is, Ansible may think that a value is being changed when it is not. This fallback will be removed in a future version + that is, Ansible may think that a value is being changed when it is not. This fallback is to be removed in a future version of this module, at which point the module will stop working on hosts without C(gi.repository). - Detection of existing, running D-Bus session, required to change settings using C(dconf), is not 100% reliable due to implementation details of D-Bus daemon itself. This might lead to running applications not picking-up changes on-the-fly @@ -398,7 +398,7 @@ def main(): state=dict(default='present', choices=['present', 'absent', 'read']), key=dict(required=True, type='str', no_log=False), # Converted to str below after special handling of bool. - value=dict(required=False, default=None, type='raw'), + value=dict(type='raw'), ), supports_check_mode=True, required_if=[ diff --git a/plugins/modules/decompress.py b/plugins/modules/decompress.py index 50db0355e3..03be61a8e6 100644 --- a/plugins/modules/decompress.py +++ b/plugins/modules/decompress.py @@ -33,13 +33,12 @@ options: required: true dest: description: - - The file name of the destination file where the compressed file will be decompressed. - - If the destination file exists, it will be truncated and overwritten. - - If not specified, the destination filename will be derived from O(src) by removing the compression format extension. - For example, if O(src) is V(/path/to/file.txt.gz) and O(format) is V(gz), O(dest) will be V(/path/to/file.txt). If - the O(src) file does not have an extension for the current O(format), the O(dest) filename will be made by appending - C(_decompressed) to the O(src) filename. For instance, if O(src) is V(/path/to/file.myextension), the (dest) filename - will be V(/path/to/file.myextension_decompressed). + - The file name of the destination file where the compressed file is decompressed. + - If the destination file exists, it is truncated and overwritten. + - If not specified, the destination filename is derived from O(src) by removing the compression format extension. For + example, when O(src) is V(/path/to/file.txt.gz) and O(format) is V(gz), O(dest) is V(/path/to/file.txt). If the O(src) + file does not have an extension for the current O(format), the O(dest) filename is made by appending C(_decompressed) + to the O(src) filename. For instance, when O(src) is V(/path/to/file.myextension), the (dest) filename is V(/path/to/file.myextension_decompressed). type: path format: description: diff --git a/plugins/modules/deploy_helper.py b/plugins/modules/deploy_helper.py index 14a7d4f8c7..b25e68392b 100644 --- a/plugins/modules/deploy_helper.py +++ b/plugins/modules/deploy_helper.py @@ -18,8 +18,8 @@ short_description: Manages some of the steps common in deploying projects description: - The Deploy Helper manages some of the steps common in deploying software. It creates a folder structure, manages a symlink for the current release and cleans up old releases. - - Running it with the O(state=query) or O(state=present) will return the C(deploy_helper) fact. C(project_path), whatever - you set in the O(path) parameter, C(current_path), the path to the symlink that points to the active release, C(releases_path), + - Running it with the O(state=query) or O(state=present) returns the C(deploy_helper) fact. C(project_path), whatever you + set in the O(path) parameter, C(current_path), the path to the symlink that points to the active release, C(releases_path), the path to the folder to keep releases in, C(shared_path), the path to the folder to keep shared resources in, C(unfinished_filename), the file to check for to recognize unfinished builds, C(previous_release), the release the 'current' symlink is pointing to, C(previous_release_path), the full path to the 'current' symlink target, C(new_release), either the O(release) parameter @@ -41,12 +41,12 @@ options: type: str description: - The state of the project. - - V(query) will only gather facts. - - V(present) will create the project C(root) folder, and in it the C(releases) and C(shared) folders. - - V(finalize) will remove the unfinished_filename file, create a symlink to the newly deployed release and optionally - clean old releases. - - V(clean) will remove failed & old releases. - - V(absent) will remove the project folder (synonymous to the M(ansible.builtin.file) module with O(state=absent)). + - V(query) gathers facts. + - V(present) creates the project C(root) folder, and in it the C(releases) and C(shared) folders. + - V(finalize) removes the unfinished_filename file, creates a symlink to the newly deployed release and optionally cleans + old releases. + - V(clean) removes failed & old releases. + - V(absent) removes the project folder (synonymous to the M(ansible.builtin.file) module with O(state=absent)). choices: [present, finalize, absent, clean, query] default: present @@ -59,15 +59,15 @@ options: releases_path: type: str description: - - The name of the folder that will hold the releases. This can be relative to O(path) or absolute. Returned in the C(deploy_helper.releases_path) + - The name of the folder that holds the releases. This can be relative to O(path) or absolute. Returned in the C(deploy_helper.releases_path) fact. default: releases shared_path: type: path description: - - The name of the folder that will hold the shared resources. This can be relative to O(path) or absolute. If this is - set to an empty string, no shared folder will be created. Returned in the C(deploy_helper.shared_path) fact. + - The name of the folder that holds the shared resources. This can be relative to O(path) or absolute. If this is set + to an empty string, no shared folder is created. Returned in the C(deploy_helper.shared_path) fact. default: shared current_path: @@ -81,8 +81,8 @@ options: type: str description: - The name of the file that indicates a deploy has not finished. All folders in the O(releases_path) that contain this - file will be deleted on O(state=finalize) with O(clean=true), or O(state=clean). This file is automatically deleted - from the C(new_release_path) during O(state=finalize). + file are deleted on O(state=finalize) with O(clean=true), or O(state=clean). This file is automatically deleted from + the C(new_release_path) during O(state=finalize). default: DEPLOY_UNFINISHED clean: @@ -95,16 +95,16 @@ options: type: int description: - The number of old releases to keep when cleaning. Used in O(state=finalize) and O(state=clean). Any unfinished builds - will be deleted first, so only correct releases will count. The current version will not count. + are deleted first, so only correct releases count. The current version does not count. default: 5 notes: - Facts are only returned for O(state=query) and O(state=present). If you use both, you should pass any overridden parameters - to both calls, otherwise the second call will overwrite the facts of the first one. + to both calls, otherwise the second call overwrites the facts of the first one. - When using O(state=clean), the releases are ordered by I(creation date). You should be able to switch to a new naming strategy without problems. - - Because of the default behaviour of generating the C(new_release) fact, this module will not be idempotent unless you - pass your own release name with O(release). Due to the nature of deploying software, this should not be much of a problem. + - Because of the default behaviour of generating the C(new_release) fact, this module is not idempotent unless you pass + your own release name with O(release). Due to the nature of deploying software, this should not be much of a problem. extends_documentation_fragment: - ansible.builtin.files - community.general.attributes diff --git a/plugins/modules/dimensiondata_network.py b/plugins/modules/dimensiondata_network.py index 6617d6aef1..04fff21e58 100644 --- a/plugins/modules/dimensiondata_network.py +++ b/plugins/modules/dimensiondata_network.py @@ -140,7 +140,7 @@ class DimensionDataNetworkModule(DimensionDataModule): module=AnsibleModule( argument_spec=DimensionDataModule.argument_spec_with_wait( name=dict(type='str', required=True), - description=dict(type='str', required=False), + description=dict(type='str'), service_plan=dict(default='ESSENTIALS', choices=['ADVANCED', 'ESSENTIALS']), state=dict(default='present', choices=['present', 'absent']) ), diff --git a/plugins/modules/dimensiondata_vlan.py b/plugins/modules/dimensiondata_vlan.py index 2389d34333..b28b12d998 100644 --- a/plugins/modules/dimensiondata_vlan.py +++ b/plugins/modules/dimensiondata_vlan.py @@ -56,8 +56,7 @@ options: state: description: - The desired state for the target VLAN. - - V(readonly) ensures that the state is only ever read, not modified (the module will fail if the resource does not - exist). + - V(readonly) ensures that the state is only ever read, not modified (the module fails if the resource does not exist). choices: [present, absent, readonly] default: present type: str @@ -65,7 +64,7 @@ options: description: - Permit expansion of the target VLAN's network if the module parameters specify a larger network than the VLAN currently possesses. - - If V(false), the module will fail under these conditions. + - If V(false), the module fails under these conditions. - This is intended to prevent accidental expansion of a VLAN's network (since this operation is not reversible). type: bool default: false @@ -187,7 +186,7 @@ class DimensionDataVlanModule(DimensionDataModule): network_domain=dict(required=True, type='str'), private_ipv4_base_address=dict(default='', type='str'), private_ipv4_prefix_size=dict(default=0, type='int'), - allow_expand=dict(required=False, default=False, type='bool'), + allow_expand=dict(default=False, type='bool'), state=dict(default='present', choices=['present', 'absent', 'readonly']) ), required_together=DimensionDataModule.required_together() diff --git a/plugins/modules/django_check.py b/plugins/modules/django_check.py index 9699428b9c..e6e03c8276 100644 --- a/plugins/modules/django_check.py +++ b/plugins/modules/django_check.py @@ -22,7 +22,7 @@ options: database: description: - Specify databases to run checks against. - - If not specified, Django will not run database tests. + - If not specified, Django does not run database tests. type: list elements: str deploy: @@ -32,7 +32,7 @@ options: default: false fail_level: description: - - Message level that will trigger failure. + - Message level that triggers failure. - Default is the Django default value. Check the documentation for the version being used. type: str choices: [CRITICAL, ERROR, WARNING, INFO, DEBUG] @@ -49,7 +49,7 @@ options: elements: str notes: - The outcome of the module is found in the common return values RV(ignore:stdout), RV(ignore:stderr), RV(ignore:rc). - - The module will fail if RV(ignore:rc) is not zero. + - The module fails if RV(ignore:rc) is not zero. attributes: check_mode: support: full diff --git a/plugins/modules/django_manage.py b/plugins/modules/django_manage.py index ded4f436e3..0fe07890f8 100644 --- a/plugins/modules/django_manage.py +++ b/plugins/modules/django_manage.py @@ -15,7 +15,7 @@ module: django_manage short_description: Manages a Django application description: - Manages a Django application using the C(manage.py) application frontend to C(django-admin). With the O(virtualenv) parameter, - all management commands will be executed by the given C(virtualenv) installation. + all management commands are executed by the given C(virtualenv) installation. extends_documentation_fragment: - community.general.attributes attributes: @@ -34,8 +34,8 @@ options: - V(loaddata) - Searches for and loads the contents of the named O(fixtures) into the database. - V(migrate) - Synchronizes the database state with models and migrations. - V(test) - Runs tests for all installed apps. - - Other commands can be entered, but will fail if they are unknown to Django. Other commands that may prompt for user - input should be run with the C(--noinput) flag. + - Custom commands can be entered, but they fail unless they are known to Django. Custom commands that may prompt for + user input should be run with the C(--noinput) flag. - Support for the values V(cleanup), V(syncdb), V(validate) was removed in community.general 9.0.0. See note about supported versions of Django. type: str @@ -62,7 +62,7 @@ options: virtualenv: description: - An optional path to a C(virtualenv) installation to use while running the manage application. - - The virtual environment must exist, otherwise the module will fail. + - The virtual environment must exist, otherwise the module fails. type: path aliases: [virtual_env] apps: @@ -78,7 +78,7 @@ options: clear: description: - Clear the existing files before trying to copy or link the original file. - - Used only with the V(collectstatic) command. The C(--noinput) argument will be added automatically. + - Used only with the V(collectstatic) command. The C(--noinput) argument is added automatically. required: false default: false type: bool @@ -101,18 +101,18 @@ options: required: false skip: description: - - Will skip over out-of-order missing migrations, you can only use this parameter with V(migrate) command. + - Skips over out-of-order missing migrations, you can only use this parameter with V(migrate) command. required: false type: bool merge: description: - - Will run out-of-order or missing migrations as they are not rollback migrations, you can only use this parameter with + - Runs out-of-order or missing migrations as they are not rollback migrations, you can only use this parameter with V(migrate) command. required: false type: bool link: description: - - Will create links to the files instead of copying them, you can only use this parameter with V(collectstatic) command. + - Creates links to the files instead of copying them, you can only use this parameter with V(collectstatic) command. required: false type: bool testrunner: @@ -128,7 +128,7 @@ notes: module allows for free-form commands, not verifying the version of Django being used, it is B(strongly recommended) to use a more recent version of the framework.' - Please notice that Django 4.1 requires Python 3.8 or greater. - - This module will not create a virtualenv if the O(virtualenv) parameter is specified and a virtual environment does not + - This module does not create a virtualenv if the O(virtualenv) parameter is specified and a virtual environment does not already exist at the given location. This behavior changed in community.general version 9.0.0. - The recommended way to create a virtual environment in Ansible is by using M(ansible.builtin.pip). - This module assumes English error messages for the V(createcachetable) command to detect table existence, unfortunately. diff --git a/plugins/modules/dnf_config_manager.py b/plugins/modules/dnf_config_manager.py index 69ac2c7085..eb64bee864 100644 --- a/plugins/modules/dnf_config_manager.py +++ b/plugins/modules/dnf_config_manager.py @@ -120,7 +120,7 @@ changed_repos: returned: success type: list elements: str - sample: ['crb'] + sample: ["crb"] """ from ansible.module_utils.basic import AnsibleModule @@ -175,8 +175,8 @@ def pack_repo_states_for_return(states): def main(): module_args = dict( - name=dict(type='list', elements='str', required=False, default=[]), - state=dict(type='str', required=False, choices=['enabled', 'disabled'], default='enabled') + name=dict(type='list', elements='str', default=[]), + state=dict(type='str', choices=['enabled', 'disabled'], default='enabled') ) result = dict( diff --git a/plugins/modules/dnf_versionlock.py b/plugins/modules/dnf_versionlock.py index d3eaf832a5..b3e2e2bcc9 100644 --- a/plugins/modules/dnf_versionlock.py +++ b/plugins/modules/dnf_versionlock.py @@ -22,9 +22,9 @@ attributes: support: partial details: - The logics of the C(versionlock) plugin for corner cases could be confusing, so please take in account that this module - will do its best to give a C(check_mode) prediction on what is going to happen. In case of doubt, check the documentation + does its best to give a C(check_mode) prediction on what is going to happen. In case of doubt, check the documentation of the plugin. - - Sometimes the module could predict changes in C(check_mode) that will not be such because C(versionlock) concludes + - Sometimes the module could predict changes in C(check_mode) that are not fulfilled because C(versionlock) concludes that there is already a entry in C(locklist) that already matches. diff_mode: support: none @@ -47,12 +47,12 @@ options: state: description: - Whether to add (V(present) or V(excluded)) to or remove (V(absent) or V(clean)) from the C(locklist). - - V(present) will add a package name spec to the C(locklist). If there is a installed package that matches, then only - that version will be added. Otherwise, all available package versions will be added. - - V(excluded) will add a package name spec as excluded to the C(locklist). It means that packages represented by the - package name spec will be excluded from transaction operations. All available package versions will be added. - - V(absent) will delete entries in the C(locklist) that match the package name spec. - - V(clean) will delete all entries in the C(locklist). This option is mutually exclusive with O(name). + - V(present) adds a package name spec to the C(locklist). If there is a installed package that matches, then only that + version is added. Otherwise, all available package versions are added. + - V(excluded) adds a package name spec as excluded to the C(locklist). It means that packages represented by the package + name spec are excluded from transaction operations. All available package versions are added. + - V(absent) deletes entries in the C(locklist) that match the package name spec. + - V(clean) deletes all entries in the C(locklist). This option is mutually exclusive with O(name). choices: ['absent', 'clean', 'excluded', 'present'] type: str default: present @@ -83,12 +83,12 @@ EXAMPLES = r""" - name: Remove lock from nginx to be updated again community.general.dnf_versionlock: - package: nginx + name: nginx state: absent - name: Exclude bind 32:9.11 from installs or updates community.general.dnf_versionlock: - package: bind-32:9.11* + name: bind-32:9.11* state: excluded - name: Keep bash package in major version 4 @@ -108,25 +108,25 @@ locklist_pre: returned: success type: list elements: str - sample: ['bash-0:4.4.20-1.el8_4.*', '!bind-32:9.11.26-4.el8_4.*'] + sample: ["bash-0:4.4.20-1.el8_4.*", "!bind-32:9.11.26-4.el8_4.*"] locklist_post: description: Locklist after module execution. returned: success and (not check mode or state is clean) type: list elements: str - sample: ['bash-0:4.4.20-1.el8_4.*'] + sample: ["bash-0:4.4.20-1.el8_4.*"] specs_toadd: description: Package name specs meant to be added by versionlock. returned: success type: list elements: str - sample: ['bash'] + sample: ["bash"] specs_todelete: description: Package name specs meant to be deleted by versionlock. returned: success type: list elements: str - sample: ['bind'] + sample: ["bind"] """ from ansible.module_utils.basic import AnsibleModule diff --git a/plugins/modules/dnsimple.py b/plugins/modules/dnsimple.py index 979aca5797..729c876841 100644 --- a/plugins/modules/dnsimple.py +++ b/plugins/modules/dnsimple.py @@ -25,8 +25,8 @@ attributes: options: account_email: description: - - Account email. If omitted, the environment variables E(DNSIMPLE_EMAIL) and E(DNSIMPLE_API_TOKEN) will be looked for. - - 'If those variables are not found, a C(.dnsimple) file will be looked for, see: U(https://github.com/mikemaccana/dnsimple-python#getting-started).' + - Account email. If omitted, the environment variables E(DNSIMPLE_EMAIL) and E(DNSIMPLE_API_TOKEN) are looked for. + - 'If those variables are not found, a C(.dnsimple) file is looked for, see: U(https://github.com/mikemaccana/dnsimple-python#getting-started).' - C(.dnsimple) config files are only supported in dnsimple-python<2.0.0. type: str account_api_token: @@ -36,12 +36,12 @@ options: domain: description: - Domain to work with. Can be the domain name (for example V(mydomain.com)) or the numeric ID of the domain in DNSimple. - - If omitted, a list of domains will be returned. - - If domain is present but the domain does not exist, it will be created. + - If omitted, a list of domains is returned. + - If domain is present but the domain does not exist, it is created. type: str record: description: - - Record to add, if blank a record for the domain will be created, supports the wildcard (*). + - Record to add, if blank a record for the domain is created, supports the wildcard (*). type: str record_ids: description: diff --git a/plugins/modules/dnsimple_info.py b/plugins/modules/dnsimple_info.py index c508525fac..78b4ceae25 100644 --- a/plugins/modules/dnsimple_info.py +++ b/plugins/modules/dnsimple_info.py @@ -26,8 +26,8 @@ options: name: description: - The domain name to retrieve info from. - - Will return all associated records for this domain if specified. - - If not specified, will return all domains associated with the account ID. + - Returns all associated records for this domain if specified. + - If not specified, returns all domains associated with the account ID. type: str account_id: @@ -43,7 +43,7 @@ options: record: description: - The record to find. - - If specified, only this record will be returned instead of all records. + - If specified, only this record is returned instead of all records. required: false type: str diff --git a/plugins/modules/dnsmadeeasy.py b/plugins/modules/dnsmadeeasy.py index 83268af379..ec17880af7 100644 --- a/plugins/modules/dnsmadeeasy.py +++ b/plugins/modules/dnsmadeeasy.py @@ -50,7 +50,7 @@ options: record_name: description: - - Record name to get/create/delete/update. If record_name is not specified; all records for the domain will be returned + - Record name to get/create/delete/update. If O(record_name) is not specified; all records for the domain are returned in "result" regardless of the state argument. type: str @@ -64,8 +64,8 @@ options: description: - 'Record value. HTTPRED: , MX: , NS: , PTR: , SRV: , TXT: ".' - - If record_value is not specified; no changes will be made and the record will be returned in 'result' (in other words, - this module can be used to fetch a record's current ID, type, and ttl). + - If O(record_value) is not specified; no changes are made and the record is returned in RV(ignore:result) (in other + words, this module can be used to fetch a record's current ID, type, and TTL). type: str record_ttl: @@ -83,8 +83,8 @@ options: validate_certs: description: - - If V(false), SSL certificates will not be validated. This should only be used on personally controlled sites using - self-signed certificates. + - If V(false), SSL certificates are not validated. This should only be used on personally controlled sites using self-signed + certificates. type: bool default: true @@ -128,7 +128,7 @@ options: contactList: description: - - Name or ID of the contact list that the monitor will notify. + - Name or ID of the contact list that the monitor notifies. - The default V('') means the Account Owner. type: str @@ -195,7 +195,7 @@ notes: - Only A records can have a O(monitor) or O(failover). - To add failover, the O(failover), O(autoFailover), O(port), O(protocol), O(ip1), and O(ip2) options are required. - To add monitor, the O(monitor), O(port), O(protocol), O(maxEmails), O(systemDescription), and O(ip1) options are required. - - The monitor and the failover will share O(port), O(protocol), and O(ip1) options. + - The options O(monitor) and O(failover) share O(port), O(protocol), and O(ip1) options. requirements: [hashlib, hmac] author: "Brice Burgess (@briceburg)" """ @@ -553,28 +553,28 @@ def main(): domain=dict(required=True), sandbox=dict(default=False, type='bool'), state=dict(required=True, choices=['present', 'absent']), - record_name=dict(required=False), - record_type=dict(required=False, choices=[ + record_name=dict(), + record_type=dict(choices=[ 'A', 'AAAA', 'CNAME', 'ANAME', 'HTTPRED', 'MX', 'NS', 'PTR', 'SRV', 'TXT']), - record_value=dict(required=False), - record_ttl=dict(required=False, default=1800, type='int'), + record_value=dict(), + record_ttl=dict(default=1800, type='int'), monitor=dict(default=False, type='bool'), systemDescription=dict(default=''), maxEmails=dict(default=1, type='int'), protocol=dict(default='HTTP', choices=['TCP', 'UDP', 'HTTP', 'DNS', 'SMTP', 'HTTPS']), port=dict(default=80, type='int'), sensitivity=dict(default='Medium', choices=['Low', 'Medium', 'High']), - contactList=dict(default=None), - httpFqdn=dict(required=False), - httpFile=dict(required=False), - httpQueryString=dict(required=False), + contactList=dict(), + httpFqdn=dict(), + httpFile=dict(), + httpQueryString=dict(), failover=dict(default=False, type='bool'), autoFailover=dict(default=False, type='bool'), - ip1=dict(required=False), - ip2=dict(required=False), - ip3=dict(required=False), - ip4=dict(required=False), - ip5=dict(required=False), + ip1=dict(), + ip2=dict(), + ip3=dict(), + ip4=dict(), + ip5=dict(), validate_certs=dict(default=True, type='bool'), ), required_together=[ diff --git a/plugins/modules/dpkg_divert.py b/plugins/modules/dpkg_divert.py index 83a22bd632..6ef1f394e4 100644 --- a/plugins/modules/dpkg_divert.py +++ b/plugins/modules/dpkg_divert.py @@ -17,8 +17,8 @@ author: - quidame (@quidame) description: - A diversion is for C(dpkg) the knowledge that only a given package (or the local administrator) is allowed to install - a file at a given location. Other packages shipping their own version of this file will be forced to O(divert) it, that - is to install it at another location. It allows one to keep changes in a file provided by a debian package by preventing + a file at a given location. Other packages shipping their own version of this file are forced to O(divert) it, that is + to install it at another location. It allows one to keep changes in a file provided by a debian package by preventing it being overwritten on package upgrade. - This module manages diversions of debian packages files using the C(dpkg-divert) commandline tool. It can either create or remove a diversion for a given file, but also update an existing diversion to modify its O(holder) and/or its O(divert) @@ -54,7 +54,7 @@ options: type: str divert: description: - - The location where the versions of file will be diverted. + - The location where the versions of file are diverted. - Default is to add suffix C(.distrib) to the file path. - This parameter is ignored when O(state=absent). type: path @@ -70,7 +70,7 @@ options: force: description: - When O(rename=true) and O(force=true), renaming is performed even if the target of the renaming exists, in other words - the existing contents of the file at this location will be lost. + the existing contents of the file at this location are lost. - This parameter is ignored when O(rename=false). type: bool default: false @@ -166,11 +166,11 @@ def main(): module = AnsibleModule( argument_spec=dict( path=dict(required=True, type='path'), - state=dict(required=False, type='str', default='present', choices=['absent', 'present']), - holder=dict(required=False, type='str'), - divert=dict(required=False, type='path'), - rename=dict(required=False, type='bool', default=False), - force=dict(required=False, type='bool', default=False), + state=dict(type='str', default='present', choices=['absent', 'present']), + holder=dict(type='str'), + divert=dict(type='path'), + rename=dict(type='bool', default=False), + force=dict(type='bool', default=False), ), supports_check_mode=True, ) diff --git a/plugins/modules/easy_install.py b/plugins/modules/easy_install.py index 734f0dc4df..8d0a39333e 100644 --- a/plugins/modules/easy_install.py +++ b/plugins/modules/easy_install.py @@ -33,8 +33,8 @@ options: - An optional O(virtualenv) directory path to install into. If the O(virtualenv) does not exist, it is created automatically. virtualenv_site_packages: description: - - Whether the virtual environment will inherit packages from the global site-packages directory. Note that if this setting - is changed on an already existing virtual environment it will not have any effect, the environment must be deleted + - Whether the virtual environment inherits packages from the global site-packages directory. Note that this setting + has no effect on an already existing virtual environment, so if you want to change it, the environment must be deleted and newly created. type: bool default: false @@ -74,6 +74,12 @@ EXAMPLES = r""" community.general.easy_install: name: bottle virtualenv: /webapps/myapp/venv + +- name: Install a python package using pyvenv as the virtualenv tool + community.general.easy_install: + name: package_name + virtualenv: /opt/myenv + virtualenv_command: pyvenv """ import os @@ -127,14 +133,13 @@ def _get_easy_install(module, env=None, executable=None): def main(): arg_spec = dict( name=dict(required=True), - state=dict(required=False, - default='present', + state=dict(default='present', choices=['present', 'latest'], type='str'), - virtualenv=dict(default=None, required=False), + virtualenv=dict(), virtualenv_site_packages=dict(default=False, type='bool'), - virtualenv_command=dict(default='virtualenv', required=False), - executable=dict(default='easy_install', required=False), + virtualenv_command=dict(default='virtualenv'), + executable=dict(default='easy_install'), ) module = AnsibleModule(argument_spec=arg_spec, supports_check_mode=True) diff --git a/plugins/modules/elasticsearch_plugin.py b/plugins/modules/elasticsearch_plugin.py index 3455691cd0..8552b55ccd 100644 --- a/plugins/modules/elasticsearch_plugin.py +++ b/plugins/modules/elasticsearch_plugin.py @@ -66,7 +66,7 @@ options: type: bool plugin_bin: description: - - Location of the plugin binary. If this file is not found, the default plugin binaries will be used. + - Location of the plugin binary. If this file is not found, the default plugin binaries are used. type: path plugin_dir: description: @@ -83,7 +83,7 @@ options: type: str version: description: - - Version of the plugin to be installed. If plugin exists with previous version, it will NOT be updated. + - Version of the plugin to be installed. If plugin exists with previous version, it is NOT updated. type: str """ @@ -259,15 +259,15 @@ def main(): argument_spec=dict( name=dict(required=True), state=dict(default="present", choices=list(PACKAGE_STATE_MAP.keys())), - src=dict(default=None), - url=dict(default=None), + src=dict(), + url=dict(), timeout=dict(default="1m"), force=dict(type='bool', default=False), plugin_bin=dict(type="path"), plugin_dir=dict(default="/usr/share/elasticsearch/plugins/", type="path"), - proxy_host=dict(default=None), - proxy_port=dict(default=None), - version=dict(default=None) + proxy_host=dict(), + proxy_port=dict(), + version=dict() ), mutually_exclusive=[("src", "url")], supports_check_mode=True diff --git a/plugins/modules/emc_vnx_sg_member.py b/plugins/modules/emc_vnx_sg_member.py index bdb86625d1..a0b1e920e2 100644 --- a/plugins/modules/emc_vnx_sg_member.py +++ b/plugins/modules/emc_vnx_sg_member.py @@ -77,7 +77,7 @@ EXAMPLES = r""" RETURN = r""" hluid: - description: LUNID that hosts attached to the storage group will see. + description: LUNID visible to hosts attached to the storage group. type: int returned: success """ diff --git a/plugins/modules/facter.py b/plugins/modules/facter.py index ce9320282d..20be3d4a4d 100644 --- a/plugins/modules/facter.py +++ b/plugins/modules/facter.py @@ -62,7 +62,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): module = AnsibleModule( argument_spec=dict( - arguments=dict(required=False, type='list', elements='str') + arguments=dict(type='list', elements='str') ) ) diff --git a/plugins/modules/filesystem.py b/plugins/modules/filesystem.py index 2edc8be5ab..f14458c337 100644 --- a/plugins/modules/filesystem.py +++ b/plugins/modules/filesystem.py @@ -64,10 +64,10 @@ options: description: - If V(true), if the block device and filesystem size differ, grow the filesystem into the space. - Supported for C(bcachefs), C(btrfs), C(ext2), C(ext3), C(ext4), C(ext4dev), C(f2fs), C(lvm), C(xfs), C(ufs) and C(vfat) - filesystems. Attempts to resize other filesystem types will fail. - - XFS Will only grow if mounted. Currently, the module is based on commands from C(util-linux) package to perform operations, + filesystems. Attempts to resize other filesystem types fail. + - XFS only grows if mounted. Currently, the module is based on commands from C(util-linux) package to perform operations, so resizing of XFS is not supported on FreeBSD systems. - - VFAT will likely fail if C(fatresize < 1.04). + - VFAT is likely to fail if C(fatresize < 1.04). - Mutually exclusive with O(uuid). type: bool default: false @@ -82,7 +82,7 @@ options: - See xfs_admin(8) (C(xfs)), tune2fs(8) (C(ext2), C(ext3), C(ext4), C(ext4dev)) for possible values. - For O(fstype=lvm) the value is ignored, it resets the PV UUID if set. - Supported for O(fstype) being one of C(bcachefs), C(ext2), C(ext3), C(ext4), C(ext4dev), C(lvm), or C(xfs). - - This is B(not idempotent). Specifying this option will always result in a change. + - This is B(not idempotent). Specifying this option always results in a change. - Mutually exclusive with O(resizefs). type: str version_added: 7.1.0 @@ -633,7 +633,7 @@ def main(): opts=dict(type='str'), force=dict(type='bool', default=False), resizefs=dict(type='bool', default=False), - uuid=dict(type='str', required=False), + uuid=dict(type='str'), ), required_if=[ ('state', 'present', ['fstype']) diff --git a/plugins/modules/flatpak.py b/plugins/modules/flatpak.py index 13898c3349..98de9de3ed 100644 --- a/plugins/modules/flatpak.py +++ b/plugins/modules/flatpak.py @@ -27,7 +27,7 @@ attributes: check_mode: support: partial details: - - If O(state=latest), the module will always return C(changed=true). + - If O(state=latest), the module always returns RV(ignore:changed=true). diff_mode: support: none options: @@ -53,7 +53,7 @@ options: - When supplying a reverse DNS name, you can use the O(remote) option to specify on what remote to look for the flatpak. An example for a reverse DNS name is C(org.gnome.gedit). - When used with O(state=absent) or O(state=latest), it is recommended to specify the name in the reverse DNS format. - - When supplying a URL with O(state=absent) or O(state=latest), the module will try to match the installed flatpak based + - When supplying a URL with O(state=absent) or O(state=latest), the module tries to match the installed flatpak based on the name of the flatpakref to remove or update it. However, there is no guarantee that the names of the flatpakref file and the reverse DNS name of the installed flatpak do match. type: list @@ -107,6 +107,12 @@ EXAMPLES = r""" state: present remote: gnome +- name: Install GIMP using custom flatpak binary path + community.general.flatpak: + name: org.gimp.GIMP + state: present + executable: /usr/local/bin/flatpak-dev + - name: Install multiple packages community.general.flatpak: name: @@ -165,26 +171,6 @@ command: returned: When a flatpak command has been executed type: str sample: "/usr/bin/flatpak install --user --nontinteractive flathub org.gnome.Calculator" -msg: - description: Module error message. - returned: failure - type: str - sample: "Executable '/usr/local/bin/flatpak' was not found on the system." -rc: - description: Return code from flatpak binary. - returned: When a flatpak command has been executed - type: int - sample: 0 -stderr: - description: Error output from flatpak binary. - returned: When a flatpak command has been executed - type: str - sample: "error: Error searching remote flathub: Can't find ref org.gnome.KDE" -stdout: - description: Output from flatpak binary. - returned: When a flatpak command has been executed - type: str - sample: "org.gnome.Calendar/x86_64/stable\tcurrent\norg.gnome.gitg/x86_64/stable\tcurrent\n" """ from ansible.module_utils.six.moves.urllib.parse import urlparse diff --git a/plugins/modules/flatpak_remote.py b/plugins/modules/flatpak_remote.py index ba202d3033..641ce930d0 100644 --- a/plugins/modules/flatpak_remote.py +++ b/plugins/modules/flatpak_remote.py @@ -17,7 +17,7 @@ description: - Allows users to add or remove flatpak remotes. - The flatpak remotes concept is comparable to what is called repositories in other packaging formats. - Currently, remote addition is only supported using C(flatpakrepo) file URLs. - - Existing remotes will not be updated. + - Existing remotes are not updated. - See the M(community.general.flatpak) module for managing flatpaks. author: - John Kwiatkoski (@JayKayy) @@ -56,8 +56,8 @@ options: name: description: - The desired name for the flatpak remote to be registered under on the managed host. - - When used with O(state=present), the remote will be added to the managed host under the specified O(name). - - When used with O(state=absent) the remote with that name will be removed. + - When used with O(state=present), the remote is added to the managed host under the specified O(name). + - When used with O(state=absent) the remote with that name is removed. type: str required: true state: @@ -112,26 +112,6 @@ command: returned: When a flatpak command has been executed type: str sample: "/usr/bin/flatpak remote-add --system flatpak-test https://dl.flathub.org/repo/flathub.flatpakrepo" -msg: - description: Module error message. - returned: failure - type: str - sample: "Executable '/usr/local/bin/flatpak' was not found on the system." -rc: - description: Return code from flatpak binary. - returned: When a flatpak command has been executed - type: int - sample: 0 -stderr: - description: Error output from flatpak binary. - returned: When a flatpak command has been executed - type: str - sample: "error: GPG verification enabled, but no summary found (check that the configured URL in remote config is correct)\n" -stdout: - description: Output from flatpak binary. - returned: When a flatpak command has been executed - type: str - sample: "flathub\tFlathub\thttps://dl.flathub.org/repo/\t1\t\n" """ from ansible.module_utils.basic import AnsibleModule diff --git a/plugins/modules/gem.py b/plugins/modules/gem.py index c01433cb90..1ea9c68a94 100644 --- a/plugins/modules/gem.py +++ b/plugins/modules/gem.py @@ -48,7 +48,7 @@ options: repository: type: str description: - - The repository from which the gem will be installed. + - The repository from which the gem is installed. required: false aliases: [source] user_install: @@ -65,7 +65,7 @@ options: install_dir: type: path description: - - Install the gems into a specific directory. These gems will be independent from the global installed ones. Specifying + - Install the gems into a specific directory. These gems are independent from the global installed ones. Specifying this requires user_install to be false. required: false bindir: @@ -295,22 +295,22 @@ def main(): module = AnsibleModule( argument_spec=dict( - executable=dict(required=False, type='path'), - gem_source=dict(required=False, type='path'), - include_dependencies=dict(required=False, default=True, type='bool'), + executable=dict(type='path'), + gem_source=dict(type='path'), + include_dependencies=dict(default=True, type='bool'), name=dict(required=True, type='str'), - repository=dict(required=False, aliases=['source'], type='str'), - state=dict(required=False, default='present', choices=['present', 'absent', 'latest'], type='str'), - user_install=dict(required=False, default=True, type='bool'), - install_dir=dict(required=False, type='path'), + repository=dict(aliases=['source'], type='str'), + state=dict(default='present', choices=['present', 'absent', 'latest'], type='str'), + user_install=dict(default=True, type='bool'), + install_dir=dict(type='path'), bindir=dict(type='path'), norc=dict(type='bool', default=True), - pre_release=dict(required=False, default=False, type='bool'), - include_doc=dict(required=False, default=False, type='bool'), - env_shebang=dict(required=False, default=False, type='bool'), - version=dict(required=False, type='str'), - build_flags=dict(required=False, type='str'), - force=dict(required=False, default=False, type='bool'), + pre_release=dict(default=False, type='bool'), + include_doc=dict(default=False, type='bool'), + env_shebang=dict(default=False, type='bool'), + version=dict(type='str'), + build_flags=dict(type='str'), + force=dict(default=False, type='bool'), ), supports_check_mode=True, mutually_exclusive=[['gem_source', 'repository'], ['gem_source', 'version']], diff --git a/plugins/modules/gio_mime.py b/plugins/modules/gio_mime.py index 77ee653d85..b8864ea3e3 100644 --- a/plugins/modules/gio_mime.py +++ b/plugins/modules/gio_mime.py @@ -26,12 +26,12 @@ attributes: options: mime_type: description: - - MIME type for which a default handler will be set. + - MIME type for which a default handler is set. type: str required: true handler: description: - - Default handler will be set for the MIME type. + - Default handler set for the MIME type. type: str required: true notes: @@ -61,18 +61,6 @@ handler: returned: success type: str sample: google-chrome.desktop -stdout: - description: - - The output of the C(gio) command. - returned: success - type: str - sample: Set google-chrome.desktop as the default for x-scheme-handler/https -stderr: - description: - - The error output of the C(gio) command. - returned: failure - type: str - sample: 'gio: Failed to load info for handler "never-existed.desktop"' version: description: Version of gio. type: str diff --git a/plugins/modules/git_config_info.py b/plugins/modules/git_config_info.py index c8152cfa42..29922382de 100644 --- a/plugins/modules/git_config_info.py +++ b/plugins/modules/git_config_info.py @@ -26,7 +26,7 @@ options: name: description: - The name of the setting to read. - - If not provided, all settings will be returned as RV(config_values). + - If not provided, all settings are returned as RV(config_values). type: str path: description: @@ -94,8 +94,8 @@ config_values: description: - This is a dictionary mapping a git configuration setting to a list of its values. - When O(name) is not set, all configuration settings are returned here. - - When O(name) is set, only the setting specified in O(name) is returned here. If that setting is not set, the key will - still be present, and its value will be an empty list. + - When O(name) is set, only the setting specified in O(name) is returned here. If that setting is not set, the key is + still present, and its value is an empty list. returned: success type: dict sample: @@ -113,7 +113,7 @@ def main(): argument_spec=dict( name=dict(type="str"), path=dict(type="path"), - scope=dict(required=False, type="str", default="system", choices=["global", "system", "local", "file"]), + scope=dict(type="str", default="system", choices=["global", "system", "local", "file"]), ), required_if=[ ("scope", "local", ["path"]), diff --git a/plugins/modules/github_deploy_key.py b/plugins/modules/github_deploy_key.py index 2e5f9125ad..4ec7fbb769 100644 --- a/plugins/modules/github_deploy_key.py +++ b/plugins/modules/github_deploy_key.py @@ -57,8 +57,8 @@ options: type: str read_only: description: - - If V(true), the deploy key will only be able to read repository contents. Otherwise, the deploy key will be able to - read and write. + - If V(true), the deploy key is only able to read repository contents. Otherwise, the deploy key is able to read and + write. type: bool default: true state: @@ -301,18 +301,18 @@ class GithubDeployKey(object): def main(): module = AnsibleModule( argument_spec=dict( - github_url=dict(required=False, type='str', default="https://api.github.com"), + github_url=dict(type='str', default="https://api.github.com"), owner=dict(required=True, type='str', aliases=['account', 'organization']), repo=dict(required=True, type='str', aliases=['repository']), name=dict(required=True, type='str', aliases=['title', 'label']), key=dict(required=True, type='str', no_log=False), - read_only=dict(required=False, type='bool', default=True), + read_only=dict(type='bool', default=True), state=dict(default='present', choices=['present', 'absent']), - force=dict(required=False, type='bool', default=False), - username=dict(required=False, type='str'), - password=dict(required=False, type='str', no_log=True), - otp=dict(required=False, type='int', no_log=True), - token=dict(required=False, type='str', no_log=True) + force=dict(type='bool', default=False), + username=dict(type='str'), + password=dict(type='str', no_log=True), + otp=dict(type='int', no_log=True), + token=dict(type='str', no_log=True) ), mutually_exclusive=[ ['password', 'token'] diff --git a/plugins/modules/github_key.py b/plugins/modules/github_key.py index f9754398cc..80b0a6bf70 100644 --- a/plugins/modules/github_key.py +++ b/plugins/modules/github_key.py @@ -45,8 +45,8 @@ options: type: str force: description: - - The default is V(true), which will replace the existing remote key if it is different than O(pubkey). If V(false), - the key will only be set if no key with the given O(name) exists. + - The default is V(true), which replaces the existing remote key if it is different than O(pubkey). If V(false), the + key is only set if no key with the given O(name) exists. type: bool default: true api_url: diff --git a/plugins/modules/github_release.py b/plugins/modules/github_release.py index 1376bf4f3d..eae2081701 100644 --- a/plugins/modules/github_release.py +++ b/plugins/modules/github_release.py @@ -182,13 +182,29 @@ def main(): else: gh_obj = github3.GitHub() - # test if we're actually logged in - if password or login_token: + # GitHub's token formats: + # - ghp_ - Personal access token (classic) + # - github_pat_ - Fine-grained personal access token + # - gho_ - OAuth access token + # - ghu_ - User access token for a GitHub App + # - ghs_ - Installation access token for a GitHub App + # - ghr_ - Refresh token for a GitHub App + # + # References: + # https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/about-authentication-to-github#githubs-token-formats + # + # Test if we're actually logged in, but skip this check for some token prefixes + SKIPPED_TOKEN_PREFIXES = ['ghs_'] + if password or (login_token and not any(login_token.startswith(prefix) for prefix in SKIPPED_TOKEN_PREFIXES)): gh_obj.me() except github3.exceptions.AuthenticationFailed as e: module.fail_json(msg='Failed to connect to GitHub: %s' % to_native(e), details="Please check username and password or token " "for repository %s" % repo) + except github3.exceptions.GitHubError as e: + module.fail_json(msg='GitHub API error: %s' % to_native(e), + details="Please check username and password or token " + "for repository %s" % repo) repository = gh_obj.repository(user, repo) diff --git a/plugins/modules/github_repo.py b/plugins/modules/github_repo.py index 2d2c6f8588..abaddb3c28 100644 --- a/plugins/modules/github_repo.py +++ b/plugins/modules/github_repo.py @@ -72,7 +72,7 @@ options: organization: description: - Organization for the repository. - - When O(state=present), the repository will be created in the current user profile. + - When O(state=present), the repository is created in the current user profile. type: str required: false api_url: @@ -246,12 +246,12 @@ def main(): password=dict(type='str', no_log=True), access_token=dict(type='str', no_log=True), name=dict(type='str', required=True), - state=dict(type='str', required=False, default="present", + state=dict(type='str', default="present", choices=["present", "absent"]), - organization=dict(type='str', required=False, default=None), + organization=dict(type='str', ), private=dict(type='bool'), description=dict(type='str'), - api_url=dict(type='str', required=False, default='https://api.github.com'), + api_url=dict(type='str', default='https://api.github.com'), force_defaults=dict(type='bool', default=True), ) module = AnsibleModule( diff --git a/plugins/modules/github_webhook.py b/plugins/modules/github_webhook.py index 8608c90bc9..1ae2e71aaa 100644 --- a/plugins/modules/github_webhook.py +++ b/plugins/modules/github_webhook.py @@ -32,7 +32,7 @@ options: - repo url: description: - - URL to which payloads will be delivered. + - URL to which payloads are delivered. type: str required: true content_type: @@ -208,25 +208,16 @@ def main(): argument_spec=dict( repository=dict(type='str', required=True, aliases=['repo']), url=dict(type='str', required=True), - content_type=dict( - type='str', - choices=('json', 'form'), - required=False, - default='form'), - secret=dict(type='str', required=False, no_log=True), - insecure_ssl=dict(type='bool', required=False, default=False), - events=dict(type='list', elements='str', required=False), - active=dict(type='bool', required=False, default=True), - state=dict( - type='str', - required=False, - choices=('absent', 'present'), - default='present'), + content_type=dict(type='str', choices=('json', 'form'), default='form'), + secret=dict(type='str', no_log=True), + insecure_ssl=dict(type='bool', default=False), + events=dict(type='list', elements='str', ), + active=dict(type='bool', default=True), + state=dict(type='str', choices=('absent', 'present'), default='present'), user=dict(type='str', required=True), - password=dict(type='str', required=False, no_log=True), - token=dict(type='str', required=False, no_log=True), - github_url=dict( - type='str', required=False, default="https://api.github.com")), + password=dict(type='str', no_log=True), + token=dict(type='str', no_log=True), + github_url=dict(type='str', default="https://api.github.com")), mutually_exclusive=(('password', 'token'),), required_one_of=(("password", "token"),), required_if=(("state", "present", ("events",)),), diff --git a/plugins/modules/github_webhook_info.py b/plugins/modules/github_webhook_info.py index 648095b3fa..75315c77aa 100644 --- a/plugins/modules/github_webhook_info.py +++ b/plugins/modules/github_webhook_info.py @@ -124,10 +124,10 @@ def main(): argument_spec=dict( repository=dict(type='str', required=True, aliases=["repo"]), user=dict(type='str', required=True), - password=dict(type='str', required=False, no_log=True), - token=dict(type='str', required=False, no_log=True), + password=dict(type='str', no_log=True), + token=dict(type='str', no_log=True), github_url=dict( - type='str', required=False, default="https://api.github.com")), + type='str', default="https://api.github.com")), mutually_exclusive=(('password', 'token'), ), required_one_of=(("password", "token"), ), supports_check_mode=True) diff --git a/plugins/modules/gitlab_branch.py b/plugins/modules/gitlab_branch.py index b32169ef5a..6ed6e6a0c5 100644 --- a/plugins/modules/gitlab_branch.py +++ b/plugins/modules/gitlab_branch.py @@ -118,7 +118,7 @@ def main(): argument_spec.update( project=dict(type='str', required=True), branch=dict(type='str', required=True), - ref_branch=dict(type='str', required=False), + ref_branch=dict(type='str'), state=dict(type='str', default="present", choices=["absent", "present"]), ) diff --git a/plugins/modules/gitlab_deploy_key.py b/plugins/modules/gitlab_deploy_key.py index f5ae130324..d116df0714 100644 --- a/plugins/modules/gitlab_deploy_key.py +++ b/plugins/modules/gitlab_deploy_key.py @@ -55,8 +55,8 @@ options: default: false state: description: - - When V(present) the deploy key added to the project if it does not exist. - - When V(absent) it will be removed from the project if it exists. + - When V(present) the deploy key is added to the project if it does not exist. + - When V(absent) it is removed from the project if it exists. default: present type: str choices: ["present", "absent"] @@ -208,7 +208,7 @@ class GitLabDeployKey(object): ''' def find_deploy_key(self, project, key_title): for deploy_key in project.keys.list(**list_all_kwargs): - if (deploy_key.title == key_title): + if deploy_key.title == key_title: return deploy_key ''' diff --git a/plugins/modules/gitlab_group.py b/plugins/modules/gitlab_group.py index 6d03476092..d6105642b8 100644 --- a/plugins/modules/gitlab_group.py +++ b/plugins/modules/gitlab_group.py @@ -13,8 +13,8 @@ DOCUMENTATION = r""" module: gitlab_group short_description: Creates/updates/deletes GitLab Groups description: - - When the group does not exist in GitLab, it will be created. - - When the group does exist and state=absent, the group will be deleted. + - When the group does not exist in GitLab, it is created. + - When the group does exist and O(state=absent), the group is deleted. author: - Werner Dijkerman (@dj-wasabi) - Guillaume Martinez (@Lunik) @@ -101,8 +101,8 @@ options: type: str path: description: - - The path of the group you want to create, this will be api_url/group_path. - - If not supplied, the group_name will be used. + - The path of the group you want to create, this is O(api_url)/O(path). + - If not supplied, O(name) is used. type: str prevent_forking_outside_group: description: @@ -129,7 +129,7 @@ options: service_access_tokens_expiration_enforced: description: - Service account token expiration. - - Changes will not affect existing token expiration dates. + - Changes do not affect existing token expiration dates. - Only available for top level groups. type: bool version_added: 9.5.0 diff --git a/plugins/modules/gitlab_group_access_token.py b/plugins/modules/gitlab_group_access_token.py index 3da3e42114..0fe6c14af2 100644 --- a/plugins/modules/gitlab_group_access_token.py +++ b/plugins/modules/gitlab_group_access_token.py @@ -28,7 +28,7 @@ extends_documentation_fragment: - community.general.attributes notes: - Access tokens can not be changed. If a parameter needs to be changed, an acceess token has to be recreated. Whether tokens - will be recreated is controlled by the O(recreate) option, which defaults to V(never). + are recreated or not is controlled by the O(recreate) option, which defaults to V(never). - Token string is contained in the result only when access token is created or recreated. It can not be fetched afterwards. - Token matching is done by comparing O(name) option. attributes: @@ -79,17 +79,17 @@ options: required: true recreate: description: - - Whether the access token will be recreated if it already exists. - - When V(never) the token will never be recreated. - - When V(always) the token will always be recreated. - - When V(state_change) the token will be recreated if there is a difference between desired state and actual state. + - Whether the access token is recreated if it already exists. + - When V(never) the token is never recreated. + - When V(always) the token is always recreated. + - When V(state_change) the token is recreated if there is a difference between desired state and actual state. type: str choices: ["never", "always", "state_change"] default: never state: description: - - When V(present) the access token will be added to the group if it does not exist. - - When V(absent) it will be removed from the group if it exists. + - When V(present) the access token is added to the group if it does not exist. + - When V(absent) it is removed from the group if it exists. default: present type: str choices: ["present", "absent"] @@ -195,7 +195,7 @@ class GitLabGroupAccessToken(object): def find_access_token(self, group, name): access_tokens = [x for x in group.access_tokens.list(all=True) if not getattr(x, 'revoked', False)] for access_token in access_tokens: - if (access_token.name == name): + if access_token.name == name: self.access_token_object = access_token return False return False @@ -245,7 +245,7 @@ def main(): 'create_runner', 'ai_features', 'k8s_proxy']), - access_level=dict(type='str', required=False, default='maintainer', choices=['guest', 'reporter', 'developer', 'maintainer', 'owner']), + access_level=dict(type='str', default='maintainer', choices=['guest', 'reporter', 'developer', 'maintainer', 'owner']), expires_at=dict(type='str', required=True), recreate=dict(type='str', default='never', choices=['never', 'always', 'state_change']) )) diff --git a/plugins/modules/gitlab_group_variable.py b/plugins/modules/gitlab_group_variable.py index 926f4fe20a..10ca467bcd 100644 --- a/plugins/modules/gitlab_group_variable.py +++ b/plugins/modules/gitlab_group_variable.py @@ -15,9 +15,9 @@ short_description: Creates, updates, or deletes GitLab groups variables version_added: 1.2.0 description: - Creates a group variable if it does not exist. - - When a group variable does exist, its value will be updated when the values are different. + - When a group variable does exist, its value is updated when the values are different. - Variables which are untouched in the playbook, but are not untouched in the GitLab group, they stay untouched (O(purge=false)) - or will be deleted (O(purge=true)). + or are deleted (O(purge=true)). author: - Florent Madiot (@scodeman) requirements: @@ -52,7 +52,7 @@ options: type: bool vars: description: - - When the list element is a simple key-value pair, masked, raw and protected will be set to false. + - When the list element is a simple key-value pair, masked, raw and protected are set to V(false). - When the list element is a dict with the keys C(value), C(masked), C(raw) and C(protected), the user can have full control about whether a value should be masked, raw, protected or both. - Support for group variables requires GitLab >= 9.5. @@ -185,22 +185,22 @@ group_variable: description: A list of variables which were created. returned: always type: list - sample: ['ACCESS_KEY_ID', 'SECRET_ACCESS_KEY'] + sample: ["ACCESS_KEY_ID", "SECRET_ACCESS_KEY"] untouched: description: A list of variables which exist. returned: always type: list - sample: ['ACCESS_KEY_ID', 'SECRET_ACCESS_KEY'] + sample: ["ACCESS_KEY_ID", "SECRET_ACCESS_KEY"] removed: description: A list of variables which were deleted. returned: always type: list - sample: ['ACCESS_KEY_ID', 'SECRET_ACCESS_KEY'] + sample: ["ACCESS_KEY_ID", "SECRET_ACCESS_KEY"] updated: description: A list of variables whose values were changed. returned: always type: list - sample: ['ACCESS_KEY_ID', 'SECRET_ACCESS_KEY'] + sample: ["ACCESS_KEY_ID", "SECRET_ACCESS_KEY"] """ from ansible.module_utils.basic import AnsibleModule @@ -372,11 +372,11 @@ def main(): argument_spec.update(auth_argument_spec()) argument_spec.update( group=dict(type='str', required=True), - purge=dict(type='bool', required=False, default=False), - vars=dict(type='dict', required=False, default=dict(), no_log=True), + purge=dict(type='bool', default=False), + vars=dict(type='dict', default=dict(), no_log=True), # please mind whenever changing the variables dict to also change module_utils/gitlab.py's # KNOWN dict in filter_returned_variables or bad evil will happen - variables=dict(type='list', elements='dict', required=False, default=list(), options=dict( + variables=dict(type='list', elements='dict', default=list(), options=dict( name=dict(type='str', required=True), value=dict(type='str', no_log=True), masked=dict(type='bool', default=False), diff --git a/plugins/modules/gitlab_hook.py b/plugins/modules/gitlab_hook.py index cb132c8aaa..87c8aa635a 100644 --- a/plugins/modules/gitlab_hook.py +++ b/plugins/modules/gitlab_hook.py @@ -45,8 +45,8 @@ options: type: str state: description: - - When V(present) the hook will be updated to match the input or created if it does not exist. - - When V(absent) hook will be deleted if it exists. + - When V(present) the hook is updated to match the input or created if it does not exist. + - When V(absent) hook is deleted if it exists. default: present type: str choices: ["present", "absent"] @@ -103,15 +103,15 @@ options: version_added: '8.4.0' hook_validate_certs: description: - - Whether GitLab will do SSL verification when triggering the hook. + - Whether GitLab performs SSL verification when triggering the hook. type: bool default: false aliases: [enable_ssl_verification] token: description: - Secret token to validate hook messages at the receiver. - - If this is present it will always result in a change as it cannot be retrieved from GitLab. - - Will show up in the X-GitLab-Token HTTP request header. + - If this is present it always results in a change as it cannot be retrieved from GitLab. + - It shows up in the C(X-GitLab-Token) HTTP request header. required: false type: str """ @@ -271,7 +271,7 @@ class GitLabHook(object): ''' def find_hook(self, project, hook_url): for hook in project.hooks.list(**list_all_kwargs): - if (hook.url == hook_url): + if hook.url == hook_url: return hook ''' @@ -307,7 +307,7 @@ def main(): job_events=dict(type='bool', default=False), pipeline_events=dict(type='bool', default=False), wiki_page_events=dict(type='bool', default=False), - releases_events=dict(type='bool', default=None), + releases_events=dict(type='bool'), hook_validate_certs=dict(type='bool', default=False, aliases=['enable_ssl_verification']), token=dict(type='str', no_log=True), )) diff --git a/plugins/modules/gitlab_instance_variable.py b/plugins/modules/gitlab_instance_variable.py index 2023b0ad7d..0f2c9b7752 100644 --- a/plugins/modules/gitlab_instance_variable.py +++ b/plugins/modules/gitlab_instance_variable.py @@ -16,10 +16,10 @@ short_description: Creates, updates, or deletes GitLab instance variables version_added: 7.1.0 description: - Creates a instance variable if it does not exist. - - When a instance variable does exist, its value will be updated if the values are different. + - When a instance variable does exist, its value is updated if the values are different. - Support for instance variables requires GitLab >= 13.0. - - Variables which are not mentioned in the modules options, but are present on the GitLab instance, will either stay (O(purge=false)) - or will be deleted (O(purge=true)). + - Variables which are not mentioned in the modules options, but are present on the GitLab instance, either stay (O(purge=false)) + or are deleted (O(purge=true)). author: - Benedikt Braunger (@benibr) requirements: @@ -124,22 +124,22 @@ instance_variable: description: A list of variables which were created. returned: always type: list - sample: ['ACCESS_KEY_ID', 'SECRET_ACCESS_KEY'] + sample: ["ACCESS_KEY_ID", "SECRET_ACCESS_KEY"] untouched: description: A list of variables which exist. returned: always type: list - sample: ['ACCESS_KEY_ID', 'SECRET_ACCESS_KEY'] + sample: ["ACCESS_KEY_ID", "SECRET_ACCESS_KEY"] removed: description: A list of variables which were deleted. returned: always type: list - sample: ['ACCESS_KEY_ID', 'SECRET_ACCESS_KEY'] + sample: ["ACCESS_KEY_ID", "SECRET_ACCESS_KEY"] updated: description: A list pre-existing variables whose values have been set. returned: always type: list - sample: ['ACCESS_KEY_ID', 'SECRET_ACCESS_KEY'] + sample: ["ACCESS_KEY_ID", "SECRET_ACCESS_KEY"] """ from ansible.module_utils.basic import AnsibleModule @@ -301,8 +301,8 @@ def main(): argument_spec = basic_auth_argument_spec() argument_spec.update(auth_argument_spec()) argument_spec.update( - purge=dict(type='bool', required=False, default=False), - variables=dict(type='list', elements='dict', required=False, default=list(), options=dict( + purge=dict(type='bool', default=False), + variables=dict(type='list', elements='dict', default=list(), options=dict( name=dict(type='str', required=True), value=dict(type='str', no_log=True), masked=dict(type='bool', default=False), diff --git a/plugins/modules/gitlab_issue.py b/plugins/modules/gitlab_issue.py index 47b6f072e8..c6bf6f8328 100644 --- a/plugins/modules/gitlab_issue.py +++ b/plugins/modules/gitlab_issue.py @@ -18,8 +18,8 @@ short_description: Create, update, or delete GitLab issues version_added: '8.1.0' description: - Creates an issue if it does not exist. - - When an issue does exist, it will be updated if the provided parameters are different. - - When an issue does exist and O(state=absent), the issue will be deleted. + - When an issue does exist, it is updated if the provided parameters are different. + - When an issue does exist and O(state=absent), the issue is deleted. - When multiple issues are detected, the task fails. - Existing issues are matched based on O(title) and O(state_filter) filters. author: @@ -284,13 +284,13 @@ def main(): argument_spec = basic_auth_argument_spec() argument_spec.update(auth_argument_spec()) argument_spec.update( - assignee_ids=dict(type='list', elements='str', required=False), - description=dict(type='str', required=False), - description_path=dict(type='path', required=False), - issue_type=dict(type='str', default='issue', choices=["issue", "incident", "test_case"], required=False), - labels=dict(type='list', elements='str', required=False), - milestone_search=dict(type='str', required=False), - milestone_group_id=dict(type='str', required=False), + assignee_ids=dict(type='list', elements='str'), + description=dict(type='str'), + description_path=dict(type='path'), + issue_type=dict(type='str', default='issue', choices=["issue", "incident", "test_case"]), + labels=dict(type='list', elements='str'), + milestone_search=dict(type='str'), + milestone_group_id=dict(type='str'), project=dict(type='str', required=True), state=dict(type='str', default="present", choices=["absent", "present"]), state_filter=dict(type='str', default="opened", choices=["opened", "closed"]), diff --git a/plugins/modules/gitlab_label.py b/plugins/modules/gitlab_label.py index 8b9503e325..a139d1fcbd 100644 --- a/plugins/modules/gitlab_label.py +++ b/plugins/modules/gitlab_label.py @@ -12,8 +12,8 @@ module: gitlab_label short_description: Creates/updates/deletes GitLab Labels belonging to project or group version_added: 8.3.0 description: - - When a label does not exist, it will be created. - - When a label does exist, its value will be updated when the values are different. + - When a label does not exist, it is created. + - When a label does exist, its value is updated when the values are different. - Labels can be purged. author: - "Gabriele Pongelli (@gpongelli)" @@ -197,22 +197,22 @@ labels: description: A list of labels which were created. returned: always type: list - sample: ['abcd', 'label-one'] + sample: ["abcd", "label-one"] untouched: description: A list of labels which exist. returned: always type: list - sample: ['defg', 'new-label'] + sample: ["defg", "new-label"] removed: description: A list of labels which were deleted. returned: always type: list - sample: ['defg', 'new-label'] + sample: ["defg", "new-label"] updated: description: A list pre-existing labels whose values have been set. returned: always type: list - sample: ['defg', 'new-label'] + sample: ["defg", "new-label"] labels_obj: description: API object. returned: success @@ -410,16 +410,16 @@ def main(): argument_spec = basic_auth_argument_spec() argument_spec.update(auth_argument_spec()) argument_spec.update( - project=dict(type='str', required=False, default=None), - group=dict(type='str', required=False, default=None), - purge=dict(type='bool', required=False, default=False), - labels=dict(type='list', elements='dict', required=False, default=list(), + project=dict(type='str'), + group=dict(type='str'), + purge=dict(type='bool', default=False), + labels=dict(type='list', elements='dict', default=list(), options=dict( name=dict(type='str', required=True), - color=dict(type='str', required=False), - description=dict(type='str', required=False), - priority=dict(type='int', required=False), - new_name=dict(type='str', required=False),) + color=dict(type='str'), + description=dict(type='str'), + priority=dict(type='int'), + new_name=dict(type='str'),) ), state=dict(type='str', default="present", choices=["absent", "present"]), ) diff --git a/plugins/modules/gitlab_merge_request.py b/plugins/modules/gitlab_merge_request.py index fd6068980a..922b224c1f 100644 --- a/plugins/modules/gitlab_merge_request.py +++ b/plugins/modules/gitlab_merge_request.py @@ -18,8 +18,8 @@ short_description: Create, update, or delete GitLab merge requests version_added: 7.1.0 description: - Creates a merge request if it does not exist. - - When a single merge request does exist, it will be updated if the provided parameters are different. - - When a single merge request does exist and O(state=absent), the merge request will be deleted. + - When a single merge request does exist, it is updated if the provided parameters are different. + - When a single merge request does exist and O(state=absent), the merge request is deleted. - When multiple merge requests are detected, the task fails. - Existing merge requests are matched based on O(title), O(source_branch), O(target_branch), and O(state_filter) filters. author: @@ -287,13 +287,13 @@ def main(): source_branch=dict(type='str', required=True), target_branch=dict(type='str', required=True), title=dict(type='str', required=True), - description=dict(type='str', required=False), - labels=dict(type='str', default="", required=False), - description_path=dict(type='path', required=False), - remove_source_branch=dict(type='bool', default=False, required=False), + description=dict(type='str'), + labels=dict(type='str', default=""), + description_path=dict(type='path'), + remove_source_branch=dict(type='bool', default=False), state_filter=dict(type='str', default="opened", choices=["opened", "closed", "locked", "merged"]), - assignee_ids=dict(type='str', required=False), - reviewer_ids=dict(type='str', required=False), + assignee_ids=dict(type='str'), + reviewer_ids=dict(type='str'), state=dict(type='str', default="present", choices=["absent", "present"]), ) diff --git a/plugins/modules/gitlab_milestone.py b/plugins/modules/gitlab_milestone.py index 99b922c4dd..1406f96ffb 100644 --- a/plugins/modules/gitlab_milestone.py +++ b/plugins/modules/gitlab_milestone.py @@ -12,8 +12,8 @@ module: gitlab_milestone short_description: Creates/updates/deletes GitLab Milestones belonging to project or group version_added: 8.3.0 description: - - When a milestone does not exist, it will be created. - - When a milestone does exist, its value will be updated when the values are different. + - When a milestone does not exist, it is created. + - When a milestone does exist, its value is updated when the values are different. - Milestones can be purged. author: - "Gabriele Pongelli (@gpongelli)" @@ -181,22 +181,22 @@ milestones: description: A list of milestones which were created. returned: always type: list - sample: ['abcd', 'milestone-one'] + sample: ["abcd", "milestone-one"] untouched: description: A list of milestones which exist. returned: always type: list - sample: ['defg', 'new-milestone'] + sample: ["defg", "new-milestone"] removed: description: A list of milestones which were deleted. returned: always type: list - sample: ['defg', 'new-milestone'] + sample: ["defg", "new-milestone"] updated: description: A list pre-existing milestones whose values have been set. returned: always type: list - sample: ['defg', 'new-milestone'] + sample: ["defg", "new-milestone"] milestones_obj: description: API object. returned: success @@ -411,15 +411,15 @@ def main(): argument_spec = basic_auth_argument_spec() argument_spec.update(auth_argument_spec()) argument_spec.update( - project=dict(type='str', required=False, default=None), - group=dict(type='str', required=False, default=None), - purge=dict(type='bool', required=False, default=False), - milestones=dict(type='list', elements='dict', required=False, default=list(), + project=dict(type='str'), + group=dict(type='str'), + purge=dict(type='bool', default=False), + milestones=dict(type='list', elements='dict', default=list(), options=dict( title=dict(type='str', required=True), - description=dict(type='str', required=False), - due_date=dict(type='str', required=False), - start_date=dict(type='str', required=False),) + description=dict(type='str'), + due_date=dict(type='str'), + start_date=dict(type='str'),) ), state=dict(type='str', default="present", choices=["absent", "present"]), ) diff --git a/plugins/modules/gitlab_project.py b/plugins/modules/gitlab_project.py index eec2b0fa7a..1e2140e24a 100644 --- a/plugins/modules/gitlab_project.py +++ b/plugins/modules/gitlab_project.py @@ -13,9 +13,9 @@ DOCUMENTATION = r""" module: gitlab_project short_description: Creates/updates/deletes GitLab Projects description: - - When the project does not exist in GitLab, it will be created. - - When the project does exist and O(state=absent), the project will be deleted. - - When changes are made to the project, the project will be updated. + - When the project does not exist in GitLab, it is created. + - When the project does exist and O(state=absent), the project is deleted. + - When changes are made to the project, the project is updated. author: - Werner Dijkerman (@dj-wasabi) - Guillaume Martinez (@Lunik) @@ -47,7 +47,7 @@ options: build_timeout: description: - Maximum number of seconds a CI job can run. - - If not specified on creation, GitLab will impose a default value. + - If not specified on creation, GitLab imposes a default value. type: int version_added: "10.6.0" builds_access_level: @@ -148,7 +148,7 @@ options: type: str import_url: description: - - Git repository which will be imported into gitlab. + - Git repository which is imported into gitlab. - GitLab server needs read access to this git repository. required: false type: str @@ -162,7 +162,7 @@ options: version_added: "6.4.0" initialize_with_readme: description: - - Will initialize the project with a default C(README.md). + - Initializes the project with a default C(README.md). - Is only used when the project is created, and ignored otherwise. type: bool default: false @@ -248,8 +248,8 @@ options: version_added: "9.3.0" path: description: - - The path of the project you want to create, this will be server_url//path. - - If not supplied, name will be used. + - The path of the project you want to create, this is server_url/O(group)/O(path). + - If not supplied, O(name) is used. type: str releases_access_level: description: @@ -600,7 +600,7 @@ def main(): builds_access_level=dict(type='str', choices=['private', 'disabled', 'enabled']), build_timeout=dict(type='int'), ci_config_path=dict(type='str'), - container_expiration_policy=dict(type='dict', default=None, options=dict( + container_expiration_policy=dict(type='dict', options=dict( cadence=dict(type='str', choices=["1d", "7d", "14d", "1month", "3month"]), enabled=dict(type='bool'), keep_n=dict(type='int', choices=[0, 1, 5, 10, 25, 50, 100]), diff --git a/plugins/modules/gitlab_project_access_token.py b/plugins/modules/gitlab_project_access_token.py index 07d3985633..3747870d9a 100644 --- a/plugins/modules/gitlab_project_access_token.py +++ b/plugins/modules/gitlab_project_access_token.py @@ -28,7 +28,7 @@ extends_documentation_fragment: - community.general.attributes notes: - Access tokens can not be changed. If a parameter needs to be changed, an acceess token has to be recreated. Whether tokens - will be recreated is controlled by the O(recreate) option, which defaults to V(never). + are recreated or not is controlled by the O(recreate) option, which defaults to V(never). - Token string is contained in the result only when access token is created or recreated. It can not be fetched afterwards. - Token matching is done by comparing O(name) option. attributes: @@ -79,17 +79,17 @@ options: required: true recreate: description: - - Whether the access token will be recreated if it already exists. - - When V(never) the token will never be recreated. - - When V(always) the token will always be recreated. - - When V(state_change) the token will be recreated if there is a difference between desired state and actual state. + - Whether the access token is recreated if it already exists. + - When V(never) the token is never recreated. + - When V(always) the token is always recreated. + - When V(state_change) the token is recreated if there is a difference between desired state and actual state. type: str choices: ["never", "always", "state_change"] default: never state: description: - - When V(present) the access token will be added to the project if it does not exist. - - When V(absent) it will be removed from the project if it exists. + - When V(present) the access token is added to the project if it does not exist. + - When V(absent) it is removed from the project if it exists. default: present type: str choices: ["present", "absent"] @@ -193,7 +193,7 @@ class GitLabProjectAccessToken(object): def find_access_token(self, project, name): access_tokens = [x for x in project.access_tokens.list(all=True) if not getattr(x, 'revoked', False)] for access_token in access_tokens: - if (access_token.name == name): + if access_token.name == name: self.access_token_object = access_token return False return False @@ -243,7 +243,7 @@ def main(): 'create_runner', 'ai_features', 'k8s_proxy']), - access_level=dict(type='str', required=False, default='maintainer', choices=['guest', 'reporter', 'developer', 'maintainer', 'owner']), + access_level=dict(type='str', default='maintainer', choices=['guest', 'reporter', 'developer', 'maintainer', 'owner']), expires_at=dict(type='str', required=True), recreate=dict(type='str', default='never', choices=['never', 'always', 'state_change']) )) diff --git a/plugins/modules/gitlab_project_variable.py b/plugins/modules/gitlab_project_variable.py index 5903c9b5c4..4c261f5978 100644 --- a/plugins/modules/gitlab_project_variable.py +++ b/plugins/modules/gitlab_project_variable.py @@ -11,10 +11,10 @@ DOCUMENTATION = r""" module: gitlab_project_variable short_description: Creates/updates/deletes GitLab Projects Variables description: - - When a project variable does not exist, it will be created. - - When a project variable does exist, its value will be updated when the values are different. + - When a project variable does not exist, it is created. + - When a project variable does exist, its value is updated when the values are different. - Variables which are untouched in the playbook, but are not untouched in the GitLab project, they stay untouched (O(purge=false)) - or will be deleted (O(purge=true)). + or are deleted (O(purge=true)). author: - "Markus Bergholz (@markuman)" requirements: @@ -45,12 +45,12 @@ options: type: str purge: description: - - When set to true, all variables which are not untouched in the task will be deleted. + - When set to V(true), all variables which are not untouched in the task are deleted. default: false type: bool vars: description: - - When the list element is a simple key-value pair, masked, raw and protected will be set to false. + - When the list element is a simple key-value pair, masked, raw and protected are set to V(false). - When the list element is a dict with the keys C(value), C(masked), C(raw) and C(protected), the user can have full control about whether a value should be masked, raw, protected or both. - Support for protected values requires GitLab >= 9.3. @@ -202,22 +202,22 @@ project_variable: description: A list of variables which were created. returned: always type: list - sample: ['ACCESS_KEY_ID', 'SECRET_ACCESS_KEY'] + sample: ["ACCESS_KEY_ID", "SECRET_ACCESS_KEY"] untouched: description: A list of variables which exist. returned: always type: list - sample: ['ACCESS_KEY_ID', 'SECRET_ACCESS_KEY'] + sample: ["ACCESS_KEY_ID", "SECRET_ACCESS_KEY"] removed: description: A list of variables which were deleted. returned: always type: list - sample: ['ACCESS_KEY_ID', 'SECRET_ACCESS_KEY'] + sample: ["ACCESS_KEY_ID", "SECRET_ACCESS_KEY"] updated: description: A list of variables whose values were changed. returned: always type: list - sample: ['ACCESS_KEY_ID', 'SECRET_ACCESS_KEY'] + sample: ["ACCESS_KEY_ID", "SECRET_ACCESS_KEY"] """ from ansible.module_utils.basic import AnsibleModule @@ -394,11 +394,11 @@ def main(): argument_spec.update(auth_argument_spec()) argument_spec.update( project=dict(type='str', required=True), - purge=dict(type='bool', required=False, default=False), - vars=dict(type='dict', required=False, default=dict(), no_log=True), + purge=dict(type='bool', default=False), + vars=dict(type='dict', default=dict(), no_log=True), # please mind whenever changing the variables dict to also change module_utils/gitlab.py's # KNOWN dict in filter_returned_variables or bad evil will happen - variables=dict(type='list', elements='dict', required=False, default=list(), options=dict( + variables=dict(type='list', elements='dict', default=list(), options=dict( name=dict(type='str', required=True), value=dict(type='str', no_log=True), masked=dict(type='bool', default=False), diff --git a/plugins/modules/gitlab_runner.py b/plugins/modules/gitlab_runner.py index 62875c552a..87ba152ffa 100644 --- a/plugins/modules/gitlab_runner.py +++ b/plugins/modules/gitlab_runner.py @@ -81,8 +81,8 @@ options: description: - The registration token is used to register new runners before GitLab 16.0. - Required if O(state=present) for GitLab < 16.0. - - If set, the runner will be created using the old runner creation workflow. - - If not set, the runner will be created using the new runner creation workflow, introduced in GitLab 16.0. + - If set, the runner is created using the old runner creation workflow. + - If not set, the runner is created using the new runner creation workflow, introduced in GitLab 16.0. - If not set, requires python-gitlab >= 4.0.0. type: str owned: @@ -122,8 +122,8 @@ options: - If set to V(not_protected), runner can pick up jobs from both protected and unprotected branches. - If set to V(ref_protected), runner can pick up jobs only from protected branches. - Before community.general 8.0.0 the default was V(ref_protected). This was changed to no default in community.general - 8.0.0. If this option is not specified explicitly, GitLab will use V(not_protected) on creation, and the value set - will not be changed on any updates. + 8.0.0. If this option is not specified explicitly, GitLab uses V(not_protected) on creation, and the value set is + not changed on any updates. required: false choices: ["not_protected", "ref_protected"] type: str @@ -393,10 +393,10 @@ class GitLabRunner(object): # python-gitlab 2.2 through at least 2.5 returns a list of dicts for list() instead of a Runner # object, so we need to handle both if hasattr(runner, "description"): - if (runner.description == description): + if runner.description == description: return self._gitlab.runners.get(runner.id) else: - if (runner['description'] == description): + if runner['description'] == description: return self._gitlab.runners.get(runner['id']) ''' diff --git a/plugins/modules/gitlab_user.py b/plugins/modules/gitlab_user.py index 3be684b1e9..4d7bd506f6 100644 --- a/plugins/modules/gitlab_user.py +++ b/plugins/modules/gitlab_user.py @@ -14,10 +14,10 @@ DOCUMENTATION = r""" module: gitlab_user short_description: Creates/updates/deletes/blocks/unblocks GitLab Users description: - - When the user does not exist in GitLab, it will be created. - - When the user exists and state=absent, the user will be deleted. - - When the user exists and state=blocked, the user will be blocked. - - When changes are made to user, the user will be updated. + - When the user does not exist in GitLab, it is created. + - When the user exists and state=absent, the user is deleted. + - When the user exists and state=blocked, the user is blocked. + - When changes are made to user, the user is updated. notes: - From community.general 0.2.0 and onwards, name, email and password are optional while deleting the user. author: diff --git a/plugins/modules/grove.py b/plugins/modules/grove.py index abdc303f90..81417657c8 100644 --- a/plugins/modules/grove.py +++ b/plugins/modules/grove.py @@ -51,8 +51,8 @@ options: required: false validate_certs: description: - - If V(false), SSL certificates will not be validated. This should only be used on personally controlled sites using - self-signed certificates. + - If V(false), SSL certificates are not validated. This should only be used on personally controlled sites using self-signed + certificates. default: true type: bool author: "Jonas Pfenniger (@zimbatm)" @@ -101,8 +101,8 @@ def main(): channel_token=dict(type='str', required=True, no_log=True), message_content=dict(type='str', required=True), service=dict(type='str', default='ansible'), - url=dict(type='str', default=None), - icon_url=dict(type='str', default=None), + url=dict(type='str'), + icon_url=dict(type='str'), validate_certs=dict(default=True, type='bool'), ) ) diff --git a/plugins/modules/gunicorn.py b/plugins/modules/gunicorn.py index 8118e0f60d..b524165c90 100644 --- a/plugins/modules/gunicorn.py +++ b/plugins/modules/gunicorn.py @@ -50,8 +50,8 @@ options: pid: type: path description: - - A filename to use for the PID file. If not set and not found on the configuration file a tmp pid file will be created - to check a successful run of gunicorn. + - A filename to use for the PID file. If not set and not found on the configuration file a tmp pid file is created to + check a successful run of gunicorn. worker: type: str choices: ['sync', 'eventlet', 'gevent', 'tornado ', 'gthread', 'gaiohttp'] @@ -62,8 +62,8 @@ options: description: - Switch worker processes to run as this user. notes: - - If not specified on config file, a temporary error log will be created on /tmp dir. Please make sure you have write access - in /tmp dir. Not needed but will help you to identify any problem with configuration. + - If not specified on config file, a temporary error log is created on C(/tmp) directory. Please make sure you have write + access in C(/tmp) directory. Not needed but it is helpful to identify any problem with configuration. """ EXAMPLES = r""" diff --git a/plugins/modules/haproxy.py b/plugins/modules/haproxy.py index 9c60e59040..b0e56de061 100644 --- a/plugins/modules/haproxy.py +++ b/plugins/modules/haproxy.py @@ -32,7 +32,7 @@ options: backend: description: - Name of the HAProxy backend pool. - - If this parameter is unset, it will be auto-detected. + - If this parameter is unset, it is auto-detected. type: str drain: description: @@ -62,8 +62,7 @@ options: state: description: - Desired state of the provided backend host. - - Note that V(drain) state is supported only by HAProxy version 1.5 or later. When used on versions < 1.5, it will be - ignored. + - Note that V(drain) state is supported only by HAProxy version 1.5 or later. When used on versions < 1.5, it is ignored. type: str required: true choices: [disabled, drain, enabled] @@ -103,7 +102,7 @@ options: weight: description: - The value passed in argument. - - If the value ends with the V(%) sign, then the new weight will be relative to the initially configured weight. + - If the value ends with the V(%) sign, then the new weight is relative to the initially configured weight. - Relative weights are only permitted between 0 and 100% and absolute weights are permitted between 0 and 256. type: str """ diff --git a/plugins/modules/hg.py b/plugins/modules/hg.py index f269628abb..982364504c 100644 --- a/plugins/modules/hg.py +++ b/plugins/modules/hg.py @@ -61,15 +61,15 @@ options: default: true executable: description: - - Path to hg executable to use. If not supplied, the normal mechanism for resolving binary paths will be used. + - Path to C(hg) executable to use. If not supplied, the normal mechanism for resolving binary paths is used. type: str notes: - This module does not support push capability. See U(https://github.com/ansible/ansible/issues/31156). - - 'If the task seems to be hanging, first verify remote host is in C(known_hosts). SSH will prompt user to authorize the - first contact with a remote host. To avoid this prompt, one solution is to add the remote host public key in C(/etc/ssh/ssh_known_hosts) + - 'If the task seems to be hanging, first verify remote host is in C(known_hosts). SSH prompts user to authorize the first + contact with a remote host. To avoid this prompt, one solution is to add the remote host public key in C(/etc/ssh/ssh_known_hosts) before calling the hg module, with the following command: C(ssh-keyscan remote_host.com >> /etc/ssh/ssh_known_hosts).' - As per 01 Dec 2018, Bitbucket has dropped support for TLSv1 and TLSv1.1 connections. As such, if the underlying system - still uses a Python version below 2.7.9, you will have issues checking out bitbucket repositories. See + still uses a Python version below 2.7.9, you are bound to have issues checking out bitbucket repositories. See U(https://bitbucket.org/blog/deprecating-tlsv1-tlsv1-1-2018-12-01). """ @@ -222,12 +222,12 @@ def main(): argument_spec=dict( repo=dict(type='str', required=True, aliases=['name']), dest=dict(type='path'), - revision=dict(type='str', default=None, aliases=['version']), + revision=dict(type='str', aliases=['version']), force=dict(type='bool', default=False), purge=dict(type='bool', default=False), update=dict(type='bool', default=True), clone=dict(type='bool', default=True), - executable=dict(type='str', default=None), + executable=dict(type='str'), ), ) repo = module.params['repo'] diff --git a/plugins/modules/homebrew.py b/plugins/modules/homebrew.py index 25d4fc37e2..021f990e67 100644 --- a/plugins/modules/homebrew.py +++ b/plugins/modules/homebrew.py @@ -83,7 +83,7 @@ options: default: false version_added: 9.0.0 notes: - - When used with a C(loop:) each package will be processed individually, it is much more efficient to pass the list directly + - When used with a C(loop:) each package is processed individually, it is much more efficient to pass the list directly to the O(name) option. """ @@ -173,7 +173,7 @@ changed_pkgs: - List of package names which are changed after module run. returned: success type: list - sample: ['git', 'git-cola'] + sample: ["git", "git-cola"] version_added: '0.2.0' """ @@ -807,13 +807,11 @@ def main(): argument_spec=dict( name=dict( aliases=["pkg", "package", "formula"], - required=False, type='list', elements='str', ), path=dict( default="/usr/local/bin:/opt/homebrew/bin:/home/linuxbrew/.linuxbrew/bin", - required=False, type='path', ), state=dict( @@ -835,13 +833,11 @@ def main(): type='bool', ), install_options=dict( - default=None, aliases=['options'], type='list', elements='str', ), upgrade_options=dict( - default=None, type='list', elements='str', ), diff --git a/plugins/modules/homebrew_cask.py b/plugins/modules/homebrew_cask.py index 7455a61d69..948f5c1fd1 100644 --- a/plugins/modules/homebrew_cask.py +++ b/plugins/modules/homebrew_cask.py @@ -734,13 +734,11 @@ def main(): argument_spec=dict( name=dict( aliases=["pkg", "package", "cask"], - required=False, type='list', elements='str', ), path=dict( default="/usr/local/bin:/opt/homebrew/bin", - required=False, type='path', ), state=dict( @@ -753,7 +751,6 @@ def main(): ), sudo_password=dict( type="str", - required=False, no_log=True, ), update_homebrew=dict( @@ -761,7 +758,6 @@ def main(): type='bool', ), install_options=dict( - default=None, aliases=['options'], type='list', elements='str', diff --git a/plugins/modules/homebrew_tap.py b/plugins/modules/homebrew_tap.py index f070ccccc7..f50472f90d 100644 --- a/plugins/modules/homebrew_tap.py +++ b/plugins/modules/homebrew_tap.py @@ -220,11 +220,10 @@ def main(): module = AnsibleModule( argument_spec=dict( name=dict(aliases=['tap'], type='list', required=True, elements='str'), - url=dict(default=None, required=False), + url=dict(), state=dict(default='present', choices=['present', 'absent']), path=dict( default="/usr/local/bin:/opt/homebrew/bin:/home/linuxbrew/.linuxbrew/bin", - required=False, type='path', ), ), diff --git a/plugins/modules/homectl.py b/plugins/modules/homectl.py index 6e4366960d..f93867d03b 100644 --- a/plugins/modules/homectl.py +++ b/plugins/modules/homectl.py @@ -65,7 +65,7 @@ options: type: str resize: description: - - When used with O(disksize) this will attempt to resize the home directory immediately. + - When used with O(disksize) this attempts to resize the home directory immediately. default: false type: bool realname: diff --git a/plugins/modules/honeybadger_deployment.py b/plugins/modules/honeybadger_deployment.py index d4bf92b583..2512fc2642 100644 --- a/plugins/modules/honeybadger_deployment.py +++ b/plugins/modules/honeybadger_deployment.py @@ -51,7 +51,7 @@ options: default: "https://api.honeybadger.io/v1/deploys" validate_certs: description: - - If V(false), SSL certificates for the target URL will not be validated. This should only be used on personally controlled + - If V(false), SSL certificates for the target URL are not validated. This should only be used on personally controlled sites using self-signed certificates. type: bool default: true @@ -88,9 +88,9 @@ def main(): token=dict(required=True, no_log=True), environment=dict(required=True), user=dict(required=False), - repo=dict(required=False), - revision=dict(required=False), - url=dict(required=False, default='https://api.honeybadger.io/v1/deploys'), + repo=dict(), + revision=dict(), + url=dict(default='https://api.honeybadger.io/v1/deploys'), validate_certs=dict(default=True, type='bool'), ), supports_check_mode=True diff --git a/plugins/modules/hpilo_boot.py b/plugins/modules/hpilo_boot.py index c3d14564d6..f04aaaed20 100644 --- a/plugins/modules/hpilo_boot.py +++ b/plugins/modules/hpilo_boot.py @@ -67,7 +67,7 @@ options: force: description: - Whether to force a reboot (even when the system is already booted). - - As a safeguard, without force, hpilo_boot will refuse to reboot a server that is already running. + - As a safeguard, without force, M(community.general.hpilo_boot) refuses to reboot a server that is already running. default: false type: bool ssl_version: @@ -78,7 +78,7 @@ options: choices: ["SSLv3", "SSLv23", "TLSv1", "TLSv1_1", "TLSv1_2"] idempotent_boot_once: description: - - "This option makes O(state=boot_once) succeed instead of failing when the server is already powered on." + - This option makes O(state=boot_once) succeed instead of failing when the server is already powered on. type: bool default: false version_added: 10.6.0 diff --git a/plugins/modules/hpilo_info.py b/plugins/modules/hpilo_info.py index 70eecb8b0e..90680603e8 100644 --- a/plugins/modules/hpilo_info.py +++ b/plugins/modules/hpilo_info.py @@ -121,7 +121,7 @@ hw_uuid: host_power_status: description: - Power status of host. - - Will be one of V(ON), V(OFF) and V(UNKNOWN). + - It is one of V(ON), V(OFF) and V(UNKNOWN). returned: always type: str sample: "ON" diff --git a/plugins/modules/htpasswd.py b/plugins/modules/htpasswd.py index f13cd5a610..d8a755476f 100644 --- a/plugins/modules/htpasswd.py +++ b/plugins/modules/htpasswd.py @@ -46,10 +46,13 @@ options: description: - Hashing scheme to be used. As well as the four choices listed here, you can also use any other hash supported by passlib, such as V(portable_apache22) and V(host_apache24); or V(md5_crypt) and V(sha256_crypt), which are Linux passwd hashes. - Only some schemes in addition to the four choices below will be compatible with Apache or Nginx, and supported schemes - depend on passlib version and its dependencies. + Only some schemes in addition to the four choices below are compatible with Apache or Nginx, and supported schemes + depend on C(passlib) version and its dependencies. - See U(https://passlib.readthedocs.io/en/stable/lib/passlib.apache.html#passlib.apache.HtpasswdFile) parameter C(default_scheme). - 'Some of the available choices might be: V(apr_md5_crypt), V(des_crypt), V(ldap_sha1), V(plaintext).' + - 'B(WARNING): The module has no mechanism to determine the O(hash_scheme) of an existing entry, therefore, it does + not detect whether the O(hash_scheme) has changed. If you want to change the scheme, you must remove the existing + entry and then create a new one using the new scheme.' aliases: [crypt_scheme] state: type: str @@ -63,8 +66,8 @@ options: type: bool default: true description: - - Used with O(state=present). If V(true), the file will be created if it does not exist. Conversely, if set to V(false) - and the file does not exist it will fail. + - Used with O(state=present). If V(true), the file is created if it does not exist. Conversely, if set to V(false) and + the file does not exist, it fails. notes: - This module depends on the C(passlib) Python library, which needs to be installed on all target systems. - 'On Debian < 11, Ubuntu <= 20.04, or Fedora: install C(python-passlib).' @@ -188,9 +191,9 @@ def main(): arg_spec = dict( path=dict(type='path', required=True, aliases=["dest", "destfile"]), name=dict(type='str', required=True, aliases=["username"]), - password=dict(type='str', required=False, default=None, no_log=True), - hash_scheme=dict(type='str', required=False, default="apr_md5_crypt", aliases=["crypt_scheme"]), - state=dict(type='str', required=False, default="present", choices=["present", "absent"]), + password=dict(type='str', no_log=True), + hash_scheme=dict(type='str', default="apr_md5_crypt", aliases=["crypt_scheme"]), + state=dict(type='str', default="present", choices=["present", "absent"]), create=dict(type='bool', default=True), ) @@ -238,8 +241,8 @@ def main(): (msg, changed) = present(path, username, password, hash_scheme, create, check_mode) elif state == 'absent': if not os.path.exists(path): - module.exit_json(msg="%s not present" % username, - warnings="%s does not exist" % path, changed=False) + module.warn("%s does not exist" % path) + module.exit_json(msg="%s not present" % username, changed=False) (msg, changed) = absent(path, username, check_mode) else: module.fail_json(msg="Invalid state: %s" % state) diff --git a/plugins/modules/hwc_ecs_instance.py b/plugins/modules/hwc_ecs_instance.py index f01b7c48fd..13becdf07f 100644 --- a/plugins/modules/hwc_ecs_instance.py +++ b/plugins/modules/hwc_ecs_instance.py @@ -442,7 +442,7 @@ created: disk_config_type: description: - Specifies the disk configuration type. MANUAL is The image space is not expanded. AUTO is the image space of the system - disk will be expanded to be as same as the flavor. + disk is expanded to be as same as the flavor. type: str returned: success host_name: diff --git a/plugins/modules/hwc_evs_disk.py b/plugins/modules/hwc_evs_disk.py index 0763c07b01..0d57caf6cb 100644 --- a/plugins/modules/hwc_evs_disk.py +++ b/plugins/modules/hwc_evs_disk.py @@ -70,8 +70,8 @@ options: - SSD specifies the ultra-high I/O disk type. - SAS specifies the high I/O disk type. - SATA specifies the common I/O disk type. - - If the specified disk type is not available in the AZ, the disk will fail to create. If the EVS disk is created from - a snapshot, the volume_type field must be the same as that of the snapshot's source disk. + - If the specified disk type is not available in the AZ, the disk creation fails. If the EVS disk is created from a + snapshot, the volume_type field must be the same as that of the snapshot's source disk. type: str required: true backup_id: @@ -92,9 +92,9 @@ options: required: false enable_scsi: description: - - If this parameter is set to True, the disk device type will be SCSI, which allows ECS OSs to directly access underlying - storage media. SCSI reservation command is supported. If this parameter is set to False, the disk device type will - be VBD, which supports only simple SCSI read/write commands. + - If this parameter is set to V(true), the disk device type is SCSI, which allows ECS OSs to directly access underlying + storage media. SCSI reservation command is supported. If this parameter is set to V(false), the disk device type is + VBD, which supports only simple SCSI read/write commands. - If parameter enable_share is set to True and this parameter is not specified, shared SCSI disks are created. SCSI EVS disks cannot be created from backups, which means that this parameter cannot be True if backup_id has been specified. type: bool @@ -167,8 +167,8 @@ volume_type: - SSD specifies the ultra-high I/O disk type. - SAS specifies the high I/O disk type. - SATA specifies the common I/O disk type. - - If the specified disk type is not available in the AZ, the disk will fail to create. If the EVS disk is created from - a snapshot, the volume_type field must be the same as that of the snapshot's source disk. + - If the specified disk type is not available in the AZ, the disk creation fails. If the EVS disk is created from a snapshot, + the volume_type field must be the same as that of the snapshot's source disk. type: str returned: success backup_id: @@ -189,8 +189,8 @@ enable_full_clone: returned: success enable_scsi: description: - - If this parameter is set to True, the disk device type will be SCSI, which allows ECS OSs to directly access underlying - storage media. SCSI reservation command is supported. If this parameter is set to False, the disk device type will be + - If this parameter is set to V(true), the disk device type is SCSI, which allows ECS OSs to directly access underlying + storage media. SCSI reservation command is supported. If this parameter is set to V(false), the disk device type is VBD, which supports only simple SCSI read/write commands. - If parameter enable_share is set to True and this parameter is not specified, shared SCSI disks are created. SCSI EVS disks cannot be created from backups, which means that this parameter cannot be True if backup_id has been specified. diff --git a/plugins/modules/hwc_network_vpc.py b/plugins/modules/hwc_network_vpc.py index 3342280061..d34e428d6a 100644 --- a/plugins/modules/hwc_network_vpc.py +++ b/plugins/modules/hwc_network_vpc.py @@ -117,7 +117,7 @@ routes: returned: success next_hop: description: - - The next hop of a route. If the route type is peering, it will provide VPC peering connection ID. + - The next hop of a route. If the route type is peering, it provides VPC peering connection ID. type: str returned: success enable_shared_snat: diff --git a/plugins/modules/hwc_vpc_eip.py b/plugins/modules/hwc_vpc_eip.py index b818fe0d86..e830c2b14b 100644 --- a/plugins/modules/hwc_vpc_eip.py +++ b/plugins/modules/hwc_vpc_eip.py @@ -92,7 +92,7 @@ options: required: false ip_version: description: - - The value can be 4 (IPv4 address) or 6 (IPv6 address). If this parameter is left blank, an IPv4 address will be assigned. + - The value can be 4 (IPv4 address) or 6 (IPv6 address). If this parameter is left blank, an IPv4 address is assigned. type: int required: false ipv4_address: @@ -193,7 +193,7 @@ enterprise_project_id: returned: success ip_version: description: - - The value can be 4 (IPv4 address) or 6 (IPv6 address). If this parameter is left blank, an IPv4 address will be assigned. + - The value can be 4 (IPv4 address) or 6 (IPv6 address). If this parameter is left blank, an IPv4 address is assigned. type: int returned: success ipv4_address: diff --git a/plugins/modules/hwc_vpc_private_ip.py b/plugins/modules/hwc_vpc_private_ip.py index 695c644cb9..e665568774 100644 --- a/plugins/modules/hwc_vpc_private_ip.py +++ b/plugins/modules/hwc_vpc_private_ip.py @@ -21,7 +21,7 @@ notes: - If O(id) option is provided, it takes precedence over O(subnet_id), O(ip_address) for private IP selection. - O(subnet_id), O(ip_address) are used for private IP selection. If more than one private IP with this options exists, execution is aborted. - - No parameter support updating. If one of option is changed, the module will create a new resource. + - No parameter support updating. If one of option is changed, the module creates a new resource. version_added: '0.2.0' author: Huawei Inc. (@huaweicloud) requirements: diff --git a/plugins/modules/hwc_vpc_route.py b/plugins/modules/hwc_vpc_route.py index 85224fd4c8..20bbba6cd8 100644 --- a/plugins/modules/hwc_vpc_route.py +++ b/plugins/modules/hwc_vpc_route.py @@ -21,7 +21,7 @@ notes: - If O(id) option is provided, it takes precedence over O(destination), O(vpc_id), O(type), and O(next_hop) for route selection. - O(destination), O(vpc_id), O(type) and O(next_hop) are used for route selection. If more than one route with this options exists, execution is aborted. - - No parameter support updating. If one of option is changed, the module will create a new resource. + - No parameter support updating. If one of option is changed, the module creates a new resource. version_added: '0.2.0' author: Huawei Inc. (@huaweicloud) requirements: diff --git a/plugins/modules/hwc_vpc_security_group.py b/plugins/modules/hwc_vpc_security_group.py index 9f53b49c0d..e1b2b41ae4 100644 --- a/plugins/modules/hwc_vpc_security_group.py +++ b/plugins/modules/hwc_vpc_security_group.py @@ -22,7 +22,7 @@ notes: selection. - O(name), O(enterprise_project_id) and O(vpc_id) are used for security group selection. If more than one security group with this options exists, execution is aborted. - - No parameter support updating. If one of option is changed, the module will create a new resource. + - No parameter support updating. If one of option is changed, the module creates a new resource. version_added: '0.2.0' author: Huawei Inc. (@huaweicloud) requirements: diff --git a/plugins/modules/hwc_vpc_security_group_rule.py b/plugins/modules/hwc_vpc_security_group_rule.py index 0848901cd5..42f854a029 100644 --- a/plugins/modules/hwc_vpc_security_group_rule.py +++ b/plugins/modules/hwc_vpc_security_group_rule.py @@ -21,7 +21,7 @@ notes: - If O(id) option is provided, it takes precedence over O(security_group_id) for security group rule selection. - O(security_group_id) is used for security group rule selection. If more than one security group rule with this options exists, execution is aborted. - - No parameter support updating. If one of option is changed, the module will create a new resource. + - No parameter support updating. If one of option is changed, the module creates a new resource. version_added: '0.2.0' author: Huawei Inc. (@huaweicloud) requirements: diff --git a/plugins/modules/hwc_vpc_subnet.py b/plugins/modules/hwc_vpc_subnet.py index 84a9219370..b9af890688 100644 --- a/plugins/modules/hwc_vpc_subnet.py +++ b/plugins/modules/hwc_vpc_subnet.py @@ -86,7 +86,7 @@ options: required: false dns_address: description: - - Specifies the DNS server addresses for subnet. The address in the head will be used first. + - Specifies the DNS server addresses for subnet. The address in the head is used first. type: list elements: str required: false @@ -148,7 +148,7 @@ dhcp_enable: returned: success dns_address: description: - - Specifies the DNS server addresses for subnet. The address in the head will be used first. + - Specifies the DNS server addresses for subnet. The address in the head is used first. type: list returned: success """ diff --git a/plugins/modules/ibm_sa_host.py b/plugins/modules/ibm_sa_host.py index f6613b3b29..b3d80a6b62 100644 --- a/plugins/modules/ibm_sa_host.py +++ b/plugins/modules/ibm_sa_host.py @@ -41,8 +41,8 @@ options: type: str domain: description: - - The domains the cluster will be attached to. To include more than one domain, separate domain names with commas. To - include all existing domains, use an asterisk (V(*)). + - The domains the cluster is attached to. To include more than one domain, separate domain names with commas. To include + all existing domains, use an asterisk (V(*)). required: false type: str iscsi_chap_name: diff --git a/plugins/modules/icinga2_host.py b/plugins/modules/icinga2_host.py index 8d0a3b554b..d78f607aae 100644 --- a/plugins/modules/icinga2_host.py +++ b/plugins/modules/icinga2_host.py @@ -30,13 +30,13 @@ options: - HTTP, HTTPS, or FTP URL in the form V((http|https|ftp\)://[user[:pass]]@host.domain[:port]/path). use_proxy: description: - - If V(false), it will not use a proxy, even if one is defined in an environment variable on the target hosts. + - If V(false), it does not use a proxy, even if one is defined in an environment variable on the target hosts. type: bool default: true validate_certs: description: - - If V(false), SSL certificates will not be validated. This should only be used on personally controlled sites using - self-signed certificates. + - If V(false), SSL certificates are not validated. This should only be used on personally controlled sites using self-signed + certificates. type: bool default: true url_username: @@ -48,12 +48,12 @@ options: type: str description: - The password for use in HTTP basic authentication. - - If the O(url_username) parameter is not specified, the O(url_password) parameter will not be used. + - If the O(url_username) parameter is not specified, the O(url_password) parameter is not used. force_basic_auth: description: - - C(httplib2), the library used by Ansible's HTTP request code only sends authentication information when a webservice responds to - an initial request with a 401 status. Since some basic auth services do not properly send a 401, logins will fail. - This option forces the sending of the Basic authentication header upon initial request. + - C(httplib2), the library used by Ansible's HTTP request code only sends authentication information when a webservice + responds to an initial request with a 401 status. Since some basic auth services do not properly send a 401, logins + may fail. This option forces the sending of the Basic authentication header upon initial request. type: bool default: false client_cert: @@ -235,11 +235,11 @@ def main(): state=dict(default="present", choices=["absent", "present"]), name=dict(required=True, aliases=['host']), zone=dict(), - template=dict(default=None), + template=dict(), check_command=dict(default="hostalive"), - display_name=dict(default=None), + display_name=dict(), ip=dict(), - variables=dict(type='dict', default=None), + variables=dict(type='dict'), ) # Define the main module diff --git a/plugins/modules/imc_rest.py b/plugins/modules/imc_rest.py index 8a0b63cd78..674ba0d2b3 100644 --- a/plugins/modules/imc_rest.py +++ b/plugins/modules/imc_rest.py @@ -57,8 +57,8 @@ options: description: - When used instead of O(path), sets the content of the API requests directly. - This may be convenient to template simple requests, for anything complex use the M(ansible.builtin.template) module. - - You can collate multiple IMC XML fragments and they will be processed sequentially in a single stream, the Cisco IMC - output is subsequently merged. + - You can collate multiple IMC XML fragments and they are processed sequentially in a single stream, the Cisco IMC output + is subsequently merged. - Parameter O(content) is mutual exclusive with parameter O(path). type: str protocol: @@ -71,12 +71,12 @@ options: description: - The socket level timeout in seconds. - This is the time that every single connection (every fragment) can spend. If this O(timeout) is reached, the module - will fail with a C(Connection failure) indicating that C(The read operation timed out). + fails with a C(Connection failure) indicating that C(The read operation timed out). default: 60 type: int validate_certs: description: - - If V(false), SSL certificates will not be validated. + - If V(false), SSL certificates are not validated. - This should only set to V(false) used on personally controlled sites using self-signed certificates. type: bool default: true @@ -84,8 +84,8 @@ notes: - The XML fragments do not need an authentication cookie, this is injected by the module automatically. - The Cisco IMC XML output is being translated to JSON using the Cobra convention. - Any configConfMo change requested has a return status of C(modified), even if there was no actual change from the previous - configuration. As a result, this module will always report a change on subsequent runs. In case this behaviour is fixed - in a future update to Cisco IMC, this module will automatically adapt. + configuration. As a result, this module always reports a change on subsequent runs. In case this behaviour is fixed in + a future update to Cisco IMC, this module is meant to automatically adapt. - If you get a C(Connection failure) related to C(The read operation timed out) increase the O(timeout) parameter. Some XML fragments can take longer than the default timeout. - More information about the IMC REST API is available from diff --git a/plugins/modules/imgadm.py b/plugins/modules/imgadm.py index 344bf9cc56..1c29e8a94b 100644 --- a/plugins/modules/imgadm.py +++ b/plugins/modules/imgadm.py @@ -44,7 +44,7 @@ options: choices: [present, absent, deleted, imported, updated, vacuumed] description: - State the object operated on should be in. V(imported) is an alias for for V(present) and V(deleted) for V(absent). - When set to V(vacuumed) and O(uuid=*), it will remove all unused images. + When set to V(vacuumed) and O(uuid=*), it removes all unused images. type: str type: diff --git a/plugins/modules/influxdb_user.py b/plugins/modules/influxdb_user.py index 5ec6cd010d..45410e76a5 100644 --- a/plugins/modules/influxdb_user.py +++ b/plugins/modules/influxdb_user.py @@ -37,7 +37,7 @@ options: admin: description: - Whether the user should be in the admin role or not. - - Since version 2.8, the role will also be updated. + - Since version 2.8, the role is also updated. default: false type: bool state: @@ -50,8 +50,8 @@ options: description: - Privileges to grant to this user. - Takes a list of dicts containing the "database" and "privilege" keys. - - If this argument is not provided, the current grants will be left alone. - - If an empty list is provided, all grants for the user will be removed. + - If this argument is not provided, the current grants are left alone. + - If an empty list is provided, all grants for the user are removed. type: list elements: dict extends_documentation_fragment: @@ -217,7 +217,7 @@ def main(): argument_spec.update( state=dict(default='present', type='str', choices=['present', 'absent']), user_name=dict(required=True, type='str'), - user_password=dict(required=False, type='str', no_log=True), + user_password=dict(type='str', no_log=True), admin=dict(default='False', type='bool'), grants=dict(type='list', elements='dict'), ) diff --git a/plugins/modules/ini_file.py b/plugins/modules/ini_file.py index bf8534bf39..04fe92fa08 100644 --- a/plugins/modules/ini_file.py +++ b/plugins/modules/ini_file.py @@ -39,7 +39,7 @@ options: section: description: - Section name in INI file. This is added if O(state=present) automatically when a single value is being set. - - If being omitted, the O(option) will be placed before the first O(section). + - If being omitted, the O(option) is placed before the first O(section). - Omitting O(section) is also required if the config format does not support sections. type: str section_has_values: @@ -63,7 +63,7 @@ options: elements: str description: - Among possibly multiple sections of the same name, select the first one that contains matching options and values. - - With O(state=present), if a suitable section is not found, a new section will be added, including the required options. + - With O(state=present), if a suitable section is not found, a new section is added, including the required options. - With O(state=absent), at most one O(section) is removed if it contains the values. version_added: 8.6.0 option: @@ -100,8 +100,8 @@ options: O(option)s with the same name are not touched. - If set to V(present) and O(exclusive) set to V(false) the specified O(option=values) lines are added, but the other O(option)s with the same name are not touched. - - If set to V(present) and O(exclusive) set to V(true) all given O(option=values) lines will be added and the other - O(option)s with the same name are removed. + - If set to V(present) and O(exclusive) set to V(true) all given O(option=values) lines are added and the other O(option)s + with the same name are removed. type: str choices: [absent, present] default: present @@ -126,8 +126,8 @@ options: version_added: 7.5.0 create: description: - - If set to V(false), the module will fail if the file does not already exist. - - By default it will create the file if it is missing. + - If set to V(false), the module fails if the file does not already exist. + - By default it creates the file if it is missing. type: bool default: true allow_no_value: @@ -584,7 +584,7 @@ def main(): option=dict(type='str', required=True), value=dict(type='str'), values=dict(type='list', elements='str') - ), default=None, mutually_exclusive=[['value', 'values']]), + ), mutually_exclusive=[['value', 'values']]), option=dict(type='str'), value=dict(type='str'), values=dict(type='list', elements='str'), diff --git a/plugins/modules/installp.py b/plugins/modules/installp.py index e54a56949f..da88a7e7c2 100644 --- a/plugins/modules/installp.py +++ b/plugins/modules/installp.py @@ -47,7 +47,7 @@ options: choices: [absent, present] default: present notes: - - If the package is already installed, even the package/fileset is new, the module will not install it. + - If the package is already installed, even the package/fileset is new, the module does not install it. """ EXAMPLES = r""" diff --git a/plugins/modules/interfaces_file.py b/plugins/modules/interfaces_file.py index 23bfd78790..8e315d7b69 100644 --- a/plugins/modules/interfaces_file.py +++ b/plugins/modules/interfaces_file.py @@ -45,10 +45,10 @@ options: value: type: str description: - - If O(option) is not presented for the O(iface) and O(state) is V(present) option will be added. If O(option) already - exists and is not V(pre-up), V(up), V(post-up) or V(down), its value will be updated. V(pre-up), V(up), V(post-up) - and V(down) options cannot be updated, only adding new options, removing existing ones or cleaning the whole option - set are supported. + - If O(option) is not presented for the O(iface) and O(state) is V(present), then O(option) is added. If O(option) already + exists and is not V(pre-up), V(up), V(post-up) or V(down), its value is updated. V(pre-up), V(up), V(post-up) and + V(down) options cannot be updated, only adding new options, removing existing ones or cleaning the whole option set + are supported. backup: description: - Create a backup file including the timestamp information so you can get the original file back if you somehow clobbered @@ -58,12 +58,12 @@ options: state: type: str description: - - If set to V(absent) the option or section will be removed if present instead of created. + - If set to V(absent) the option or section is removed if present instead of created. default: "present" choices: ["present", "absent"] notes: - - If option is defined multiple times last one will be updated but all will be deleted in case of an absent state. + - If option is defined multiple times last one is updated but all others are deleted in case of an O(state=absent). requirements: [] author: "Roman Belyakovsky (@hryamzik)" """ diff --git a/plugins/modules/ipa_dnsrecord.py b/plugins/modules/ipa_dnsrecord.py index d92e2c4f66..3cba35b11c 100644 --- a/plugins/modules/ipa_dnsrecord.py +++ b/plugins/modules/ipa_dnsrecord.py @@ -45,33 +45,31 @@ options: - Manage DNS record name with this value. - Mutually exclusive with O(record_values), and exactly one of O(record_value) and O(record_values) has to be specified. - Use O(record_values) if you need to specify multiple values. - - In the case of V(A) or V(AAAA) record types, this will be the IP address. - - In the case of V(A6) record type, this will be the A6 Record data. - - In the case of V(CNAME) record type, this will be the hostname. - - In the case of V(DNAME) record type, this will be the DNAME target. - - In the case of V(NS) record type, this will be the name server hostname. Hostname must already have a valid A or AAAA - record. - - In the case of V(PTR) record type, this will be the hostname. - - In the case of V(TXT) record type, this will be a text. - - In the case of V(SRV) record type, this will be a service record. - - In the case of V(MX) record type, this will be a mail exchanger record. - - In the case of V(SSHFP) record type, this will be an SSH fingerprint record. + - In the case of V(A) or V(AAAA) record types, this is the IP address. + - In the case of V(A6) record type, this is the A6 Record data. + - In the case of V(CNAME) record type, this is the hostname. + - In the case of V(DNAME) record type, this is the DNAME target. + - In the case of V(NS) record type, this is the name server hostname. Hostname must already have a valid A or AAAA record. + - In the case of V(PTR) record type, this is the hostname. + - In the case of V(TXT) record type, this is a text. + - In the case of V(SRV) record type, this is a service record. + - In the case of V(MX) record type, this is a mail exchanger record. + - In the case of V(SSHFP) record type, this is an SSH fingerprint record. type: str record_values: description: - Manage DNS record name with this value. - Mutually exclusive with O(record_value), and exactly one of O(record_value) and O(record_values) has to be specified. - - In the case of V(A) or V(AAAA) record types, this will be the IP address. - - In the case of V(A6) record type, this will be the A6 Record data. - - In the case of V(CNAME) record type, this will be the hostname. - - In the case of V(DNAME) record type, this will be the DNAME target. - - In the case of V(NS) record type, this will be the name server hostname. Hostname must already have a valid A or AAAA - record. - - In the case of V(PTR) record type, this will be the hostname. - - In the case of V(TXT) record type, this will be a text. - - In the case of V(SRV) record type, this will be a service record. - - In the case of V(MX) record type, this will be a mail exchanger record. - - In the case of V(SSHFP) record type, this will be an SSH fingerprint record. + - In the case of V(A) or V(AAAA) record types, this is the IP address. + - In the case of V(A6) record type, this is the A6 Record data. + - In the case of V(CNAME) record type, this is the hostname. + - In the case of V(DNAME) record type, this is the DNAME target. + - In the case of V(NS) record type, this is the name server hostname. Hostname must already have a valid A or AAAA record. + - In the case of V(PTR) record type, this is the hostname. + - In the case of V(TXT) record type, this is a text. + - In the case of V(SRV) record type, this is a service record. + - In the case of V(MX) record type, this is a mail exchanger record. + - In the case of V(SSHFP) record type, this is an SSH fingerprint record. type: list elements: str record_ttl: @@ -167,7 +165,7 @@ EXAMPLES = r""" state: absent - name: Ensure an NS record for a subdomain is present - community,general.ipa_dnsrecord: + community.general.ipa_dnsrecord: name: subdomain zone_name: example.com record_type: 'NS' @@ -355,7 +353,7 @@ def main(): record_value=dict(type='str'), record_values=dict(type='list', elements='str'), state=dict(type='str', default='present', choices=['present', 'absent']), - record_ttl=dict(type='int', required=False), + record_ttl=dict(type='int'), ) module = AnsibleModule( diff --git a/plugins/modules/ipa_dnszone.py b/plugins/modules/ipa_dnszone.py index b536c258d2..81a99bc54b 100644 --- a/plugins/modules/ipa_dnszone.py +++ b/plugins/modules/ipa_dnszone.py @@ -173,8 +173,8 @@ def main(): argument_spec = ipa_argument_spec() argument_spec.update(zone_name=dict(type='str', required=True), state=dict(type='str', default='present', choices=['present', 'absent']), - dynamicupdate=dict(type='bool', required=False, default=False), - allowsyncptr=dict(type='bool', required=False, default=False), + dynamicupdate=dict(type='bool', default=False), + allowsyncptr=dict(type='bool', default=False), ) module = AnsibleModule(argument_spec=argument_spec, diff --git a/plugins/modules/ipa_getkeytab.py b/plugins/modules/ipa_getkeytab.py index dfd612564b..7c533fb729 100644 --- a/plugins/modules/ipa_getkeytab.py +++ b/plugins/modules/ipa_getkeytab.py @@ -67,15 +67,15 @@ options: retrieve_mode: description: - Retrieve an existing key from the server instead of generating a new one. - - This is incompatible with the O(password), and will work only against a IPA server more recent than version 3.3. + - This is incompatible with the O(password), and works only against a IPA server more recent than version 3.3. - The user requesting the keytab must have access to the keys for this operation to succeed. - - Be aware that if set V(true), a new keytab will be generated. + - Be aware that if set V(true), a new keytab is generated. - This invalidates all previously retrieved keytabs for this service principal. type: bool encryption_types: description: - The list of encryption types to use to generate keys. - - It will use local client defaults if not provided. + - It uses local client defaults if not provided. - Valid values depend on the Kerberos library version and configuration. type: str state: diff --git a/plugins/modules/ipa_group.py b/plugins/modules/ipa_group.py index 60077a2c6a..934e533dff 100644 --- a/plugins/modules/ipa_group.py +++ b/plugins/modules/ipa_group.py @@ -22,7 +22,7 @@ options: append: description: - If V(true), add the listed O(user) and O(group) to the group members. - - If V(false), only the listed O(user) and O(group) will be group members, removing any other members. + - If V(false), only the listed O(user) and O(group) are set as group members, removing any other members. default: false type: bool version_added: 4.0.0 @@ -49,10 +49,10 @@ options: group: description: - List of group names assigned to this group. - - If O(append=false) and an empty list is passed all groups will be removed from this group. - - Groups that are already assigned but not passed will be removed. - - If O(append=true) the listed groups will be assigned without removing other groups. - - If option is omitted assigned groups will not be checked or changed. + - If O(append=false) and an empty list is passed all groups are removed from this group. + - Groups that are already assigned but not passed are removed. + - If O(append=true) the listed groups are assigned without removing other groups. + - If option is omitted assigned groups are not checked or changed. type: list elements: str nonposix: @@ -62,10 +62,10 @@ options: user: description: - List of user names assigned to this group. - - If O(append=false) and an empty list is passed all users will be removed from this group. - - Users that are already assigned but not passed will be removed. - - If O(append=true) the listed users will be assigned without removing other users. - - If option is omitted assigned users will not be checked or changed. + - If O(append=false) and an empty list is passed all users are removed from this group. + - Users that are already assigned but not passed are removed. + - If O(append=true) the listed users are assigned without removing other users. + - If option is omitted assigned users are not checked or changed. type: list elements: str external_user: @@ -73,7 +73,7 @@ options: - List of external users assigned to this group. - Behaves identically to O(user) with respect to O(append) attribute. - List entries can be in V(DOMAIN\\\\username) or SID format. - - Unless SIDs are provided, the module will always attempt to make changes even if the group already has all the users. + - Unless SIDs are provided, the module always attempts to make changes even if the group already has all the users. This is because only SIDs are returned by IPA query. - O(external=true) is needed for this option to work. type: list @@ -261,7 +261,7 @@ def ensure(module, client): nonposix=module.params['nonposix']) ipa_group = client.group_find(name=name) - if (not (external or external_user is None)): + if not (external or external_user is None): module.fail_json("external_user can only be set if external = True") changed = False diff --git a/plugins/modules/ipa_hbacrule.py b/plugins/modules/ipa_hbacrule.py index d168a3a7e0..cb828f68e9 100644 --- a/plugins/modules/ipa_hbacrule.py +++ b/plugins/modules/ipa_hbacrule.py @@ -32,8 +32,8 @@ options: host: description: - List of host names to assign. - - If an empty list is passed all hosts will be removed from the rule. - - If option is omitted hosts will not be checked or changed. + - If an empty list is passed all hosts are removed from the rule. + - If option is omitted hosts are not checked or changed. required: false type: list elements: str @@ -44,15 +44,15 @@ options: hostgroup: description: - List of hostgroup names to assign. - - If an empty list is passed all hostgroups will be removed from the rule. - - If option is omitted hostgroups will not be checked or changed. + - If an empty list is passed all hostgroups are removed from the rule. + - If option is omitted hostgroups are not checked or changed. type: list elements: str service: description: - List of service names to assign. - - If an empty list is passed all services will be removed from the rule. - - If option is omitted services will not be checked or changed. + - If an empty list is passed all services are removed from the rule. + - If option is omitted services are not checked or changed. type: list elements: str servicecategory: @@ -62,15 +62,15 @@ options: servicegroup: description: - List of service group names to assign. - - If an empty list is passed all assigned service groups will be removed from the rule. - - If option is omitted service groups will not be checked or changed. + - If an empty list is passed all assigned service groups are removed from the rule. + - If option is omitted service groups are not checked or changed. type: list elements: str sourcehost: description: - List of source host names to assign. - - If an empty list if passed all assigned source hosts will be removed from the rule. - - If option is omitted source hosts will not be checked or changed. + - If an empty list if passed all assigned source hosts are removed from the rule. + - If option is omitted source hosts are not checked or changed. type: list elements: str sourcehostcategory: @@ -80,8 +80,8 @@ options: sourcehostgroup: description: - List of source host group names to assign. - - If an empty list if passed all assigned source host groups will be removed from the rule. - - If option is omitted source host groups will not be checked or changed. + - If an empty list if passed all assigned source host groups are removed from the rule. + - If option is omitted source host groups are not checked or changed. type: list elements: str state: @@ -92,8 +92,8 @@ options: user: description: - List of user names to assign. - - If an empty list if passed all assigned users will be removed from the rule. - - If option is omitted users will not be checked or changed. + - If an empty list if passed all assigned users are removed from the rule. + - If option is omitted users are not checked or changed. type: list elements: str usercategory: @@ -103,8 +103,8 @@ options: usergroup: description: - List of user group names to assign. - - If an empty list if passed all assigned user groups will be removed from the rule. - - If option is omitted user groups will not be checked or changed. + - If an empty list if passed all assigned user groups are removed from the rule. + - If option is omitted user groups are not checked or changed. type: list elements: str extends_documentation_fragment: diff --git a/plugins/modules/ipa_host.py b/plugins/modules/ipa_host.py index a78ea6223e..c88f3c0adb 100644 --- a/plugins/modules/ipa_host.py +++ b/plugins/modules/ipa_host.py @@ -42,9 +42,9 @@ options: mac_address: description: - List of Hardware MAC address(es) off this host. - - If option is omitted MAC addresses will not be checked or changed. - - If an empty list is passed all assigned MAC addresses will be removed. - - MAC addresses that are already assigned but not passed will be removed. + - If option is omitted MAC addresses are not checked nor changed. + - If an empty list is passed all assigned MAC addresses are removed. + - MAC addresses that are already assigned but not passed are removed. aliases: ["macaddress"] type: list elements: str @@ -66,9 +66,9 @@ options: user_certificate: description: - List of Base-64 encoded server certificates. - - If option is omitted certificates will not be checked or changed. - - If an empty list is passed all assigned certificates will be removed. - - Certificates already assigned but not passed will be removed. + - If option is omitted certificates are not checked nor changed. + - If an empty list is passed all assigned certificates are removed. + - Certificates already assigned but not passed are removed. aliases: ["usercertificate"] type: list elements: str diff --git a/plugins/modules/ipa_hostgroup.py b/plugins/modules/ipa_hostgroup.py index c1e7d3ad56..ffe87fca4c 100644 --- a/plugins/modules/ipa_hostgroup.py +++ b/plugins/modules/ipa_hostgroup.py @@ -22,7 +22,7 @@ options: append: description: - If V(true), add the listed O(host) to the O(hostgroup). - - If V(false), only the listed O(host) will be in O(hostgroup), removing any other hosts. + - If V(false), only the listed O(host) is set in O(hostgroup), removing any other hosts. default: false type: bool version_added: 6.6.0 @@ -40,17 +40,17 @@ options: host: description: - List of hosts that belong to the host-group. - - If an empty list is passed all hosts will be removed from the group. - - If option is omitted hosts will not be checked or changed. - - If option is passed all assigned hosts that are not passed will be unassigned from the group. + - If an empty list is passed all hosts are removed from the group. + - If option is omitted hosts are not checked nor changed. + - If option is passed all assigned hosts that are not passed are unassigned from the group. type: list elements: str hostgroup: description: - List of host-groups than belong to that host-group. - - If an empty list is passed all host-groups will be removed from the group. - - If option is omitted host-groups will not be checked or changed. - - If option is passed all assigned hostgroups that are not passed will be unassigned from the group. + - If an empty list is passed all host-groups are removed from the group. + - If option is omitted host-groups are not checked nor changed. + - If option is passed all assigned hostgroups that are not passed are unassigned from the group. type: list elements: str state: diff --git a/plugins/modules/ipa_otptoken.py b/plugins/modules/ipa_otptoken.py index 5f5c8dd612..e8c99bd302 100644 --- a/plugins/modules/ipa_otptoken.py +++ b/plugins/modules/ipa_otptoken.py @@ -26,7 +26,7 @@ options: aliases: ["name"] type: str newuniqueid: - description: If specified, the unique ID specified will be changed to this. + description: If specified, the unique ID specified is changed to this. type: str otptype: description: @@ -37,7 +37,7 @@ options: secretkey: description: - Token secret (Base64). - - If OTP is created and this is not specified, a random secret will be generated by IPA. + - If OTP is created and this is not specified, a random secret is generated by IPA. - B(Note:) Cannot be modified after OTP is created. type: str description: @@ -54,13 +54,13 @@ options: description: - First date/time the token can be used. - In the format C(YYYYMMddHHmmss). - - For example, V(20180121182022) will allow the token to be used starting on 21 January 2018 at 18:20:22. + - For example, V(20180121182022) allows the token to be used starting on 21 January 2018 at 18:20:22. type: str notafter: description: - Last date/time the token can be used. - In the format C(YYYYMMddHHmmss). - - For example, V(20200121182022) will allow the token to be used until 21 January 2020 at 18:20:22. + - For example, V(20200121182022) allows the token to be used until 21 January 2020 at 18:20:22. type: str vendor: description: Token vendor name (informational only). @@ -84,7 +84,7 @@ options: type: str digits: description: - - Number of digits each token code will have. + - Number of digits each token code has. - B(Note:) Cannot be modified after OTP is created. choices: [6, 8] type: int diff --git a/plugins/modules/ipa_role.py b/plugins/modules/ipa_role.py index e77b732cb2..6057deec7b 100644 --- a/plugins/modules/ipa_role.py +++ b/plugins/modules/ipa_role.py @@ -33,41 +33,41 @@ options: group: description: - List of group names assign to this role. - - If an empty list is passed all assigned groups will be unassigned from the role. - - If option is omitted groups will not be checked or changed. - - If option is passed all assigned groups that are not passed will be unassigned from the role. + - If an empty list is passed all assigned groups are unassigned from the role. + - If option is omitted groups are not checked nor changed. + - If option is passed all assigned groups that are not passed are unassigned from the role. type: list elements: str host: description: - List of host names to assign. - - If an empty list is passed all assigned hosts will be unassigned from the role. - - If option is omitted hosts will not be checked or changed. - - If option is passed all assigned hosts that are not passed will be unassigned from the role. + - If an empty list is passed all assigned hosts are unassigned from the role. + - If option is omitted hosts are not checked nor changed. + - If option is passed all assigned hosts that are not passed are unassigned from the role. type: list elements: str hostgroup: description: - List of host group names to assign. - - If an empty list is passed all assigned host groups will be removed from the role. - - If option is omitted host groups will not be checked or changed. - - If option is passed all assigned hostgroups that are not passed will be unassigned from the role. + - If an empty list is passed all assigned host groups are removed from the role. + - If option is omitted host groups are not checked nor changed. + - If option is passed all assigned hostgroups that are not passed are unassigned from the role. type: list elements: str privilege: description: - List of privileges granted to the role. - - If an empty list is passed all assigned privileges will be removed. - - If option is omitted privileges will not be checked or changed. - - If option is passed all assigned privileges that are not passed will be removed. + - If an empty list is passed all assigned privileges are removed. + - If option is omitted privileges are not checked nor changed. + - If option is passed all assigned privileges that are not passed are removed. type: list elements: str service: description: - List of service names to assign. - - If an empty list is passed all assigned services will be removed from the role. - - If option is omitted services will not be checked or changed. - - If option is passed all assigned services that are not passed will be removed from the role. + - If an empty list is passed all assigned services are removed from the role. + - If option is omitted services are not checked nor changed. + - If option is passed all assigned services that are not passed are removed from the role. type: list elements: str state: @@ -78,8 +78,8 @@ options: user: description: - List of user names to assign. - - If an empty list is passed all assigned users will be removed from the role. - - If option is omitted users will not be checked or changed. + - If an empty list is passed all assigned users are removed from the role. + - If option is omitted users are not checked nor changed. type: list elements: str extends_documentation_fragment: diff --git a/plugins/modules/ipa_service.py b/plugins/modules/ipa_service.py index 54c5575950..51ace78760 100644 --- a/plugins/modules/ipa_service.py +++ b/plugins/modules/ipa_service.py @@ -197,10 +197,10 @@ def main(): argument_spec = ipa_argument_spec() argument_spec.update( krbcanonicalname=dict(type='str', required=True, aliases=['name']), - force=dict(type='bool', required=False), - skip_host_check=dict(type='bool', default=False, required=False), - hosts=dict(type='list', required=False, elements='str'), - state=dict(type='str', required=False, default='present', + force=dict(type='bool'), + skip_host_check=dict(type='bool', default=False), + hosts=dict(type='list', elements='str'), + state=dict(type='str', default='present', choices=['present', 'absent'])) module = AnsibleModule(argument_spec=argument_spec, diff --git a/plugins/modules/ipa_sudocmdgroup.py b/plugins/modules/ipa_sudocmdgroup.py index c7ab798f4c..4298032121 100644 --- a/plugins/modules/ipa_sudocmdgroup.py +++ b/plugins/modules/ipa_sudocmdgroup.py @@ -37,8 +37,8 @@ options: sudocmd: description: - List of sudo commands to assign to the group. - - If an empty list is passed all assigned commands will be removed from the group. - - If option is omitted sudo commands will not be checked or changed. + - If an empty list is passed all assigned commands are removed from the group. + - If option is omitted sudo commands are not checked nor changed. type: list elements: str extends_documentation_fragment: diff --git a/plugins/modules/ipa_sudorule.py b/plugins/modules/ipa_sudorule.py index 1670a52035..ae3730da62 100644 --- a/plugins/modules/ipa_sudorule.py +++ b/plugins/modules/ipa_sudorule.py @@ -34,31 +34,31 @@ options: cmd: description: - List of commands assigned to the rule. - - If an empty list is passed all commands will be removed from the rule. - - If option is omitted commands will not be checked or changed. + - If an empty list is passed all commands are removed from the rule. + - If option is omitted commands are not checked nor changed. type: list elements: str cmdgroup: description: - List of command groups assigned to the rule. - - If an empty list is passed all command groups will be removed from the rule. - - If option is omitted command groups will not be checked or changed. + - If an empty list is passed all command groups are removed from the rule. + - If option is omitted command groups are not checked nor changed. type: list elements: str version_added: 2.0.0 deny_cmd: description: - List of denied commands assigned to the rule. - - If an empty list is passed all commands will be removed from the rule. - - If option is omitted commands will not be checked or changed. + - If an empty list is passed all commands are removed from the rule. + - If option is omitted commands are not checked nor changed. type: list elements: str version_added: 8.1.0 deny_cmdgroup: description: - List of denied command groups assigned to the rule. - - If an empty list is passed all command groups will be removed from the rule. - - If option is omitted command groups will not be checked or changed. + - If an empty list is passed all command groups are removed from the rule. + - If option is omitted command groups are not checked nor changed. type: list elements: str version_added: 8.1.0 @@ -69,8 +69,8 @@ options: host: description: - List of hosts assigned to the rule. - - If an empty list is passed all hosts will be removed from the rule. - - If option is omitted hosts will not be checked or changed. + - If an empty list is passed all hosts are removed from the rule. + - If option is omitted hosts are not checked nor changed. - Option O(hostcategory) must be omitted to assign hosts. type: list elements: str @@ -84,8 +84,8 @@ options: hostgroup: description: - List of host groups assigned to the rule. - - If an empty list is passed all host groups will be removed from the rule. - - If option is omitted host groups will not be checked or changed. + - If an empty list is passed all host groups are removed from the rule. + - If option is omitted host groups are not checked nor changed. - Option O(hostcategory) must be omitted to assign host groups. type: list elements: str @@ -113,8 +113,8 @@ options: user: description: - List of users assigned to the rule. - - If an empty list is passed all users will be removed from the rule. - - If option is omitted users will not be checked or changed. + - If an empty list is passed all users are removed from the rule. + - If option is omitted users are not checked nor changed. type: list elements: str usercategory: @@ -125,8 +125,8 @@ options: usergroup: description: - List of user groups assigned to the rule. - - If an empty list is passed all user groups will be removed from the rule. - - If option is omitted user groups will not be checked or changed. + - If an empty list is passed all user groups are removed from the rule. + - If option is omitted user groups are not checked nor changed. type: list elements: str state: diff --git a/plugins/modules/ipa_user.py b/plugins/modules/ipa_user.py index 47d50972bd..6e61f89600 100644 --- a/plugins/modules/ipa_user.py +++ b/plugins/modules/ipa_user.py @@ -35,9 +35,9 @@ options: type: str krbpasswordexpiration: description: - - Date at which the user password will expire. + - Date at which the user password expires. - In the format YYYYMMddHHmmss. - - For example V(20180121182022) will expire on 21 January 2018 at 18:20:22. + - For example V(20180121182022) expires on 21 January 2018 at 18:20:22. type: str loginshell: description: Login shell. @@ -45,14 +45,14 @@ options: mail: description: - List of mail addresses assigned to the user. - - If an empty list is passed all assigned email addresses will be deleted. - - If None is passed email addresses will not be checked or changed. + - If an empty list is passed all assigned email addresses are deleted. + - If None is passed email addresses are not checked nor changed. type: list elements: str password: description: - Password for a user. - - Will not be set for an existing user unless O(update_password=always), which is the default. + - It is not set for an existing user unless O(update_password=always), which is the default. type: str sn: description: @@ -62,8 +62,8 @@ options: sshpubkey: description: - List of public SSH key. - - If an empty list is passed all assigned public keys will be deleted. - - If None is passed SSH public keys will not be checked or changed. + - If an empty list is passed all assigned public keys are deleted. + - If None is passed SSH public keys are not checked nor changed. type: list elements: str state: @@ -74,8 +74,8 @@ options: telephonenumber: description: - List of telephone numbers assigned to the user. - - If an empty list is passed all assigned telephone numbers will be deleted. - - If None is passed telephone numbers will not be checked or changed. + - If an empty list is passed all assigned telephone numbers are deleted. + - If None is passed telephone numbers are not checked nor changed. type: list elements: str title: diff --git a/plugins/modules/ipbase_info.py b/plugins/modules/ipbase_info.py index 3c7d3d26c1..7a2dde13d6 100644 --- a/plugins/modules/ipbase_info.py +++ b/plugins/modules/ipbase_info.py @@ -21,7 +21,7 @@ extends_documentation_fragment: options: ip: description: - - The IP you want to get the info for. If not specified the API will detect the IP automatically. + - The IP you want to get the info for. If not specified the API detects the IP automatically. required: false type: str apikey: @@ -31,7 +31,7 @@ options: type: str hostname: description: - - If the O(hostname) parameter is set to V(true), the API response will contain the hostname of the IP. + - If the O(hostname) parameter is set to V(true), the API response contains the hostname of the IP. required: false type: bool default: false @@ -71,147 +71,148 @@ data: of the response." returned: success type: dict - sample: { - "ip": "1.1.1.1", - "hostname": "one.one.one.one", - "type": "v4", - "range_type": { - "type": "PUBLIC", - "description": "Public address" - }, - "connection": { - "asn": 13335, - "organization": "Cloudflare, Inc.", - "isp": "APNIC Research and Development", - "range": "1.1.1.1/32" - }, - "location": { - "geonames_id": 5332870, - "latitude": 34.053611755371094, - "longitude": -118.24549865722656, - "zip": "90012", - "continent": { - "code": "NA", - "name": "North America", - "name_translated": "North America" + sample: + { + "ip": "1.1.1.1", + "hostname": "one.one.one.one", + "type": "v4", + "range_type": { + "type": "PUBLIC", + "description": "Public address" }, - "country": { - "alpha2": "US", - "alpha3": "USA", - "calling_codes": [ - "+1" - ], - "currencies": [ - { - "symbol": "$", - "name": "US Dollar", - "symbol_native": "$", - "decimal_digits": 2, - "rounding": 0, - "code": "USD", - "name_plural": "US dollars" - } - ], - "emoji": "...", - "ioc": "USA", - "languages": [ - { - "name": "English", - "name_native": "English" - } - ], - "name": "United States", - "name_translated": "United States", - "timezones": [ - "America/New_York", - "America/Detroit", - "America/Kentucky/Louisville", - "America/Kentucky/Monticello", - "America/Indiana/Indianapolis", - "America/Indiana/Vincennes", - "America/Indiana/Winamac", - "America/Indiana/Marengo", - "America/Indiana/Petersburg", - "America/Indiana/Vevay", - "America/Chicago", - "America/Indiana/Tell_City", - "America/Indiana/Knox", - "America/Menominee", - "America/North_Dakota/Center", - "America/North_Dakota/New_Salem", - "America/North_Dakota/Beulah", - "America/Denver", - "America/Boise", - "America/Phoenix", - "America/Los_Angeles", - "America/Anchorage", - "America/Juneau", - "America/Sitka", - "America/Metlakatla", - "America/Yakutat", - "America/Nome", - "America/Adak", - "Pacific/Honolulu" - ], - "is_in_european_union": false, - "fips": "US", - "geonames_id": 6252001, - "hasc_id": "US", - "wikidata_id": "Q30" + "connection": { + "asn": 13335, + "organization": "Cloudflare, Inc.", + "isp": "APNIC Research and Development", + "range": "1.1.1.1/32" }, - "city": { - "fips": "644000", - "alpha2": null, - "geonames_id": 5368753, - "hasc_id": null, - "wikidata_id": "Q65", - "name": "Los Angeles", - "name_translated": "Los Angeles" + "location": { + "geonames_id": 5332870, + "latitude": 34.053611755371094, + "longitude": -118.24549865722656, + "zip": "90012", + "continent": { + "code": "NA", + "name": "North America", + "name_translated": "North America" + }, + "country": { + "alpha2": "US", + "alpha3": "USA", + "calling_codes": [ + "+1" + ], + "currencies": [ + { + "symbol": "$", + "name": "US Dollar", + "symbol_native": "$", + "decimal_digits": 2, + "rounding": 0, + "code": "USD", + "name_plural": "US dollars" + } + ], + "emoji": "...", + "ioc": "USA", + "languages": [ + { + "name": "English", + "name_native": "English" + } + ], + "name": "United States", + "name_translated": "United States", + "timezones": [ + "America/New_York", + "America/Detroit", + "America/Kentucky/Louisville", + "America/Kentucky/Monticello", + "America/Indiana/Indianapolis", + "America/Indiana/Vincennes", + "America/Indiana/Winamac", + "America/Indiana/Marengo", + "America/Indiana/Petersburg", + "America/Indiana/Vevay", + "America/Chicago", + "America/Indiana/Tell_City", + "America/Indiana/Knox", + "America/Menominee", + "America/North_Dakota/Center", + "America/North_Dakota/New_Salem", + "America/North_Dakota/Beulah", + "America/Denver", + "America/Boise", + "America/Phoenix", + "America/Los_Angeles", + "America/Anchorage", + "America/Juneau", + "America/Sitka", + "America/Metlakatla", + "America/Yakutat", + "America/Nome", + "America/Adak", + "Pacific/Honolulu" + ], + "is_in_european_union": false, + "fips": "US", + "geonames_id": 6252001, + "hasc_id": "US", + "wikidata_id": "Q30" + }, + "city": { + "fips": "644000", + "alpha2": null, + "geonames_id": 5368753, + "hasc_id": null, + "wikidata_id": "Q65", + "name": "Los Angeles", + "name_translated": "Los Angeles" + }, + "region": { + "fips": "US06", + "alpha2": "US-CA", + "geonames_id": 5332921, + "hasc_id": "US.CA", + "wikidata_id": "Q99", + "name": "California", + "name_translated": "California" + } }, - "region": { - "fips": "US06", - "alpha2": "US-CA", - "geonames_id": 5332921, - "hasc_id": "US.CA", - "wikidata_id": "Q99", - "name": "California", - "name_translated": "California" + "tlds": [ + ".us" + ], + "timezone": { + "id": "America/Los_Angeles", + "current_time": "2023-05-04T04:30:28-07:00", + "code": "PDT", + "is_daylight_saving": true, + "gmt_offset": -25200 + }, + "security": { + "is_anonymous": false, + "is_datacenter": false, + "is_vpn": false, + "is_bot": false, + "is_abuser": true, + "is_known_attacker": true, + "is_proxy": false, + "is_spam": false, + "is_tor": false, + "is_icloud_relay": false, + "threat_score": 100 + }, + "domains": { + "count": 10943, + "domains": [ + "eliwise.academy", + "accountingprose.academy", + "pistola.academy", + "1and1-test-ntlds-fr.accountant", + "omnergy.africa" + ] } - }, - "tlds": [ - ".us" - ], - "timezone": { - "id": "America/Los_Angeles", - "current_time": "2023-05-04T04:30:28-07:00", - "code": "PDT", - "is_daylight_saving": true, - "gmt_offset": -25200 - }, - "security": { - "is_anonymous": false, - "is_datacenter": false, - "is_vpn": false, - "is_bot": false, - "is_abuser": true, - "is_known_attacker": true, - "is_proxy": false, - "is_spam": false, - "is_tor": false, - "is_icloud_relay": false, - "threat_score": 100 - }, - "domains": { - "count": 10943, - "domains": [ - "eliwise.academy", - "accountingprose.academy", - "pistola.academy", - "1and1-test-ntlds-fr.accountant", - "omnergy.africa" - ] } - } """ from ansible.module_utils.basic import AnsibleModule @@ -284,10 +285,10 @@ class IpbaseInfo(object): def main(): module_args = dict( - ip=dict(type='str', required=False, no_log=False), - apikey=dict(type='str', required=False, no_log=True), - hostname=dict(type='bool', required=False, no_log=False, default=False), - language=dict(type='str', required=False, no_log=False, default='en'), + ip=dict(type='str', no_log=False), + apikey=dict(type='str', no_log=True), + hostname=dict(type='bool', no_log=False, default=False), + language=dict(type='str', no_log=False, default='en'), ) module = AnsibleModule( diff --git a/plugins/modules/ipify_facts.py b/plugins/modules/ipify_facts.py index 7767c8d0ff..b7cd2b7447 100644 --- a/plugins/modules/ipify_facts.py +++ b/plugins/modules/ipify_facts.py @@ -24,7 +24,7 @@ options: api_url: description: - URL of the ipify.org API service. - - C(?format=json) will be appended per default. + - C(?format=json) is appended by default. type: str default: https://api.ipify.org/ timeout: @@ -34,7 +34,7 @@ options: default: 10 validate_certs: description: - - When set to V(false), SSL certificates will not be validated. + - When set to V(false), SSL certificates are not validated. type: bool default: true notes: diff --git a/plugins/modules/ipmi_boot.py b/plugins/modules/ipmi_boot.py index bd96b35a51..69131732c6 100644 --- a/plugins/modules/ipmi_boot.py +++ b/plugins/modules/ipmi_boot.py @@ -95,17 +95,17 @@ author: "Bulat Gaifullin (@bgaifullin) " RETURN = r""" bootdev: - description: The boot device name which will be used beyond next boot. + description: The boot device name which is used beyond next boot. returned: success type: str sample: default persistent: - description: If True, system firmware will use this device beyond next boot. + description: If V(true), system firmware uses this device beyond next boot. returned: success type: bool sample: false uefimode: - description: If True, system firmware will use UEFI boot explicitly beyond next boot. + description: If V(true), system firmware uses UEFI boot explicitly beyond next boot. returned: success type: bool sample: false diff --git a/plugins/modules/iptables_state.py b/plugins/modules/iptables_state.py index 568577c82f..21fe75ce02 100644 --- a/plugins/modules/iptables_state.py +++ b/plugins/modules/iptables_state.py @@ -27,8 +27,8 @@ description: notes: - The rollback feature is not a module option and depends on task's attributes. To enable it, the module must be played asynchronously, in other words by setting task attributes C(poll) to V(0), and C(async) to a value less or equal to C(ANSIBLE_TIMEOUT). - If C(async) is greater, the rollback will still happen if it shall happen, but you will experience a connection timeout - instead of more relevant info returned by the module after its failure. + If C(async) is greater, the rollback still happens when needed, but you experience a connection timeout instead of more + relevant info returned by the module after its failure. attributes: check_mode: support: full diff --git a/plugins/modules/ipwcli_dns.py b/plugins/modules/ipwcli_dns.py index 118f59e8d9..604eb82b5f 100644 --- a/plugins/modules/ipwcli_dns.py +++ b/plugins/modules/ipwcli_dns.py @@ -16,7 +16,7 @@ short_description: Manage DNS Records for Ericsson IPWorks using C(ipwcli) version_added: '0.2.0' description: - - Manage DNS records for the Ericsson IPWorks DNS server. The module will use the C(ipwcli) to deploy the DNS records. + - Manage DNS records for the Ericsson IPWorks DNS server. The module uses the C(ipwcli) to deploy the DNS records. requirements: - ipwcli (installed on Ericsson IPWorks) @@ -271,18 +271,18 @@ def run_module(): dnsname=dict(type='str', required=True), type=dict(type='str', required=True, choices=['A', 'AAAA', 'SRV', 'NAPTR']), container=dict(type='str', required=True), - address=dict(type='str', required=False), - ttl=dict(type='int', required=False, default=3600), + address=dict(type='str'), + ttl=dict(type='int', default=3600), state=dict(type='str', default='present', choices=['absent', 'present']), - priority=dict(type='int', required=False, default=10), - weight=dict(type='int', required=False, default=10), - port=dict(type='int', required=False), - target=dict(type='str', required=False), - order=dict(type='int', required=False), - preference=dict(type='int', required=False), - flags=dict(type='str', required=False, choices=['S', 'A', 'U', 'P']), - service=dict(type='str', required=False), - replacement=dict(type='str', required=False), + priority=dict(type='int', default=10), + weight=dict(type='int', default=10), + port=dict(type='int'), + target=dict(type='str'), + order=dict(type='int'), + preference=dict(type='int'), + flags=dict(type='str', choices=['S', 'A', 'U', 'P']), + service=dict(type='str'), + replacement=dict(type='str'), username=dict(type='str', required=True), password=dict(type='str', required=True, no_log=True) ) diff --git a/plugins/modules/irc.py b/plugins/modules/irc.py index 2cd99341b6..d18c9fd85f 100644 --- a/plugins/modules/irc.py +++ b/plugins/modules/irc.py @@ -73,13 +73,13 @@ options: channel: type: str description: - - Channel name. One of nick_to or channel needs to be set. When both are set, the message will be sent to both of them. + - Channel name. One of nick_to or channel needs to be set. When both are set, the message is sent to both of them. nick_to: type: list elements: str description: - A list of nicknames to send the message to. One of nick_to or channel needs to be set. When both are defined, the - message will be sent to both of them. + message is sent to both of them. key: type: str description: @@ -118,7 +118,7 @@ options: default: none validate_certs: description: - - If set to V(false), the SSL certificates will not be validated. + - If set to V(false), the SSL certificates are not validated. - This should always be set to V(true). Using V(false) is unsafe and should only be done if the network between between Ansible and the IRC server is known to be safe. - B(Note:) for security reasons, you should always set O(use_tls=true) and O(validate_certs=true) whenever possible. @@ -232,9 +232,11 @@ def send_msg(msg, server='localhost', port='6667', channel=None, nick_to=None, k irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) if use_tls: + kwargs = {} if validate_certs: try: context = ssl.create_default_context() + kwargs["server_hostname"] = server except AttributeError: raise Exception('Need at least Python 2.7.9 for SSL certificate validation') else: @@ -244,7 +246,7 @@ def send_msg(msg, server='localhost', port='6667', channel=None, nick_to=None, k else: context = ssl.SSLContext() context.verify_mode = ssl.CERT_NONE - irc = context.wrap_socket(irc) + irc = context.wrap_socket(irc, **kwargs) irc.connect((server, int(port))) if passwd: @@ -309,7 +311,7 @@ def main(): server=dict(default='localhost'), port=dict(type='int', default=6667), nick=dict(default='ansible'), - nick_to=dict(required=False, type='list', elements='str'), + nick_to=dict(type='list', elements='str'), msg=dict(required=True), color=dict(default="none", aliases=['colour'], choices=["white", "black", "blue", "green", "red", "brown", @@ -318,7 +320,7 @@ def main(): "light_blue", "pink", "gray", "light_gray", "none"]), style=dict(default="none", choices=["underline", "reverse", "bold", "italic", "none"]), - channel=dict(required=False), + channel=dict(), key=dict(no_log=True), topic=dict(), passwd=dict(no_log=True), diff --git a/plugins/modules/iso_create.py b/plugins/modules/iso_create.py index 008cb271bb..70f76558e6 100644 --- a/plugins/modules/iso_create.py +++ b/plugins/modules/iso_create.py @@ -32,8 +32,8 @@ attributes: options: src_files: description: - - This is a list of absolute paths of source files or folders which will be contained in the new generated ISO file. - - Will fail if specified file or folder in O(src_files) does not exist on local machine. + - This is a list of absolute paths of source files or folders to be contained in the new generated ISO file. + - The module fails if specified file or folder in O(src_files) does not exist on local machine. - 'Note: With all ISO9660 levels from 1 to 3, all file names are restricted to uppercase letters, numbers and underscores (_). File names are limited to 31 characters, directory nesting is limited to 8 levels, and path names are limited to 255 characters.' @@ -43,7 +43,7 @@ options: dest_iso: description: - The absolute path with file name of the new generated ISO file on local machine. - - Will create intermediate folders when they does not exist. + - It creates intermediate folders when they do not exist. type: path required: true interchange_level: diff --git a/plugins/modules/iso_customize.py b/plugins/modules/iso_customize.py index feac8417b8..5ee5b22c2c 100644 --- a/plugins/modules/iso_customize.py +++ b/plugins/modules/iso_customize.py @@ -14,7 +14,7 @@ module: iso_customize short_description: Add/remove/change files in ISO file description: - This module is used to add/remove/change files in ISO file. - - The file inside ISO will be overwritten if it exists by option O(add_files). + - The file inside ISO is overwritten if it exists by option O(add_files). author: - Yuhua Zou (@ZouYuhua) requirements: @@ -51,7 +51,7 @@ options: add_files: description: - Allows to add and replace files in the ISO file. - - Will create intermediate folders inside the ISO file when they do not exist. + - It creates intermediate folders inside the ISO file when they do not exist. type: list required: false elements: dict @@ -69,9 +69,9 @@ options: required: true notes: - The C(pycdlib) library states it supports Python 2.7 and 3.4+. - - The function C(add_file) in pycdlib will overwrite the existing file in ISO with type ISO9660 / Rock Ridge 1.12 / Joliet - / UDF. But it will not overwrite the existing file in ISO with Rock Ridge 1.09 / 1.10. So we take workaround "delete the - existing file and then add file for ISO with Rock Ridge". + - The function C(add_file) in pycdlib is designed to overwrite the existing file in ISO with type ISO9660 / Rock Ridge 1.12 + / Joliet / UDF. But it does not overwrite the existing file in ISO with Rock Ridge 1.09 / 1.10. So we take workaround + "delete the existing file and then add file for ISO with Rock Ridge". """ EXAMPLES = r""" diff --git a/plugins/modules/iso_extract.py b/plugins/modules/iso_extract.py index 8cda967b64..88644a6eb6 100644 --- a/plugins/modules/iso_extract.py +++ b/plugins/modules/iso_extract.py @@ -55,19 +55,19 @@ options: required: true force: description: - - If V(true), which will replace the remote file when contents are different than the source. - - If V(false), the file will only be extracted and copied if the destination does not already exist. + - If V(true), it replaces the remote file when contents are different than the source. + - If V(false), the file is only extracted and copied if the destination does not already exist. type: bool default: true executable: description: - The path to the C(7z) executable to use for extracting files from the ISO. - - If not provided, it will assume the value V(7z). + - If not provided, it assumes the value V(7z). type: path password: description: - Password used to decrypt files from the ISO. - - Will only be used if 7z is used. + - It is only used if C(7z) is used. - The password is used as a command line argument to 7z. This is a B(potential security risk) that allows passwords to be revealed if someone else can list running processes on the same machine in the right moment. type: str diff --git a/plugins/modules/jabber.py b/plugins/modules/jabber.py index 01a34ff9f5..ab73672410 100644 --- a/plugins/modules/jabber.py +++ b/plugins/modules/jabber.py @@ -108,9 +108,9 @@ def main(): password=dict(required=True, no_log=True), to=dict(required=True), msg=dict(required=True), - host=dict(required=False), - port=dict(required=False, default=5222, type='int'), - encoding=dict(required=False), + host=dict(), + port=dict(default=5222, type='int'), + encoding=dict(), ), supports_check_mode=True ) diff --git a/plugins/modules/java_cert.py b/plugins/modules/java_cert.py index b75021fc57..13cfea9324 100644 --- a/plugins/modules/java_cert.py +++ b/plugins/modules/java_cert.py @@ -32,7 +32,7 @@ options: cert_port: description: - Port to connect to URL. - - This will be used to create server URL:PORT. + - This is used to create server URL:PORT. type: int default: 443 cert_path: @@ -98,8 +98,8 @@ options: state: description: - Defines action which can be either certificate import or removal. - - When state is present, the certificate will always idempotently be inserted into the keystore, even if there already - exists a cert alias that is different. + - When O(state=present), the certificate is always inserted into the keystore, even if there already exists a cert alias + that is different. type: str choices: [absent, present] default: present @@ -197,18 +197,6 @@ EXAMPLES = r""" """ RETURN = r""" -msg: - description: Output from stdout of keytool command after execution of given command. - returned: success - type: str - sample: "Module require existing keystore at keystore_path '/tmp/test/cacerts'" - -rc: - description: Keytool command execution return value. - returned: success - type: int - sample: "0" - cmd: description: Executed command to get action done. returned: success diff --git a/plugins/modules/java_keystore.py b/plugins/modules/java_keystore.py index df7e71abbe..c826c9af4c 100644 --- a/plugins/modules/java_keystore.py +++ b/plugins/modules/java_keystore.py @@ -24,8 +24,8 @@ options: name: description: - Name of the certificate in the keystore. - - If the provided name does not exist in the keystore, the module will re-create the keystore. This behavior changed - in community.general 3.0.0, before that the module would fail when the name did not match. + - If the provided name does not exist in the keystore, the module re-creates the keystore. This behavior changed in + community.general 3.0.0, before that the module would fail when the name did not match. type: str required: true certificate: @@ -62,7 +62,7 @@ options: password: description: - Password that should be used to secure the keystore. - - If the provided password fails to unlock the keystore, the module will re-create the keystore with the new passphrase. + - If the provided password fails to unlock the keystore, the module re-creates the keystore with the new passphrase. This behavior changed in community.general 3.0.0, before that the module would fail when the password did not match. type: str required: true @@ -130,7 +130,7 @@ notes: or with the P(ansible.builtin.file#lookup) lookup), while O(certificate_path) and O(private_key_path) require that the files are available on the target host. - By design, any change of a value of options O(keystore_type), O(name) or O(password), as well as changes of key or certificate - materials will cause the existing O(dest) to be overwritten. + materials causes the existing O(dest) to be overwritten. """ EXAMPLES = r""" @@ -166,24 +166,12 @@ EXAMPLES = r""" """ RETURN = r""" -msg: - description: Output from stdout of keytool/openssl command after execution of given command or an error. - returned: changed and failure - type: str - sample: "Unable to find the current certificate fingerprint in ..." - err: description: Output from stderr of keytool/openssl command after error of given command. returned: failure type: str sample: "Keystore password is too short - must be at least 6 characters\n" -rc: - description: Keytool/openssl command execution return value. - returned: changed and failure - type: int - sample: "0" - cmd: description: Executed command to get action done. returned: changed and failure diff --git a/plugins/modules/jenkins_build.py b/plugins/modules/jenkins_build.py index cec8fcc490..4e11dd3642 100644 --- a/plugins/modules/jenkins_build.py +++ b/plugins/modules/jenkins_build.py @@ -99,6 +99,16 @@ EXAMPLES = r""" state: stopped url: http://localhost:8080 +- name: Trigger Jenkins build in detached mode + community.general.jenkins_build: + name: "detached-build" + state: present + user: admin + token: abcdefghijklmnopqrstuvwxyz123456 + url: http://localhost:8080 + detach: true + time_between_checks: 20 + - name: Delete a jenkins build using token authentication community.general.jenkins_build: name: "delete-experiment" @@ -180,11 +190,11 @@ class JenkinsBuild: def get_jenkins_connection(self): try: - if (self.user and self.password): + if self.user and self.password: return jenkins.Jenkins(self.jenkins_url, self.user, self.password) - elif (self.user and self.token): + elif self.user and self.token: return jenkins.Jenkins(self.jenkins_url, self.user, self.token) - elif (self.user and not (self.password or self.token)): + elif self.user and not (self.password or self.token): return jenkins.Jenkins(self.jenkins_url, self.user) else: return jenkins.Jenkins(self.jenkins_url) diff --git a/plugins/modules/jenkins_build_info.py b/plugins/modules/jenkins_build_info.py index f252eb504a..85cb22ad2c 100644 --- a/plugins/modules/jenkins_build_info.py +++ b/plugins/modules/jenkins_build_info.py @@ -30,7 +30,7 @@ options: build_number: description: - An integer which specifies a build of a job. - - If not specified the last build information will be returned. + - If not specified the last build information is returned. type: int password: description: @@ -138,11 +138,11 @@ class JenkinsBuildInfo: def get_jenkins_connection(self): try: - if (self.user and self.password): + if self.user and self.password: return jenkins.Jenkins(self.jenkins_url, self.user, self.password) - elif (self.user and self.token): + elif self.user and self.token: return jenkins.Jenkins(self.jenkins_url, self.user, self.token) - elif (self.user and not (self.password or self.token)): + elif self.user and not (self.password or self.token): return jenkins.Jenkins(self.jenkins_url, self.user) else: return jenkins.Jenkins(self.jenkins_url) diff --git a/plugins/modules/jenkins_credential.py b/plugins/modules/jenkins_credential.py new file mode 100644 index 0000000000..3bd8a9dd7a --- /dev/null +++ b/plugins/modules/jenkins_credential.py @@ -0,0 +1,863 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +DOCUMENTATION = r""" +module: jenkins_credential +short_description: Manage Jenkins credentials and domains through API +version_added: 11.1.0 +description: + - This module allows managing Jenkins credentials and domain scopes through the Jenkins HTTP API. + - Create, update, and delete different credential types such as C(username/password), C(secret text), C(SSH key), C(certificates), + C(GitHub App), and domains. + - For scoped domains (O(type=scope)), it supports restrictions based on V(hostname), V(hostname:port), V(path), and V(scheme). +requirements: + - urllib3 >= 1.26.0 +author: + - Youssef Ali (@YoussefKhalidAli) +extends_documentation_fragment: + - community.general.attributes +attributes: + check_mode: + support: full + diff_mode: + support: none +options: + id: + description: + - The ID of the Jenkins credential or domain. + type: str + type: + description: + - Type of the credential or action. + choices: + - user_and_pass + - file + - text + - github_app + - ssh_key + - certificate + - scope + - token + type: str + state: + description: + - The state of the credential. + choices: + - present + - absent + default: present + type: str + scope: + description: + - Jenkins credential domain scope. + - Deleting a domain scope deletes all credentials within it. + type: str + default: '_' + force: + description: + - Force update if the credential already exists, used with O(state=present). + - If set to V(true), it deletes the existing credential before creating a new one. + - Always returns RV(ignore:changed=true). + type: bool + default: false + url: + description: + - Jenkins server URL. + type: str + default: http://localhost:8080 + jenkins_user: + description: + - Jenkins user for authentication. + required: true + type: str + jenkins_password: + description: + - Jenkins password for token creation. Required if O(type=token). + type: str + token: + description: + - Jenkins API token. Required unless O(type=token). + type: str + description: + description: + - Description of the credential or domain. + default: '' + type: str + location: + description: + - Location of the credential. Either V(system) or V(folder). + - If O(location=folder) then O(url) must be set to V(/job/). + choices: + - system + - folder + default: 'system' + type: str + name: + description: + - Name of the token to generate. Required if O(type=token). + - When generating a new token, do not pass O(id). It is generated automatically. + - Creating two tokens with the same name generates two distinct tokens with different RV(token_uuid) values. + - Replacing a token with another one of the same name requires deleting the original first using O(force=True). + type: str + username: + description: + - Username for credentials types that require it (for example O(type=ssh_key) or O(type=user_and_pass)). + type: str + password: + description: + - Password for credentials types that require it (for example O(type=user_and_passs) or O(type=certificate)). + type: str + secret: + description: + - Secret text (used when O(type=text)). + type: str + appID: + description: + - GitHub App ID. + type: str + api_uri: + description: + - Link to Github API. + default: 'https://api.github.com' + type: str + owner: + description: + - GitHub App owner. + type: str + file_path: + description: + - File path to secret file (for example O(type=file) or O(type=certificate)). + - For O(type=certificate), this can be a V(.p12) or V(.pem) file. + type: path + private_key_path: + description: + - Path to private key file for PEM certificates or GitHub Apps. + type: path + passphrase: + description: + - SSH passphrase if needed. + type: str + inc_hostname: + description: + - List of hostnames to include in scope. + type: list + elements: str + exc_hostname: + description: + - List of hostnames to exclude from scope. + - If a hostname appears in both this list and O(inc_hostname), the hostname is excluded. + type: list + elements: str + inc_hostname_port: + description: + - List of V(host:port) to include in scope. + type: list + elements: str + exc_hostname_port: + description: + - List of host:port to exclude from scope. + - If a hostname and port appears in both this list and O(inc_hostname_port), it is excluded. + type: list + elements: str + inc_path: + description: + - List of URL paths to include when matching credentials to domains. + - 'B(Matching is hierarchical): subpaths of excluded paths are also excluded, even if explicitly included.' + type: list + elements: str + exc_path: + description: + - List of URL paths to exclude. + - If a path is also matched by O(exc_path), it is excluded. + - If you exclude a subpath of a path previously included, that subpath alone is excluded. + type: list + elements: str + schemes: + description: + - List of schemes (for example V(http) or V(https)) to match. + type: list + elements: str +""" + +EXAMPLES = r""" +- name: Generate token + community.general.jenkins_credential: + id: "test-token" + jenkins_user: "admin" + jenkins_password: "password" + type: "token" + register: token_result + +- name: Add CUSTOM scope credential + community.general.jenkins_credential: + id: "CUSTOM" + type: "scope" + jenkins_user: "admin" + token: "{{ token }}" + description: "Custom scope credential" + inc_path: + - "include/path" + - "include/path2" + exc_path: + - "exclude/path" + - "exclude/path2" + inc_hostname: + - "included-hostname" + - "included-hostname2" + exc_hostname: + - "excluded-hostname" + - "excluded-hostname2" + schemes: + - "http" + - "https" + inc_hostname_port: + - "included-hostname:7000" + - "included-hostname2:7000" + exc_hostname_port: + - "excluded-hostname:7000" + - "excluded-hostname2:7000" + +- name: Add user_and_pass credential + community.general.jenkins_credential: + id: "userpass-id" + type: "user_and_pass" + jenkins_user: "admin" + token: "{{ token }}" + description: "User and password credential" + username: "user1" + password: "pass1" + +- name: Add file credential to custom scope + community.general.jenkins_credential: + id: "file-id" + type: "file" + jenkins_user: "admin" + token: "{{ token }}" + scope: "CUSTOM" + description: "File credential" + file_path: "../vars/my-secret.pem" + +- name: Add text credential to folder + community.general.jenkins_credential: + id: "text-id" + type: "text" + jenkins_user: "admin" + token: "{{ token }}" + description: "Text credential" + secret: "mysecrettext" + location: "folder" + url: "http://localhost:8080/job/test" + +- name: Add githubApp credential + community.general.jenkins_credential: + id: "githubapp-id" + type: "github_app" + jenkins_user: "admin" + token: "{{ token }}" + description: "GitHub app credential" + appID: "12345" + file_path: "../vars/github.pem" + owner: "github_owner" + +- name: Add sshKey credential + community.general.jenkins_credential: + id: "sshkey-id" + type: "ssh_key" + jenkins_user: "admin" + token: "{{ token }}" + description: "SSH key credential" + username: "sshuser" + file_path: "../vars/ssh_key" + passphrase: 1234 + +- name: Add certificate credential (p12) + community.general.jenkins_credential: + id: "certificate-id" + type: "certificate" + jenkins_user: "admin" + token: "{{ token }}" + description: "Certificate credential" + password: "12345678901234" + file_path: "../vars/certificate.p12" + +- name: Add certificate credential (pem) + community.general.jenkins_credential: + id: "certificate-id-pem" + type: "certificate" + jenkins_user: "admin" + token: "{{ token }}" + description: "Certificate credential (pem)" + file_path: "../vars/cert.pem" + private_key_path: "../vars/private.key" +""" +RETURN = r""" +details: + description: Return more details in case of errors. + type: str + returned: failed +token: + description: + - The generated API token if O(type=token). + - This is needed to authenticate API calls later. + - This should be stored securely, as it is the only time it is returned. + type: str + returned: success +token_uuid: + description: + - The generated ID of the token. + - You pass this value back to the module as O(id) to edit or revoke the token later. + - This should be stored securely, as it is the only time it is returned. + type: str + returned: success +""" + +from ansible.module_utils.basic import AnsibleModule +from ansible.module_utils.urls import fetch_url, basic_auth_header +from ansible.module_utils.six.moves.urllib.parse import urlencode +from ansible_collections.community.general.plugins.module_utils import deps + +import json +import os +import base64 + +with deps.declare("urllib3", reason="urllib3 is required to embed files into requests"): + import urllib3 + + +# Function to validate file paths exist on disk +def validate_file_exist(module, path): + + if path and not os.path.exists(path): + module.fail_json(msg="File not found: {}".format(path)) + + +# Gets the Jenkins crumb for CSRF protection which is required for API calls +def get_jenkins_crumb(module, headers): + type = module.params["type"] + url = module.params["url"] + + if "/job" in url: + url = url.split("/job")[0] + + crumb_url = "{}/crumbIssuer/api/json".format(url) + + response, info = fetch_url(module, crumb_url, headers=headers) + + if info["status"] != 200: + module.fail_json(msg="Failed to fetch Jenkins crumb. Confirm token is real.") + + # Cookie is needed to generate API token + cookie = info.get("set-cookie", "") + session_cookie = cookie.split(";")[0] if cookie else None + + try: + data = response.read() + json_data = json.loads(data) + crumb_request_field = json_data["crumbRequestField"] + crumb = json_data["crumb"] + headers[crumb_request_field] = crumb # Set the crumb in headers + headers["Content-Type"] = ( + "application/x-www-form-urlencoded" # Set Content-Type for form data + ) + if type == "token": + headers["Cookie"] = ( + session_cookie # Set session cookie for token operations + ) + return crumb_request_field, crumb, session_cookie # Return for test purposes + + except Exception: + return None + + +# Function to clean the data sent via API by removing unwanted keys and None values +def clean_data(data): + # Keys to remove (including those with None values) + keys_to_remove = { + "url", + "token", + "jenkins_user", + "jenkins_password", + "file_path", + "private_key_path", + "type", + "state", + "force", + "name", + "scope", + "location", + "api_uri", + } + + # Filter out None values and unwanted keys + cleaned_data = { + key: value + for key, value in data.items() + if value is not None and key not in keys_to_remove + } + + return cleaned_data + + +# Function to check if credentials/domain exists +def target_exists(module, check_domain=False): + url = module.params["url"] + location = module.params["location"] + scope = module.params["scope"] + name = module.params["id"] + user = module.params["jenkins_user"] + token = module.params["token"] + + headers = {"Authorization": basic_auth_header(user, token)} + + if module.params["type"] == "scope" or check_domain: + target_url = "{}/credentials/store/{}/domain/{}/api/json".format( + url, location, scope if check_domain else name + ) + elif module.params["type"] == "token": + return False # Can't check token + else: + target_url = "{}/credentials/store/{}/domain/{}/credential/{}/api/json".format( + url, location, scope, name + ) + + response, info = fetch_url(module, target_url, headers=headers) + status = info.get("status", 0) + + if status == 200: + return True + elif status == 404: + return False + else: + module.fail_json( + msg="Unexpected status code {} when checking {} existence.".format( + status, name + ) + ) + + +# Function to delete the scope or credential provided +def delete_target(module, headers): + user = module.params["jenkins_user"] + type = module.params["type"] + url = module.params["url"] + location = module.params["location"] + id = module.params["id"] + scope = module.params["scope"] + + body = False + + try: + + if type == "token": + delete_url = "{}/user/{}/descriptorByName/jenkins.security.ApiTokenProperty/revoke".format( + url, user + ) + body = urlencode({"tokenUuid": id}) + + elif type == "scope": + delete_url = "{}/credentials/store/{}/domain/{}/doDelete".format( + url, location, id + ) + + else: + delete_url = ( + "{}/credentials/store/{}/domain/{}/credential/{}/doDelete".format( + url, location, scope, id + ) + ) + + response, info = fetch_url( + module, + delete_url, + headers=headers, + data=body if body else None, + method="POST", + ) + + status = info.get("status", 0) + if not status == 200: + module.fail_json( + msg="Failed to delete: HTTP {}, {}, {}".format( + status, response, headers + ) + ) + + except Exception as e: + module.fail_json(msg="Exception during delete: {}".format(str(e))) + + +# Function to read the private key for types texts and ssh_key +def read_privateKey(module): + try: + with open(module.params["private_key_path"], "r") as f: + private_key = f.read().strip() + return private_key + except Exception as e: + module.fail_json(msg="Failed to read private key file: {}".format(str(e))) + + +# Function to builds multipart form-data body and content-type header for file credential upload. +# Returns: +# body (bytes): Encoded multipart data +# content_type (str): Content-Type header including boundary +def embed_file_into_body(module, file_path, credentials): + + filename = os.path.basename(file_path) + + try: + with open(file_path, "rb") as f: + file_bytes = f.read() + except Exception as e: + module.fail_json(msg="Failed to read file: {}".format(str(e))) + return "", "" # Return for test purposes + + credentials.update( + { + "file": "file0", + "fileName": filename, + } + ) + + payload = {"credentials": credentials} + + fields = {"file0": (filename, file_bytes), "json": json.dumps(payload)} + + body, content_type = urllib3.encode_multipart_formdata(fields) + return body, content_type + + +# Main function to run the Ansible module +def run_module(): + + module = AnsibleModule( + argument_spec=dict( + id=dict(type="str"), + type=dict( + type="str", + choices=[ + "user_and_pass", + "file", + "text", + "github_app", + "ssh_key", + "certificate", + "scope", + "token", + ], + ), + state=dict(type="str", default="present", choices=["present", "absent"]), + force=dict(type="bool", default=False), + scope=dict(type="str", default="_"), + url=dict(type="str", default="http://localhost:8080"), + jenkins_user=dict(type="str", required=True), + jenkins_password=dict(type="str", no_log=True), + token=dict(type="str", no_log=True), + description=dict(type="str", default=""), + location=dict(type="str", default="system", choices=["system", "folder"]), + name=dict(type="str"), + username=dict(type="str"), + password=dict(type="str", no_log=True), + file_path=dict(type="path"), + secret=dict(type="str", no_log=True), + appID=dict(type="str"), + api_uri=dict(type="str", default="https://api.github.com"), + owner=dict(type="str"), + passphrase=dict(type="str", no_log=True), + private_key_path=dict(type="path", no_log=True), + # Scope specifications parameters + inc_hostname=dict(type="list", elements="str"), + exc_hostname=dict(type="list", elements="str"), + inc_hostname_port=dict(type="list", elements="str"), + exc_hostname_port=dict(type="list", elements="str"), + inc_path=dict(type="list", elements="str"), + exc_path=dict(type="list", elements="str"), + schemes=dict(type="list", elements="str"), + ), + supports_check_mode=True, + required_if=[ + ("state", "present", ["type"]), + ("state", "absent", ["id"]), + ("type", "token", ["name", "jenkins_password"]), + ("type", "user_and_pass", ["username", "password", "id", "token"]), + ("type", "file", ["file_path", "id", "token"]), + ("type", "text", ["secret", "id", "token"]), + ("type", "github_app", ["appID", "private_key_path", "id", "token"]), + ("type", "ssh_key", ["username", "private_key_path", "id", "token"]), + ("type", "certificate", ["file_path", "id", "token"]), + ("type", "scope", ["id", "token"]), + ], + ) + + # Parameters + id = module.params["id"] + type = module.params["type"] + state = module.params["state"] + force = module.params["force"] + scope = module.params["scope"] + url = module.params["url"] + jenkins_user = module.params["jenkins_user"] + jenkins_password = module.params["jenkins_password"] + name = module.params["name"] + token = module.params["token"] + description = module.params["description"] + location = module.params["location"] + filePath = module.params["file_path"] + private_key_path = module.params["private_key_path"] + api_uri = module.params["api_uri"] + inc_hostname = module.params["inc_hostname"] + exc_hostname = module.params["exc_hostname"] + inc_hostname_port = module.params["inc_hostname_port"] + exc_hostname_port = module.params["exc_hostname_port"] + inc_path = module.params["inc_path"] + exc_path = module.params["exc_path"] + schemes = module.params["schemes"] + + deps.validate(module) + + headers = { + "Authorization": basic_auth_header(jenkins_user, token or jenkins_password), + } + + # Get the crumb for CSRF protection + get_jenkins_crumb(module, headers) + + result = dict( + changed=False, + msg="", + ) + + credentials = clean_data(module.params) + + does_exist = target_exists(module) + + # Check if the credential/domain doesn't exist and the user wants to delete + if not does_exist and state == "absent" and not type == "token": + result["changed"] = False + result["msg"] = "{} does not exist.".format(id) + module.exit_json(**result) + + if state == "present": + + # If updating, we need to delete the existing credential/domain first based on force parameter + if force and (does_exist or type == "token"): + delete_target(module, headers) + elif does_exist and not force: + result["changed"] = False + result["msg"] = "{} already exists. Use force=True to update.".format(id) + module.exit_json(**result) + + if type == "token": + + post_url = "{}/user/{}/descriptorByName/jenkins.security.ApiTokenProperty/generateNewToken".format( + url, jenkins_user + ) + + body = "newTokenName={}".format(name) + + elif type == "scope": + + post_url = "{}/credentials/store/{}/createDomain".format(url, location) + + specifications = [] + + # Create a domain in Jenkins + if inc_hostname or exc_hostname: + specifications.append( + { + "stapler-class": "com.cloudbees.plugins.credentials.domains.HostnameSpecification", + "includes": ",".join(inc_hostname), + "excludes": ",".join(exc_hostname), + } + ) + + if inc_hostname_port or exc_hostname_port: + specifications.append( + { + "stapler-class": "com.cloudbees.plugins.credentials.domains.HostnamePortSpecification", + "includes": ",".join(inc_hostname_port), + "excludes": ",".join(exc_hostname_port), + } + ) + + if schemes: + specifications.append( + { + "stapler-class": "com.cloudbees.plugins.credentials.domains.SchemeSpecification", + "schemes": ",".join(schemes), + }, + ) + + if inc_path or exc_path: + specifications.append( + { + "stapler-class": "com.cloudbees.plugins.credentials.domains.PathSpecification", + "includes": ",".join(inc_path), + "excludes": ",".join(exc_path), + } + ) + + payload = { + "name": id, + "description": description, + "specifications": specifications, + } + + else: + if filePath: + validate_file_exist(module, filePath) + elif private_key_path: + validate_file_exist(module, private_key_path) + + post_url = "{}/credentials/store/{}/domain/{}/createCredentials".format( + url, location, scope + ) + + cred_class = { + "user_and_pass": "com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl", + "file": "org.jenkinsci.plugins.plaincredentials.impl.FileCredentialsImpl", + "text": "org.jenkinsci.plugins.plaincredentials.impl.StringCredentialsImpl", + "github_app": "org.jenkinsci.plugins.github_branch_source.GitHubAppCredentials", + "ssh_key": "com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey", + "certificate": "com.cloudbees.plugins.credentials.impl.CertificateCredentialsImpl", + } + credentials.update({"$class": cred_class[type]}) + + if type == "file": + + # Build multipart body and content-type + body, content_type = embed_file_into_body(module, filePath, credentials) + headers["Content-Type"] = content_type + + elif type == "github_app": + + private_key = read_privateKey(module) + + credentials.update( + { + "privateKey": private_key, + "apiUri": api_uri, + } + ) + + elif type == "ssh_key": + + private_key = read_privateKey(module) + + credentials.update( + { + "privateKeySource": { + "stapler-class": "com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey$DirectEntryPrivateKeySource", + "privateKey": private_key, + }, + } + ) + + elif type == "certificate": + + name, ext = os.path.splitext(filePath) + + if ext.lower() in [".p12", ".pfx"]: + try: + with open(filePath, "rb") as f: + file_content = f.read() + uploaded_keystore = base64.b64encode(file_content).decode( + "utf-8" + ) + except Exception as e: + module.fail_json( + msg="Failed to read or encode keystore file: {}".format( + str(e) + ) + ) + + credentials.update( + { + "keyStoreSource": { + "$class": "com.cloudbees.plugins.credentials.impl.CertificateCredentialsImpl$UploadedKeyStoreSource", + "uploadedKeystore": uploaded_keystore, + }, + } + ) + + elif ext.lower() in [".pem", ".crt"]: # PEM mode + try: + with open(filePath, "r") as f: + cert_chain = f.read() + with open(private_key_path, "r") as f: + private_key = f.read() + except Exception as e: + module.fail_json( + msg="Failed to read PEM files: {}".format(str(e)) + ) + + credentials.update( + { + "keyStoreSource": { + "$class": "com.cloudbees.plugins.credentials.impl.CertificateCredentialsImpl$PEMEntryKeyStoreSource", + "certChain": cert_chain, + "privateKey": private_key, + }, + } + ) + + else: + module.fail_json( + msg="Unsupported certificate file type. Only .p12, .pfx, .pem or .crt are supported." + ) + + payload = {"credentials": credentials} + + if not type == "file" and not type == "token": + body = urlencode({"json": json.dumps(payload)}) + + else: # Delete + + delete_target(module, headers) + + module.exit_json(changed=True, msg="{} deleted successfully.".format(id)) + + if ( + not type == "scope" and not scope == "_" + ): # Check if custom scope exists if adding to a custom scope + if not target_exists(module, True): + module.fail_json(msg="Domain {} doesn't exists".format(scope)) + + try: + response, info = fetch_url( + module, post_url, headers=headers, data=body, method="POST" + ) + except Exception as e: + module.fail_json(msg="Request to {} failed: {}".format(post_url, str(e))) + + status = info.get("status", 0) + + if not status == 200: + body = response.read() if response else b"" + module.fail_json( + msg="Failed to {} credential".format( + "add/update" if state == "present" else "delete" + ), + details=body.decode("utf-8", errors="ignore"), + ) + + if type == "token": + response_data = json.loads(response.read()) + result["token"] = response_data["data"]["tokenValue"] + result["token_uuid"] = response_data["data"]["tokenUuid"] + + result["changed"] = True + result["msg"] = response.read().decode("utf-8") + + module.exit_json(**result) + + +if __name__ == "__main__": + run_module() diff --git a/plugins/modules/jenkins_job.py b/plugins/modules/jenkins_job.py index 93d922ed22..8362a40255 100644 --- a/plugins/modules/jenkins_job.py +++ b/plugins/modules/jenkins_job.py @@ -76,8 +76,8 @@ options: type: bool default: true description: - - If set to V(false), the SSL certificates will not be validated. This should only set to V(false) used on personally - controlled sites using self-signed certificates as it avoids verifying the source site. + - If set to V(false), the SSL certificates are not validated. This should only set to V(false) used on personally controlled + sites using self-signed certificates as it avoids verifying the source site. - The C(python-jenkins) library only handles this by using the environment variable E(PYTHONHTTPSVERIFY). version_added: 2.3.0 """ @@ -350,14 +350,14 @@ def job_config_to_string(xml_str): def main(): module = AnsibleModule( argument_spec=dict( - config=dict(type='str', required=False), + config=dict(type='str'), name=dict(type='str', required=True), - password=dict(type='str', required=False, no_log=True), - state=dict(type='str', required=False, choices=['present', 'absent'], default="present"), - enabled=dict(required=False, type='bool'), - token=dict(type='str', required=False, no_log=True), - url=dict(type='str', required=False, default="http://localhost:8080"), - user=dict(type='str', required=False), + password=dict(type='str', no_log=True), + state=dict(type='str', choices=['present', 'absent'], default="present"), + enabled=dict(type='bool'), + token=dict(type='str', no_log=True), + url=dict(type='str', default="http://localhost:8080"), + user=dict(type='str'), validate_certs=dict(type='bool', default=True), ), mutually_exclusive=[ diff --git a/plugins/modules/jenkins_job_info.py b/plugins/modules/jenkins_job_info.py index 638158fb44..37d9af3f56 100644 --- a/plugins/modules/jenkins_job_info.py +++ b/plugins/modules/jenkins_job_info.py @@ -53,7 +53,7 @@ options: - User to authenticate with the Jenkins server. validate_certs: description: - - If set to V(false), the SSL certificates will not be validated. + - If set to V(false), the SSL certificates are not validated. - This should only set to V(false) used on personally controlled sites using self-signed certificates. default: true type: bool diff --git a/plugins/modules/jenkins_node.py b/plugins/modules/jenkins_node.py index affd462659..aa75100168 100644 --- a/plugins/modules/jenkins_node.py +++ b/plugins/modules/jenkins_node.py @@ -65,9 +65,9 @@ options: offline_message: description: - Specifies the offline reason message to be set when configuring the Jenkins node state. - - If O(offline_message) is given and requested O(state) is not V(disabled), an error will be raised. + - If O(offline_message) is given and requested O(state) is not V(disabled), an error is raised. - Internally O(offline_message) is set using the V(toggleOffline) API, so updating the message when the node is already - offline (current state V(disabled)) is not possible. In this case, a warning will be issued. + offline (current state V(disabled)) is not possible. In this case, a warning is issued. type: str version_added: 10.0.0 """ diff --git a/plugins/modules/jenkins_plugin.py b/plugins/modules/jenkins_plugin.py index 73ff40c725..f47dcfe92f 100644 --- a/plugins/modules/jenkins_plugin.py +++ b/plugins/modules/jenkins_plugin.py @@ -51,7 +51,7 @@ options: type: str description: - Desired plugin state. - - If set to V(latest), the check for new version will be performed every time. This is suitable to keep the plugin up-to-date. + - If set to V(latest), the check for new version is performed every time. This is suitable to keep the plugin up-to-date. choices: [absent, present, pinned, unpinned, enabled, disabled, latest] default: present timeout: @@ -64,8 +64,8 @@ options: description: - Number of seconds after which a new copy of the C(update-center.json) file is downloaded. This is used to avoid the need to download the plugin to calculate its checksum when O(state=latest) is specified. - - Set it to V(0) if no cache file should be used. In that case, the plugin file will always be downloaded to calculate - its checksum when O(state=latest) is specified. + - Set it to V(0) if no cache file should be used. In that case, the plugin file is always downloaded to calculate its + checksum when O(state=latest) is specified. default: 86400 updates_url: type: list diff --git a/plugins/modules/jenkins_script.py b/plugins/modules/jenkins_script.py index bd30f9daa7..5a00581366 100644 --- a/plugins/modules/jenkins_script.py +++ b/plugins/modules/jenkins_script.py @@ -39,8 +39,8 @@ options: default: http://localhost:8080 validate_certs: description: - - If set to V(false), the SSL certificates will not be validated. This should only set to V(false) used on personally - controlled sites using self-signed certificates as it avoids verifying the source site. + - If set to V(false), the SSL certificates are not validated. This should only set to V(false) used on personally controlled + sites using self-signed certificates as it avoids verifying the source site. type: bool default: true user: @@ -142,12 +142,12 @@ def main(): module = AnsibleModule( argument_spec=dict( script=dict(required=True, type="str"), - url=dict(required=False, type="str", default="http://localhost:8080"), - validate_certs=dict(required=False, type="bool", default=True), - user=dict(required=False, type="str", default=None), - password=dict(required=False, no_log=True, type="str", default=None), - timeout=dict(required=False, type="int", default=10), - args=dict(required=False, type="dict", default=None) + url=dict(type="str", default="http://localhost:8080"), + validate_certs=dict(type="bool", default=True), + user=dict(type="str"), + password=dict(no_log=True, type="str"), + timeout=dict(type="int", default=10), + args=dict(type="dict") ) ) diff --git a/plugins/modules/jira.py b/plugins/modules/jira.py index 580177d64d..f99c252675 100644 --- a/plugins/modules/jira.py +++ b/plugins/modules/jira.py @@ -117,14 +117,13 @@ options: suboptions: type: description: - - Use type to specify which of the JIRA visibility restriction types will be used. + - Use O(comment_visibility.type) to specify which of the JIRA visibility restriction types is used. type: str required: true choices: [group, role] value: description: - - Use value to specify value corresponding to the type of visibility restriction. For example name of the group - or role. + - Specify value corresponding to the type of visibility restriction. For example name of the group or role. type: str required: true version_added: '3.2.0' @@ -165,12 +164,12 @@ options: type: str required: false description: - - Set issue from which link will be created. + - Set issue from which link is created. outwardissue: type: str required: false description: - - Set issue to which link will be created. + - Set issue to which link is created. fields: type: dict required: false @@ -192,7 +191,7 @@ options: maxresults: required: false description: - - Limit the result of O(operation=search). If no value is specified, the default jira limit will be used. + - Limit the result of O(operation=search). If no value is specified, the default JIRA limit is used. - Used when O(operation=search) only, ignored otherwise. type: int version_added: '0.2.0' @@ -226,12 +225,12 @@ options: content: type: str description: - - The Base64 encoded contents of the file to attach. If not specified, the contents of O(attachment.filename) will - be used instead. + - The Base64 encoded contents of the file to attach. If not specified, the contents of O(attachment.filename) is + used instead. mimetype: type: str description: - - The MIME type to supply for the upload. If not specified, best-effort detection will be done. + - The MIME type to supply for the upload. If not specified, best-effort detection is performed. notes: - Currently this only works with basic-auth, or tokens. - To use with JIRA Cloud, pass the login e-mail as the O(username) and the API token as O(password). diff --git a/plugins/modules/kdeconfig.py b/plugins/modules/kdeconfig.py index 4cc0fcf166..ac542d04e8 100644 --- a/plugins/modules/kdeconfig.py +++ b/plugins/modules/kdeconfig.py @@ -17,12 +17,12 @@ description: options: path: description: - - Path to the config file. If the file does not exist it will be created. + - Path to the config file. If the file does not exist it is created. type: path required: true kwriteconfig_path: description: - - Path to the kwriteconfig executable. If not specified, Ansible will try to discover it. + - Path to the kwriteconfig executable. If not specified, Ansible tries to discover it. type: path values: description: diff --git a/plugins/modules/keycloak_authentication.py b/plugins/modules/keycloak_authentication.py index fddff7a324..ae6d24958c 100644 --- a/plugins/modules/keycloak_authentication.py +++ b/plugins/modules/keycloak_authentication.py @@ -367,8 +367,8 @@ def main(): module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True, - required_one_of=([['token', 'auth_realm', 'auth_username', 'auth_password']]), - required_together=([['auth_realm', 'auth_username', 'auth_password']]), + required_one_of=([['token', 'auth_realm', 'auth_username', 'auth_password', 'auth_client_id', 'auth_client_secret']]), + required_together=([['auth_username', 'auth_password']]), required_by={'refresh_token': 'auth_realm'}, ) diff --git a/plugins/modules/keycloak_authentication_required_actions.py b/plugins/modules/keycloak_authentication_required_actions.py index 147acf9a1e..69183ce605 100644 --- a/plugins/modules/keycloak_authentication_required_actions.py +++ b/plugins/modules/keycloak_authentication_required_actions.py @@ -49,7 +49,7 @@ options: type: dict defaultAction: description: - - Indicates, if any new user will have the required action assigned to it. + - Indicates whether new users have the required action assigned to them. type: bool enabled: description: @@ -149,7 +149,7 @@ end_state: type: dict defaultAction: description: - - Indicates, if any new user will have the required action assigned to it. + - Indicates whether new users have the required action assigned to them. sample: false type: bool enabled: @@ -237,8 +237,8 @@ def main(): module = AnsibleModule( argument_spec=argument_spec, supports_check_mode=True, - required_one_of=([['token', 'auth_realm', 'auth_username', 'auth_password']]), - required_together=([['auth_realm', 'auth_username', 'auth_password']]), + required_one_of=([['token', 'auth_realm', 'auth_username', 'auth_password', 'auth_client_id', 'auth_client_secret']]), + required_together=([['auth_username', 'auth_password']]), required_by={'refresh_token': 'auth_realm'}, ) diff --git a/plugins/modules/keycloak_authz_authorization_scope.py b/plugins/modules/keycloak_authz_authorization_scope.py index 6b2e3c30f6..78d70c7ee6 100644 --- a/plugins/modules/keycloak_authz_authorization_scope.py +++ b/plugins/modules/keycloak_authz_authorization_scope.py @@ -37,8 +37,8 @@ options: state: description: - State of the authorization scope. - - On V(present), the authorization scope will be created (or updated if it exists already). - - On V(absent), the authorization scope will be removed if it exists. + - On V(present), the authorization scope is created (or updated if it exists already). + - On V(absent), the authorization scope is removed if it exists. choices: ['present', 'absent'] default: 'present' type: str @@ -142,8 +142,8 @@ def main(): state=dict(type='str', default='present', choices=['present', 'absent']), name=dict(type='str', required=True), - display_name=dict(type='str', required=False), - icon_uri=dict(type='str', required=False), + display_name=dict(type='str'), + icon_uri=dict(type='str'), client_id=dict(type='str', required=True), realm=dict(type='str', required=True) ) @@ -153,8 +153,8 @@ def main(): module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True, required_one_of=( - [['token', 'auth_realm', 'auth_username', 'auth_password']]), - required_together=([['auth_realm', 'auth_username', 'auth_password']]), + [['token', 'auth_realm', 'auth_username', 'auth_password', 'auth_client_id', 'auth_client_secret']]), + required_together=([['auth_username', 'auth_password']]), required_by={'refresh_token': 'auth_realm'}, ) diff --git a/plugins/modules/keycloak_authz_custom_policy.py b/plugins/modules/keycloak_authz_custom_policy.py index 5e1a2a6a2d..9607c0172c 100644 --- a/plugins/modules/keycloak_authz_custom_policy.py +++ b/plugins/modules/keycloak_authz_custom_policy.py @@ -38,8 +38,8 @@ options: state: description: - State of the custom policy. - - On V(present), the custom policy will be created (or updated if it exists already). - - On V(absent), the custom policy will be removed if it exists. + - On V(present), the custom policy is created (or updated if it exists already). + - On V(absent), the custom policy is removed if it exists. choices: ['present', 'absent'] default: 'present' type: str @@ -139,8 +139,8 @@ def main(): module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True, required_one_of=( - [['token', 'auth_realm', 'auth_username', 'auth_password']]), - required_together=([['auth_realm', 'auth_username', 'auth_password']]), + [['token', 'auth_realm', 'auth_username', 'auth_password', 'auth_client_id', 'auth_client_secret']]), + required_together=([['auth_username', 'auth_password']]), required_by={'refresh_token': 'auth_realm'}, ) diff --git a/plugins/modules/keycloak_authz_permission.py b/plugins/modules/keycloak_authz_permission.py index 683b5f8c18..74bc6cf956 100644 --- a/plugins/modules/keycloak_authz_permission.py +++ b/plugins/modules/keycloak_authz_permission.py @@ -43,8 +43,8 @@ options: state: description: - State of the authorization permission. - - On V(present), the authorization permission will be created (or updated if it exists already). - - On V(absent), the authorization permission will be removed if it exists. + - On V(present), the authorization permission is created (or updated if it exists already). + - On V(absent), the authorization permission is removed if it exists. choices: ['present', 'absent'] default: 'present' type: str @@ -237,13 +237,13 @@ def main(): state=dict(type='str', default='present', choices=['present', 'absent']), name=dict(type='str', required=True), - description=dict(type='str', required=False), + description=dict(type='str'), permission_type=dict(type='str', choices=['scope', 'resource'], required=True), decision_strategy=dict(type='str', default='UNANIMOUS', choices=['UNANIMOUS', 'AFFIRMATIVE', 'CONSENSUS']), - resources=dict(type='list', elements='str', default=[], required=False), - scopes=dict(type='list', elements='str', default=[], required=False), - policies=dict(type='list', elements='str', default=[], required=False), + resources=dict(type='list', elements='str', default=[]), + scopes=dict(type='list', elements='str', default=[]), + policies=dict(type='list', elements='str', default=[]), client_id=dict(type='str', required=True), realm=dict(type='str', required=True) ) @@ -253,8 +253,8 @@ def main(): module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True, required_one_of=( - [['token', 'auth_realm', 'auth_username', 'auth_password']]), - required_together=([['auth_realm', 'auth_username', 'auth_password']]), + [['token', 'auth_realm', 'auth_username', 'auth_password', 'auth_client_id', 'auth_client_secret']]), + required_together=([['auth_username', 'auth_password']]), required_by={'refresh_token': 'auth_realm'}, ) diff --git a/plugins/modules/keycloak_authz_permission_info.py b/plugins/modules/keycloak_authz_permission_info.py index 0271dfd4c4..af7318315f 100644 --- a/plugins/modules/keycloak_authz_permission_info.py +++ b/plugins/modules/keycloak_authz_permission_info.py @@ -134,8 +134,8 @@ def main(): module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True, required_one_of=( - [['token', 'auth_realm', 'auth_username', 'auth_password']]), - required_together=([['auth_realm', 'auth_username', 'auth_password']]), + [['token', 'auth_realm', 'auth_username', 'auth_password', 'auth_client_id', 'auth_client_secret']]), + required_together=([['auth_username', 'auth_password']]), required_by={'refresh_token': 'auth_realm'}, ) diff --git a/plugins/modules/keycloak_client.py b/plugins/modules/keycloak_client.py index e7a2de7c85..6c8a7b1383 100644 --- a/plugins/modules/keycloak_client.py +++ b/plugins/modules/keycloak_client.py @@ -37,8 +37,8 @@ options: state: description: - State of the client. - - On V(present), the client will be created (or updated if it exists already). - - On V(absent), the client will be removed if it exists. + - On V(present), the client are created (or updated if it exists already). + - On V(absent), the client are removed if it exists. choices: ['present', 'absent'] default: 'present' type: str @@ -116,8 +116,8 @@ options: secret: description: - When using O(client_authenticator_type=client-secret) (the default), you can specify a secret here (otherwise one - will be generated if it does not exit). If changing this secret, the module will not register a change currently (but - the changed secret will be saved). + is generated if it does not exit). If changing this secret, the module does not register a change currently (but the + changed secret is saved). type: str registration_access_token: @@ -130,8 +130,8 @@ options: default_roles: description: - - List of default roles for this client. If the client roles referenced do not exist yet, they will be created. This - is C(defaultRoles) in the Keycloak REST API. + - List of default roles for this client. If the client roles referenced do not exist yet, they are created. This is + C(defaultRoles) in the Keycloak REST API. aliases: - defaultRoles type: list @@ -232,7 +232,7 @@ options: protocol: description: - Type of client. - - At creation only, default value will be V(openid-connect) if O(protocol) is omitted. + - At creation only, default value is V(openid-connect) if O(protocol) is omitted. - The V(docker-v2) value was added in community.general 8.6.0. type: str choices: ['openid-connect', 'saml', 'docker-v2'] @@ -261,7 +261,7 @@ options: client_template: description: - - Client template to use for this client. If it does not exist this field will silently be dropped. This is C(clientTemplate) + - Client template to use for this client. If it does not exist this field is silently dropped. This is C(clientTemplate) in the Keycloak REST API. type: str aliases: @@ -454,7 +454,7 @@ options: - A dict of further attributes for this client. This can contain various configuration settings; an example is given in the examples section. While an exhaustive list of permissible options is not available; possible options as of Keycloak 3.4 are listed below. The Keycloak API does not validate whether a given option is appropriate for the protocol - used; if specified anyway, Keycloak will simply not use it. + used; if specified anyway, Keycloak does not use it. type: dict suboptions: saml.authnstatement: @@ -532,7 +532,7 @@ options: - For OpenID-Connect clients, client certificate for validating JWT issued by client and signed by its key, base64-encoded. x509.subjectdn: description: - - For OpenID-Connect clients, subject which will be used to authenticate the client. + - For OpenID-Connect clients, subject which is used to authenticate the client. type: str version_added: 9.5.0 @@ -704,19 +704,31 @@ proposed: description: Representation of proposed client. returned: always type: dict - sample: {clientId: "test"} + sample: {"clientId": "test"} existing: description: Representation of existing client (sample is truncated). returned: always type: dict - sample: {"adminUrl": "http://www.example.com/admin_url", "attributes": {"request.object.signature.alg": "RS256"}} + sample: + { + "adminUrl": "http://www.example.com/admin_url", + "attributes": { + "request.object.signature.alg": "RS256" + } + } end_state: description: Representation of client after module execution (sample is truncated). returned: on success type: dict - sample: {"adminUrl": "http://www.example.com/admin_url", "attributes": {"request.object.signature.alg": "RS256"}} + sample: + { + "adminUrl": "http://www.example.com/admin_url", + "attributes": { + "request.object.signature.alg": "RS256" + } + } """ from ansible_collections.community.general.plugins.module_utils.identity.keycloak.keycloak import KeycloakAPI, camel, \ @@ -941,8 +953,8 @@ def main(): module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True, required_one_of=([['client_id', 'id'], - ['token', 'auth_realm', 'auth_username', 'auth_password']]), - required_together=([['auth_realm', 'auth_username', 'auth_password']]), + ['token', 'auth_realm', 'auth_username', 'auth_password', 'auth_client_id', 'auth_client_secret']]), + required_together=([['auth_username', 'auth_password']]), required_by={'refresh_token': 'auth_realm'}, ) diff --git a/plugins/modules/keycloak_client_rolemapping.py b/plugins/modules/keycloak_client_rolemapping.py index cb1cad8291..1700c99cc1 100644 --- a/plugins/modules/keycloak_client_rolemapping.py +++ b/plugins/modules/keycloak_client_rolemapping.py @@ -22,9 +22,9 @@ description: the scope tailored to your needs and a user having the expected roles. - The names of module options are snake_cased versions of the camelCase ones found in the Keycloak API and its documentation at U(https://www.keycloak.org/docs-api/8.0/rest-api/index.html). - - Attributes are multi-valued in the Keycloak API. All attributes are lists of individual values and will be returned that - way by this module. You may pass single values for attributes when calling the module, and this will be translated into - a list suitable for the API. + - Attributes are multi-valued in the Keycloak API. All attributes are lists of individual values and are returned that way + by this module. You may pass single values for attributes when calling the module, and this is translated into a list + suitable for the API. - When updating a client_rolemapping, where possible provide the role ID to the module. This removes a lookup to the API to translate the name into the role ID. attributes: @@ -39,9 +39,9 @@ options: state: description: - State of the client_rolemapping. - - On V(present), the client_rolemapping will be created if it does not yet exist, or updated with the parameters you - provide. - - On V(absent), the client_rolemapping will be removed if it exists. + - On V(present), the client_rolemapping is created if it does not yet exist, or updated with the parameters + you provide. + - On V(absent), the client_rolemapping is removed if it exists. default: 'present' type: str choices: @@ -87,8 +87,8 @@ options: type: str description: - ID of the group to be mapped. - - This parameter is not required for updating or deleting the rolemapping but providing it will reduce the number of - API calls required. + - This parameter is not required for updating or deleting the rolemapping but providing it reduces the number of API + calls required. client_id: type: str description: @@ -98,8 +98,8 @@ options: type: str description: - ID of the client to be mapped. - - This parameter is not required for updating or deleting the rolemapping but providing it will reduce the number of - API calls required. + - This parameter is not required for updating or deleting the rolemapping but providing it reduces the number of API + calls required. roles: description: - Roles to be mapped to the group. @@ -115,8 +115,8 @@ options: type: str description: - The unique identifier for this role_representation. - - This parameter is not required for updating or deleting a role_representation but providing it will reduce the - number of API calls required. + - This parameter is not required for updating or deleting a role_representation but providing it reduces the number + of API calls required. extends_documentation_fragment: - community.general.keycloak - community.general.keycloak.actiongroup_keycloak @@ -209,7 +209,7 @@ proposed: description: Representation of proposed client role mapping. returned: always type: dict - sample: {clientId: "test"} + sample: {"clientId": "test"} existing: description: @@ -217,7 +217,13 @@ existing: - The sample is truncated. returned: always type: dict - sample: {"adminUrl": "http://www.example.com/admin_url", "attributes": {"request.object.signature.alg": "RS256"}} + sample: + { + "adminUrl": "http://www.example.com/admin_url", + "attributes": { + "request.object.signature.alg": "RS256" + } + } end_state: description: @@ -225,7 +231,13 @@ end_state: - The sample is truncated. returned: on success type: dict - sample: {"adminUrl": "http://www.example.com/admin_url", "attributes": {"request.object.signature.alg": "RS256"}} + sample: + { + "adminUrl": "http://www.example.com/admin_url", + "attributes": { + "request.object.signature.alg": "RS256" + } + } """ from ansible_collections.community.general.plugins.module_utils.identity.keycloak.keycloak import ( @@ -268,8 +280,8 @@ def main(): module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True, - required_one_of=([['token', 'auth_realm', 'auth_username', 'auth_password']]), - required_together=([['auth_realm', 'auth_username', 'auth_password']]), + required_one_of=([['token', 'auth_realm', 'auth_username', 'auth_password', 'auth_client_id', 'auth_client_secret']]), + required_together=([['auth_username', 'auth_password']]), required_by={'refresh_token': 'auth_realm'}, ) diff --git a/plugins/modules/keycloak_client_rolescope.py b/plugins/modules/keycloak_client_rolescope.py index db11f37098..fcf57c2e4a 100644 --- a/plugins/modules/keycloak_client_rolescope.py +++ b/plugins/modules/keycloak_client_rolescope.py @@ -22,9 +22,9 @@ description: In a default Keycloak installation, admin-cli and an admin user would work, as would a separate client definition with the scope tailored to your needs and a user having the expected roles. - Client O(client_id) must have O(community.general.keycloak_client#module:full_scope_allowed) set to V(false). - - Attributes are multi-valued in the Keycloak API. All attributes are lists of individual values and will be returned that - way by this module. You may pass single values for attributes when calling the module, and this will be translated into - a list suitable for the API. + - Attributes are multi-valued in the Keycloak API. All attributes are lists of individual values and are returned that way + by this module. You may pass single values for attributes when calling the module, and this is translated into a list + suitable for the API. attributes: check_mode: support: full @@ -37,8 +37,8 @@ options: state: description: - State of the role mapping. - - On V(present), all roles in O(role_names) will be mapped if not exists yet. - - On V(absent), all roles mapping in O(role_names) will be removed if it exists. + - On V(present), all roles in O(role_names) are mapped if not exist yet. + - On V(absent), all roles mapping in O(role_names) are removed if it exists. default: 'present' type: str choices: diff --git a/plugins/modules/keycloak_clientscope.py b/plugins/modules/keycloak_clientscope.py index 4c452d4f2e..ddb4e1b04b 100644 --- a/plugins/modules/keycloak_clientscope.py +++ b/plugins/modules/keycloak_clientscope.py @@ -22,9 +22,9 @@ description: the scope tailored to your needs and a user having the expected roles. - The names of module options are snake_cased versions of the camelCase ones found in the Keycloak API and its documentation at U(https://www.keycloak.org/docs-api/8.0/rest-api/index.html). - - Attributes are multi-valued in the Keycloak API. All attributes are lists of individual values and will be returned that - way by this module. You may pass single values for attributes when calling the module, and this will be translated into - a list suitable for the API. + - Attributes are multi-valued in the Keycloak API. All attributes are lists of individual values and are returned that way + by this module. You may pass single values for attributes when calling the module, and this is translated into a list + suitable for the API. - When updating a client_scope, where possible provide the client_scope ID to the module. This removes a lookup to the API to translate the name into the client_scope ID. attributes: @@ -39,8 +39,8 @@ options: state: description: - State of the client_scope. - - On V(present), the client_scope will be created if it does not yet exist, or updated with the parameters you provide. - - On V(absent), the client_scope will be removed if it exists. + - On V(present), the client_scope is created if it does not yet exist, or updated with the parameters you provide. + - On V(absent), the client_scope is removed if it exists. default: 'present' type: str choices: @@ -62,8 +62,8 @@ options: type: str description: - The unique identifier for this client_scope. - - This parameter is not required for updating or deleting a client_scope but providing it will reduce the number of - API calls required. + - This parameter is not required for updating or deleting a client_scope but providing it reduces the number of API + calls required. description: type: str description: @@ -263,19 +263,31 @@ proposed: description: Representation of proposed client scope. returned: always type: dict - sample: {clientId: "test"} + sample: {"clientId": "test"} existing: description: Representation of existing client scope (sample is truncated). returned: always type: dict - sample: {"adminUrl": "http://www.example.com/admin_url", "attributes": {"request.object.signature.alg": "RS256"}} + sample: + { + "adminUrl": "http://www.example.com/admin_url", + "attributes": { + "request.object.signature.alg": "RS256" + } + } end_state: description: Representation of client scope after module execution (sample is truncated). returned: on success type: dict - sample: {"adminUrl": "http://www.example.com/admin_url", "attributes": {"request.object.signature.alg": "RS256"}} + sample: + { + "adminUrl": "http://www.example.com/admin_url", + "attributes": { + "request.object.signature.alg": "RS256" + } + } """ from ansible_collections.community.general.plugins.module_utils.identity.keycloak.keycloak import KeycloakAPI, camel, \ @@ -354,8 +366,8 @@ def main(): module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True, required_one_of=([['id', 'name'], - ['token', 'auth_realm', 'auth_username', 'auth_password']]), - required_together=([['auth_realm', 'auth_username', 'auth_password']]), + ['token', 'auth_realm', 'auth_username', 'auth_password', 'auth_client_id', 'auth_client_secret']]), + required_together=([['auth_username', 'auth_password']]), required_by={'refresh_token': 'auth_realm'}, ) diff --git a/plugins/modules/keycloak_clientscope_type.py b/plugins/modules/keycloak_clientscope_type.py index 0e742f676c..85308f1a22 100644 --- a/plugins/modules/keycloak_clientscope_type.py +++ b/plugins/modules/keycloak_clientscope_type.py @@ -99,20 +99,43 @@ proposed: description: Representation of proposed client-scope types mapping. returned: always type: dict - sample: {default_clientscopes: ["profile", "role"], optional_clientscopes: []} + sample: + { + "default_clientscopes": [ + "profile", + "role" + ], + "optional_clientscopes": [] + } existing: description: - Representation of client scopes before module execution. returned: always type: dict - sample: {default_clientscopes: ["profile", "role"], optional_clientscopes: ["phone"]} + sample: + { + "default_clientscopes": [ + "profile", + "role" + ], + "optional_clientscopes": [ + "phone" + ] + } end_state: description: - Representation of client scopes after module execution. - The sample is truncated. returned: on success type: dict - sample: {default_clientscopes: ["profile", "role"], optional_clientscopes: []} + sample: + { + "default_clientscopes": [ + "profile", + "role" + ], + "optional_clientscopes": [] + } """ from ansible.module_utils.basic import AnsibleModule @@ -145,10 +168,10 @@ def keycloak_clientscope_type_module(): argument_spec=argument_spec, supports_check_mode=True, required_one_of=([ - ['token', 'auth_realm', 'auth_username', 'auth_password'], + ['token', 'auth_realm', 'auth_username', 'auth_password', 'auth_client_id', 'auth_client_secret'], ['default_clientscopes', 'optional_clientscopes'] ]), - required_together=([['auth_realm', 'auth_username', 'auth_password']]), + required_together=([['auth_username', 'auth_password']]), required_by={'refresh_token': 'auth_realm'}, mutually_exclusive=[ ['token', 'auth_realm'], diff --git a/plugins/modules/keycloak_clientsecret_info.py b/plugins/modules/keycloak_clientsecret_info.py index da07d03248..0ea48f6a33 100644 --- a/plugins/modules/keycloak_clientsecret_info.py +++ b/plugins/modules/keycloak_clientsecret_info.py @@ -39,8 +39,8 @@ options: id: description: - The unique identifier for this client. - - This parameter is not required for getting or generating a client secret but providing it will reduce the number of - API calls required. + - This parameter is not required for getting or generating a client secret but providing it reduces the number of API + calls required. type: str client_id: diff --git a/plugins/modules/keycloak_clientsecret_regenerate.py b/plugins/modules/keycloak_clientsecret_regenerate.py index bb449abc10..2bcaeb3705 100644 --- a/plugins/modules/keycloak_clientsecret_regenerate.py +++ b/plugins/modules/keycloak_clientsecret_regenerate.py @@ -43,8 +43,8 @@ options: id: description: - The unique identifier for this client. - - This parameter is not required for getting or generating a client secret but providing it will reduce the number of - API calls required. + - This parameter is not required for getting or generating a client secret but providing it reduces the number of API + calls required. type: str client_id: diff --git a/plugins/modules/keycloak_clienttemplate.py b/plugins/modules/keycloak_clienttemplate.py index a6af59b5ac..ee357605f1 100644 --- a/plugins/modules/keycloak_clienttemplate.py +++ b/plugins/modules/keycloak_clienttemplate.py @@ -35,8 +35,8 @@ options: state: description: - State of the client template. - - On V(present), the client template will be created (or updated if it exists already). - - On V(absent), the client template will be removed if it exists. + - On V(present), the client template is created (or updated if it exists already). + - On V(absent), the client template is removed if it exists. choices: ['present', 'absent'] default: 'present' type: str @@ -238,10 +238,7 @@ proposed: description: Representation of proposed client template. returned: always type: dict - sample: - { - "name": "test01" - } + sample: {"name": "test01"} existing: description: Representation of existing client template (sample is truncated). @@ -311,8 +308,8 @@ def main(): module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True, required_one_of=([['id', 'name'], - ['token', 'auth_realm', 'auth_username', 'auth_password']]), - required_together=([['auth_realm', 'auth_username', 'auth_password']]), + ['token', 'auth_realm', 'auth_username', 'auth_password', 'auth_client_id', 'auth_client_secret']]), + required_together=([['auth_username', 'auth_password']]), required_by={'refresh_token': 'auth_realm'}, ) diff --git a/plugins/modules/keycloak_component.py b/plugins/modules/keycloak_component.py index d5a3be2a8e..8b0c67b321 100644 --- a/plugins/modules/keycloak_component.py +++ b/plugins/modules/keycloak_component.py @@ -35,8 +35,8 @@ options: state: description: - State of the Keycloak component. - - On V(present), the component will be created (or updated if it exists already). - - On V(absent), the component will be removed if it exists. + - On V(present), the component is created (or updated if it exists already). + - On V(absent), the component is removed if it exists. choices: ['present', 'absent'] default: 'present' type: str @@ -155,8 +155,8 @@ def main(): module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True, - required_one_of=([['token', 'auth_realm', 'auth_username', 'auth_password']]), - required_together=([['auth_realm', 'auth_username', 'auth_password']]), + required_one_of=([['token', 'auth_realm', 'auth_username', 'auth_password', 'auth_client_id', 'auth_client_secret']]), + required_together=([['auth_username', 'auth_password']]), required_by={'refresh_token': 'auth_realm'}, ) diff --git a/plugins/modules/keycloak_group.py b/plugins/modules/keycloak_group.py index 08d2555745..7053b33a35 100644 --- a/plugins/modules/keycloak_group.py +++ b/plugins/modules/keycloak_group.py @@ -20,9 +20,9 @@ description: scope tailored to your needs and a user having the expected roles. - The names of module options are snake_cased versions of the camelCase ones found in the Keycloak API and its documentation at U(https://www.keycloak.org/docs-api/20.0.2/rest-api/index.html). - - Attributes are multi-valued in the Keycloak API. All attributes are lists of individual values and will be returned that - way by this module. You may pass single values for attributes when calling the module, and this will be translated into - a list suitable for the API. + - Attributes are multi-valued in the Keycloak API. All attributes are lists of individual values and are returned that way + by this module. You may pass single values for attributes when calling the module, and this is translated into a list + suitable for the API. - When updating a group, where possible provide the group ID to the module. This removes a lookup to the API to translate the name into the group ID. attributes: @@ -37,9 +37,9 @@ options: state: description: - State of the group. - - On V(present), the group will be created if it does not yet exist, or updated with the parameters you provide. - - On V(absent), the group will be removed if it exists. Be aware that absenting a group with subgroups will automatically - delete all its subgroups too. + - On V(present), the group is created if it does not yet exist, or updated with the parameters you provide. + - On V(absent), the group is removed if it exists. Be aware that absenting a group with subgroups automatically deletes + all its subgroups too. default: 'present' type: str choices: @@ -61,8 +61,7 @@ options: type: str description: - The unique identifier for this group. - - This parameter is not required for updating or deleting a group but providing it will reduce the number of API calls - required. + - This parameter is not required for updating or deleting a group but providing it reduces the number of API calls required. attributes: type: dict description: @@ -282,8 +281,7 @@ end_state: returned: always sample: [] subGroups: - description: A list of groups that are children of this group. These groups will have the same parameters as documented - here. + description: A list of groups that are children of this group. These groups have the same parameters as documented here. type: list returned: always clientRoles: @@ -334,8 +332,8 @@ def main(): module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True, required_one_of=([['id', 'name'], - ['token', 'auth_realm', 'auth_username', 'auth_password']]), - required_together=([['auth_realm', 'auth_username', 'auth_password']]), + ['token', 'auth_realm', 'auth_username', 'auth_password', 'auth_client_id', 'auth_client_secret']]), + required_together=([['auth_username', 'auth_password']]), required_by={'refresh_token': 'auth_realm'}, ) diff --git a/plugins/modules/keycloak_identity_provider.py b/plugins/modules/keycloak_identity_provider.py index 2107e273a8..40a06846d6 100644 --- a/plugins/modules/keycloak_identity_provider.py +++ b/plugins/modules/keycloak_identity_provider.py @@ -34,9 +34,8 @@ options: state: description: - State of the identity provider. - - On V(present), the identity provider will be created if it does not yet exist, or updated with the parameters you - provide. - - On V(absent), the identity provider will be removed if it exists. + - On V(present), the identity provider is created if it does not yet exist, or updated with the parameters you provide. + - On V(absent), the identity provider is removed if it exists. default: 'present' type: str choices: @@ -148,14 +147,14 @@ options: sync_mode: description: - - Default sync mode for all mappers. The sync mode determines when user data will be synced using the mappers. + - Default sync mode for all mappers. The sync mode determines when user data is synced using the mappers. aliases: - syncMode type: str issuer: description: - - The issuer identifier for the issuer of the response. If not provided, no validation will be performed. + - The issuer identifier for the issuer of the response. If not provided, no validation is performed. type: str authorizationUrl: @@ -205,7 +204,7 @@ options: useJwksUrl: description: - - If the switch is on, identity provider public keys will be downloaded from given JWKS URL. + - If V(true), identity provider public keys are downloaded from given JWKS URL. type: bool jwksUrl: @@ -215,7 +214,7 @@ options: entityId: description: - - The Entity ID that will be used to uniquely identify this SAML Service Provider. + - The Entity ID that is used to uniquely identify this SAML Service Provider. type: str singleSignOnServiceUrl: @@ -500,8 +499,8 @@ def main(): module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True, - required_one_of=([['token', 'auth_realm', 'auth_username', 'auth_password']]), - required_together=([['auth_realm', 'auth_username', 'auth_password']]), + required_one_of=([['token', 'auth_realm', 'auth_username', 'auth_password', 'auth_client_id', 'auth_client_secret']]), + required_together=([['auth_username', 'auth_password']]), required_by={'refresh_token': 'auth_realm'}, ) diff --git a/plugins/modules/keycloak_realm.py b/plugins/modules/keycloak_realm.py index 6d896d4141..c8bc7dc7df 100644 --- a/plugins/modules/keycloak_realm.py +++ b/plugins/modules/keycloak_realm.py @@ -39,8 +39,8 @@ options: state: description: - State of the realm. - - On V(present), the realm will be created (or updated if it exists already). - - On V(absent), the realm will be removed if it exists. + - On V(present), the realm is created (or updated if it exists already). + - On V(absent), the realm is removed if it exists. choices: ['present', 'absent'] default: 'present' type: str @@ -553,19 +553,31 @@ proposed: description: Representation of proposed realm. returned: always type: dict - sample: {realm: "test"} + sample: {"realm": "test"} existing: description: Representation of existing realm (sample is truncated). returned: always type: dict - sample: {"adminUrl": "http://www.example.com/admin_url", "attributes": {"request.object.signature.alg": "RS256"}} + sample: + { + "adminUrl": "http://www.example.com/admin_url", + "attributes": { + "request.object.signature.alg": "RS256" + } + } end_state: description: Representation of realm after module execution (sample is truncated). returned: on success type: dict - sample: {"adminUrl": "http://www.example.com/admin_url", "attributes": {"request.object.signature.alg": "RS256"}} + sample: + { + "adminUrl": "http://www.example.com/admin_url", + "attributes": { + "request.object.signature.alg": "RS256" + } + } """ from ansible_collections.community.general.plugins.module_utils.identity.keycloak.keycloak import KeycloakAPI, camel, \ @@ -705,8 +717,8 @@ def main(): module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True, required_one_of=([['id', 'realm', 'enabled'], - ['token', 'auth_realm', 'auth_username', 'auth_password']]), - required_together=([['auth_realm', 'auth_username', 'auth_password']]), + ['token', 'auth_realm', 'auth_username', 'auth_password', 'auth_client_id', 'auth_client_secret']]), + required_together=([['auth_username', 'auth_password']]), required_by={'refresh_token': 'auth_realm'}, ) diff --git a/plugins/modules/keycloak_realm_info.py b/plugins/modules/keycloak_realm_info.py index 838b19513d..501ca48c21 100644 --- a/plugins/modules/keycloak_realm_info.py +++ b/plugins/modules/keycloak_realm_info.py @@ -19,9 +19,9 @@ description: - This module allows you to get Keycloak realm public information using the Keycloak REST API. - The names of module options are snake_cased versions of the camelCase ones found in the Keycloak API and its documentation at U(https://www.keycloak.org/docs-api/8.0/rest-api/index.html). - - Attributes are multi-valued in the Keycloak API. All attributes are lists of individual values and will be returned that - way by this module. You may pass single values for attributes when calling the module, and this will be translated into - a list suitable for the API. + - Attributes are multi-valued in the Keycloak API. All attributes are lists of individual values and are returned that way + by this module. You may pass single values for attributes when calling the module, and this is translated into a list + suitable for the API. extends_documentation_fragment: - community.general.attributes - community.general.attributes.info_module diff --git a/plugins/modules/keycloak_realm_key.py b/plugins/modules/keycloak_realm_key.py index 97e0af6da5..dbb284ec4b 100644 --- a/plugins/modules/keycloak_realm_key.py +++ b/plugins/modules/keycloak_realm_key.py @@ -25,11 +25,9 @@ description: at U(https://www.keycloak.org/docs-api/8.0/rest-api/index.html). Aliases are provided so camelCased versions can be used as well. - This module is unable to detect changes to the actual cryptographic key after importing it. However, if some other property - is changed alongside the cryptographic key, then the key will also get changed as a side-effect, as the JSON payload needs - to include the private key. This can be considered either a bug or a feature, as the alternative would be to always update - the realm key whether it has changed or not. - - If certificate is not explicitly provided it will be dynamically created by Keycloak. Therefore comparing the current - state of the certificate to the desired state (which may be empty) is not possible. + is changed alongside the cryptographic key, then the key also changes as a side-effect, as the JSON payload needs to include + the private key. This can be considered either a bug or a feature, as the alternative would be to always update the realm + key whether it has changed or not. attributes: check_mode: support: full @@ -42,8 +40,8 @@ options: state: description: - State of the keycloak realm key. - - On V(present), the realm key will be created (or updated if it exists already). - - On V(absent), the realm key will be removed if it exists. + - On V(present), the realm key is created (or updated if it exists already). + - On V(absent), the realm key is removed if it exists. choices: ['present', 'absent'] default: 'present' type: str @@ -119,10 +117,10 @@ options: notes: - Current value of the private key cannot be fetched from Keycloak. Therefore comparing its desired state to the current state is not possible. - - If certificate is not explicitly provided it will be dynamically created by Keycloak. Therefore comparing the current + - If O(config.certificate) is not explicitly provided it is dynamically created by Keycloak. Therefore comparing the current state of the certificate to the desired state (which may be empty) is not possible. - Due to the private key and certificate options the module is B(not fully idempotent). You can use O(force=true) to force - the module to always update if you know that the private key might have changed. + the module to ensure updating if you know that the private key might have changed. extends_documentation_fragment: - community.general.keycloak - community.general.keycloak.actiongroup_keycloak @@ -208,7 +206,21 @@ end_state: description: Realm key configuration. type: dict returned: when O(state=present) - sample: {"active": ["true"], "algorithm": ["RS256"], "enabled": ["true"], "priority": ["140"]} + sample: + { + "active": [ + "true" + ], + "algorithm": [ + "RS256" + ], + "enabled": [ + "true" + ], + "priority": [ + "140" + ] + } """ from ansible_collections.community.general.plugins.module_utils.identity.keycloak.keycloak import KeycloakAPI, camel, \ @@ -263,8 +275,8 @@ def main(): module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True, - required_one_of=([['token', 'auth_realm', 'auth_username', 'auth_password']]), - required_together=([['auth_realm', 'auth_username', 'auth_password']]), + required_one_of=([['token', 'auth_realm', 'auth_username', 'auth_password', 'auth_client_id', 'auth_client_secret']]), + required_together=([['auth_username', 'auth_password']]), required_by={'refresh_token': 'auth_realm'}, ) diff --git a/plugins/modules/keycloak_realm_keys_metadata_info.py b/plugins/modules/keycloak_realm_keys_metadata_info.py index 9946bd88ba..8340c8f2a5 100644 --- a/plugins/modules/keycloak_realm_keys_metadata_info.py +++ b/plugins/modules/keycloak_realm_keys_metadata_info.py @@ -104,8 +104,8 @@ def main(): module = AnsibleModule( argument_spec=argument_spec, supports_check_mode=True, - required_one_of=([["token", "auth_realm", "auth_username", "auth_password"]]), - required_together=([['auth_realm', 'auth_username', 'auth_password']]), + required_one_of=([['token', 'auth_realm', 'auth_username', 'auth_password', 'auth_client_id', 'auth_client_secret']]), + required_together=([['auth_username', 'auth_password']]), required_by={'refresh_token': 'auth_realm'}, ) diff --git a/plugins/modules/keycloak_realm_rolemapping.py b/plugins/modules/keycloak_realm_rolemapping.py index 2937ed0ec0..2b6b6a4eda 100644 --- a/plugins/modules/keycloak_realm_rolemapping.py +++ b/plugins/modules/keycloak_realm_rolemapping.py @@ -22,9 +22,9 @@ description: definition with the scope tailored to your needs and a user having the expected roles. - The names of module options are snake_cased versions of the camelCase ones found in the Keycloak API and its documentation at U(https://www.keycloak.org/docs-api/18.0/rest-api/index.html). - - Attributes are multi-valued in the Keycloak API. All attributes are lists of individual values and will be returned that - way by this module. You may pass single values for attributes when calling the module, and this will be translated into - a list suitable for the API. + - Attributes are multi-valued in the Keycloak API. All attributes are lists of individual values and are returned that way + by this module. You may pass single values for attributes when calling the module, and this is translated into a list + suitable for the API. - When updating a group_rolemapping, where possible provide the role ID to the module. This removes a lookup to the API to translate the name into the role ID. attributes: @@ -39,9 +39,8 @@ options: state: description: - State of the realm_rolemapping. - - On C(present), the realm_rolemapping will be created if it does not yet exist, or updated with the parameters you - provide. - - On C(absent), the realm_rolemapping will be removed if it exists. + - On C(present), the realm_rolemapping is created if it does not yet exist, or updated with the parameters you provide. + - On C(absent), the realm_rolemapping is removed if it exists. default: 'present' type: str choices: @@ -86,8 +85,8 @@ options: type: str description: - ID of the group to be mapped. - - This parameter is not required for updating or deleting the rolemapping but providing it will reduce the number of - API calls required. + - This parameter is not required for updating or deleting the rolemapping but providing it reduces the number of API + calls required. roles: description: - Roles to be mapped to the group. @@ -103,8 +102,8 @@ options: type: str description: - The unique identifier for this role_representation. - - This parameter is not required for updating or deleting a role_representation but providing it will reduce the - number of API calls required. + - This parameter is not required for updating or deleting a role_representation but providing it reduces the number + of API calls required. extends_documentation_fragment: - community.general.keycloak - community.general.keycloak.actiongroup_keycloak @@ -195,7 +194,7 @@ proposed: description: Representation of proposed client role mapping. returned: always type: dict - sample: {clientId: "test"} + sample: {"clientId": "test"} existing: description: @@ -203,7 +202,13 @@ existing: - The sample is truncated. returned: always type: dict - sample: {"adminUrl": "http://www.example.com/admin_url", "attributes": {"request.object.signature.alg": "RS256"}} + sample: + { + "adminUrl": "http://www.example.com/admin_url", + "attributes": { + "request.object.signature.alg": "RS256" + } + } end_state: description: @@ -211,7 +216,13 @@ end_state: - The sample is truncated. returned: on success type: dict - sample: {"adminUrl": "http://www.example.com/admin_url", "attributes": {"request.object.signature.alg": "RS256"}} + sample: + { + "adminUrl": "http://www.example.com/admin_url", + "attributes": { + "request.object.signature.alg": "RS256" + } + } """ from ansible_collections.community.general.plugins.module_utils.identity.keycloak.keycloak import ( @@ -252,8 +263,8 @@ def main(): module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True, - required_one_of=([['token', 'auth_realm', 'auth_username', 'auth_password']]), - required_together=([['auth_realm', 'auth_username', 'auth_password']]), + required_one_of=([['token', 'auth_realm', 'auth_username', 'auth_password', 'auth_client_id', 'auth_client_secret']]), + required_together=([['auth_username', 'auth_password']]), required_by={'refresh_token': 'auth_realm'}, ) diff --git a/plugins/modules/keycloak_role.py b/plugins/modules/keycloak_role.py index 9444140f06..5b706354ed 100644 --- a/plugins/modules/keycloak_role.py +++ b/plugins/modules/keycloak_role.py @@ -22,9 +22,9 @@ description: scope tailored to your needs and a user having the expected roles. - The names of module options are snake_cased versions of the camelCase ones found in the Keycloak API and its documentation at U(https://www.keycloak.org/docs-api/8.0/rest-api/index.html). - - Attributes are multi-valued in the Keycloak API. All attributes are lists of individual values and will be returned that - way by this module. You may pass single values for attributes when calling the module, and this will be translated into - a list suitable for the API. + - Attributes are multi-valued in the Keycloak API. All attributes are lists of individual values and are returned that way + by this module. You may pass single values for attributes when calling the module, and this is translated into a list + suitable for the API. attributes: check_mode: support: full @@ -37,8 +37,8 @@ options: state: description: - State of the role. - - On V(present), the role will be created if it does not yet exist, or updated with the parameters you provide. - - On V(absent), the role will be removed if it exists. + - On V(present), the role is created if it does not yet exist, or updated with the parameters you provide. + - On V(absent), the role is removed if it exists. default: 'present' type: str choices: @@ -195,10 +195,7 @@ proposed: description: Representation of proposed role. returned: always type: dict - sample: - { - "description": "My updated test description" - } + sample: {"description": "My updated test description"} existing: description: Representation of existing role. @@ -247,7 +244,7 @@ def main(): composites_spec = dict( name=dict(type='str', required=True), - client_id=dict(type='str', aliases=['clientId'], required=False), + client_id=dict(type='str', aliases=['clientId']), state=dict(type='str', default='present', choices=['present', 'absent']) ) @@ -266,8 +263,8 @@ def main(): module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True, - required_one_of=([['token', 'auth_realm', 'auth_username', 'auth_password']]), - required_together=([['auth_realm', 'auth_username', 'auth_password']]), + required_one_of=([['token', 'auth_realm', 'auth_username', 'auth_password', 'auth_client_id', 'auth_client_secret']]), + required_together=([['auth_username', 'auth_password']]), required_by={'refresh_token': 'auth_realm'}, ) diff --git a/plugins/modules/keycloak_user.py b/plugins/modules/keycloak_user.py index 71e793ae21..2b3c838483 100644 --- a/plugins/modules/keycloak_user.py +++ b/plugins/modules/keycloak_user.py @@ -101,9 +101,9 @@ options: groups: description: - List of groups for the user. - Groups can be referenced by their name, like V(staff), or their path, like V(/staff/engineering). - The path syntax allows you to reference subgroups, which is not possible otherwise. - This is possible since community.general 10.6.0. + - Groups can be referenced by their name, like V(staff), or their path, like V(/staff/engineering). The path syntax + allows you to reference subgroups, which is not possible otherwise. + - Using the path is possible since community.general 10.6.0. type: list elements: dict default: [] @@ -332,11 +332,6 @@ EXAMPLES = r""" """ RETURN = r""" -msg: - description: Message as to what action was taken. - returned: always - type: str - sample: User f18c709c-03d6-11ee-970b-c74bf2721112 created proposed: description: Representation of the proposed user. returned: on success @@ -349,10 +344,6 @@ end_state: description: Representation of the user after module execution. returned: on success type: dict -changed: - description: Return V(true) if the operation changed the user on the keycloak server, V(false) otherwise. - returned: always - type: bool """ from ansible_collections.community.general.plugins.module_utils.identity.keycloak.keycloak import KeycloakAPI, camel, \ @@ -410,8 +401,8 @@ def main(): module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True, - required_one_of=([['token', 'auth_realm', 'auth_username', 'auth_password']]), - required_together=([['auth_realm', 'auth_username', 'auth_password']]), + required_one_of=([['token', 'auth_realm', 'auth_username', 'auth_password', 'auth_client_id', 'auth_client_secret']]), + required_together=([['auth_username', 'auth_password']]), required_by={'refresh_token': 'auth_realm'}, ) diff --git a/plugins/modules/keycloak_user_federation.py b/plugins/modules/keycloak_user_federation.py index 13428ddeb3..3290ab8dd9 100644 --- a/plugins/modules/keycloak_user_federation.py +++ b/plugins/modules/keycloak_user_federation.py @@ -34,8 +34,8 @@ options: state: description: - State of the user federation. - - On V(present), the user federation will be created if it does not yet exist, or updated with the parameters you provide. - - On V(absent), the user federation will be removed if it exists. + - On V(present), the user federation is created if it does not yet exist, or updated with the parameters you provide. + - On V(absent), the user federation is removed if it exists. default: 'present' type: str choices: @@ -50,7 +50,7 @@ options: id: description: - - The unique ID for this user federation. If left empty, the user federation will be searched by its O(name). + - The unique ID for this user federation. If left empty, the user federation is searched by its O(name). type: str name: @@ -76,7 +76,7 @@ options: parent_id: description: - - Unique ID for the parent of this user federation. Realm ID will be automatically used if left blank. + - Unique ID for the parent of this user federation. Realm ID is automatically used if left blank. aliases: - parentId type: str @@ -95,11 +95,11 @@ options: value with the desired value always evaluates to not equal. This means the before and desired states are never equal if the parameter is set. - Set to V(always) to include O(config.bindCredential) in the comparison of before and desired state. Because of the - redacted value returned by Keycloak the module will always detect a change and make an update if a O(config.bindCredential) + redacted value returned by Keycloak the module always detects a change and make an update if a O(config.bindCredential) value is set. - Set to V(only_indirect) to exclude O(config.bindCredential) when comparing the before state with the desired state. - The value of O(config.bindCredential) will only be updated if there are other changes to the user federation that - require an update. + The value of O(config.bindCredential) is only updated if there are other changes to the user federation that require + an update. type: str default: always choices: @@ -129,14 +129,14 @@ options: importEnabled: description: - - If V(true), LDAP users will be imported into Keycloak DB and synced by the configured sync policies. + - If V(true), LDAP users are imported into Keycloak DB and synced by the configured sync policies. default: true type: bool editMode: description: - - V(READ_ONLY) is a read-only LDAP store. V(WRITABLE) means data will be synced back to LDAP on demand. V(UNSYNCED) - means user data will be imported, but not synced back to LDAP. + - V(READ_ONLY) is a read-only LDAP store. V(WRITABLE) means data is synced back to LDAP on demand. V(UNSYNCED) means + user data is imported, but not synced back to LDAP. type: str choices: - READ_ONLY @@ -181,7 +181,7 @@ options: userObjectClasses: description: - All values of LDAP objectClass attribute for users in LDAP divided by comma. For example V(inetOrgPerson, organizationalPerson). - Newly created Keycloak users will be written to LDAP with all those object classes and existing LDAP user records + Newly created Keycloak users are written to LDAP with all those object classes and existing LDAP user records are found just if they contain all those object classes. type: str @@ -222,7 +222,7 @@ options: bindDn: description: - - DN of LDAP user which will be used by Keycloak to access LDAP server. + - DN of LDAP user which is used by Keycloak to access LDAP server. type: str bindCredential: @@ -232,7 +232,7 @@ options: startTls: description: - - Encrypts the connection to LDAP using STARTTLS, which will disable connection pooling. + - Encrypts the connection to LDAP using STARTTLS, which disables connection pooling. default: false type: bool @@ -258,11 +258,11 @@ options: useTruststoreSpi: description: - - Specifies whether LDAP connection will use the truststore SPI with the truststore configured in standalone.xml/domain.xml. - V(always) means that it will always use it. V(never) means that it will not use it. V(ldapsOnly) means that it - will use if your connection URL use ldaps. + - Specifies whether LDAP connection uses the truststore SPI with the truststore configured in standalone.xml/domain.xml. + V(always) means that it always uses it. V(never) means that it does not use it. V(ldapsOnly) means that it uses + if your connection URL use ldaps. - Note even if standalone.xml/domain.xml is not configured, the default Java cacerts or certificate specified by - C(javax.net.ssl.trustStore) property will be used. + C(javax.net.ssl.trustStore) property is used. default: ldapsOnly type: str choices: @@ -335,8 +335,8 @@ options: allowKerberosAuthentication: description: - - Enable/disable HTTP authentication of users with SPNEGO/Kerberos tokens. The data about authenticated users will - be provisioned from this LDAP server. + - Enable/disable HTTP authentication of users with SPNEGO/Kerberos tokens. The data about authenticated users is + provisioned from this LDAP server. default: false type: bool @@ -348,9 +348,9 @@ options: krbPrincipalAttribute: description: - Name of the LDAP attribute, which refers to Kerberos principal. This is used to lookup appropriate LDAP user after - successful Kerberos/SPNEGO authentication in Keycloak. When this is empty, the LDAP user will be looked based - on LDAP username corresponding to the first part of his Kerberos principal. For instance, for principal C(john@KEYCLOAK.ORG), - it will assume that LDAP username is V(john). + successful Kerberos/SPNEGO authentication in Keycloak. When this is empty, the LDAP user is looked up based on + LDAP username corresponding to the first part of his Kerberos principal. For instance, for principal C(john@KEYCLOAK.ORG), + it assumes that LDAP username is V(john). type: str version_added: 8.1.0 @@ -419,17 +419,17 @@ options: evictionDay: description: - - Day of the week the entry will become invalid on. + - Day of the week the entry is set to become invalid on. type: str evictionHour: description: - - Hour of day the entry will become invalid on. + - Hour of day the entry is set to become invalid on. type: str evictionMinute: description: - - Minute of day the entry will become invalid on. + - Minute of day the entry is set to become invalid on. type: str maxLifespan: @@ -461,12 +461,12 @@ options: name: description: - - Name of the mapper. If no ID is given, the mapper will be searched by name. + - Name of the mapper. If no ID is given, the mapper is searched by name. type: str parentId: description: - - Unique ID for the parent of this mapper. ID of the user federation will automatically be used if left blank. + - Unique ID for the parent of this mapper. ID of the user federation is automatically used if left blank. type: str providerId: @@ -841,8 +841,8 @@ def main(): module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True, required_one_of=([['id', 'name'], - ['token', 'auth_realm', 'auth_username', 'auth_password']]), - required_together=([['auth_realm', 'auth_username', 'auth_password']]), + ['token', 'auth_realm', 'auth_username', 'auth_password', 'auth_client_id', 'auth_client_secret']]), + required_together=([['auth_username', 'auth_password']]), required_by={'refresh_token': 'auth_realm'}, ) diff --git a/plugins/modules/keycloak_user_rolemapping.py b/plugins/modules/keycloak_user_rolemapping.py index c15bf09410..49d71e2ca9 100644 --- a/plugins/modules/keycloak_user_rolemapping.py +++ b/plugins/modules/keycloak_user_rolemapping.py @@ -21,9 +21,9 @@ description: the scope tailored to your needs and a user having the expected roles. - The names of module options are snake_cased versions of the camelCase ones found in the Keycloak API and its documentation at U(https://www.keycloak.org/docs-api/8.0/rest-api/index.html). - - Attributes are multi-valued in the Keycloak API. All attributes are lists of individual values and will be returned that - way by this module. You may pass single values for attributes when calling the module, and this will be translated into - a list suitable for the API. + - Attributes are multi-valued in the Keycloak API. All attributes are lists of individual values and are returned that way + by this module. You may pass single values for attributes when calling the module, and this is translated into a list + suitable for the API. - When updating a user_rolemapping, where possible provide the role ID to the module. This removes a lookup to the API to translate the name into the role ID. attributes: @@ -38,8 +38,8 @@ options: state: description: - State of the user_rolemapping. - - On V(present), the user_rolemapping will be created if it does not yet exist, or updated with the parameters you provide. - - On V(absent), the user_rolemapping will be removed if it exists. + - On V(present), the user_rolemapping is created if it does not yet exist, or updated with the parameters you provide. + - On V(absent), the user_rolemapping is removed if it exists. default: 'present' type: str choices: @@ -61,14 +61,14 @@ options: type: str description: - ID of the user to be mapped. - - This parameter is not required for updating or deleting the rolemapping but providing it will reduce the number of - API calls required. + - This parameter is not required for updating or deleting the rolemapping but providing it reduces the number of API + calls required. service_account_user_client_id: type: str description: - Client ID of the service-account-user to be mapped. - - This parameter is not required for updating or deleting the rolemapping but providing it will reduce the number of - API calls required. + - This parameter is not required for updating or deleting the rolemapping but providing it reduces the number of API + calls required. client_id: type: str description: @@ -79,8 +79,8 @@ options: type: str description: - ID of the client to be mapped. - - This parameter is not required for updating or deleting the rolemapping but providing it will reduce the number of - API calls required. + - This parameter is not required for updating or deleting the rolemapping but providing it reduces the number of API + calls required. roles: description: - Roles to be mapped to the user. @@ -96,8 +96,8 @@ options: type: str description: - The unique identifier for this role_representation. - - This parameter is not required for updating or deleting a role_representation but providing it will reduce the - number of API calls required. + - This parameter is not required for updating or deleting a role_representation but providing it reduces the number + of API calls required. extends_documentation_fragment: - community.general.keycloak - community.general.keycloak.actiongroup_keycloak @@ -190,7 +190,7 @@ proposed: description: Representation of proposed client role mapping. returned: always type: dict - sample: {clientId: "test"} + sample: {"clientId": "test"} existing: description: @@ -198,7 +198,13 @@ existing: - The sample is truncated. returned: always type: dict - sample: {"adminUrl": "http://www.example.com/admin_url", "attributes": {"request.object.signature.alg": "RS256"}} + sample: + { + "adminUrl": "http://www.example.com/admin_url", + "attributes": { + "request.object.signature.alg": "RS256" + } + } end_state: description: @@ -206,7 +212,13 @@ end_state: - The sample is truncated. returned: on success type: dict - sample: {"adminUrl": "http://www.example.com/admin_url", "attributes": {"request.object.signature.alg": "RS256"}} + sample: + { + "adminUrl": "http://www.example.com/admin_url", + "attributes": { + "request.object.signature.alg": "RS256" + } + } """ from ansible_collections.community.general.plugins.module_utils.identity.keycloak.keycloak import KeycloakAPI, \ @@ -242,9 +254,9 @@ def main(): module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True, - required_one_of=([['token', 'auth_realm', 'auth_username', 'auth_password'], + required_one_of=([['token', 'auth_realm', 'auth_username', 'auth_password', 'auth_client_id', 'auth_client_secret'], ['uid', 'target_username', 'service_account_user_client_id']]), - required_together=([['auth_realm', 'auth_username', 'auth_password']]), + required_together=([['auth_username', 'auth_password']]), required_by={'refresh_token': 'auth_realm'}, ) diff --git a/plugins/modules/keycloak_userprofile.py b/plugins/modules/keycloak_userprofile.py index f637271497..9760a17ecf 100644 --- a/plugins/modules/keycloak_userprofile.py +++ b/plugins/modules/keycloak_userprofile.py @@ -33,9 +33,8 @@ options: state: description: - State of the User Profile provider. - - On V(present), the User Profile provider will be created if it does not yet exist, or updated with the parameters - you provide. - - On V(absent), the User Profile provider will be removed if it exists. + - On V(present), the User Profile provider is created if it does not yet exist, or updated with the parameters you provide. + - On V(absent), the User Profile provider is removed if it exists. default: 'present' type: str choices: @@ -171,7 +170,7 @@ options: group: description: - - Specifies the User Profile group where this attribute will be added. + - Specifies the User Profile group where this attribute is added. type: str permissions: @@ -406,7 +405,6 @@ data: description: The data returned by the Keycloak API. returned: when state is present type: dict - sample: {'...': '...'} """ from ansible_collections.community.general.plugins.module_utils.identity.keycloak.keycloak import KeycloakAPI, camel, \ @@ -456,7 +454,6 @@ def main(): ), config=dict( type='dict', - required=False, options={ 'kc_user_profile_config': dict( type='list', @@ -466,7 +463,6 @@ def main(): 'attributes': dict( type='list', elements='dict', - required=False, options={ 'name': dict(type='str', required=True), 'display_name': dict(type='str', aliases=['displayName'], required=True), @@ -476,17 +472,17 @@ def main(): 'length': dict( type='dict', options={ - 'min': dict(type='int', required=False), + 'min': dict(type='int'), 'max': dict(type='int', required=True) } ), - 'email': dict(type='dict', required=False), - 'username_prohibited_characters': dict(type='dict', aliases=['usernameProhibitedCharacters'], required=False), - 'up_username_not_idn_homograph': dict(type='dict', aliases=['upUsernameNotIdnHomograph'], required=False), - 'person_name_prohibited_characters': dict(type='dict', aliases=['personNameProhibitedCharacters'], required=False), - 'uri': dict(type='dict', required=False), - 'pattern': dict(type='dict', required=False), - 'options': dict(type='dict', required=False) + 'email': dict(type='dict'), + 'username_prohibited_characters': dict(type='dict', aliases=['usernameProhibitedCharacters']), + 'up_username_not_idn_homograph': dict(type='dict', aliases=['upUsernameNotIdnHomograph']), + 'person_name_prohibited_characters': dict(type='dict', aliases=['personNameProhibitedCharacters']), + 'uri': dict(type='dict'), + 'pattern': dict(type='dict'), + 'options': dict(type='dict') } ), 'annotations': dict(type='dict'), @@ -513,15 +509,15 @@ def main(): options={ 'name': dict(type='str', required=True), 'display_header': dict(type='str', aliases=['displayHeader'], required=True), - 'display_description': dict(type='str', aliases=['displayDescription'], required=False), - 'annotations': dict(type='dict', required=False) + 'display_description': dict(type='str', aliases=['displayDescription']), + 'annotations': dict(type='dict') } ), 'unmanaged_attribute_policy': dict( type='str', aliases=['unmanagedAttributePolicy'], choices=['ENABLED', 'ADMIN_EDIT', 'ADMIN_VIEW'], - required=False + ) } ) @@ -533,8 +529,8 @@ def main(): module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True, - required_one_of=([['token', 'auth_realm', 'auth_username', 'auth_password']]), - required_together=([['auth_realm', 'auth_username', 'auth_password']]), + required_one_of=([['token', 'auth_realm', 'auth_username', 'auth_password', 'auth_client_id', 'auth_client_secret']]), + required_together=([['auth_username', 'auth_password']]), required_by={'refresh_token': 'auth_realm'}, ) diff --git a/plugins/modules/keyring.py b/plugins/modules/keyring.py index 3a8cbcae02..eef59dd10a 100644 --- a/plugins/modules/keyring.py +++ b/plugins/modules/keyring.py @@ -206,10 +206,10 @@ def run_module(): username=dict(type="str", required=True), keyring_password=dict(type="str", required=True, no_log=True), user_password=dict( - type="str", required=False, no_log=True, aliases=["password"] + type="str", no_log=True, aliases=["password"] ), state=dict( - type="str", required=False, default="present", choices=["absent", "present"] + type="str", default="present", choices=["absent", "present"] ), ) diff --git a/plugins/modules/kibana_plugin.py b/plugins/modules/kibana_plugin.py index 09703b504c..b975e2dcea 100644 --- a/plugins/modules/kibana_plugin.py +++ b/plugins/modules/kibana_plugin.py @@ -59,11 +59,11 @@ options: version: description: - Version of the plugin to be installed. - - If plugin exists with previous version, plugin will B(not) be updated unless O(force) is set to V(true). + - If the plugin is installed with in a previous version, it is B(not) updated unless O(force=true). type: str force: description: - - Delete and re-install the plugin. Can be useful for plugins update. + - Delete and re-install the plugin. It can be useful for plugins update. type: bool default: false allow_root: @@ -109,14 +109,6 @@ timeout: description: The timeout for plugin download. returned: success type: str -stdout: - description: The command stdout. - returned: success - type: str -stderr: - description: The command stderr. - returned: success - type: str state: description: The state for the managed plugin. returned: success @@ -236,11 +228,11 @@ def main(): argument_spec=dict( name=dict(required=True), state=dict(default="present", choices=list(PACKAGE_STATE_MAP.keys())), - url=dict(default=None), + url=dict(), timeout=dict(default="1m"), plugin_bin=dict(default="/opt/kibana/bin/kibana", type="path"), plugin_dir=dict(default="/opt/kibana/installedPlugins/", type="path"), - version=dict(default=None), + version=dict(), force=dict(default=False, type="bool"), allow_root=dict(default=False, type="bool"), ), diff --git a/plugins/modules/krb_ticket.py b/plugins/modules/krb_ticket.py index e021050c22..3a01944535 100644 --- a/plugins/modules/krb_ticket.py +++ b/plugins/modules/krb_ticket.py @@ -30,7 +30,7 @@ options: principal: description: - The principal name. - - If not set, the user running this module will be used. + - If not set, the user running this module is used. type: str state: description: @@ -50,17 +50,17 @@ options: - Use O(cache_name) as the ticket cache name and location. - If this option is not used, the default cache name and location are used. - The default credentials cache may vary between systems. - - If not set the the value of E(KRB5CCNAME) environment variable will be used instead, its value is used to name the - default ticket cache. + - If not set the the value of E(KRB5CCNAME) environment variable is used instead, its value is used to name the default + ticket cache. type: str lifetime: description: - Requests a ticket with the lifetime, if the O(lifetime) is not specified, the default ticket lifetime is used. - - Specifying a ticket lifetime longer than the maximum ticket lifetime (configured by each site) will not override the + - Specifying a ticket lifetime longer than the maximum ticket lifetime (configured by each site) does not override the configured maximum ticket lifetime. - 'The value for O(lifetime) must be followed by one of the following suffixes: V(s) - seconds, V(m) - minutes, V(h) - hours, V(d) - days.' - - You cannot mix units; a value of V(3h30m) will result in an error. + - You cannot mix units; a value of V(3h30m) results in an error. - See U(https://web.mit.edu/kerberos/krb5-1.12/doc/basic/date_format.html) for reference. type: str start_time: @@ -78,7 +78,7 @@ options: - Requests renewable tickets, with a total lifetime equal to O(renewable). - 'The value for O(renewable) must be followed by one of the following delimiters: V(s) - seconds, V(m) - minutes, V(h) - hours, V(d) - days.' - - You cannot mix units; a value of V(3h30m) will result in an error. + - You cannot mix units; a value of V(3h30m) results in an error. - See U(https://web.mit.edu/kerberos/krb5-1.12/doc/basic/date_format.html) for reference. type: str forwardable: @@ -119,7 +119,7 @@ options: keytab: description: - Requests a ticket, obtained from a key in the local host's keytab. - - If O(keytab_path) is not specified will try to use default client keytab path (C(-i) option). + - If O(keytab_path) is not specified it tries to use default client keytab path (C(-i) option). type: bool keytab_path: description: diff --git a/plugins/modules/launchd.py b/plugins/modules/launchd.py index 0f770f47a5..310e1af9b1 100644 --- a/plugins/modules/launchd.py +++ b/plugins/modules/launchd.py @@ -37,9 +37,9 @@ options: version_added: 10.1.0 state: description: - - V(started)/V(stopped) are idempotent actions that will not run commands unless necessary. - - Launchd does not support V(restarted) nor V(reloaded) natively. These will trigger a stop/start (restarted) or an - unload/load (reloaded). + - V(started)/V(stopped) are idempotent actions that do not run commands unless necessary. + - C(launchd) does not support V(restarted) nor V(reloaded) natively. These states trigger a stop/start (restarted) or + an unload/load (reloaded). - V(restarted) unloads and loads the service before start to ensure that the latest job definition (plist) is used. - V(reloaded) unloads and loads the service to ensure that the latest job definition (plist) is used. Whether a service is started or stopped depends on the content of the definition file. @@ -53,8 +53,8 @@ options: force_stop: description: - Whether the service should not be restarted automatically by launchd. - - Services might have the 'KeepAlive' attribute set to true in a launchd configuration. In case this is set to true, - stopping a service will cause that launchd starts the service again. + - Services might have the C(KeepAlive) attribute set to V(true) in a launchd configuration. In case this is set to V(true), + stopping a service causes that C(launchd) starts the service again. - Set this option to V(true) to let this module change the C(KeepAlive) attribute to V(false). type: bool default: false diff --git a/plugins/modules/layman.py b/plugins/modules/layman.py index b0fab39233..b19428d9f9 100644 --- a/plugins/modules/layman.py +++ b/plugins/modules/layman.py @@ -35,7 +35,7 @@ options: type: str list_url: description: - - An URL of the alternative overlays list that defines the overlay to install. This list will be fetched and saved under + - An URL of the alternative overlays list that defines the overlay to install. This list is fetched and saved under C(${overlay_defs}/${name}.xml), where C(overlay_defs) is read from the Layman's configuration. aliases: [url] type: str @@ -47,7 +47,7 @@ options: type: str validate_certs: description: - - If V(false), SSL certificates will not be validated. This should only be set to V(false) when no other option exists. + - If V(false), SSL certificates are not validated. This should only be set to V(false) when no other option exists. type: bool default: true """ @@ -236,7 +236,7 @@ def main(): name=dict(required=True), list_url=dict(aliases=['url']), state=dict(default="present", choices=['present', 'absent', 'updated']), - validate_certs=dict(required=False, default=True, type='bool'), + validate_certs=dict(default=True, type='bool'), ), supports_check_mode=True ) diff --git a/plugins/modules/ldap_attrs.py b/plugins/modules/ldap_attrs.py index c7ccd42154..592da93a63 100644 --- a/plugins/modules/ldap_attrs.py +++ b/plugins/modules/ldap_attrs.py @@ -43,10 +43,9 @@ options: choices: [present, absent, exact] default: present description: - - The state of the attribute values. If V(present), all given attribute values will be added if they are missing. If - V(absent), all given attribute values will be removed if present. If V(exact), the set of attribute values will be - forced to exactly those provided and no others. If O(state=exact) and the attribute value is empty, all values for - this attribute will be removed. + - The state of the attribute values. If V(present), all given attribute values are added if they are missing. If V(absent), + all given attribute values are removed if present. If V(exact), the set of attribute values is forced to exactly those + provided and no others. If O(state=exact) and the attribute value is empty, all values for this attribute are removed. attributes: required: true type: dict @@ -297,7 +296,7 @@ def main(): module = AnsibleModule( argument_spec=gen_specs( attributes=dict(type='dict', required=True), - ordered=dict(type='bool', default=False, required=False), + ordered=dict(type='bool', default=False), state=dict(type='str', default='present', choices=['absent', 'exact', 'present']), ), supports_check_mode=True, diff --git a/plugins/modules/ldap_inc.py b/plugins/modules/ldap_inc.py index ea6788de66..224027f666 100644 --- a/plugins/modules/ldap_inc.py +++ b/plugins/modules/ldap_inc.py @@ -26,8 +26,8 @@ notes: and the control PostRead. This extension and the control are implemented in OpenLdap but not all directory servers implement them. In this case, the module automatically uses a more classic method based on two phases, first the current value is read then the modify operation remove the old value and add the new one in a single request. If the value has changed - by a concurrent call then the remove action will fail. Then the sequence is retried 3 times before raising an error to - the playbook. In an heavy modification environment, the module does not guarante to be systematically successful. + by a concurrent call then the remove action fails. Then the sequence is retried 3 times before raising an error to the + playbook. In an heavy modification environment, the module does not guarante to be systematically successful. - This only deals with integer attribute of an existing entry. To modify attributes of an entry, see M(community.general.ldap_attrs) or to add or remove whole entries, see M(community.general.ldap_entry). author: @@ -153,7 +153,7 @@ def main(): module = AnsibleModule( argument_spec=gen_specs( attribute=dict(type='str', required=True), - increment=dict(type='int', default=1, required=False), + increment=dict(type='int', default=1), method=dict(type='str', default='auto', choices=['auto', 'rfc4525', 'legacy']), ), supports_check_mode=True, diff --git a/plugins/modules/ldap_search.py b/plugins/modules/ldap_search.py index 155e9859d5..47c4d8d64d 100644 --- a/plugins/modules/ldap_search.py +++ b/plugins/modules/ldap_search.py @@ -64,10 +64,10 @@ options: version_added: 7.1.0 base64_attributes: description: - - If provided, all attribute values returned that are listed in this option will be Base64 encoded. - - If the special value V(*) appears in this list, all attributes will be Base64 encoded. - - All other attribute values will be converted to UTF-8 strings. If they contain binary data, please note that invalid - UTF-8 bytes will be omitted. + - If provided, all attribute values returned that are listed in this option are Base64 encoded. + - If the special value V(*) appears in this list, all attributes are Base64 encoded. + - All other attribute values are converted to UTF-8 strings. If they contain binary data, please note that invalid UTF-8 + bytes are omitted. type: list elements: str version_added: 7.0.0 @@ -91,15 +91,16 @@ EXAMPLES = r""" register: ldap_group_gids """ +# @FIXME RV 'results' is meant to be used when 'loop:' was used with the module. RESULTS = r""" results: description: - - For every entry found, one dictionary will be returned. + - For every entry found, one dictionary is returned. - Every dictionary contains a key C(dn) with the entry's DN as a value. - Every attribute of the entry found is added to the dictionary. If the key has precisely one value, that value is taken directly, otherwise the key's value is a list. - - Note that all values (for single-element lists) and list elements (for multi-valued lists) will be UTF-8 strings. Some - might contain Base64-encoded binary data; which ones is determined by the O(base64_attributes) option. + - Note that all values (for single-element lists) and list elements (for multi-valued lists) are UTF-8 strings. Some might + contain Base64-encoded binary data; which ones is determined by the O(base64_attributes) option. type: list elements: dict """ diff --git a/plugins/modules/librato_annotation.py b/plugins/modules/librato_annotation.py index 35fc810c65..1087cb426c 100644 --- a/plugins/modules/librato_annotation.py +++ b/plugins/modules/librato_annotation.py @@ -13,8 +13,8 @@ DOCUMENTATION = r""" module: librato_annotation short_description: Create an annotation in Librato description: - - Create an annotation event on the given annotation stream :name. If the annotation stream does not exist, it will be created - automatically. + - Create an annotation event on the given annotation stream O(name). If the annotation stream does not exist, it creates + one automatically. author: "Seth Edwards (@Sedward)" requirements: [] extends_documentation_fragment: @@ -39,7 +39,7 @@ options: type: str description: - The annotation stream name. - - If the annotation stream does not exist, it will be created automatically. + - If the annotation stream does not exist, it creates one automatically. required: false title: type: str @@ -160,12 +160,12 @@ def main(): argument_spec=dict( user=dict(required=True), api_key=dict(required=True, no_log=True), - name=dict(required=False), + name=dict(), title=dict(required=True), - source=dict(required=False), - description=dict(required=False), - start_time=dict(required=False, default=None, type='int'), - end_time=dict(required=False, default=None, type='int'), + source=dict(), + description=dict(), + start_time=dict(type='int'), + end_time=dict(type='int'), links=dict(type='list', elements='dict') ) ) diff --git a/plugins/modules/linode.py b/plugins/modules/linode.py index fcfcce4d0a..d2c5714d47 100644 --- a/plugins/modules/linode.py +++ b/plugins/modules/linode.py @@ -47,8 +47,8 @@ options: linode_id: description: - Unique ID of a Linode server. This value is read-only in the sense that if you specify it on creation of a Linode - it will not be used. The Linode API generates these IDs and we can those generated value here to reference a Linode - more specifically. This is useful for idempotence. + it is not used. The Linode API generates these IDs and we can those generated value here to reference a Linode more + specifically. This is useful for idempotency. aliases: [lid] type: int additional_disks: @@ -103,7 +103,7 @@ options: type: int backupwindow: description: - - The time window in which backups will be taken. + - The time window in which backups are taken. type: int plan: description: diff --git a/plugins/modules/linode_v4.py b/plugins/modules/linode_v4.py index b650f7f104..0095cb9002 100644 --- a/plugins/modules/linode_v4.py +++ b/plugins/modules/linode_v4.py @@ -17,7 +17,7 @@ requirements: author: - Luke Murphy (@decentral1se) notes: - - No Linode resizing is currently implemented. This module will, in time, replace the current Linode module which uses deprecated + - No Linode resizing is currently implemented. This module aims to replace the current Linode module which uses deprecated API bindings on the Linode side. extends_documentation_fragment: - community.general.attributes @@ -43,7 +43,7 @@ options: type: str label: description: - - The instance label. This label is used as the main determiner for idempotence for the module and is therefore mandatory. + - The instance label. This label is used as the main determiner for idempotency for the module and is therefore mandatory. type: str required: true group: @@ -53,7 +53,7 @@ options: type: str private_ip: description: - - If V(true), the created Linode will have private networking enabled and assigned a private IPv4 address. + - If V(true), the created Linode instance has private networking enabled and assigned a private IPv4 address. type: bool default: false version_added: 3.0.0 @@ -65,8 +65,8 @@ options: elements: str root_pass: description: - - The password for the root user. If not specified, one will be generated. This generated password will be available - in the task success JSON. + - The password for the root user. If not specified, it generates a new one. This generated password is available in + the task success JSON. type: str authorized_keys: description: @@ -128,45 +128,46 @@ instance: description: The instance description in JSON serialized form. returned: Always. type: dict - sample: { - "root_pass": "foobar", # if auto-generated - "alerts": { - "cpu": 90, - "io": 10000, - "network_in": 10, - "network_out": 10, - "transfer_quota": 80 - }, - "backups": { - "enabled": false, - "schedule": { - "day": null, - "window": null - } - }, - "created": "2018-09-26T08:12:33", - "group": "Foobar Group", - "hypervisor": "kvm", - "id": 10480444, - "image": "linode/centos7", - "ipv4": [ - "130.132.285.233" - ], - "ipv6": "2a82:7e00::h03c:46ff:fe04:5cd2/64", - "label": "lin-foo", - "region": "eu-west", - "specs": { - "disk": 25600, - "memory": 1024, - "transfer": 1000, - "vcpus": 1 - }, - "status": "running", - "tags": [], - "type": "g6-nanode-1", - "updated": "2018-09-26T10:10:14", - "watchdog_enabled": true - } + sample: + { + "root_pass": "foobar", # if auto-generated + "alerts": { + "cpu": 90, + "io": 10000, + "network_in": 10, + "network_out": 10, + "transfer_quota": 80 + }, + "backups": { + "enabled": false, + "schedule": { + "day": null, + "window": null + } + }, + "created": "2018-09-26T08:12:33", + "group": "Foobar Group", + "hypervisor": "kvm", + "id": 10480444, + "image": "linode/centos7", + "ipv4": [ + "130.132.285.233" + ], + "ipv6": "2a82:7e00::h03c:46ff:fe04:5cd2/64", + "label": "lin-foo", + "region": "eu-west", + "specs": { + "disk": 25600, + "memory": 1024, + "transfer": 1000, + "vcpus": 1 + }, + "status": "running", + "tags": [], + "type": "g6-nanode-1", + "updated": "2018-09-26T10:10:14", + "watchdog_enabled": true + } """ import traceback diff --git a/plugins/modules/listen_ports_facts.py b/plugins/modules/listen_ports_facts.py index 9f9eb66481..a33c78be3c 100644 --- a/plugins/modules/listen_ports_facts.py +++ b/plugins/modules/listen_ports_facts.py @@ -20,7 +20,7 @@ requirements: short_description: Gather facts on processes listening on TCP and UDP ports notes: - C(ss) returns all processes for each listen address and port. - - This plugin will return each of them, so multiple entries for the same listen address and port are likely in results. + - This plugin returns each of them, so multiple entries for the same listen address and port are likely in results. extends_documentation_fragment: - community.general.attributes - community.general.attributes.facts @@ -29,7 +29,7 @@ options: command: description: - Override which command to use for fetching listen ports. - - By default module will use first found supported command on the system (in alphanumerical order). + - By default module uses first found supported command on the system (in alphanumerical order). type: str choices: - netstat @@ -397,7 +397,7 @@ def main(): break if bin_path is None: - raise EnvironmentError(msg='Unable to find any of the supported commands in PATH: {0}'.format(", ".join(sorted(commands_map)))) + raise EnvironmentError('Unable to find any of the supported commands in PATH: {0}'.format(", ".join(sorted(commands_map)))) # which ports are listening for connections? args = commands_map[command]['args'] diff --git a/plugins/modules/lldp.py b/plugins/modules/lldp.py index 7f4a820257..018d9fc307 100644 --- a/plugins/modules/lldp.py +++ b/plugins/modules/lldp.py @@ -98,7 +98,7 @@ def gather_lldp(module): def main(): module_args = dict( - multivalues=dict(type='bool', required=False, default=False) + multivalues=dict(type='bool', default=False) ) module = AnsibleModule(module_args) diff --git a/plugins/modules/locale_gen.py b/plugins/modules/locale_gen.py index 23e9d33485..2e1932c204 100644 --- a/plugins/modules/locale_gen.py +++ b/plugins/modules/locale_gen.py @@ -37,10 +37,10 @@ options: choices: [absent, present] default: present notes: - - If C(/etc/locale.gen) exists, the module will assume to be using the B(glibc) mechanism, else if C(/var/lib/locales/supported.d/) - exists it will assume to be using the B(ubuntu_legacy) mechanism, else it will raise an error. - - When using glibc mechanism, it will manage locales by editing C(/etc/locale.gen) and running C(locale-gen). - - When using ubuntu_legacy mechanism, it will manage locales by editing C(/var/lib/locales/supported.d/local) and then running + - If C(/etc/locale.gen) exists, the module assumes to be using the B(glibc) mechanism, else if C(/var/lib/locales/supported.d/) + exists it assumes to be using the B(ubuntu_legacy) mechanism, else it raises an error. + - When using glibc mechanism, it manages locales by editing C(/etc/locale.gen) and running C(locale-gen). + - When using ubuntu_legacy mechanism, it manages locales by editing C(/var/lib/locales/supported.d/local) and then running C(locale-gen). - Please note that the code path that uses ubuntu_legacy mechanism has not been tested for a while, because Ubuntu is already using the glibc mechanism. There is no support for that, given our inability to test it. Therefore, that mechanism is diff --git a/plugins/modules/logentries.py b/plugins/modules/logentries.py index 420f054fac..69e83f5e49 100644 --- a/plugins/modules/logentries.py +++ b/plugins/modules/logentries.py @@ -139,8 +139,8 @@ def main(): argument_spec=dict( path=dict(required=True), state=dict(default="present", choices=["present", "followed", "absent", "unfollowed"]), - name=dict(required=False, default=None, type='str'), - logtype=dict(required=False, default=None, type='str', aliases=['type']) + name=dict(type='str'), + logtype=dict(type='str', aliases=['type']) ), supports_check_mode=True ) diff --git a/plugins/modules/logstash_plugin.py b/plugins/modules/logstash_plugin.py index ba7bdc2cc5..afacf7767f 100644 --- a/plugins/modules/logstash_plugin.py +++ b/plugins/modules/logstash_plugin.py @@ -49,7 +49,7 @@ options: version: type: str description: - - Specify plugin Version of the plugin to install. If plugin exists with previous version, it will NOT be updated. + - Specify version of the plugin to install. If the plugin exists with a previous version, it is B(not) updated. """ EXAMPLES = r""" diff --git a/plugins/modules/lvg.py b/plugins/modules/lvg.py index b16cdd87a2..42d4c9182e 100644 --- a/plugins/modules/lvg.py +++ b/plugins/modules/lvg.py @@ -33,7 +33,7 @@ options: description: - List of comma-separated devices to use as physical devices in this volume group. - Required when creating or resizing volume group. - - The module will take care of running pvcreate if needed. + - The module runs C(pvcreate) if needed. - O(remove_extra_pvs) controls whether or not unspecified physical devices are removed from the volume group. type: list elements: str @@ -123,7 +123,9 @@ EXAMPLES = r""" - name: Create or resize a volume group on top of /dev/sdb1 and /dev/sdc5. community.general.lvg: vg: vg.services - pvs: /dev/sdb1,/dev/sdc5 + pvs: + - /dev/sdb1 + - /dev/sdc5 - name: Remove a volume group with name vg.services community.general.lvg: @@ -146,6 +148,13 @@ EXAMPLES = r""" state: active vg: vg.services +- name: Add new PVs to volume group without removing existing ones + community.general.lvg: + vg: vg.services + pvs: /dev/sdb1,/dev/sdc1 + remove_extra_pvs: false + state: present + - name: Reset a volume group UUID community.general.lvg: state: inactive @@ -156,7 +165,9 @@ EXAMPLES = r""" community.general.lvg: state: inactive vg: vg.services - pvs: /dev/sdb1,/dev/sdc5 + pvs: + - /dev/sdb1 + - /dev/sdc5 reset_vg_uuid: true reset_pv_uuid: true """ diff --git a/plugins/modules/lxc_container.py b/plugins/modules/lxc_container.py index 8d5face301..cbd643efdb 100644 --- a/plugins/modules/lxc_container.py +++ b/plugins/modules/lxc_container.py @@ -129,13 +129,13 @@ options: archive: description: - Create an archive of a container. - - This will create a tarball of the running container. + - This creates a tarball of the running container. type: bool default: false archive_path: description: - Path the save the archived container. - - If the path does not exist the archive method will attempt to create it. + - If the path does not exist the archive method attempts to create it. type: path archive_compression: choices: @@ -157,8 +157,8 @@ options: description: - Define the state of a container. - If you clone a container using O(clone_name) the newly cloned container created in a stopped state. - - The running container will be stopped while the clone operation is happening and upon completion of the clone the - original container state will be restored. + - The running container is stopped while the clone operation is happening and upon completion of the clone the original + container state is restored. type: str default: started container_config: @@ -172,15 +172,15 @@ requirements: - 'python3-lxc # OS Package' notes: - Containers must have a unique name. If you attempt to create a container with a name that already exists in the users - namespace the module will simply return as "unchanged". - - The O(container_command) can be used with any state except V(absent). If used with state V(stopped) the container will - be V(started), the command executed, and then the container V(stopped) again. Likewise if O(state=stopped) and the container - does not exist it will be first created, V(started), the command executed, and then V(stopped). If you use a C(|) in the - variable you can use common script formatting within the variable itself. The O(container_command) option will always - execute as C(bash). When using O(container_command), a log file is created in the C(/tmp/) directory which contains both - C(stdout) and C(stderr) of any command executed. - - If O(archive=true) the system will attempt to create a compressed tarball of the running container. The O(archive) option - supports LVM backed containers and will create a snapshot of the running container when creating the archive. + namespace the module simply returns as "unchanged". + - The O(container_command) can be used with any state except V(absent). If used with state V(stopped) the container is V(started), + the command executed, and then the container V(stopped) again. Likewise if O(state=stopped) and the container does not + exist it is first created, V(started), the command executed, and then V(stopped). If you use a C(|) in the variable you + can use common script formatting within the variable itself. The O(container_command) option always execute as C(bash). + When using O(container_command), a log file is created in the C(/tmp/) directory which contains both C(stdout) and C(stderr) + of any command executed. + - If O(archive=true) the system attempts to create a compressed tarball of the running container. The O(archive) option + supports LVM backed containers and creates a snapshot of the running container when creating the archive. - If your distro does not have a package for C(python3-lxc), which is a requirement for this module, it can be installed from source at U(https://github.com/lxc/python3-lxc) or installed using C(pip install lxc). """ diff --git a/plugins/modules/lxca_cmms.py b/plugins/modules/lxca_cmms.py index 8ece67470b..87b0e2e125 100644 --- a/plugins/modules/lxca_cmms.py +++ b/plugins/modules/lxca_cmms.py @@ -144,8 +144,8 @@ FUNC_DICT = { INPUT_ARG_SPEC = dict( command_options=dict(default='cmms', choices=['cmms', 'cmms_by_uuid', 'cmms_by_chassis_uuid']), - uuid=dict(default=None), - chassis=dict(default=None) + uuid=dict(), + chassis=dict() ) diff --git a/plugins/modules/lxca_nodes.py b/plugins/modules/lxca_nodes.py index f133671114..91d3337b27 100644 --- a/plugins/modules/lxca_nodes.py +++ b/plugins/modules/lxca_nodes.py @@ -175,7 +175,7 @@ INPUT_ARG_SPEC = dict( 'nodes_by_chassis_uuid', 'nodes_status_managed', 'nodes_status_unmanaged']), - uuid=dict(default=None), chassis=dict(default=None) + uuid=dict(), chassis=dict() ) diff --git a/plugins/modules/lxd_container.py b/plugins/modules/lxd_container.py index f347df7492..4abec5acaa 100644 --- a/plugins/modules/lxd_container.py +++ b/plugins/modules/lxd_container.py @@ -101,9 +101,9 @@ options: type: str target: description: - - For cluster deployments. Will attempt to create an instance on a target node. If the instance exists elsewhere in - a cluster, then it will not be replaced or moved. The name should respond to same name of the node you see in C(lxc - cluster list). + - For cluster deployments. It attempts to create an instance on a target node. If the instance exists elsewhere in a + cluster, then it is not replaced nor moved. The name should respond to same name of the node you see in C(lxc cluster + list). type: str required: false version_added: 1.0.0 @@ -134,7 +134,7 @@ options: type: bool wait_for_container: description: - - If set to V(true), the tasks will wait till the task reports a success status when performing container operations. + - If set to V(true), the tasks wait until the task reports a success status when performing container operations. default: false type: bool version_added: 4.4.0 @@ -180,7 +180,7 @@ options: type: str notes: - Instances can be a container or a virtual machine, both of them must have unique name. If you attempt to create an instance - with a name that already existed in the users namespace the module will simply return as "unchanged". + with a name that already existed in the users namespace, the module simply returns as "unchanged". - There are two ways to run commands inside a container or virtual machine, using the command module or using the ansible lxd connection plugin bundled in Ansible >= 2.1, the later requires python to be installed in the instance which can be done with the command module. @@ -262,7 +262,7 @@ EXAMPLES = r""" source: type: image mode: pull - # Provides Ubuntu minimal images + # Provides Ubuntu minimal images server: https://cloud-images.ubuntu.com/minimal/releases/ protocol: simplestreams alias: "22.04" @@ -393,7 +393,12 @@ addresses: description: Mapping from the network device name to a list of IPv4 addresses in the instance. returned: when state is started or restarted type: dict - sample: {"eth0": ["10.155.92.191"]} + sample: + { + "eth0": [ + "10.155.92.191" + ] + } old_state: description: The old state of the instance. returned: when state is started or restarted diff --git a/plugins/modules/lxd_profile.py b/plugins/modules/lxd_profile.py index efdf50ea90..2525889968 100644 --- a/plugins/modules/lxd_profile.py +++ b/plugins/modules/lxd_profile.py @@ -57,7 +57,7 @@ options: new_name: description: - A new name of a profile. - - If this parameter is specified a profile will be renamed to this name. + - If this parameter is specified a profile is renamed to this name. - See U(https://documentation.ubuntu.com/lxd/en/latest/api/#/profiles/profile_post). required: false type: str @@ -113,7 +113,7 @@ options: type: str notes: - Profiles must have a unique name. If you attempt to create a profile with a name that already existed in the users namespace - the module will simply return as "unchanged". + the module simply returns as "unchanged". """ EXAMPLES = r""" diff --git a/plugins/modules/lxd_project.py b/plugins/modules/lxd_project.py index 98068175aa..20804f8b38 100644 --- a/plugins/modules/lxd_project.py +++ b/plugins/modules/lxd_project.py @@ -42,14 +42,14 @@ options: new_name: description: - A new name of a project. - - If this parameter is specified a project will be renamed to this name. + - If this parameter is specified a project is renamed to this name. - See U(https://documentation.ubuntu.com/lxd/en/latest/api/#/projects/project_post). required: false type: str merge_project: description: - Merge the configuration of the present project with the new desired configuration, instead of replacing it. If configuration - is the same after merged, no change will be made. + is the same after merged, no change is made. required: false default: false type: bool @@ -98,7 +98,7 @@ options: type: str notes: - Projects must have a unique name. If you attempt to create a project with a name that already existed in the users namespace - the module will simply return as "unchanged". + the module simply returns as "unchanged". """ EXAMPLES = r""" diff --git a/plugins/modules/macports.py b/plugins/modules/macports.py index 3f02eeb411..c328e45904 100644 --- a/plugins/modules/macports.py +++ b/plugins/modules/macports.py @@ -280,7 +280,7 @@ def main(): selfupdate=dict(aliases=["update_cache", "update_ports"], default=False, type='bool'), state=dict(default="present", choices=["present", "installed", "absent", "removed", "active", "inactive"]), upgrade=dict(default=False, type='bool'), - variant=dict(aliases=["variants"], default=None, type='str') + variant=dict(aliases=["variants"], type='str') ) ) diff --git a/plugins/modules/mail.py b/plugins/modules/mail.py index 03192e5bf8..7c8bdb69b3 100644 --- a/plugins/modules/mail.py +++ b/plugins/modules/mail.py @@ -90,7 +90,7 @@ options: attach: description: - A list of pathnames of files to attach to the message. - - Attached files will have their content-type set to C(application/octet-stream). + - Attached files have their content-type set to C(application/octet-stream). type: list elements: path default: [] @@ -115,12 +115,12 @@ options: default: plain secure: description: - - If V(always), the connection will only send email if the connection is Encrypted. If the server does not accept the - encrypted connection it will fail. - - If V(try), the connection will attempt to setup a secure SSL/TLS session, before trying to send. - - If V(never), the connection will not attempt to setup a secure SSL/TLS session, before sending. - - If V(starttls), the connection will try to upgrade to a secure SSL/TLS connection, before sending. If it is unable - to do so it will fail. + - If V(always), the connection only sends email if the connection is Encrypted. If the server does not accept the encrypted + connection it fails. + - If V(try), the connection attempts to setup a secure SSL/TLS session, before trying to send. + - If V(never), the connection does not attempt to setup a secure SSL/TLS session, before sending. + - If V(starttls), the connection tries to upgrade to a secure SSL/TLS connection, before sending. If it is unable to + do so it fails. type: str choices: [always, never, starttls, try] default: try @@ -137,7 +137,7 @@ options: message_id_domain: description: - The domain name to use for the L(Message-ID header, https://en.wikipedia.org/wiki/Message-ID). - - Note that this is only available on Python 3+. On Python 2, this value will be ignored. + - Note that this is only available on Python 3+. On Python 2, this value is ignored. type: str default: ansible version_added: 8.2.0 @@ -242,7 +242,7 @@ def main(): password=dict(type='str', no_log=True), host=dict(type='str', default='localhost'), port=dict(type='int', default=25), - ehlohost=dict(type='str', default=None), + ehlohost=dict(type='str'), sender=dict(type='str', default='root', aliases=['from']), to=dict(type='list', elements='str', default=['root'], aliases=['recipients']), cc=dict(type='list', elements='str', default=[]), diff --git a/plugins/modules/make.py b/plugins/modules/make.py index a574560f7f..57ee525db5 100644 --- a/plugins/modules/make.py +++ b/plugins/modules/make.py @@ -48,7 +48,7 @@ options: params: description: - Any extra parameters to pass to make. - - If the value is empty, only the key will be used. For example, V(FOO:) will produce V(FOO), not V(FOO=). + - If the value is empty, only the key is used. For example, V(FOO:) produces V(FOO), not V(FOO=). type: dict target: description: diff --git a/plugins/modules/manageiq_alerts.py b/plugins/modules/manageiq_alerts.py index 87fafcf10b..d1b3fdba69 100644 --- a/plugins/modules/manageiq_alerts.py +++ b/plugins/modules/manageiq_alerts.py @@ -300,7 +300,7 @@ def main(): expression=dict(type='dict'), options=dict(type='dict'), enabled=dict(type='bool'), - state=dict(required=False, default='present', + state=dict(default='present', choices=['present', 'absent']), ) # add the manageiq connection arguments to the arguments diff --git a/plugins/modules/manageiq_group.py b/plugins/modules/manageiq_group.py index 9781ebfc98..68170ea733 100644 --- a/plugins/modules/manageiq_group.py +++ b/plugins/modules/manageiq_group.py @@ -75,8 +75,8 @@ options: managed_filters_merge_mode: type: str description: - - In merge mode existing categories are kept or updated, new categories are added. - - In replace mode all categories will be replaced with the supplied O(managed_filters). + - In V(merge) mode existing categories are kept or updated, new categories are added. + - In V(replace) mode all categories are replaced with the supplied O(managed_filters). choices: [merge, replace] default: replace belongsto_filters: @@ -570,14 +570,14 @@ def main(): argument_spec = dict( description=dict(required=True, type='str'), state=dict(choices=['absent', 'present'], default='present'), - role_id=dict(required=False, type='int'), - role=dict(required=False, type='str'), - tenant_id=dict(required=False, type='int'), - tenant=dict(required=False, type='str'), - managed_filters=dict(required=False, type='dict'), - managed_filters_merge_mode=dict(required=False, choices=['merge', 'replace'], default='replace'), - belongsto_filters=dict(required=False, type='list', elements='str'), - belongsto_filters_merge_mode=dict(required=False, choices=['merge', 'replace'], default='replace'), + role_id=dict(type='int'), + role=dict(type='str'), + tenant_id=dict(type='int'), + tenant=dict(type='str'), + managed_filters=dict(type='dict'), + managed_filters_merge_mode=dict(choices=['merge', 'replace'], default='replace'), + belongsto_filters=dict(type='list', elements='str'), + belongsto_filters_merge_mode=dict(choices=['merge', 'replace'], default='replace'), ) # add the manageiq connection arguments to the arguments argument_spec.update(manageiq_argument_spec()) diff --git a/plugins/modules/manageiq_policies.py b/plugins/modules/manageiq_policies.py index 4256f89d07..247e2dc94c 100644 --- a/plugins/modules/manageiq_policies.py +++ b/plugins/modules/manageiq_policies.py @@ -147,7 +147,7 @@ def main(): resource_name=dict(type='str'), resource_type=dict(required=True, type='str', choices=list(manageiq_entities().keys())), - state=dict(required=False, type='str', + state=dict(type='str', choices=['present', 'absent'], default='present'), ) # add the manageiq connection arguments to the arguments diff --git a/plugins/modules/manageiq_policies_info.py b/plugins/modules/manageiq_policies_info.py index c7c20418b2..2db694f11c 100644 --- a/plugins/modules/manageiq_policies_info.py +++ b/plugins/modules/manageiq_policies_info.py @@ -96,8 +96,8 @@ from ansible_collections.community.general.plugins.module_utils.manageiq import def main(): argument_spec = dict( - resource_id=dict(required=False, type='int'), - resource_name=dict(required=False, type='str'), + resource_id=dict(type='int'), + resource_name=dict(type='str'), resource_type=dict(required=True, type='str', choices=list(manageiq_entities().keys())), ) diff --git a/plugins/modules/manageiq_provider.py b/plugins/modules/manageiq_provider.py index 98677c7beb..334555c29a 100644 --- a/plugins/modules/manageiq_provider.py +++ b/plugins/modules/manageiq_provider.py @@ -31,7 +31,7 @@ options: description: - V(absent) - provider should not exist, - V(present) - provider should be present, - - V(refresh) - provider will be refreshed. + - V(refresh) - provider is refreshed. choices: ['absent', 'present', 'refresh'] default: 'present' name: @@ -44,7 +44,7 @@ options: choices: ['Openshift', 'Amazon', 'oVirt', 'VMware', 'Azure', 'Director', 'OpenStack', 'GCE'] zone: type: str - description: The ManageIQ zone name that will manage the provider. + description: The ManageIQ zone name that manages the provider. default: 'default' provider_region: type: str @@ -63,7 +63,7 @@ options: description: Google Compute Engine Project ID. azure_tenant_id: type: str - description: Tenant ID. defaults to None. + description: Tenant ID. Defaults to V(null). aliases: [keystone_v3_domain_id] tenant_mapping_enabled: type: bool @@ -190,25 +190,25 @@ options: description: The provider's API port. userid: type: str - description: Provider's API endpoint authentication userid. defaults to None. + description: Provider's API endpoint authentication userid. Defaults to V(null). password: type: str - description: Provider's API endpoint authentication password. defaults to None. + description: Provider's API endpoint authentication password. Defaults to V(null). auth_key: type: str - description: Provider's API endpoint authentication bearer token. defaults to None. + description: Provider's API endpoint authentication bearer token. Defaults to V(null). validate_certs: type: bool - description: Whether SSL certificates should be verified for HTTPS requests (deprecated). defaults to True. + description: Whether SSL certificates should be verified for HTTPS requests (deprecated). Defaults to V(true). default: true aliases: [verify_ssl] security_protocol: type: str choices: ['ssl-with-validation', 'ssl-with-validation-custom-ca', 'ssl-without-validation', 'non-ssl'] - description: How SSL certificates should be used for HTTPS requests. defaults to None. + description: How SSL certificates should be used for HTTPS requests. Defaults to V(null). certificate_authority: type: str - description: The CA bundle string with custom certificates. defaults to None. + description: The CA bundle string with custom certificates. Defaults to V(null). path: type: str description: diff --git a/plugins/modules/manageiq_tags.py b/plugins/modules/manageiq_tags.py index 6833b70355..efd135393d 100644 --- a/plugins/modules/manageiq_tags.py +++ b/plugins/modules/manageiq_tags.py @@ -63,11 +63,11 @@ options: resource_name: type: str description: - - The name of the resource at which tags will be controlled. + - The name of the resource at which tags are be controlled. - Must be specified if O(resource_id) is not set. Both options are mutually exclusive. resource_id: description: - - The ID of the resource at which tags will be controlled. + - The ID of the resource at which tags are controlled. - Must be specified if O(resource_name) is not set. Both options are mutually exclusive. type: int version_added: 2.2.0 @@ -138,7 +138,7 @@ def main(): resource_name=dict(type='str'), resource_type=dict(required=True, type='str', choices=list(manageiq_entities().keys())), - state=dict(required=False, type='str', + state=dict(type='str', choices=['present', 'absent'], default='present'), ) # add the manageiq connection arguments to the arguments diff --git a/plugins/modules/manageiq_tags_info.py b/plugins/modules/manageiq_tags_info.py index c5b6fcd451..2a742f69c5 100644 --- a/plugins/modules/manageiq_tags_info.py +++ b/plugins/modules/manageiq_tags_info.py @@ -45,11 +45,11 @@ options: resource_name: type: str description: - - The name of the resource at which tags will be controlled. + - The name of the resource at which tags are controlled. - Must be specified if O(resource_id) is not set. Both options are mutually exclusive. resource_id: description: - - The ID of the resource at which tags will be controlled. + - The ID of the resource at which tags are controlled. - Must be specified if O(resource_name) is not set. Both options are mutually exclusive. type: int """ diff --git a/plugins/modules/manageiq_tenant.py b/plugins/modules/manageiq_tenant.py index deb2fc452d..fda97509ce 100644 --- a/plugins/modules/manageiq_tenant.py +++ b/plugins/modules/manageiq_tenant.py @@ -482,8 +482,8 @@ def main(): argument_spec = dict( name=dict(required=True, type='str'), description=dict(required=True, type='str'), - parent_id=dict(required=False, type='int'), - parent=dict(required=False, type='str'), + parent_id=dict(type='int'), + parent=dict(type='str'), state=dict(choices=['absent', 'present'], default='present'), quotas=dict(type='dict', default={}) ) diff --git a/plugins/modules/manageiq_user.py b/plugins/modules/manageiq_user.py index a4d5c21dfc..475086c823 100644 --- a/plugins/modules/manageiq_user.py +++ b/plugins/modules/manageiq_user.py @@ -59,8 +59,8 @@ options: default: always choices: ['always', 'on_create'] description: - - V(always) will update passwords unconditionally. - - V(on_create) will only set the password for a newly created user. + - V(always) updates passwords unconditionally. + - V(on_create) only sets the password for a newly created user. """ EXAMPLES = r""" diff --git a/plugins/modules/matrix.py b/plugins/modules/matrix.py index 186c57dd31..fb6c797bff 100644 --- a/plugins/modules/matrix.py +++ b/plugins/modules/matrix.py @@ -13,7 +13,7 @@ author: "Jan Christian Grünhage (@jcgruenhage)" module: matrix short_description: Send notifications to matrix description: - - This module sends html formatted notifications to matrix rooms. + - This module sends HTML formatted notifications to matrix rooms. extends_documentation_fragment: - community.general.attributes attributes: @@ -99,9 +99,9 @@ def run_module(): msg_html=dict(type='str', required=True), room_id=dict(type='str', required=True), hs_url=dict(type='str', required=True), - token=dict(type='str', required=False, no_log=True), - user_id=dict(type='str', required=False), - password=dict(type='str', required=False, no_log=True), + token=dict(type='str', no_log=True), + user_id=dict(type='str'), + password=dict(type='str', no_log=True), ) result = dict( diff --git a/plugins/modules/mattermost.py b/plugins/modules/mattermost.py index ed046e6481..4cb32c1f3b 100644 --- a/plugins/modules/mattermost.py +++ b/plugins/modules/mattermost.py @@ -38,7 +38,7 @@ options: type: str description: - Mattermost webhook API key. Log into your Mattermost site, go to Menu -> Integration -> Incoming Webhook -> Add Incoming - Webhook. This will give you full URL. O(api_key) is the last part. U(http://mattermost.example.com/hooks/API_KEY). + Webhook. This gives you a full URL. O(api_key) is the last part. U(http://mattermost.example.com/hooks/API_KEY). required: true text: type: str @@ -75,8 +75,8 @@ options: version_added: 10.0.0 validate_certs: description: - - If V(false), SSL certificates will not be validated. This should only be used on personally controlled sites using - self-signed certificates. + - If V(false), SSL certificates are not validated. This should only be used on personally controlled sites using self-signed + certificates. default: true type: bool """ @@ -137,10 +137,10 @@ def main(): url=dict(type='str', required=True), api_key=dict(type='str', required=True, no_log=True), text=dict(type='str'), - channel=dict(type='str', default=None), + channel=dict(type='str'), username=dict(type='str', default='Ansible'), icon_url=dict(type='str', default='https://docs.ansible.com/favicon.ico'), - priority=dict(type='str', default=None, choices=['important', 'urgent']), + priority=dict(type='str', choices=['important', 'urgent']), validate_certs=dict(default=True, type='bool'), attachments=dict(type='list', elements='dict'), ), diff --git a/plugins/modules/maven_artifact.py b/plugins/modules/maven_artifact.py index fb294797f0..af3be70f39 100644 --- a/plugins/modules/maven_artifact.py +++ b/plugins/modules/maven_artifact.py @@ -16,8 +16,7 @@ module: maven_artifact short_description: Downloads an Artifact from a Maven Repository description: - Downloads an artifact from a maven repository given the maven coordinates provided to the module. - - Can retrieve snapshots or release versions of the artifact and will resolve the latest available version if one is not - available. + - Can retrieve snapshots or release versions of the artifact and resolve the latest available version if one is not available. author: "Chris Schmidt (@chrisisbeef)" requirements: - lxml @@ -85,8 +84,8 @@ options: type: dict force_basic_auth: description: - - C(httplib2), the library used by the URI module only sends authentication information when a webservice responds to an - initial request with a 401 status. Since some basic auth services do not properly send a 401, logins will fail. This + - C(httplib2), the library used by the URI module only sends authentication information when a webservice responds to + an initial request with a 401 status. Since some basic auth services do not properly send a 401, logins fail. This option forces the sending of the Basic authentication header upon initial request. default: false type: bool @@ -110,7 +109,7 @@ options: default: 10 validate_certs: description: - - If V(false), SSL certificates will not be validated. This should only be set to V(false) when no other option exists. + - If V(false), SSL certificates are not validated. This should only be set to V(false) when no other option exists. type: bool default: true client_cert: @@ -135,13 +134,13 @@ options: verify_checksum: type: str description: - - If V(never), the MD5/SHA1 checksum will never be downloaded and verified. - - If V(download), the MD5/SHA1 checksum will be downloaded and verified only after artifact download. This is the default. - - If V(change), the MD5/SHA1 checksum will be downloaded and verified if the destination already exist, to verify if - they are identical. This was the behaviour before 2.6. Since it downloads the checksum before (maybe) downloading - the artifact, and since some repository software, when acting as a proxy/cache, return a 404 error if the artifact - has not been cached yet, it may fail unexpectedly. If you still need it, you should consider using V(always) instead - - if you deal with a checksum, it is better to use it to verify integrity after download. + - If V(never), the MD5/SHA1 checksum is never downloaded and verified. + - If V(download), the MD5/SHA1 checksum is downloaded and verified only after artifact download. This is the default. + - If V(change), the MD5/SHA1 checksum is downloaded and verified if the destination already exist, to verify if they + are identical. This was the behaviour before 2.6. Since it downloads the checksum before (maybe) downloading the artifact, + and since some repository software, when acting as a proxy/cache, return a 404 error if the artifact has not been + cached yet, it may fail unexpectedly. If you still need it, you should consider using V(always) instead - if you deal + with a checksum, it is better to use it to verify integrity after download. - V(always) combines V(download) and V(change). required: false default: 'download' @@ -149,9 +148,9 @@ options: checksum_alg: type: str description: - - If V(md5), checksums will use the MD5 algorithm. This is the default. - - If V(sha1), checksums will use the SHA1 algorithm. This can be used on systems configured to use FIPS-compliant algorithms, - since MD5 will be blocked on such systems. + - If V(md5), checksums use the MD5 algorithm. This is the default. + - If V(sha1), checksums use the SHA1 algorithm. This can be used on systems configured to use FIPS-compliant algorithms, + since MD5 is blocked on such systems. default: 'md5' choices: ['md5', 'sha1'] version_added: 3.2.0 @@ -622,25 +621,25 @@ def main(): argument_spec=dict( group_id=dict(required=True), artifact_id=dict(required=True), - version=dict(default=None), - version_by_spec=dict(default=None), + version=dict(), + version_by_spec=dict(), classifier=dict(default=''), extension=dict(default='jar'), repository_url=dict(default='https://repo1.maven.org/maven2'), - username=dict(default=None, aliases=['aws_secret_key']), - password=dict(default=None, no_log=True, aliases=['aws_secret_access_key']), + username=dict(aliases=['aws_secret_key']), + password=dict(no_log=True, aliases=['aws_secret_access_key']), headers=dict(type='dict'), force_basic_auth=dict(default=False, type='bool'), state=dict(default="present", choices=["present", "absent"]), # TODO - Implement a "latest" state timeout=dict(default=10, type='int'), dest=dict(type="path", required=True), - validate_certs=dict(required=False, default=True, type='bool'), - client_cert=dict(type="path", required=False), - client_key=dict(type="path", required=False), - keep_name=dict(required=False, default=False, type='bool'), - verify_checksum=dict(required=False, default='download', choices=['never', 'download', 'change', 'always']), - checksum_alg=dict(required=False, default='md5', choices=['md5', 'sha1']), - unredirected_headers=dict(type='list', elements='str', required=False), + validate_certs=dict(default=True, type='bool'), + client_cert=dict(type="path"), + client_key=dict(type="path"), + keep_name=dict(default=False, type='bool'), + verify_checksum=dict(default='download', choices=['never', 'download', 'change', 'always']), + checksum_alg=dict(default='md5', choices=['md5', 'sha1']), + unredirected_headers=dict(type='list', elements='str'), directory_mode=dict(type='str'), ), add_file_common_args=True, diff --git a/plugins/modules/memset_dns_reload.py b/plugins/modules/memset_dns_reload.py index 7781abbf76..cb8ebe9191 100644 --- a/plugins/modules/memset_dns_reload.py +++ b/plugins/modules/memset_dns_reload.py @@ -36,9 +36,9 @@ options: default: false type: bool description: - - Boolean value, if set will poll the reload job's status and return when the job has completed (unless the 30 second - timeout is reached first). If the timeout is reached then the task will not be marked as failed, but stderr will indicate - that the polling failed. + - If V(true), it polls the reload job's status and return when the job has completed (unless the 30 second timeout is + reached first). If the timeout is reached then the task does not return as failed, but stderr indicates that the polling + failed. """ EXAMPLES = r""" @@ -167,7 +167,7 @@ def main(): module = AnsibleModule( argument_spec=dict( api_key=dict(required=True, type='str', no_log=True), - poll=dict(required=False, default=False, type='bool') + poll=dict(default=False, type='bool') ), supports_check_mode=False ) diff --git a/plugins/modules/memset_server_info.py b/plugins/modules/memset_server_info.py index df7ecb712f..59d395a161 100644 --- a/plugins/modules/memset_server_info.py +++ b/plugins/modules/memset_server_info.py @@ -148,7 +148,7 @@ memset_api: description: The network zone(s) the server is in. returned: always type: list - sample: ['reading'] + sample: ["reading"] nickname: description: Customer-set nickname for the server. returned: always diff --git a/plugins/modules/memset_zone.py b/plugins/modules/memset_zone.py index 2c80503bec..553328909d 100644 --- a/plugins/modules/memset_zone.py +++ b/plugins/modules/memset_zone.py @@ -289,8 +289,8 @@ def main(): state=dict(required=True, choices=['present', 'absent'], type='str'), api_key=dict(required=True, type='str', no_log=True), name=dict(required=True, aliases=['nickname'], type='str'), - ttl=dict(required=False, default=0, choices=[0, 300, 600, 900, 1800, 3600, 7200, 10800, 21600, 43200, 86400], type='int'), - force=dict(required=False, default=False, type='bool') + ttl=dict(default=0, choices=[0, 300, 600, 900, 1800, 3600, 7200, 10800, 21600, 43200, 86400], type='int'), + force=dict(default=False, type='bool') ), supports_check_mode=True ) diff --git a/plugins/modules/memset_zone_record.py b/plugins/modules/memset_zone_record.py index 7c16ee31eb..fd87c35fa0 100644 --- a/plugins/modules/memset_zone_record.py +++ b/plugins/modules/memset_zone_record.py @@ -356,15 +356,15 @@ def main(): global module module = AnsibleModule( argument_spec=dict( - state=dict(required=False, default='present', choices=['present', 'absent'], type='str'), + state=dict(default='present', choices=['present', 'absent'], type='str'), api_key=dict(required=True, type='str', no_log=True), zone=dict(required=True, type='str'), type=dict(required=True, choices=['A', 'AAAA', 'CNAME', 'MX', 'NS', 'SRV', 'TXT'], type='str'), address=dict(required=True, aliases=['ip', 'data'], type='str'), - record=dict(required=False, default='', type='str'), - ttl=dict(required=False, default=0, choices=[0, 300, 600, 900, 1800, 3600, 7200, 10800, 21600, 43200, 86400], type='int'), - priority=dict(required=False, default=0, type='int'), - relative=dict(required=False, default=False, type='bool') + record=dict(default='', type='str'), + ttl=dict(default=0, choices=[0, 300, 600, 900, 1800, 3600, 7200, 10800, 21600, 43200, 86400], type='int'), + priority=dict(default=0, type='int'), + relative=dict(default=False, type='bool') ), supports_check_mode=True ) diff --git a/plugins/modules/mksysb.py b/plugins/modules/mksysb.py index 3b6d322f23..7e188ec844 100644 --- a/plugins/modules/mksysb.py +++ b/plugins/modules/mksysb.py @@ -77,7 +77,7 @@ options: storage_path: type: str description: - - Storage path where the mksysb will stored. + - Storage path where the mksysb backup is stored. required: true use_snapshot: description: @@ -96,10 +96,6 @@ EXAMPLES = r""" """ RETURN = r""" -changed: - description: Return changed for mksysb actions as true or false. - returned: always - type: bool msg: description: Return message regarding the action. returned: always diff --git a/plugins/modules/modprobe.py b/plugins/modules/modprobe.py index cff77e9558..d5bb6fddbb 100644 --- a/plugins/modules/modprobe.py +++ b/plugins/modules/modprobe.py @@ -50,11 +50,11 @@ options: - Persistency between reboots for configured module. - This option creates files in C(/etc/modules-load.d/) and C(/etc/modprobe.d/) that make your module configuration persistent during reboots. - - If V(present), adds module name to C(/etc/modules-load.d/) and params to C(/etc/modprobe.d/) so the module will be - loaded on next reboot. - - If V(absent), will comment out module name from C(/etc/modules-load.d/) and comment out params from C(/etc/modprobe.d/) - so the module will not be loaded on next reboot. - - If V(disabled), will not touch anything and leave C(/etc/modules-load.d/) and C(/etc/modprobe.d/) as it is. + - If V(present), adds module name to C(/etc/modules-load.d/) and params to C(/etc/modprobe.d/) so the module is loaded + on next reboot. + - If V(absent), comments out module name from C(/etc/modules-load.d/) and comments out params from C(/etc/modprobe.d/) + so the module is not loaded on next reboot. + - If V(disabled), does not touch anything and leaves C(/etc/modules-load.d/) and C(/etc/modprobe.d/) as it is. - Note that it is usually a better idea to rely on the automatic module loading by PCI IDs, USB IDs, DMI IDs or similar triggers encoded in the kernel modules themselves instead of configuration like this. - In fact, most modern kernel modules are prepared for automatic loading already. diff --git a/plugins/modules/monit.py b/plugins/modules/monit.py index 65b6c606e9..a10967264c 100644 --- a/plugins/modules/monit.py +++ b/plugins/modules/monit.py @@ -35,8 +35,8 @@ options: type: str timeout: description: - - If there are pending actions for the service monitored by monit, then Ansible will check for up to this many seconds - to verify the requested action has been performed. Ansible will sleep for five seconds between each check. + - If there are pending actions for the service monitored by monit, then it checks for up to this many seconds to verify + the requested action has been performed. The module sleeps for five seconds between each check. default: 300 type: int author: diff --git a/plugins/modules/mqtt.py b/plugins/modules/mqtt.py index 9c610d02c7..b35a257da7 100644 --- a/plugins/modules/mqtt.py +++ b/plugins/modules/mqtt.py @@ -44,7 +44,7 @@ options: type: str description: - MQTT client identifier. - - If not specified, a value C(hostname + pid) will be used. + - If not specified, it uses a value C(hostname + pid). topic: type: str description: @@ -72,22 +72,22 @@ options: type: path description: - The path to the Certificate Authority certificate files that are to be treated as trusted by this client. If this - is the only option given then the client will operate in a similar manner to a web browser. That is to say it will - require the broker to have a certificate signed by the Certificate Authorities in ca_certs and will communicate using - TLS v1, but will not attempt any form of authentication. This provides basic network encryption but may not be sufficient + is the only option given then the client operates in a similar manner to a web browser. That is to say it requires + the broker to have a certificate signed by the Certificate Authorities in ca_certs and communicates using TLS v1, + but does not attempt any form of authentication. This provides basic network encryption but may not be sufficient depending on how the broker is configured. aliases: [ca_certs] client_cert: type: path description: - - The path pointing to the PEM encoded client certificate. If this is not None it will be used as client information - for TLS based authentication. Support for this feature is broker dependent. + - The path pointing to the PEM encoded client certificate. If this is set it is used as client information for TLS based + authentication. Support for this feature is broker dependent. aliases: [certfile] client_key: type: path description: - - The path pointing to the PEM encoded client private key. If this is not None it will be used as client information - for TLS based authentication. Support for this feature is broker dependent. + - The path pointing to the PEM encoded client private key. If this is set it is used as client information for TLS based + authentication. Support for this feature is broker dependent. aliases: [keyfile] tls_version: description: @@ -162,15 +162,15 @@ def main(): port=dict(default=1883, type='int'), topic=dict(required=True), payload=dict(required=True), - client_id=dict(default=None), + client_id=dict(), qos=dict(default="0", choices=["0", "1", "2"]), retain=dict(default=False, type='bool'), - username=dict(default=None), - password=dict(default=None, no_log=True), - ca_cert=dict(default=None, type='path', aliases=['ca_certs']), - client_cert=dict(default=None, type='path', aliases=['certfile']), - client_key=dict(default=None, type='path', aliases=['keyfile']), - tls_version=dict(default=None, choices=['tlsv1.1', 'tlsv1.2']) + username=dict(), + password=dict(no_log=True), + ca_cert=dict(type='path', aliases=['ca_certs']), + client_cert=dict(type='path', aliases=['certfile']), + client_key=dict(type='path', aliases=['keyfile']), + tls_version=dict(choices=['tlsv1.1', 'tlsv1.2']) ), supports_check_mode=True ) diff --git a/plugins/modules/mssql_db.py b/plugins/modules/mssql_db.py index e1fc222e71..8a15bfe699 100644 --- a/plugins/modules/mssql_db.py +++ b/plugins/modules/mssql_db.py @@ -158,7 +158,7 @@ def main(): login_password=dict(default='', no_log=True), login_host=dict(required=True), login_port=dict(default='1433'), - target=dict(default=None), + target=dict(), autocommit=dict(type='bool', default=False), state=dict( default='present', choices=['present', 'absent', 'import']) diff --git a/plugins/modules/mssql_script.py b/plugins/modules/mssql_script.py index 872b2ee13d..37bd0853d0 100644 --- a/plugins/modules/mssql_script.py +++ b/plugins/modules/mssql_script.py @@ -23,7 +23,7 @@ attributes: check_mode: support: partial details: - - The script will not be executed in check mode. + - The script is not be executed in check mode. diff_mode: support: none @@ -64,8 +64,8 @@ options: version_added: 8.4.0 output: description: - - With V(default) each row will be returned as a list of values. See RV(query_results). - - Output format V(dict) will return dictionary with the column names as keys. See RV(query_results_dict). + - With V(default) each row is returned as a list of values. See RV(query_results). + - Output format V(dict) returns dictionary with the column names as keys. See RV(query_results_dict). - V(dict) requires named columns to be returned by each query otherwise an error is thrown. choices: ["dict", "default"] default: 'default' @@ -170,12 +170,33 @@ query_results: type: list elements: list returned: success and O(output=default) - sample: [[[["Batch 0 - Select 0"]], [["Batch 0 - Select 1"]]], [[["Batch 1 - Select 0"]]]] + sample: + [ + [ + [ + [ + "Batch 0 - Select 0" + ] + ], + [ + [ + "Batch 0 - Select 1" + ] + ] + ], + [ + [ + [ + "Batch 1 - Select 0" + ] + ] + ] + ] contains: queries: description: - List of result sets of each query. - - If a query returns no results, the results of this and all the following queries will not be included in the output. + - If a query returns no results, the results of this and all the following queries are not included in the output. - Use the V(GO) keyword in O(script) to separate queries. type: list elements: list @@ -197,12 +218,33 @@ query_results_dict: type: list elements: list returned: success and O(output=dict) - sample: [[[["Batch 0 - Select 0"]], [["Batch 0 - Select 1"]]], [[["Batch 1 - Select 0"]]]] + sample: + [ + [ + [ + [ + "Batch 0 - Select 0" + ] + ], + [ + [ + "Batch 0 - Select 1" + ] + ] + ], + [ + [ + [ + "Batch 1 - Select 0" + ] + ] + ] + ] contains: queries: description: - List of result sets of each query. - - If a query returns no results, the results of this and all the following queries will not be included in the output. + - If a query returns no results, the results of this and all the following queries are not included in the output. Use V(GO) keyword to separate queries. type: list elements: list @@ -240,7 +282,7 @@ def clean_output(o): def run_module(): module_args = dict( - name=dict(required=False, aliases=['db'], default=''), + name=dict(aliases=['db'], default=''), login_user=dict(), login_password=dict(no_log=True), login_host=dict(required=True), diff --git a/plugins/modules/nagios.py b/plugins/modules/nagios.py index b3fb65bc63..830a805f87 100644 --- a/plugins/modules/nagios.py +++ b/plugins/modules/nagios.py @@ -22,11 +22,6 @@ description: - The C(nagios) module is not idempotent. - All actions require the O(host) parameter to be given explicitly. In playbooks you can use the C({{inventory_hostname}}) variable to refer to the host the playbook is currently running on. - - You can specify multiple services at once by separating them with commas, for example O(services=httpd,nfs,puppet). - - When specifying what service to handle there is a special service value, O(host), which will handle alerts/downtime/acknowledge - for the I(host itself), for example O(services=host). This keyword may not be given with other services at the same time. - B(Setting alerts/downtime/acknowledge for a host does not affect alerts/downtime/acknowledge for any of the services running - on it.) To schedule downtime for all services on particular host use keyword "all", for example O(services=all). extends_documentation_fragment: - community.general.attributes attributes: @@ -88,6 +83,12 @@ options: description: - What to manage downtime/alerts for. Separate multiple services with commas. - 'B(Required) option when O(action) is one of: V(downtime), V(acknowledge), V(forced_check), V(enable_alerts), V(disable_alerts).' + - You can specify multiple services at once by separating them with commas, for example O(services=httpd,nfs,puppet). + - When specifying what O(services) to handle there is a special service value, V(host), which handles alerts/downtime/acknowledge + for the I(host itself), for example O(services=host). This keyword may not be given with other services at the same + time. B(Setting alerts/downtime/acknowledge for a host does not affect alerts/downtime/acknowledge for any of the + services running on it.) To schedule downtime for all O(services) on particular host use keyword V(all), for example + O(services=all). aliases: ["service"] type: str servicegroup: @@ -97,8 +98,8 @@ options: type: str command: description: - - The raw command to send to nagios, which should not include the submitted time header or the line-feed. - - B(Required) option when using the V(command) O(action). + - The raw command to send to Nagios, which should not include the submitted time header or the line-feed. + - B(Required) option when O(action=command). type: str author: "Tim Bielawa (@tbielawa)" diff --git a/plugins/modules/netcup_dns.py b/plugins/modules/netcup_dns.py index 900eb01e0d..c48e0a2fb2 100644 --- a/plugins/modules/netcup_dns.py +++ b/plugins/modules/netcup_dns.py @@ -68,7 +68,7 @@ options: default: false description: - Whether the record should be the only one for that record type and record name. Only use with O(state=present). - - This will delete all other records with the same record name and type. + - This deletes all other records with the same record name and type. priority: description: - Record priority. Required for O(type=MX). @@ -213,15 +213,15 @@ def main(): customer_id=dict(required=True, type='int'), domain=dict(required=True), - record=dict(required=False, default='@', aliases=['name']), + record=dict(default='@', aliases=['name']), type=dict(required=True, choices=['A', 'AAAA', 'MX', 'CNAME', 'CAA', 'SRV', 'TXT', 'TLSA', 'NS', 'DS', 'OPENPGPKEY', 'SMIMEA', 'SSHFP']), value=dict(required=True), - priority=dict(required=False, type='int'), - solo=dict(required=False, type='bool', default=False), - state=dict(required=False, choices=['present', 'absent'], default='present'), - timeout=dict(required=False, type='int', default=5), + priority=dict(type='int'), + solo=dict(type='bool', default=False), + state=dict(choices=['present', 'absent'], default='present'), + timeout=dict(type='int', default=5), ), supports_check_mode=True diff --git a/plugins/modules/newrelic_deployment.py b/plugins/modules/newrelic_deployment.py index b9ce8af586..af58402a44 100644 --- a/plugins/modules/newrelic_deployment.py +++ b/plugins/modules/newrelic_deployment.py @@ -62,8 +62,8 @@ options: required: false validate_certs: description: - - If V(false), SSL certificates will not be validated. This should only be used on personally controlled sites using - self-signed certificates. + - If V(false), SSL certificates are not validated. This should only be used on personally controlled sites using self-signed + certificates. required: false default: true type: bool @@ -102,14 +102,14 @@ def main(): module = AnsibleModule( argument_spec=dict( token=dict(required=True, no_log=True), - app_name=dict(required=False), - application_id=dict(required=False), - changelog=dict(required=False), - description=dict(required=False), + app_name=dict(), + application_id=dict(), + changelog=dict(), + description=dict(), revision=dict(required=True), - user=dict(required=False), + user=dict(), validate_certs=dict(default=True, type='bool'), - app_name_exact_match=dict(required=False, type='bool', default=False), + app_name_exact_match=dict(type='bool', default=False), ), required_one_of=[['app_name', 'application_id']], required_if=[('app_name_exact_match', True, ['app_name'])], diff --git a/plugins/modules/nexmo.py b/plugins/modules/nexmo.py index ef6502532d..2d3a62b053 100644 --- a/plugins/modules/nexmo.py +++ b/plugins/modules/nexmo.py @@ -45,12 +45,12 @@ options: msg: type: str description: - - Message to text to send. Messages longer than 160 characters will be split into multiple messages. + - Message text to send. Messages longer than 160 characters are split into multiple messages. required: true validate_certs: description: - - If V(false), SSL certificates will not be validated. This should only be used on personally controlled sites using - self-signed certificates. + - If V(false), SSL certificates are not validated. This should only be used on personally controlled sites using self-signed + certificates. type: bool default: true extends_documentation_fragment: diff --git a/plugins/modules/nictagadm.py b/plugins/modules/nictagadm.py index a02a8fcffd..07b17bcf9e 100644 --- a/plugins/modules/nictagadm.py +++ b/plugins/modules/nictagadm.py @@ -35,7 +35,7 @@ options: type: str etherstub: description: - - Specifies that the nic tag will be attached to a created O(etherstub). + - Specifies that the nic tag is attached to a created O(etherstub). - Parameter O(etherstub) is mutually exclusive with both O(mtu), and O(mac). type: bool default: false @@ -46,7 +46,7 @@ options: type: int force: description: - - When O(state=absent) this switch will use the C(-f) parameter and delete the nic tag regardless of existing VMs. + - When O(state=absent) this switch uses the C(-f) parameter and delete the nic tag regardless of existing VMs. type: bool default: false state: @@ -83,7 +83,7 @@ mac: type: str sample: 00:1b:21:a3:f5:4d etherstub: - description: Specifies if the nic tag will create and attach to an etherstub. + description: Specifies if the nic tag was created and attached to an etherstub. returned: always type: bool sample: false @@ -93,7 +93,7 @@ mtu: type: int sample: 1500 force: - description: Shows if -f was used during the deletion of a nic tag. + description: Shows if C(-f) was used during the deletion of a nic tag. returned: always type: bool sample: false diff --git a/plugins/modules/nmcli.py b/plugins/modules/nmcli.py index 0af9f64ee9..0d35e5aacc 100644 --- a/plugins/modules/nmcli.py +++ b/plugins/modules/nmcli.py @@ -21,10 +21,10 @@ extends_documentation_fragment: description: - Manage the network devices. Create, modify and manage various connection and device type, for example V(ethernet), V(team), V(bond), V(vlan) and so on. - - 'On CentOS 8 and Fedora >=29 like systems, the requirements can be met by installing the following packages: NetworkManager.' - - 'On CentOS 7 and Fedora <=28 like systems, the requirements can be met by installing the following packages: NetworkManager-tui.' - - 'On Ubuntu and Debian like systems, the requirements can be met by installing the following packages: network-manager.' - - 'On openSUSE, the requirements can be met by installing the following packages: NetworkManager.' + - 'On CentOS 8 and Fedora >=29 like systems, the requirements can be met by installing the following packages: C(NetworkManager).' + - 'On CentOS 7 and Fedora <=28 like systems, the requirements can be met by installing the following packages: C(NetworkManager-tui).' + - 'On Ubuntu and Debian like systems, the requirements can be met by installing the following packages: C(network-manager).' + - 'On openSUSE, the requirements can be met by installing the following packages: C(NetworkManager).' attributes: check_mode: support: full @@ -34,8 +34,8 @@ options: state: description: - Whether the device should exist or not, taking action if the state is different from what is stated. - - Using O(state=present) to create connection will automatically bring connection up. - - Using O(state=up) and O(state=down) will not modify connection with other parameters. These states have been added + - Using O(state=present) creates connection set to be brought up automatically. + - Using O(state=up) and O(state=down) does not modify connection with other parameters. These states have been added in community.general 9.5.0. type: str required: true @@ -48,7 +48,7 @@ options: default: true autoconnect_priority: description: - - The priority of the connection profile for autoconnect. If set, connection profiles with higher priority will be preferred. + - The priority of the connection profile for autoconnect. If set, connection profiles with higher priority are preferred. type: int version_added: 11.0.0 autoconnect_retries: @@ -71,9 +71,9 @@ options: ifname: description: - The interface to bind the connection to. - - The connection will only be applicable to this interface name. + - The connection is only applicable to this interface name. - A special value of V(*) can be used for interface-independent connections. - - The ifname argument is mandatory for all connection types except bond, team, bridge, vlan and vpn. + - The O(ifname) argument is mandatory for all connection types except bond, team, bridge, vlan and vpn. - This parameter defaults to O(conn_name) when left unset for all connection types except vpn that removes it. type: str type: @@ -501,7 +501,7 @@ options: runner_fast_rate: description: - Option specifies the rate at which our link partner is asked to transmit LACPDU packets. If this is V(true) then packets - will be sent once per second. Otherwise they will be sent every 30 seconds. + are sent once per second. Otherwise they are sent every 30 seconds. - Only allowed for O(runner=lacp). type: bool version_added: 6.5.0 @@ -595,7 +595,7 @@ options: - Indicates whether Fast Initial Link Setup (802.11ai) must be enabled for the connection. - One of V(0) (use global default value), V(1) (disable FILS), V(2) (enable FILS if the supplicant and the access point support it) or V(3) (enable FILS and fail if not supported). - - When set to V(0) and no global default is set, FILS will be optionally enabled. + - When set to V(0) and no global default is set, FILS is optionally enabled. type: int choices: [0, 1, 2, 3] default: 0 @@ -639,7 +639,7 @@ options: - Indicates whether Protected Management Frames (802.11w) must be enabled for the connection. - One of V(0) (use global default value), V(1) (disable PMF), V(2) (enable PMF if the supplicant and the access point support it) or V(3) (enable PMF and fail if not supported). - - When set to V(0) and no global default is set, PMF will be optionally enabled. + - When set to V(0) and no global default is set, PMF is optionally enabled. type: int choices: [0, 1, 2, 3] default: 0 @@ -672,8 +672,8 @@ options: description: - Controls the interpretation of WEP keys. - Allowed values are V(1), in which case the key is either a 10- or 26-character hexadecimal string, or a 5- or - 13-character ASCII password; or V(2), in which case the passphrase is provided as a string and will be hashed - using the de-facto MD5 method to derive the actual WEP key. + 13-character ASCII password; or V(2), in which case the passphrase is provided as a string and it is hashed using + the de-facto MD5 method to derive the actual WEP key. type: int choices: [1, 2] wep-key0: @@ -708,8 +708,8 @@ options: wps-method: description: - Flags indicating which mode of WPS is to be used if any. - - There is little point in changing the default setting as NetworkManager will automatically determine whether it - is feasible to start WPS enrollment from the Access Point capabilities. + - There is little point in changing the default setting as NetworkManager automatically determines whether it is + feasible to start WPS enrollment from the Access Point capabilities. - WPS can be disabled by setting this property to a value of V(1). type: int default: 0 @@ -753,8 +753,8 @@ options: description: - 802.11 frequency band of the network. - One of V(a) for 5GHz 802.11a or V(bg) for 2.4GHz 802.11. - - This will lock associations to the Wi-Fi network to the specific band, so for example, if V(a) is specified, the - device will not associate with the same network in the 2.4GHz band even if the network's settings are compatible. + - This locks associations to the Wi-Fi network to the specific band, so for example, if V(a) is specified, the device + does not associate with the same network in the 2.4GHz band even if the network's settings are compatible. - This setting depends on specific driver capability and may not work with all drivers. type: str choices: [a, bg] @@ -767,7 +767,7 @@ options: channel: description: - Wireless channel to use for the Wi-Fi connection. - - The device will only join (or create for Ad-Hoc networks) a Wi-Fi network on the specified channel. + - The device only joins (or creates for Ad-Hoc networks) a Wi-Fi network on the specified channel. - Because channel numbers overlap between bands, this property also requires the O(wifi.band) property to be set. type: int default: 0 @@ -782,7 +782,7 @@ options: - With O(wifi.cloned-mac-address) setting V(random) or V(stable), by default all bits of the MAC address are scrambled and a locally-administered, unicast MAC address is created. This property allows to specify that certain bits are fixed. - - Note that the least significant bit of the first MAC address will always be unset to create a unicast MAC address. + - Note that the least significant bit of the first MAC address is always unset to create a unicast MAC address. - If the property is V(null), it is eligible to be overwritten by a default connection setting. - If the value is still V(null) or an empty string, the default is to create a locally-administered, unicast MAC address. @@ -792,12 +792,12 @@ options: 3 bytes using the V(random) or V(stable) algorithm. - If the value contains one additional MAC address after the mask, this address is used instead of the current MAC address to fill the bits that shall not be randomized. - - For example, a value of V(FE:FF:FF:00:00:00 68:F7:28:00:00:00) will set the OUI of the MAC address to 68:F7:28, - while the lower bits are randomized. - - A value of V(02:00:00:00:00:00 00:00:00:00:00:00) will create a fully scrambled globally-administered, burned-in - MAC address. + - For example, a value of V(FE:FF:FF:00:00:00 68:F7:28:00:00:00) sets the OUI of the MAC address to 68:F7:28, while + the lower bits are randomized. + - A value of V(02:00:00:00:00:00 00:00:00:00:00:00) creates a fully scrambled globally-administered, burned-in MAC + address. - If the value contains more than one additional MAC addresses, one of them is chosen randomly. For example, V(02:00:00:00:00:00 - 00:00:00:00:00:00 02:00:00:00:00:00) will create a fully scrambled MAC address, randomly locally or globally administered. + 00:00:00:00:00:00 02:00:00:00:00:00) creates a fully scrambled MAC address, randomly locally or globally administered. type: str hidden: description: @@ -827,7 +827,7 @@ options: choices: [0, 1, 2] mac-address: description: - - If specified, this connection will only apply to the Wi-Fi device whose permanent MAC address matches. + - If specified, this connection only applies to the Wi-Fi device whose permanent MAC address matches. - This property does not change the MAC address of the device (for example for MAC spoofing). type: str mode: @@ -896,25 +896,25 @@ options: apn: description: - The GPRS Access Point Name specifying the APN used when establishing a data session with the GSM-based network. - - The APN often determines how the user will be billed for their network usage and whether the user has access to - the Internet or just a provider-specific walled-garden, so it is important to use the correct APN for the user's - mobile broadband plan. + - The APN often determines how the user is billed for their network usage and whether the user has access to the + Internet or just a provider-specific walled-garden, so it is important to use the correct APN for the user's mobile + broadband plan. - The APN may only be composed of the characters a-z, 0-9, ., and - per GSM 03.60 Section 14.9. type: str auto-config: - description: When V(true), the settings such as O(gsm.apn), O(gsm.username), or O(gsm.password) will default to values - that match the network the modem will register to in the Mobile Broadband Provider database. + description: When V(true), the settings such as O(gsm.apn), O(gsm.username), or O(gsm.password) default to values + that match the network the modem registers to in the Mobile Broadband Provider database. type: bool default: false device-id: description: - The device unique identifier (as given by the V(WWAN) management service) which this connection applies to. - - If given, the connection will only apply to the specified device. + - If given, the connection only applies to the specified device. type: str home-only: description: - - When V(true), only connections to the home network will be allowed. - - Connections to roaming networks will not be made. + - When V(true), only connections to the home network are allowed. + - Connections to roaming networks are not made. type: bool default: false mtu: @@ -925,7 +925,7 @@ options: network-id: description: - The Network ID (GSM LAI format, ie MCC-MNC) to force specific network registration. - - If the Network ID is specified, NetworkManager will attempt to force the device to register only on the specified + - If the Network ID is specified, NetworkManager attempts to force the device to register only on the specified network. - This can be used to ensure that the device does not roam when direct roaming control of the device is not otherwise possible. @@ -944,7 +944,7 @@ options: - NMSettingSecretFlags indicating how to handle the O(gsm.password) property. - 'Following choices are allowed: V(0) B(NONE): The system is responsible for providing and storing this secret (default), V(1) B(AGENT_OWNED): A user secret agent is responsible for providing and storing this secret; when - it is required agents will be asked to retrieve it V(2) B(NOT_SAVED): This secret should not be saved, but should + it is required agents are asked to retrieve it V(2) B(NOT_SAVED): This secret should not be saved, but should be requested from the user each time it is needed V(4) B(NOT_REQUIRED): In situations where it cannot be automatically determined that the secret is required (some VPNs and PPP providers do not require all secrets) this flag indicates that the specific secret is not required.' @@ -966,14 +966,14 @@ options: sim-id: description: - The SIM card unique identifier (as given by the C(WWAN) management service) which this connection applies to. - - If given, the connection will apply to any device also allowed by O(gsm.device-id) which contains a SIM card matching + - If given, the connection applies to any device also allowed by O(gsm.device-id) which contains a SIM card matching the given identifier. type: str sim-operator-id: description: - A MCC/MNC string like V(310260) or V(21601I) identifying the specific mobile network operator which this connection applies to. - - If given, the connection will apply to any device also allowed by O(gsm.device-id) and O(gsm.sim-id) which contains + - If given, the connection applies to any device also allowed by O(gsm.device-id) and O(gsm.sim-id) which contains a SIM card provisioned by the given operator. type: str username: @@ -1032,8 +1032,8 @@ options: ip4-auto-default-route: description: - Whether to enable special handling of the IPv4 default route. - - If enabled, the IPv4 default route from O(wireguard.peer-routes) will be placed to a dedicated routing-table and - two policy routing rules will be added. + - If enabled, the IPv4 default route from O(wireguard.peer-routes) is placed to a dedicated routing-table and two + policy routing rules are added. - The fwmark number is also used as routing-table for the default-route, and if fwmark is zero, an unused fwmark/table is chosen automatically. This corresponds to what wg-quick does with Table=auto and what WireGuard calls "Improved Rule-based Routing". @@ -1043,7 +1043,7 @@ options: - Like O(wireguard.ip4-auto-default-route), but for the IPv6 default route. type: bool listen-port: - description: The WireGuard connection listen-port. If not specified, the port will be chosen randomly when the interface + description: The WireGuard connection listen-port. If not specified, the port is chosen randomly when the interface comes up. type: int mtu: @@ -1056,12 +1056,12 @@ options: peer-routes: description: - Whether to automatically add routes for the AllowedIPs ranges of the peers. - - If V(true) (the default), NetworkManager will automatically add routes in the routing tables according to C(ipv4.route-table) + - If V(true) (the default), NetworkManager automatically adds routes in the routing tables according to C(ipv4.route-table) and C(ipv6.route-table). Usually you want this automatism enabled. - If V(false), no such routes are added automatically. In this case, the user may want to configure static routes in C(ipv4.routes) and C(ipv6.routes), respectively. - Note that if the peer's AllowedIPs is V(0.0.0.0/0) or V(::/0) and the profile's C(ipv4.never-default) or C(ipv6.never-default) - setting is enabled, the peer route for this peer will not be added automatically. + setting is enabled, the peer route for this peer is not added automatically. type: bool private-key: description: The 256 bit private-key in base64 encoding. @@ -1079,7 +1079,7 @@ options: version_added: 5.1.0 suboptions: permissions: - description: User that will have permission to use the connection. + description: User that has permission to use the connection. type: str required: true service-type: @@ -1096,7 +1096,7 @@ options: - NMSettingSecretFlags indicating how to handle the C(vpn.password) property. - 'Following choices are allowed: V(0) B(NONE): The system is responsible for providing and storing this secret (default); V(1) B(AGENT_OWNED): A user secret agent is responsible for providing and storing this secret; when - it is required agents will be asked to retrieve it; V(2) B(NOT_SAVED): This secret should not be saved, but should + it is required agents are asked to retrieve it; V(2) B(NOT_SAVED): This secret should not be saved, but should be requested from the user each time it is needed; V(4) B(NOT_REQUIRED): In situations where it cannot be automatically determined that the secret is required (some VPNs and PPP providers do not require all secrets) this flag indicates that the specific secret is not required.' @@ -1115,7 +1115,8 @@ options: ipsec-psk: description: - The pre-shared key in base64 encoding. - - "You can encode using this Ansible jinja2 expression: V(\"0s{{ '[YOUR PRE-SHARED KEY]' | ansible.builtin.b64encode }}\")." + - > + You can encode using this Ansible Jinja2 expression: V("0s{{ '[YOUR PRE-SHARED KEY]' | ansible.builtin.b64encode }}"). - This is only used when O(vpn.ipsec-enabled=true). type: str sriov: @@ -1839,10 +1840,7 @@ class Nmcli(object): self.module.fail_json(msg="'master' option is required when 'slave_type' is specified.") def execute_command(self, cmd, use_unsafe_shell=False, data=None): - if isinstance(cmd, list): - cmd = [to_text(item) for item in cmd] - else: - cmd = to_text(cmd) + cmd = [to_text(item) for item in cmd] return self.module.run_command(cmd, use_unsafe_shell=use_unsafe_shell, data=data) def execute_edit_commands(self, commands, arguments): @@ -2269,7 +2267,7 @@ class Nmcli(object): @staticmethod def settings_type(setting): - if setting in ('bridge.stp', + if setting in {'bridge.stp', 'bridge-port.hairpin-mode', 'connection.autoconnect', 'ipv4.never-default', @@ -2279,9 +2277,9 @@ class Nmcli(object): 'ipv6.ignore-auto-dns', 'ipv6.ignore-auto-routes', '802-11-wireless.hidden', - 'team.runner-fast-rate'): + 'team.runner-fast-rate'}: return bool - elif setting in ('ipv4.addresses', + elif setting in {'ipv4.addresses', 'ipv6.addresses', 'ipv4.dns', 'ipv4.dns-search', @@ -2298,10 +2296,10 @@ class Nmcli(object): '802-11-wireless-security.proto', '802-11-wireless-security.psk-flags', '802-11-wireless-security.wep-key-flags', - '802-11-wireless.mac-address-blacklist'): + '802-11-wireless.mac-address-blacklist'}: return list - elif setting in ('connection.autoconnect-priority', - 'connection.autoconnect-retries'): + elif setting in {'connection.autoconnect-priority', + 'connection.autoconnect-retries'}: return int return str @@ -2484,7 +2482,7 @@ class Nmcli(object): for line in out.splitlines(): prefix = '%s.' % setting - if (line.startswith(prefix)): + if line.startswith(prefix): pair = line.split(':', 1) property = pair[0].strip().replace(prefix, '') properties.append(property) @@ -2768,7 +2766,11 @@ def main(): mutually_exclusive=[['never_default4', 'gw4'], ['routes4_extended', 'routes4'], ['routes6_extended', 'routes6']], - required_if=[("type", "wifi", [("ssid")])], + required_if=[ + ("type", "wifi", ["ssid"]), + ("type", "team-slave", ["master", "ifname"]), + ("slave_type", "team", ["master", "ifname"]), + ], supports_check_mode=True, ) module.run_command_environ_update = dict(LANG='C', LC_ALL='C', LC_MESSAGES='C', LC_CTYPE='C') @@ -2778,21 +2780,12 @@ def main(): (rc, out, err) = (None, '', '') result = {'conn_name': nmcli.conn_name, 'state': nmcli.state} - # check for issues - if nmcli.conn_name is None: - nmcli.module.fail_json(msg="Please specify a name for the connection") # team checks if nmcli.type == "team": if nmcli.runner_hwaddr_policy and not nmcli.runner == "activebackup": nmcli.module.fail_json(msg="Runner-hwaddr-policy is only allowed for runner activebackup") if nmcli.runner_fast_rate is not None and nmcli.runner != "lacp": nmcli.module.fail_json(msg="runner-fast-rate is only allowed for runner lacp") - # team-slave checks - if nmcli.type == 'team-slave' or nmcli.slave_type == 'team': - if nmcli.master is None: - nmcli.module.fail_json(msg="Please specify a name for the master when type is %s" % nmcli.type) - if nmcli.ifname is None: - nmcli.module.fail_json(msg="Please specify an interface name for the connection when type is %s" % nmcli.type) if nmcli.type == 'wifi': unsupported_properties = {} if nmcli.wifi: @@ -2815,7 +2808,7 @@ def main(): (rc, out, err) = nmcli.down_connection() (rc, out, err) = nmcli.remove_connection() if rc != 0: - module.fail_json(name=('No Connection named %s exists' % nmcli.conn_name), msg=err, rc=rc) + module.fail_json(name=('Error removing connection named %s' % nmcli.conn_name), msg=err, rc=rc) elif nmcli.state == 'present': if nmcli.connection_exists(): @@ -2852,7 +2845,7 @@ def main(): (rc, out, err) = nmcli.reload_connection() (rc, out, err) = nmcli.up_connection() if rc != 0: - module.fail_json(name=('No Connection named %s exists' % nmcli.conn_name), msg=err, rc=rc) + module.fail_json(name=('Error bringing up connection named %s' % nmcli.conn_name), msg=err, rc=rc) elif nmcli.state == 'down': if nmcli.connection_exists(): @@ -2862,7 +2855,7 @@ def main(): (rc, out, err) = nmcli.reload_connection() (rc, out, err) = nmcli.down_connection() if rc != 0: - module.fail_json(name=('No Connection named %s exists' % nmcli.conn_name), msg=err, rc=rc) + module.fail_json(name=('Error bringing down connection named %s' % nmcli.conn_name), msg=err, rc=rc) except NmcliModuleError as e: module.fail_json(name=nmcli.conn_name, msg=str(e)) diff --git a/plugins/modules/nosh.py b/plugins/modules/nosh.py index da9db091bc..7cd4f4ad66 100644 --- a/plugins/modules/nosh.py +++ b/plugins/modules/nosh.py @@ -35,22 +35,22 @@ options: required: false choices: [started, stopped, reset, restarted, reloaded] description: - - V(started)/V(stopped) are idempotent actions that will not run commands unless necessary. - - V(restarted) will always bounce the service. - - V(reloaded) will send a SIGHUP or start the service. - - V(reset) will start or stop the service according to whether it is enabled or not. + - V(started)/V(stopped) are idempotent actions that do not run commands unless necessary. + - V(restarted) always bounces the service. + - V(reloaded) sends a SIGHUP or starts the service. + - V(reset) starts or stops the service according to whether it is enabled or not. enabled: required: false type: bool description: - Enable or disable the service, independently of C(*.preset) file preference or running state. Mutually exclusive with - O(preset). Will take effect prior to O(state=reset). + O(preset). It takes effect prior to O(state=reset). preset: required: false type: bool description: - Enable or disable the service according to local preferences in C(*.preset) files. Mutually exclusive with O(enabled). - Only has an effect if set to true. Will take effect prior to O(state=reset). + Only has an effect if set to true. It takes effect prior to O(state=reset). user: required: false default: false diff --git a/plugins/modules/nsupdate.py b/plugins/modules/nsupdate.py index 9f665626b2..4049996ca3 100644 --- a/plugins/modules/nsupdate.py +++ b/plugins/modules/nsupdate.py @@ -63,8 +63,8 @@ options: type: str zone: description: - - DNS record will be modified on this O(zone). - - When omitted DNS will be queried to attempt finding the correct zone. + - DNS record is modified on this O(zone). + - When omitted, DNS is queried to attempt finding the correct zone. type: str record: description: @@ -144,10 +144,6 @@ EXAMPLES = r""" """ RETURN = r""" -changed: - description: If module has modified record. - returned: success - type: str record: description: DNS record. returned: success @@ -476,18 +472,18 @@ def main(): module = AnsibleModule( argument_spec=dict( - state=dict(required=False, default='present', choices=['present', 'absent'], type='str'), + state=dict(default='present', choices=['present', 'absent'], type='str'), server=dict(required=True, type='str'), - port=dict(required=False, default=53, type='int'), - key_name=dict(required=False, type='str'), - key_secret=dict(required=False, type='str', no_log=True), - key_algorithm=dict(required=False, default='hmac-md5', choices=tsig_algs, type='str'), - zone=dict(required=False, default=None, type='str'), + port=dict(default=53, type='int'), + key_name=dict(type='str'), + key_secret=dict(type='str', no_log=True), + key_algorithm=dict(default='hmac-md5', choices=tsig_algs, type='str'), + zone=dict(type='str'), record=dict(required=True, type='str'), - type=dict(required=False, default='A', type='str'), - ttl=dict(required=False, default=3600, type='int'), - value=dict(required=False, default=None, type='list', elements='str'), - protocol=dict(required=False, default='tcp', choices=['tcp', 'udp'], type='str') + type=dict(default='A', type='str'), + ttl=dict(default=3600, type='int'), + value=dict(type='list', elements='str'), + protocol=dict(default='tcp', choices=['tcp', 'udp'], type='str') ), supports_check_mode=True ) diff --git a/plugins/modules/oci_vcn.py b/plugins/modules/oci_vcn.py index e44d2b0f20..56a637ac2c 100644 --- a/plugins/modules/oci_vcn.py +++ b/plugins/modules/oci_vcn.py @@ -162,17 +162,12 @@ def main(): ) module_args.update( dict( - cidr_block=dict(type="str", required=False), - compartment_id=dict(type="str", required=False), - display_name=dict(type="str", required=False, aliases=["name"]), - dns_label=dict(type="str", required=False), - state=dict( - type="str", - required=False, - default="present", - choices=["absent", "present"], - ), - vcn_id=dict(type="str", required=False, aliases=["id"]), + cidr_block=dict(type="str"), + compartment_id=dict(type="str"), + display_name=dict(type="str", aliases=["name"]), + dns_label=dict(type="str"), + state=dict(type="str", default="present", choices=["absent", "present"]), + vcn_id=dict(type="str", aliases=["id"]), ) ) diff --git a/plugins/modules/odbc.py b/plugins/modules/odbc.py index 54c923cf1e..41b5df4f08 100644 --- a/plugins/modules/odbc.py +++ b/plugins/modules/odbc.py @@ -66,6 +66,7 @@ EXAMPLES = r""" changed_when: false """ +# @FIXME RV 'results' is meant to be used when 'loop:' was used with the module. RETURN = r""" results: description: List of lists of strings containing selected rows, likely empty for DDL statements. diff --git a/plugins/modules/office_365_connector_card.py b/plugins/modules/office_365_connector_card.py index 8ff82fecc1..6b8384a7ca 100644 --- a/plugins/modules/office_365_connector_card.py +++ b/plugins/modules/office_365_connector_card.py @@ -17,7 +17,7 @@ description: U(https://learn.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/cards/cards-reference#connector-card-for-microsoft-365-groups). author: "Marc Sensenich (@marc-sensenich)" notes: - - This module is not idempotent, therefore if the same task is run twice there will be two Connector Cards created. + - This module is not idempotent, therefore if you run the same task twice then you create two Connector Cards. extends_documentation_fragment: - community.general.attributes attributes: @@ -35,7 +35,7 @@ options: type: str description: - A string used for summarizing card content. - - This will be shown as the message subject. + - This is the message subject. - This is required if the text parameter is not populated. color: type: str @@ -49,13 +49,13 @@ options: type: str description: - The main text of the card. - - This will be rendered below the sender information and optional title, + - This is rendered below the sender information and optional title, - And above any sections or actions present. actions: type: list elements: dict description: - - This array of objects will power the action links found at the bottom of the card. + - This array of objects is used to power the action links found at the bottom of the card. sections: type: list elements: dict diff --git a/plugins/modules/one_host.py b/plugins/modules/one_host.py index 8246172c90..7c43da3058 100644 --- a/plugins/modules/one_host.py +++ b/plugins/modules/one_host.py @@ -36,8 +36,8 @@ options: state: description: - Takes the host to the desired lifecycle state. - - If V(absent) the host will be deleted from the cluster. - - If V(present) the host will be created in the cluster (includes V(enabled), V(disabled) and V(offline) states). + - If V(absent) the host is deleted from the cluster. + - If V(present) the host is created in the cluster (includes V(enabled), V(disabled) and V(offline) states). - If V(enabled) the host is fully operational. - V(disabled), for example to perform maintenance operations. - V(offline), host is totally offline. diff --git a/plugins/modules/one_image.py b/plugins/modules/one_image.py index e5ffb68b4f..d9a21f86b7 100644 --- a/plugins/modules/one_image.py +++ b/plugins/modules/one_image.py @@ -48,8 +48,8 @@ options: type: bool new_name: description: - - A name that will be assigned to the existing or new image. - - In the case of cloning, by default O(new_name) will take the name of the origin image with the prefix 'Copy of'. + - A name that is assigned to the existing or new image. + - In the case of cloning, by default O(new_name) is set to the name of the origin image with the prefix 'Copy of'. type: str persistent: description: @@ -325,7 +325,7 @@ datastore: returned: when O(state=present), O(state=cloned), or O(state=renamed) version_added: 9.5.0 vms: - description: The image's list of vm ID's. + description: The image's list of VM ID's. type: list elements: int returned: when O(state=present), O(state=cloned), or O(state=renamed) diff --git a/plugins/modules/one_image_info.py b/plugins/modules/one_image_info.py index 7e5def76fb..f940444cad 100644 --- a/plugins/modules/one_image_info.py +++ b/plugins/modules/one_image_info.py @@ -29,10 +29,10 @@ options: elements: str name: description: - - A O(name) of the image whose facts will be gathered. - - If the O(name) begins with V(~) the O(name) will be used as regex pattern, which restricts the list of images (whose - facts will be returned) whose names match specified regex. - - Also, if the O(name) begins with V(~*) case-insensitive matching will be performed. + - A O(name) of the image whose facts is gathered. + - If the O(name) begins with V(~) the O(name) is used as regex pattern, which restricts the list of images (whose facts + is returned) whose names match specified regex. + - Also, if the O(name) begins with V(~*) case-insensitive matching is performed. - See examples for more details. type: str author: @@ -231,7 +231,7 @@ images: sample: image_datastore version_added: 9.5.0 vms: - description: The image's list of vm ID's. + description: The image's list of VM ID's. type: list elements: int version_added: 9.5.0 @@ -281,8 +281,8 @@ IMAGE_STATES = ['INIT', 'READY', 'USED', 'DISABLED', 'LOCKED', 'ERROR', 'CLONE', class ImageInfoModule(OpenNebulaModule): def __init__(self): argument_spec = dict( - ids=dict(type='list', aliases=['id'], elements='str', required=False), - name=dict(type='str', required=False), + ids=dict(type='list', aliases=['id'], elements='str'), + name=dict(type='str'), ) mutually_exclusive = [ ['ids', 'name'], diff --git a/plugins/modules/one_service.py b/plugins/modules/one_service.py index 8244e0ca5a..88ccd29d74 100644 --- a/plugins/modules/one_service.py +++ b/plugins/modules/one_service.py @@ -55,7 +55,7 @@ options: type: str unique: description: - - Setting O(unique=true) will make sure that there is only one service instance running with a name set with O(service_name) + - Setting O(unique=true) ensures that there is only one service instance running with a name set with O(service_name) when instantiating a service from a template specified with O(template_id) or O(template_name). Check examples below. type: bool default: false @@ -73,11 +73,11 @@ options: type: str owner_id: description: - - ID of the user which will be set as the owner of the service. + - ID of the user which is set as the owner of the service. type: int group_id: description: - - ID of the group which will be set as the group of the service. + - ID of the group which is set as the group of the service. type: int wait: description: @@ -91,7 +91,7 @@ options: type: int custom_attrs: description: - - Dictionary of key/value custom attributes which will be used when instantiating a new service. + - Dictionary of key/value custom attributes which is used when instantiating a new service. default: {} type: dict role: diff --git a/plugins/modules/one_template.py b/plugins/modules/one_template.py index 71db2c1d2c..091c4c55a7 100644 --- a/plugins/modules/one_template.py +++ b/plugins/modules/one_template.py @@ -33,12 +33,12 @@ attributes: options: id: description: - - A O(id) of the template you would like to manage. If not set then a new template will be created with the given O(name). + - A O(id) of the template you would like to manage. If not set then a new template is created with the given O(name). type: int name: description: - - A O(name) of the template you would like to manage. If a template with the given name does not exist it will be created, - otherwise it will be managed by this module. + - A O(name) of the template you would like to manage. If a template with the given name does not exist it is created, + otherwise it is managed by this module. type: str template: description: @@ -163,11 +163,11 @@ from ansible_collections.community.general.plugins.module_utils.opennebula impor class TemplateModule(OpenNebulaModule): def __init__(self): argument_spec = dict( - id=dict(type='int', required=False), - name=dict(type='str', required=False), + id=dict(type='int'), + name=dict(type='str'), state=dict(type='str', choices=['present', 'absent'], default='present'), - template=dict(type='str', required=False), - filter=dict(type='str', required=False, choices=['user_primary_group', 'user', 'all', 'user_groups'], default='user'), + template=dict(type='str'), + filter=dict(type='str', choices=['user_primary_group', 'user', 'all', 'user_groups'], default='user'), ) mutually_exclusive = [ diff --git a/plugins/modules/one_vm.py b/plugins/modules/one_vm.py index 2139da5d4c..3d23efa036 100644 --- a/plugins/modules/one_vm.py +++ b/plugins/modules/one_vm.py @@ -39,7 +39,7 @@ options: api_password: description: - Password of the user to login into OpenNebula RPC server. If not set then the value of the E(ONE_PASSWORD) environment - variable is used. if both O(api_username) or O(api_password) are not set, then it will try authenticate with ONE auth + variable is used. if both O(api_username) or O(api_password) are not set, then it tries to authenticate with ONE auth file. Default path is C(~/.one/one_auth). - Set environment variable E(ONE_AUTH) to override this path. type: str @@ -53,7 +53,7 @@ options: type: int vm_start_on_hold: description: - - Set to true to put vm on hold while creating. + - Set to true to put VM on hold while creating. default: false type: bool instance_ids: @@ -80,7 +80,7 @@ options: wait: description: - Wait for the instance to reach its desired state before returning. Keep in mind if you are waiting for instance to - be in running state it does not mean that you will be able to SSH on that machine only that boot process have started + be in running state it does not mean that you are able to SSH on that machine only that boot process have started on that instance. See the example using the M(ansible.builtin.wait_for) module for details. default: true type: bool @@ -94,9 +94,9 @@ options: - A dictionary of key/value attributes to add to new instances, or for setting C(state) of instances with these attributes. - Keys are case insensitive and OpenNebula automatically converts them to upper case. - Be aware V(NAME) is a special attribute which sets the name of the VM when it is deployed. - - C(#) character(s) can be appended to the C(NAME) and the module will automatically add indexes to the names of VMs. + - C(#) character(s) can be appended to the C(NAME) and the module automatically adds indexes to the names of VMs. - 'For example: V(NAME: foo-###) would create VMs with names V(foo-000), V(foo-001),...' - - When used with O(count_attributes) and O(exact_count) the module will match the base name without the index part. + - When used with O(count_attributes) and O(exact_count) the module matches the base name without the index part. default: {} type: dict labels: @@ -126,7 +126,7 @@ options: description: - Indicates how many instances that match O(count_attributes) and O(count_labels) parameters should be deployed. Instances are either created or terminated based on this value. - - B(NOTE:) Instances with the least IDs will be terminated first. + - B(NOTE:) Instances with the least IDs are terminated first. type: int mode: description: @@ -135,11 +135,11 @@ options: type: str owner_id: description: - - ID of the user which will be set as the owner of the instance. + - ID of the user which is set as the owner of the instance. type: int group_id: description: - - ID of the group which will be set as the group of the instance. + - ID of the group which is set as the group of the instance. type: int memory: description: @@ -157,7 +157,7 @@ options: type: float vcpu: description: - - Number of CPUs (cores) new VM will have. + - Number of CPUs (cores) the new VM uses. type: int networks: description: @@ -170,9 +170,9 @@ options: - Creates an image from a VM disk. - It is a dictionary where you have to specify C(name) of the new image. - Optionally you can specify C(disk_id) of the disk you want to save. By default C(disk_id) is 0. - - B(NOTE:) This operation will only be performed on the first VM (if more than one VM ID is passed) and the VM has to - be in the C(poweredoff) state. - - Also this operation will fail if an image with specified C(name) already exists. + - B(NOTE:) This operation is only performed on the first VM (if more than one VM ID is passed) and the VM has to be + in the C(poweredoff) state. + - Also this operation fails if an image with specified C(name) already exists. type: dict persistent: description: @@ -195,14 +195,16 @@ options: - When O(instance_ids) is provided, updates running VMs with the C(updateconf) API call. - When new VMs are being created, emulates the C(updateconf) API call using direct template merge. - Allows for complete modifications of the C(CONTEXT) attribute. - - "Supported attributes include:" + - 'Supported attributes include:' - B(BACKUP_CONFIG:) V(BACKUP_VOLATILE), V(FS_FREEZE), V(INCREMENT_MODE), V(KEEP_LAST), V(MODE); - - B(CONTEXT:) (Any value, except V(ETH*). Variable substitution will be made); + - B(CONTEXT:) (Any value, except V(ETH*). Variable substitutions are made); - B(CPU_MODEL:) V(FEATURES), V(MODEL); - - B(FEATURES:) V(ACPI), V(APIC), V(GUEST_AGENT), V(HYPERV), V(IOTHREADS), V(LOCALTIME), V(PAE), V(VIRTIO_BLK_QUEUES), V(VIRTIO_SCSI_QUEUES); + - B(FEATURES:) V(ACPI), V(APIC), V(GUEST_AGENT), V(HYPERV), V(IOTHREADS), V(LOCALTIME), V(PAE), V(VIRTIO_BLK_QUEUES), + V(VIRTIO_SCSI_QUEUES); - B(GRAPHICS:) V(COMMAND), V(KEYMAP), V(LISTEN), V(PASSWD), V(PORT), V(TYPE); - B(INPUT:) V(BUS), V(TYPE); - - B(OS:) V(ARCH), V(BOOT), V(BOOTLOADER), V(FIRMWARE), V(INITRD), V(KERNEL), V(KERNEL_CMD), V(MACHINE), V(ROOT), V(SD_DISK_BUS), V(UUID); + - B(OS:) V(ARCH), V(BOOT), V(BOOTLOADER), V(FIRMWARE), V(INITRD), V(KERNEL), V(KERNEL_CMD), V(MACHINE), V(ROOT), V(SD_DISK_BUS), + V(UUID); - B(RAW:) V(DATA), V(DATA_VMX), V(TYPE), V(VALIDATE); - B(VIDEO:) V(ATS), V(IOMMU), V(RESOLUTION), V(TYPE), V(VRAM). type: dict @@ -453,35 +455,35 @@ instances: returned: success contains: vm_id: - description: Vm ID. + description: VM ID. type: int sample: 153 vm_name: - description: Vm name. + description: VM name. type: str sample: foo template_id: - description: Vm's template ID. + description: VM's template ID. type: int sample: 153 group_id: - description: Vm's group ID. + description: VM's group ID. type: int sample: 1 group_name: - description: Vm's group name. + description: VM's group name. type: str sample: one-users owner_id: - description: Vm's owner ID. + description: VM's owner ID. type: int sample: 143 owner_name: - description: Vm's owner name. + description: VM's owner name. type: str sample: app-user mode: - description: Vm's mode. + description: VM's mode. type: str returned: success sample: 660 @@ -512,20 +514,21 @@ instances: networks: description: A list of dictionaries with info about IP, NAME, MAC, SECURITY_GROUPS for each NIC. type: list - sample: [ - { - "ip": "10.120.5.33", - "mac": "02:00:0a:78:05:21", - "name": "default-test-private", - "security_groups": "0,10" - }, - { - "ip": "10.120.5.34", - "mac": "02:00:0a:78:05:22", - "name": "default-test-private", - "security_groups": "0" - } - ] + sample: + [ + { + "ip": "10.120.5.33", + "mac": "02:00:0a:78:05:21", + "name": "default-test-private", + "security_groups": "0,10" + }, + { + "ip": "10.120.5.34", + "mac": "02:00:0a:78:05:22", + "name": "default-test-private", + "security_groups": "0" + } + ] uptime_h: description: Uptime of the instance in hours. type: int @@ -537,23 +540,27 @@ instances: attributes: description: A dictionary of key/values attributes that are associated with the instance. type: dict - sample: { - "HYPERVISOR": "kvm", - "LOGO": "images/logos/centos.png", - "TE_GALAXY": "bar", - "USER_INPUTS": null - } + sample: + { + "HYPERVISOR": "kvm", + "LOGO": "images/logos/centos.png", + "TE_GALAXY": "bar", + "USER_INPUTS": null + } updateconf: description: A dictionary of key/values attributes that are set with the updateconf API call. type: dict version_added: 6.3.0 - sample: { - "OS": { "ARCH": "x86_64" }, - "CONTEXT": { - "START_SCRIPT": "ip r r 169.254.16.86/32 dev eth0", - "SSH_PUBLIC_KEY": "ssh-rsa ...\\nssh-ed25519 ..." + sample: + { + "OS": { + "ARCH": "x86_64" + }, + "CONTEXT": { + "START_SCRIPT": "ip r r 169.254.16.86/32 dev eth0", + "SSH_PUBLIC_KEY": "ssh-rsa ...\\nssh-ed25519 ..." + } } - } tagged_instances: description: - A list of instances info based on a specific attributes and/or labels that are specified with O(count_attributes) and @@ -562,35 +569,35 @@ tagged_instances: returned: success contains: vm_id: - description: Vm ID. + description: VM ID. type: int sample: 153 vm_name: - description: Vm name. + description: VM name. type: str sample: foo template_id: - description: Vm's template ID. + description: VM's template ID. type: int sample: 153 group_id: - description: Vm's group ID. + description: VM's group ID. type: int sample: 1 group_name: - description: Vm's group name. + description: VM's group name. type: str sample: one-users owner_id: - description: Vm's user ID. + description: VM's user ID. type: int sample: 143 owner_name: - description: Vm's user name. + description: VM's user name. type: str sample: app-user mode: - description: Vm's mode. + description: VM's mode. type: str returned: success sample: 660 @@ -621,20 +628,21 @@ tagged_instances: networks: description: A list of dictionaries with info about IP, NAME, MAC, SECURITY_GROUPS for each NIC. type: list - sample: [ - { - "ip": "10.120.5.33", - "mac": "02:00:0a:78:05:21", - "name": "default-test-private", - "security_groups": "0,10" - }, - { - "ip": "10.120.5.34", - "mac": "02:00:0a:78:05:22", - "name": "default-test-private", - "security_groups": "0" - } - ] + sample: + [ + { + "ip": "10.120.5.33", + "mac": "02:00:0a:78:05:21", + "name": "default-test-private", + "security_groups": "0,10" + }, + { + "ip": "10.120.5.34", + "mac": "02:00:0a:78:05:22", + "name": "default-test-private", + "security_groups": "0" + } + ] uptime_h: description: Uptime of the instance in hours. type: int @@ -646,12 +654,27 @@ tagged_instances: attributes: description: A dictionary of key/values attributes that are associated with the instance. type: dict - sample: {"HYPERVISOR": "kvm", "LOGO": "images/logos/centos.png", "TE_GALAXY": "bar", "USER_INPUTS": null} + sample: + { + "HYPERVISOR": "kvm", + "LOGO": "images/logos/centos.png", + "TE_GALAXY": "bar", + "USER_INPUTS": null + } updateconf: description: A dictionary of key/values attributes that are set with the updateconf API call. type: dict version_added: 6.3.0 - sample: {"OS": {"ARCH": "x86_64"}, "CONTEXT": {"START_SCRIPT": "ip r r 169.254.16.86/32 dev eth0", "SSH_PUBLIC_KEY": "ssh-rsa ...\\nssh-ed25519 ..."}} + sample: + { + "OS": { + "ARCH": "x86_64" + }, + "CONTEXT": { + "START_SCRIPT": "ip r r 169.254.16.86/32 dev eth0", + "SSH_PUBLIC_KEY": "ssh-rsa ...\\nssh-ed25519 ..." + } + } """ try: diff --git a/plugins/modules/one_vnet.py b/plugins/modules/one_vnet.py index b8cb0c6559..b77530e756 100644 --- a/plugins/modules/one_vnet.py +++ b/plugins/modules/one_vnet.py @@ -30,12 +30,12 @@ options: id: description: - A O(id) of the network you would like to manage. - - If not set then a new network will be created with the given O(name). + - If not set then a new network is created with the given O(name). type: int name: description: - - A O(name) of the network you would like to manage. If a network with the given name does not exist it will be created, - otherwise it will be managed by this module. + - A O(name) of the network you would like to manage. If a network with the given name does not exist it, then is created, + otherwise it is managed by this module. type: str template: description: @@ -263,10 +263,10 @@ class NetworksModule(OpenNebulaModule): def __init__(self): argument_spec = dict( - id=dict(type='int', required=False), - name=dict(type='str', required=False), + id=dict(type='int'), + name=dict(type='str'), state=dict(type='str', choices=['present', 'absent'], default='present'), - template=dict(type='str', required=False), + template=dict(type='str'), ) mutually_exclusive = [ diff --git a/plugins/modules/oneandone_firewall_policy.py b/plugins/modules/oneandone_firewall_policy.py index d0b5319aad..eca9a8ed70 100644 --- a/plugins/modules/oneandone_firewall_policy.py +++ b/plugins/modules/oneandone_firewall_policy.py @@ -46,14 +46,14 @@ options: type: str rules: description: - - A list of rules that will be set for the firewall policy. Each rule must contain protocol parameter, in addition to - three optional parameters (port_from, port_to, and source). + - List of rules that are set for the firewall policy. Each rule must contain protocol parameter, in addition to three + optional parameters (port_from, port_to, and source). type: list elements: dict default: [] add_server_ips: description: - - A list of server identifiers (id or name) to be assigned to a firewall policy. Used in combination with update state. + - A list of server identifiers (ID or name) to be assigned to a firewall policy. Used in combination with update state. type: list elements: str required: false @@ -67,15 +67,15 @@ options: default: [] add_rules: description: - - A list of rules that will be added to an existing firewall policy. It is syntax is the same as the one used for rules - parameter. Used in combination with update state. + - List of rules that are added to an existing firewall policy. It is syntax is the same as the one used for rules parameter. + Used in combination with update state. type: list elements: dict required: false default: [] remove_rules: description: - - A list of rule IDs that will be removed from an existing firewall policy. Used in combination with update state. + - List of rule IDs that are removed from an existing firewall policy. Used in combination with update state. type: list elements: str required: false @@ -194,7 +194,7 @@ RETURN = r""" firewall_policy: description: Information about the firewall policy that was processed. type: dict - sample: '{"id": "92B74394A397ECC3359825C1656D67A6", "name": "Default Policy"}' + sample: {"id": "92B74394A397ECC3359825C1656D67A6", "name": "Default Policy"} returned: always """ @@ -288,7 +288,7 @@ def _add_firewall_rules(module, oneandone_conn, firewall_id, rules): if module.check_mode: firewall_policy_id = get_firewall_policy(oneandone_conn, firewall_id) - if (firewall_rules and firewall_policy_id): + if firewall_rules and firewall_policy_id: return True return False diff --git a/plugins/modules/oneandone_load_balancer.py b/plugins/modules/oneandone_load_balancer.py index 2d19a98adf..5a8ce7b8f0 100644 --- a/plugins/modules/oneandone_load_balancer.py +++ b/plugins/modules/oneandone_load_balancer.py @@ -78,15 +78,15 @@ options: choices: ["ROUND_ROBIN", "LEAST_CONNECTIONS"] datacenter: description: - - ID or country code of the datacenter where the load balancer will be created. + - ID or country code of the datacenter where the load balancer is created. - If not specified, it defaults to V(US). type: str choices: ["US", "ES", "DE", "GB"] required: false rules: description: - - A list of rule objects that will be set for the load balancer. Each rule must contain protocol, port_balancer, and - port_server parameters, in addition to source parameter, which is optional. + - A list of rule objects that are set for the load balancer. Each rule must contain protocol, port_balancer, and port_server + parameters, in addition to source parameter, which is optional. type: list elements: dict default: [] @@ -111,15 +111,15 @@ options: default: [] add_rules: description: - - A list of rules that will be added to an existing load balancer. It is syntax is the same as the one used for rules - parameter. Used in combination with O(state=update). + - A list of rules that are added to an existing load balancer. It is syntax is the same as the one used for rules parameter. + Used in combination with O(state=update). type: list elements: dict required: false default: [] remove_rules: description: - - A list of rule IDs that will be removed from an existing load balancer. Used in combination with O(state=update). + - A list of rule IDs that are removed from an existing load balancer. Used in combination with O(state=update). type: list elements: str required: false @@ -245,7 +245,7 @@ RETURN = r""" load_balancer: description: Information about the load balancer that was processed. type: dict - sample: '{"id": "92B74394A397ECC3359825C1656D67A6", "name": "Default Balancer"}' + sample: {"id": "92B74394A397ECC3359825C1656D67A6", "name": "Default Balancer"} returned: always """ @@ -344,7 +344,7 @@ def _add_load_balancer_rules(module, oneandone_conn, load_balancer_id, rules): if module.check_mode: lb_id = get_load_balancer(oneandone_conn, load_balancer_id) - if (load_balancer_rules and lb_id): + if load_balancer_rules and lb_id: return True return False diff --git a/plugins/modules/oneandone_monitoring_policy.py b/plugins/modules/oneandone_monitoring_policy.py index a0aa17611e..2d8693156c 100644 --- a/plugins/modules/oneandone_monitoring_policy.py +++ b/plugins/modules/oneandone_monitoring_policy.py @@ -89,7 +89,7 @@ options: required: true ports: description: - - Array of ports that will be monitoring. + - Array of ports that are to be monitored. type: list elements: dict default: [] @@ -114,7 +114,7 @@ options: required: true processes: description: - - Array of processes that will be monitoring. + - Array of processes that are to be monitored. type: list elements: dict default: [] @@ -413,7 +413,7 @@ RETURN = r""" monitoring_policy: description: Information about the monitoring policy that was processed. type: dict - sample: '{"id": "92B74394A397ECC3359825C1656D67A6", "name": "Default Policy"}' + sample: {"id": "92B74394A397ECC3359825C1656D67A6", "name": "Default Policy"} returned: always """ @@ -537,7 +537,7 @@ def _add_processes(module, oneandone_conn, monitoring_policy_id, processes): if module.check_mode: mp_id = get_monitoring_policy(oneandone_conn, monitoring_policy_id) - if (monitoring_policy_processes and mp_id): + if monitoring_policy_processes and mp_id: return True return False diff --git a/plugins/modules/oneandone_private_network.py b/plugins/modules/oneandone_private_network.py index 1a56fe345c..f39c464f96 100644 --- a/plugins/modules/oneandone_private_network.py +++ b/plugins/modules/oneandone_private_network.py @@ -50,7 +50,7 @@ options: type: str datacenter: description: - - The identifier of the datacenter where the private network will be created. + - The identifier of the datacenter where the private network is created. type: str choices: [US, ES, DE, GB] network_address: @@ -143,7 +143,7 @@ RETURN = r""" private_network: description: Information about the private network. type: dict - sample: '{"name": "backup_network", "id": "55726DEDA20C99CF6F2AF8F18CAC9963"}' + sample: {"name": "backup_network", "id": "55726DEDA20C99CF6F2AF8F18CAC9963"} returned: always """ diff --git a/plugins/modules/oneandone_public_ip.py b/plugins/modules/oneandone_public_ip.py index c30c0bbdc7..b6b49c5b4a 100644 --- a/plugins/modules/oneandone_public_ip.py +++ b/plugins/modules/oneandone_public_ip.py @@ -43,7 +43,7 @@ options: required: false datacenter: description: - - ID of the datacenter where the IP will be created (only for unassigned IPs). + - ID of the datacenter where the IP is created (only for unassigned IPs). type: str choices: [US, ES, DE, GB] default: US @@ -110,7 +110,7 @@ RETURN = r""" public_ip: description: Information about the public IP that was processed. type: dict - sample: '{"id": "F77CC589EBC120905B4F4719217BFF6D", "ip": "10.5.132.106"}' + sample: {"id": "F77CC589EBC120905B4F4719217BFF6D", "ip": "10.5.132.106"} returned: always """ diff --git a/plugins/modules/oneandone_server.py b/plugins/modules/oneandone_server.py index ae9198c7d0..7683ea1480 100644 --- a/plugins/modules/oneandone_server.py +++ b/plugins/modules/oneandone_server.py @@ -73,8 +73,8 @@ options: type: float hdds: description: - - A list of hard disks with nested O(ignore:hdds[].size) and O(ignore:hdds[].is_main) properties. It must be provided with O(vcore), - O(cores_per_processor), and O(ram) parameters. + - A list of hard disks with nested O(ignore:hdds[].size) and O(ignore:hdds[].is_main) properties. It must be provided + with O(vcore), O(cores_per_processor), and O(ram) parameters. type: list elements: dict private_network: diff --git a/plugins/modules/onepassword_info.py b/plugins/modules/onepassword_info.py index 00fa847c07..5689d28fe6 100644 --- a/plugins/modules/onepassword_info.py +++ b/plugins/modules/onepassword_info.py @@ -51,7 +51,7 @@ options: section: type: str description: - - The name of a section within this item containing the specified field (optional, will search all sections if not + - The name of a section within this item containing the specified field (optional, it searches all sections if not specified). vault: type: str @@ -62,8 +62,7 @@ options: auto_login: type: dict description: - - A dictionary containing authentication details. If this is set, M(community.general.onepassword_info) will attempt - to sign in to 1Password automatically. + - A dictionary containing authentication details. If this is set, the module attempts to sign in to 1Password automatically. - Without this option, you must have already logged in using the 1Password CLI before running Ansible. - It is B(highly) recommended to store 1Password credentials in an Ansible Vault. Ensure that the key used to encrypt the Ansible Vault is equal to or greater in strength than the 1Password master password. @@ -72,7 +71,7 @@ options: type: str description: - 1Password subdomain name (V(subdomain).1password.com). - - If this is not specified, the most recent subdomain will be used. + - If this is not specified, the most recent subdomain is used. username: type: str description: @@ -209,7 +208,7 @@ class OnePasswordInfo(object): def _parse_field(self, data_json, item_id, field_name, section_title=None): data = json.loads(data_json) - if ('documentAttributes' in data['details']): + if 'documentAttributes' in data['details']: # This is actually a document, let's fetch the document data instead! document = self._run(["get", "document", data['overview']['title']]) return {'document': document[1].strip()} @@ -219,7 +218,7 @@ class OnePasswordInfo(object): # Some types of 1Password items have a 'password' field directly alongside the 'fields' attribute, # not inside it, so we need to check there first. - if (field_name in data['details']): + if field_name in data['details']: return {field_name: data['details'][field_name]} # Otherwise we continue looking inside the 'fields' attribute for the specified field. @@ -375,7 +374,7 @@ def main(): username=dict(type='str'), master_password=dict(required=True, type='str', no_log=True), secret_key=dict(type='str', no_log=True), - ), default=None), + )), search_terms=dict(required=True, type='list', elements='dict'), ), supports_check_mode=True diff --git a/plugins/modules/oneview_ethernet_network.py b/plugins/modules/oneview_ethernet_network.py index 823fea3b2c..7ba3abb6e4 100644 --- a/plugins/modules/oneview_ethernet_network.py +++ b/plugins/modules/oneview_ethernet_network.py @@ -27,9 +27,9 @@ options: state: description: - Indicates the desired state for the Ethernet Network resource. - - V(present) will ensure data properties are compliant with OneView. - - V(absent) will remove the resource from OneView, if it exists. - - V(default_bandwidth_reset) will reset the network connection template to the default. + - V(present) ensures data properties are compliant with OneView. + - V(absent) removes the resource from OneView, if it exists. + - V(default_bandwidth_reset) resets the network connection template to the default. type: str default: present choices: [present, absent, default_bandwidth_reset] diff --git a/plugins/modules/oneview_fc_network.py b/plugins/modules/oneview_fc_network.py index 312a5dc893..3063e80757 100644 --- a/plugins/modules/oneview_fc_network.py +++ b/plugins/modules/oneview_fc_network.py @@ -24,8 +24,8 @@ options: state: description: - Indicates the desired state for the Fibre Channel Network resource. - - V(present) will ensure data properties are compliant with OneView. - - V(absent) will remove the resource from OneView, if it exists. + - V(present) ensures data properties are compliant with OneView. + - V(absent) removes the resource from OneView, if it exists. type: str choices: ['present', 'absent'] required: true diff --git a/plugins/modules/oneview_fc_network_info.py b/plugins/modules/oneview_fc_network_info.py index af20869dc3..9de22ef55c 100644 --- a/plugins/modules/oneview_fc_network_info.py +++ b/plugins/modules/oneview_fc_network_info.py @@ -87,8 +87,8 @@ class FcNetworkInfoModule(OneViewModuleBase): def __init__(self): argument_spec = dict( - name=dict(required=False, type='str'), - params=dict(required=False, type='dict') + name=dict(type='str'), + params=dict(type='dict') ) super(FcNetworkInfoModule, self).__init__( diff --git a/plugins/modules/oneview_fcoe_network.py b/plugins/modules/oneview_fcoe_network.py index 15128bd372..37fbff9ef4 100644 --- a/plugins/modules/oneview_fcoe_network.py +++ b/plugins/modules/oneview_fcoe_network.py @@ -25,8 +25,8 @@ options: state: description: - Indicates the desired state for the FCoE Network resource. - - V(present) will ensure data properties are compliant with OneView. - - V(absent) will remove the resource from OneView, if it exists. + - V(present) ensures data properties are compliant with OneView. + - V(absent) removes the resource from OneView, if it exists. type: str default: present choices: ['present', 'absent'] diff --git a/plugins/modules/oneview_logical_interconnect_group.py b/plugins/modules/oneview_logical_interconnect_group.py index a45224cb31..2683fc5468 100644 --- a/plugins/modules/oneview_logical_interconnect_group.py +++ b/plugins/modules/oneview_logical_interconnect_group.py @@ -28,8 +28,8 @@ options: state: description: - Indicates the desired state for the Logical Interconnect Group resource. - - V(absent) will remove the resource from OneView, if it exists. - - V(present) will ensure data properties are compliant with OneView. + - V(absent) removes the resource from OneView, if it exists. + - V(present) ensures data properties are compliant with OneView. type: str choices: [absent, present] default: present diff --git a/plugins/modules/oneview_network_set.py b/plugins/modules/oneview_network_set.py index a7fae51f21..ee5d3560a7 100644 --- a/plugins/modules/oneview_network_set.py +++ b/plugins/modules/oneview_network_set.py @@ -27,8 +27,8 @@ options: state: description: - Indicates the desired state for the Network Set resource. - - V(present) will ensure data properties are compliant with OneView. - - V(absent) will remove the resource from OneView, if it exists. + - V(present) ensures data properties are compliant with OneView. + - V(absent) removes the resource from OneView, if it exists. type: str default: present choices: ['present', 'absent'] diff --git a/plugins/modules/online_server_info.py b/plugins/modules/online_server_info.py index d676d1a0e7..a06dae1926 100644 --- a/plugins/modules/online_server_info.py +++ b/plugins/modules/online_server_info.py @@ -41,7 +41,7 @@ online_server_info: type: list elements: dict sample: - "online_server_info": [ + [ { "abuse": "abuse@example.com", "anti_ddos": false, diff --git a/plugins/modules/online_user_info.py b/plugins/modules/online_user_info.py index c76c71f2e5..5b1628adad 100644 --- a/plugins/modules/online_user_info.py +++ b/plugins/modules/online_user_info.py @@ -37,7 +37,7 @@ online_user_info: returned: success type: dict sample: - "online_user_info": { + { "company": "foobar LLC", "email": "foobar@example.com", "first_name": "foo", diff --git a/plugins/modules/open_iscsi.py b/plugins/modules/open_iscsi.py index defb0a072b..80360833a2 100644 --- a/plugins/modules/open_iscsi.py +++ b/plugins/modules/open_iscsi.py @@ -44,7 +44,7 @@ options: login: description: - Whether the target node should be connected. - - When O(target) is omitted, will login to all available. + - When O(target) is omitted, it logins to all available. type: bool aliases: [state] node_auth: @@ -84,7 +84,7 @@ options: description: - Whether the list of target nodes on the portal should be (re)discovered and added to the persistent iSCSI database. - Keep in mind that C(iscsiadm) discovery resets configuration, like C(node.startup) to manual, hence combined with - O(auto_node_startup=true) will always return a changed state. + O(auto_node_startup=true) always returns a changed state. type: bool default: false show_nodes: @@ -95,7 +95,7 @@ options: rescan: description: - Rescan an established session for discovering new targets. - - When O(target) is omitted, will rescan all sessions. + - When O(target) is omitted, it rescans all sessions. type: bool default: false version_added: 4.1.0 diff --git a/plugins/modules/openbsd_pkg.py b/plugins/modules/openbsd_pkg.py index b9a541cc44..e81fce3018 100644 --- a/plugins/modules/openbsd_pkg.py +++ b/plugins/modules/openbsd_pkg.py @@ -36,9 +36,9 @@ options: elements: str state: description: - - V(present) will make sure the package is installed. - - V(latest) will make sure the latest version of the package is installed. - - V(absent) will make sure the specified package is not installed. + - V(present) ensures the package is installed. + - V(latest) ensures the latest version of the package is installed. + - V(absent) ensures the specified package is not installed. choices: [absent, latest, present, installed, removed] default: present type: str @@ -73,7 +73,7 @@ options: type: bool default: false notes: - - When used with a C(loop:) each package will be processed individually, it is much more efficient to pass the list directly + - When used with a C(loop:) each package is processed individually, it is much more efficient to pass the list directly to the O(name) option. """ diff --git a/plugins/modules/opendj_backendprop.py b/plugins/modules/opendj_backendprop.py index cd55a39d51..be4edac125 100644 --- a/plugins/modules/opendj_backendprop.py +++ b/plugins/modules/opendj_backendprop.py @@ -10,10 +10,10 @@ __metaclass__ = type DOCUMENTATION = r""" module: opendj_backendprop -short_description: Will update the backend configuration of OpenDJ using the dsconfig set-backend-prop command +short_description: Update the backend configuration of OpenDJ using the dsconfig set-backend-prop command description: - - This module will update settings for OpenDJ with the command set-backend-prop. - - It will check first using de get-backend-prop if configuration needs to be applied. + - This module updates settings for OpenDJ with the command C(set-backend-prop). + - It checks first using C(get-backend-prop) if configuration needs to be applied. author: - Werner Dijkerman (@dj-wasabi) extends_documentation_fragment: @@ -153,9 +153,9 @@ def main(): opendj_bindir=dict(default="/opt/opendj/bin", type="path"), hostname=dict(required=True), port=dict(required=True), - username=dict(default="cn=Directory Manager", required=False), - password=dict(required=False, no_log=True), - passwordfile=dict(required=False, type="path"), + username=dict(default="cn=Directory Manager"), + password=dict(no_log=True), + passwordfile=dict(type="path"), backend=dict(required=True), name=dict(required=True), value=dict(required=True), diff --git a/plugins/modules/openwrt_init.py b/plugins/modules/openwrt_init.py index bf5ce2b76a..c8c98f2d39 100644 --- a/plugins/modules/openwrt_init.py +++ b/plugins/modules/openwrt_init.py @@ -32,20 +32,19 @@ options: state: type: str description: - - V(started)/V(stopped) are idempotent actions that will not run commands unless necessary. - - V(restarted) will always bounce the service. - - V(reloaded) will always reload. + - V(started)/V(stopped) are idempotent actions that do not run commands unless necessary. + - V(restarted) always bounces the service. + - V(reloaded) always reloads. choices: ['started', 'stopped', 'restarted', 'reloaded'] enabled: description: - - Whether the service should start on boot. B(At least one of state and enabled are required). + - Whether the service should start on boot. B(At least one) of O(state) and O(enabled) are required. type: bool pattern: type: str description: - - If the service does not respond to the 'running' command, name a substring to look for as would be found in the output - of the C(ps) command as a stand-in for a 'running' result. If the string is found, the service will be assumed to - be running. + - If the service does not respond to the C(running) command, name a substring to look for as would be found in the output + of the C(ps) command as a stand-in for a C(running) result. If the string is found, the service is assumed to be running. notes: - One option other than O(name) is required. requirements: diff --git a/plugins/modules/osx_defaults.py b/plugins/modules/osx_defaults.py index 75bd03b4ad..56ff6e1ac1 100644 --- a/plugins/modules/osx_defaults.py +++ b/plugins/modules/osx_defaults.py @@ -69,7 +69,7 @@ options: state: description: - The state of the user defaults. - - If set to V(list) will query the given parameter specified by O(key). Returns V(null) is nothing found or mis-spelled. + - If set to V(list) it queries the given parameter specified by O(key). Returns V(null) is nothing found or misspelled. type: str choices: [absent, list, present] default: present @@ -191,7 +191,7 @@ class OSXDefaults(object): @staticmethod def is_int(value): as_str = str(value) - if (as_str.startswith("-")): + if as_str.startswith("-"): return as_str[1:].isdigit() else: return as_str.isdigit() diff --git a/plugins/modules/ovh_ip_failover.py b/plugins/modules/ovh_ip_failover.py index 0734e985f7..425ee614f5 100644 --- a/plugins/modules/ovh_ip_failover.py +++ b/plugins/modules/ovh_ip_failover.py @@ -49,13 +49,13 @@ options: default: true type: bool description: - - If true, the module will wait for the IP address to be moved. If false, exit without waiting. The taskId will be returned + - If V(true), the module waits for the IP address to be moved. If false, exit without waiting. The C(taskId) is returned in module output. wait_task_completion: required: false default: 0 description: - - If not 0, the module will wait for this task ID to be completed. Use O(wait_task_completion) if you want to wait for + - If not V(0), the module waits for this task ID to be completed. Use O(wait_task_completion) if you want to wait for completion of a previously executed task with O(wait_completion=false). You can execute this module repeatedly on a list of failover IPs using O(wait_completion=false) (see examples). type: int diff --git a/plugins/modules/ovh_ip_loadbalancing_backend.py b/plugins/modules/ovh_ip_loadbalancing_backend.py index cefb9231bd..8bf294a1d5 100644 --- a/plugins/modules/ovh_ip_loadbalancing_backend.py +++ b/plugins/modules/ovh_ip_loadbalancing_backend.py @@ -244,7 +244,7 @@ def main(): 'parameters. Error returned by OVH api was : {0}' .format(apiError)) - if (backendProperties['weight'] != weight): + if backendProperties['weight'] != weight: # Change weight try: client.post( @@ -263,7 +263,7 @@ def main(): .format(apiError)) moduleChanged = True - if (backendProperties['probe'] != probe): + if backendProperties['probe'] != probe: # Change probe backendProperties['probe'] = probe try: diff --git a/plugins/modules/ovh_monthly_billing.py b/plugins/modules/ovh_monthly_billing.py index 438bf7db7f..912b697517 100644 --- a/plugins/modules/ovh_monthly_billing.py +++ b/plugins/modules/ovh_monthly_billing.py @@ -98,10 +98,10 @@ def main(): argument_spec=dict( project_id=dict(required=True), instance_id=dict(required=True), - endpoint=dict(required=False), - application_key=dict(required=False, no_log=True), - application_secret=dict(required=False, no_log=True), - consumer_key=dict(required=False, no_log=True), + endpoint=dict(), + application_key=dict(no_log=True), + application_secret=dict(no_log=True), + consumer_key=dict(no_log=True), ), supports_check_mode=True ) diff --git a/plugins/modules/pacemaker_cluster.py b/plugins/modules/pacemaker_cluster.py index caf18abb27..ffed13f9c5 100644 --- a/plugins/modules/pacemaker_cluster.py +++ b/plugins/modules/pacemaker_cluster.py @@ -13,6 +13,7 @@ module: pacemaker_cluster short_description: Manage pacemaker clusters author: - Mathieu Bultel (@matbu) + - Dexter Le (@munchtoast) description: - This module can manage a pacemaker cluster and nodes from Ansible using the pacemaker CLI. extends_documentation_fragment: @@ -26,18 +27,20 @@ options: state: description: - Indicate desired state of the cluster. - choices: [cleanup, offline, online, restart] + - The value V(maintenance) has been added in community.general 11.1.0. + choices: [cleanup, offline, online, restart, maintenance] type: str - node: + name: description: - Specify which node of the cluster you want to manage. V(null) == the cluster status itself, V(all) == check the status of all nodes. type: str + aliases: ['node'] timeout: description: - - Timeout when the module should considered that the action has failed. - default: 300 + - Timeout period (in seconds) for polling the cluster operation. type: int + default: 300 force: description: - Force the change of the cluster state. @@ -63,132 +66,104 @@ out: returned: always """ -import time - -from ansible.module_utils.basic import AnsibleModule +from ansible_collections.community.general.plugins.module_utils.module_helper import StateModuleHelper +from ansible_collections.community.general.plugins.module_utils.pacemaker import pacemaker_runner, get_pacemaker_maintenance_mode -_PCS_CLUSTER_DOWN = "Error: cluster is not currently running on this node" +class PacemakerCluster(StateModuleHelper): + module = dict( + argument_spec=dict( + state=dict(type='str', choices=[ + 'cleanup', 'offline', 'online', 'restart', 'maintenance']), + name=dict(type='str', aliases=['node']), + timeout=dict(type='int', default=300), + force=dict(type='bool', default=True) + ), + supports_check_mode=True, + ) + default_state = "" + def __init_module__(self): + self.runner = pacemaker_runner(self.module) + self.vars.set('apply_all', True if not self.module.params['name'] else False) + get_args = dict([('cli_action', 'cluster'), ('state', 'status'), ('name', None), ('apply_all', self.vars.apply_all)]) + if self.module.params['state'] == "maintenance": + get_args['cli_action'] = "property" + get_args['state'] = "config" + get_args['name'] = "maintenance-mode" + elif self.module.params['state'] == "cleanup": + get_args['cli_action'] = "resource" + get_args['name'] = self.module.params['name'] -def get_cluster_status(module): - cmd = ["pcs", "cluster", "status"] - rc, out, err = module.run_command(cmd) - if out in _PCS_CLUSTER_DOWN: - return 'offline' - else: - return 'online' + self.vars.set('get_args', get_args) + self.vars.set('previous_value', self._get()['out']) + self.vars.set('value', self.vars.previous_value, change=True, diff=True) + if not self.module.params['state']: + self.module.deprecate( + 'Parameter "state" values not set is being deprecated. Make sure to provide a value for "state"', + version='12.0.0', + collection_name='community.general' + ) -def get_node_status(module, node='all'): - node_l = ["all"] if node == "all" else [] - cmd = ["pcs", "cluster", "pcsd-status"] + node_l - rc, out, err = module.run_command(cmd) - if rc == 1: - module.fail_json(msg="Command execution failed.\nCommand: `%s`\nError: %s" % (cmd, err)) - status = [] - for o in out.splitlines(): - status.append(o.split(':')) - return status + def __quit_module__(self): + self.vars.set('value', self._get()['out']) + def _process_command_output(self, fail_on_err, ignore_err_msg=""): + def process(rc, out, err): + if fail_on_err and rc != 0 and err and ignore_err_msg not in err: + self.do_raise('pcs failed with error (rc={0}): {1}'.format(rc, err)) + out = out.rstrip() + return None if out == "" else out + return process -def clean_cluster(module, timeout): - cmd = ["pcs", "resource", "cleanup"] - rc, out, err = module.run_command(cmd) - if rc == 1: - module.fail_json(msg="Command execution failed.\nCommand: `%s`\nError: %s" % (cmd, err)) + def _get(self): + with self.runner('cli_action state name') as ctx: + result = ctx.run(cli_action=self.vars.get_args['cli_action'], state=self.vars.get_args['state'], name=self.vars.get_args['name']) + return dict([('rc', result[0]), + ('out', result[1] if result[1] != "" else None), + ('err', result[2])]) + def state_cleanup(self): + with self.runner('cli_action state name', output_process=self._process_command_output(True, "Fail"), check_mode_skip=True) as ctx: + ctx.run(cli_action='resource') -def set_cluster(module, state, timeout, force): - if state == 'online': - cmd = ["pcs", "cluster", "start"] - if state == 'offline': - cmd = ["pcs", "cluster", "stop"] - if force: - cmd = cmd + ["--force"] - rc, out, err = module.run_command(cmd) - if rc == 1: - module.fail_json(msg="Command execution failed.\nCommand: `%s`\nError: %s" % (cmd, err)) + def state_offline(self): + with self.runner('cli_action state name apply_all wait', + output_process=self._process_command_output(True, "not currently running"), + check_mode_skip=True) as ctx: + ctx.run(cli_action='cluster', apply_all=self.vars.apply_all, wait=self.module.params['timeout']) - t = time.time() - ready = False - while time.time() < t + timeout: - cluster_state = get_cluster_status(module) - if cluster_state == state: - ready = True - break - if not ready: - module.fail_json(msg="Failed to set the state `%s` on the cluster\n" % (state)) + def state_online(self): + with self.runner('cli_action state name apply_all wait', + output_process=self._process_command_output(True, "currently running"), + check_mode_skip=True) as ctx: + ctx.run(cli_action='cluster', apply_all=self.vars.apply_all, wait=self.module.params['timeout']) + + if get_pacemaker_maintenance_mode(self.runner): + with self.runner('cli_action state name', output_process=self._process_command_output(True, "Fail"), check_mode_skip=True) as ctx: + ctx.run(cli_action='property', state='maintenance', name='maintenance-mode=false') + + def state_maintenance(self): + with self.runner('cli_action state name', + output_process=self._process_command_output(True, "Fail"), + check_mode_skip=True) as ctx: + ctx.run(cli_action='property', name='maintenance-mode=true') + + def state_restart(self): + with self.runner('cli_action state name apply_all wait', + output_process=self._process_command_output(True, "not currently running"), + check_mode_skip=True) as ctx: + ctx.run(cli_action='cluster', state='offline', apply_all=self.vars.apply_all, wait=self.module.params['timeout']) + ctx.run(cli_action='cluster', state='online', apply_all=self.vars.apply_all, wait=self.module.params['timeout']) + + if get_pacemaker_maintenance_mode(self.runner): + with self.runner('cli_action state name', output_process=self._process_command_output(True, "Fail"), check_mode_skip=True) as ctx: + ctx.run(cli_action='property', state='maintenance', name='maintenance-mode=false') def main(): - argument_spec = dict( - state=dict(type='str', choices=['online', 'offline', 'restart', 'cleanup']), - node=dict(type='str'), - timeout=dict(type='int', default=300), - force=dict(type='bool', default=True), - ) - - module = AnsibleModule( - argument_spec, - supports_check_mode=True, - ) - changed = False - state = module.params['state'] - node = module.params['node'] - force = module.params['force'] - timeout = module.params['timeout'] - - if state in ['online', 'offline']: - # Get cluster status - if node is None: - cluster_state = get_cluster_status(module) - if cluster_state == state: - module.exit_json(changed=changed, out=cluster_state) - else: - if module.check_mode: - module.exit_json(changed=True) - set_cluster(module, state, timeout, force) - cluster_state = get_cluster_status(module) - if cluster_state == state: - module.exit_json(changed=True, out=cluster_state) - else: - module.fail_json(msg="Fail to bring the cluster %s" % state) - else: - cluster_state = get_node_status(module, node) - # Check cluster state - for node_state in cluster_state: - if node_state[1].strip().lower() == state: - module.exit_json(changed=changed, out=cluster_state) - else: - if module.check_mode: - module.exit_json(changed=True) - # Set cluster status if needed - set_cluster(module, state, timeout, force) - cluster_state = get_node_status(module, node) - module.exit_json(changed=True, out=cluster_state) - - elif state == 'restart': - if module.check_mode: - module.exit_json(changed=True) - set_cluster(module, 'offline', timeout, force) - cluster_state = get_cluster_status(module) - if cluster_state == 'offline': - set_cluster(module, 'online', timeout, force) - cluster_state = get_cluster_status(module) - if cluster_state == 'online': - module.exit_json(changed=True, out=cluster_state) - else: - module.fail_json(msg="Failed during the restart of the cluster, the cluster cannot be started") - else: - module.fail_json(msg="Failed during the restart of the cluster, the cluster cannot be stopped") - - elif state == 'cleanup': - if module.check_mode: - module.exit_json(changed=True) - clean_cluster(module, timeout) - cluster_state = get_cluster_status(module) - module.exit_json(changed=True, out=cluster_state) + PacemakerCluster.execute() if __name__ == '__main__': diff --git a/plugins/modules/pacemaker_resource.py b/plugins/modules/pacemaker_resource.py index 38f1c45cef..2fdf785487 100644 --- a/plugins/modules/pacemaker_resource.py +++ b/plugins/modules/pacemaker_resource.py @@ -163,13 +163,15 @@ class PacemakerResource(StateModuleHelper): required_if=[('state', 'present', ['resource_type', 'resource_option'])], supports_check_mode=True, ) - default_state = "present" def __init_module__(self): - self.runner = pacemaker_runner(self.module, cli_action='resource') - self._maintenance_mode_runner = pacemaker_runner(self.module, cli_action='property') - self.vars.set('previous_value', self._get()) + self.runner = pacemaker_runner(self.module) + self.vars.set('previous_value', self._get()['out']) self.vars.set('value', self.vars.previous_value, change=True, diff=True) + self.module.params['name'] = self.module.params['name'] or None + + def __quit_module__(self): + self.vars.set('value', self._get()['out']) def _process_command_output(self, fail_on_err, ignore_err_msg=""): def process(rc, out, err): @@ -180,45 +182,31 @@ class PacemakerResource(StateModuleHelper): return process def _get(self): - with self.runner('state name', output_process=self._process_command_output(False)) as ctx: - return ctx.run(state='status') + with self.runner('cli_action state name') as ctx: + result = ctx.run(cli_action="resource", state='status') + return dict([('rc', result[0]), + ('out', result[1] if result[1] != "" else None), + ('err', result[2])]) def state_absent(self): - runner_args = ['state', 'name', 'force'] - force = get_pacemaker_maintenance_mode(self._maintenance_mode_runner) - with self.runner(runner_args, output_process=self._process_command_output(True, "does not exist"), check_mode_skip=True) as ctx: - ctx.run(force=force) - self.vars.set('value', self._get()) - self.vars.stdout = ctx.results_out - self.vars.stderr = ctx.results_err - self.vars.cmd = ctx.cmd + force = get_pacemaker_maintenance_mode(self.runner) + with self.runner('cli_action state name force', output_process=self._process_command_output(True, "does not exist"), check_mode_skip=True) as ctx: + ctx.run(cli_action='resource', force=force) def state_present(self): with self.runner( - 'state name resource_type resource_option resource_operation resource_meta resource_argument wait', - output_process=self._process_command_output(not get_pacemaker_maintenance_mode(self._maintenance_mode_runner), "already exists"), + 'cli_action state name resource_type resource_option resource_operation resource_meta resource_argument wait', + output_process=self._process_command_output(not get_pacemaker_maintenance_mode(self.runner), "already exists"), check_mode_skip=True) as ctx: - ctx.run() - self.vars.set('value', self._get()) - self.vars.stdout = ctx.results_out - self.vars.stderr = ctx.results_err - self.vars.cmd = ctx.cmd + ctx.run(cli_action='resource') def state_enabled(self): - with self.runner('state name', output_process=self._process_command_output(True, "Starting"), check_mode_skip=True) as ctx: - ctx.run() - self.vars.set('value', self._get()) - self.vars.stdout = ctx.results_out - self.vars.stderr = ctx.results_err - self.vars.cmd = ctx.cmd + with self.runner('cli_action state name', output_process=self._process_command_output(True, "Starting"), check_mode_skip=True) as ctx: + ctx.run(cli_action='resource') def state_disabled(self): - with self.runner('state name', output_process=self._process_command_output(True, "Stopped"), check_mode_skip=True) as ctx: - ctx.run() - self.vars.set('value', self._get()) - self.vars.stdout = ctx.results_out - self.vars.stderr = ctx.results_err - self.vars.cmd = ctx.cmd + with self.runner('cli_action state name', output_process=self._process_command_output(True, "Stopped"), check_mode_skip=True) as ctx: + ctx.run(cli_action='resource') def main(): diff --git a/plugins/modules/packet_device.py b/plugins/modules/packet_device.py index 39f3e71e83..f17db56c8c 100644 --- a/plugins/modules/packet_device.py +++ b/plugins/modules/packet_device.py @@ -111,9 +111,9 @@ options: state: description: - Desired state of the device. - - If set to V(present) (the default), the module call will return immediately after the device-creating HTTP request - successfully returns. - - If set to V(active), the module call will block until all the specified devices are in state active due to the Packet + - If set to V(present) (the default), the module call returns immediately after the device-creating HTTP request successfully + returns. + - If set to V(active), the module call blocks until all the specified devices are in state active due to the Packet API, or until O(wait_timeout). choices: [present, absent, active, inactive, rebooted] default: present @@ -127,16 +127,16 @@ options: wait_for_public_IPv: description: - Whether to wait for the instance to be assigned a public IPv4/IPv6 address. - - If set to 4, it will wait until IPv4 is assigned to the instance. - - If set to 6, wait until public IPv6 is assigned to the instance. + - If set to V(4), it waits until IPv4 is assigned to the instance. + - If set to V(6), it waits until public IPv6 is assigned to the instance. choices: [4, 6] type: int wait_timeout: description: - How long (seconds) to wait either for automatic IP address assignment, or for the device to reach the V(active) state. - - If O(wait_for_public_IPv) is set and O(state=active), the module will wait for both events consequently, applying - the timeout twice. + - If O(wait_for_public_IPv) is set and O(state=active), the module waits for both events consequently, applying the + timeout twice. default: 900 type: int @@ -258,12 +258,6 @@ EXAMPLES = r""" """ RETURN = r""" -changed: - description: True if a device was altered in any way (created, modified or removed). - type: bool - sample: true - returned: success - devices: description: Information about each device that was processed. type: list @@ -420,12 +414,12 @@ def get_hostname_list(module): # at this point, hostnames is a list hostnames = [h.strip() for h in hostnames] - if (len(hostnames) > 1) and (count > 1): + if len(hostnames) > 1 and count > 1: _msg = ("If you set count>1, you should only specify one hostname " "with the %d formatter, not a list of hostnames.") raise Exception(_msg) - if (len(hostnames) == 1) and (count > 0): + if len(hostnames) == 1 and count > 0: hostname_spec = hostnames[0] count_range = range(count_offset, count_offset + count) if re.search(r"%\d{0,2}d", hostname_spec): diff --git a/plugins/modules/packet_ip_subnet.py b/plugins/modules/packet_ip_subnet.py index ab74dac840..0029623a10 100644 --- a/plugins/modules/packet_ip_subnet.py +++ b/plugins/modules/packet_ip_subnet.py @@ -75,11 +75,11 @@ options: state: description: - Desired state of the IP subnet on the specified device. - - With O(state=present), you must specify either O(hostname) or O(device_id). Subnet with given CIDR will then be assigned + - With O(state=present), you must specify either O(hostname) or O(device_id). Subnet with given CIDR is then assigned to the specified device. - - With O(state=absent), you can specify either O(hostname) or O(device_id). The subnet will be removed from specified + - With O(state=absent), you can specify either O(hostname) or O(device_id). The subnet is then removed from specified devices. - - If you leave both O(hostname) and O(device_id) empty, the subnet will be removed from any device it is assigned to. + - If you leave both O(hostname) and O(device_id) empty, the subnet is then removed from any device it is assigned to. choices: ['present', 'absent'] default: 'present' type: str @@ -123,12 +123,6 @@ EXAMPLES = r""" """ RETURN = r""" -changed: - description: True if an IP address assignments were altered in any way (created or removed). - type: bool - sample: true - returned: success - device_id: type: str description: UUID of the device associated with the specified IP address. diff --git a/plugins/modules/packet_project.py b/plugins/modules/packet_project.py index d61c9e598b..afadec36be 100644 --- a/plugins/modules/packet_project.py +++ b/plugins/modules/packet_project.py @@ -110,12 +110,6 @@ EXAMPLES = r""" """ RETURN = r""" -changed: - description: True if a project was created or removed. - type: bool - sample: true - returned: success - name: description: Name of addressed project. type: str diff --git a/plugins/modules/packet_sshkey.py b/plugins/modules/packet_sshkey.py index 3073791b2a..ec76a17b4c 100644 --- a/plugins/modules/packet_sshkey.py +++ b/plugins/modules/packet_sshkey.py @@ -35,7 +35,7 @@ options: type: str label: description: - - Label for the key. If you keep it empty, it will be read from key string. + - Label for the key. If you keep it empty, it is read from key string. type: str aliases: [name] id: @@ -85,11 +85,6 @@ EXAMPLES = r""" """ RETURN = r""" -changed: - description: True if a sshkey was created or removed. - type: bool - sample: true - returned: always sshkeys: description: Information about sshkeys that were created/removed. type: list diff --git a/plugins/modules/pacman.py b/plugins/modules/pacman.py index 38a98bba60..359cbc51d1 100644 --- a/plugins/modules/pacman.py +++ b/plugins/modules/pacman.py @@ -41,9 +41,9 @@ options: state: description: - Whether to install (V(present) or V(installed), V(latest)), or remove (V(absent) or V(removed)) a package. - - V(present) and V(installed) will simply ensure that a desired package is installed. - - V(latest) will update the specified package if it is not of the latest available version. - - V(absent) and V(removed) will remove the specified package. + - V(present) and V(installed) simply ensure that a desired package is installed. + - V(latest) updates the specified package if it is not of the latest available version. + - V(absent) and V(removed) remove the specified package. default: present choices: [absent, installed, latest, present, removed] type: str @@ -116,20 +116,20 @@ options: reason_for: description: - Set the install reason for V(all) packages or only for V(new) packages. - - In case of O(state=latest) already installed packages which will be updated to a newer version are not counted as - V(new). + - In case of O(state=latest) already installed packages which are updated to a newer version are not counted as V(new). default: new choices: [all, new] type: str version_added: 5.4.0 notes: - - When used with a C(loop:) each package will be processed individually, it is much more efficient to pass the list directly + - When used with a C(loop:) each package is processed individually, it is much more efficient to pass the list directly to the O(name) option. - To use an AUR helper (O(executable) option), a few extra setup steps might be required beforehand. For example, a dedicated build user with permissions to install packages could be necessary. - 'In the tests, while using C(yay) as the O(executable) option, the module failed to install AUR packages with the error: C(error: target not found: ).' + - The common return values `stdout` and `stderr` are returned upon success, when needed, since community.general 4.1.0. """ RETURN = r""" @@ -142,7 +142,7 @@ packages: returned: success and O(name) is specified or O(upgrade=true) type: list elements: str - sample: [package, other-package] + sample: ["package", "other-package"] cache_updated: description: @@ -152,22 +152,6 @@ cache_updated: type: bool sample: false version_added: 4.6.0 - -stdout: - description: - - Output from pacman. - returned: success, when needed - type: str - sample: ":: Synchronizing package databases... core is up to date :: Starting full system upgrade..." - version_added: 4.1.0 - -stderr: - description: - - Error output from pacman. - returned: success, when needed - type: str - sample: "warning: libtool: local (2.4.6+44+gb9b44533-14) is newer than core (2.4.6+42+gb88cebd5-15)\nwarning ..." - version_added: 4.1.0 """ EXAMPLES = r""" diff --git a/plugins/modules/pacman_key.py b/plugins/modules/pacman_key.py index 37d17e7516..851655f9fc 100644 --- a/plugins/modules/pacman_key.py +++ b/plugins/modules/pacman_key.py @@ -18,9 +18,9 @@ description: - Add or remove gpg keys from the pacman keyring. notes: - Use full-length key ID (40 characters). - - Keys will be verified when using O(data), O(file), or O(url) unless O(verify) is overridden. - - Keys will be locally signed after being imported into the keyring. - - If the key ID exists in the keyring, the key will not be added unless O(force_update) is specified. + - Keys are verified when using O(data), O(file), or O(url) unless O(verify) is overridden. + - Keys are locally signed after being imported into the keyring. + - If the key ID exists in the keyring, the key is not added unless O(force_update) is specified. - O(data), O(file), O(url), and O(keyserver) are mutually exclusive. requirements: - gpg @@ -72,7 +72,7 @@ options: keyring: description: - The full path to the keyring folder on the remote server. - - If not specified, module will use pacman's default (V(/etc/pacman.d/gnupg)). + - If not specified, module uses pacman's default (V(/etc/pacman.d/gnupg)). - Useful if the remote system requires an alternative gnupg directory. type: path default: /etc/pacman.d/gnupg diff --git a/plugins/modules/pagerduty.py b/plugins/modules/pagerduty.py index 0c14688dbd..78443e8410 100644 --- a/plugins/modules/pagerduty.py +++ b/plugins/modules/pagerduty.py @@ -13,7 +13,7 @@ DOCUMENTATION = r""" module: pagerduty short_description: Create PagerDuty maintenance windows description: - - This module will let you create PagerDuty maintenance windows. + - This module lets you create PagerDuty maintenance windows. author: - "Andrew Newdigate (@suprememoocow)" - "Dylan Silva (@thaumos)" @@ -79,8 +79,8 @@ options: default: Created by Ansible validate_certs: description: - - If V(false), SSL certificates will not be validated. This should only be used on personally controlled sites using - self-signed certificates. + - If V(false), SSL certificates are not validated. This should only be used on personally controlled sites using self-signed + certificates. type: bool default: true """ @@ -203,7 +203,7 @@ class PagerDutyRequest(object): return False, json_out, True def _create_services_payload(self, service): - if (isinstance(service, list)): + if isinstance(service, list): return [{'id': s, 'type': 'service_reference'} for s in service] else: return [{'id': service, 'type': 'service_reference'}] @@ -242,15 +242,15 @@ def main(): module = AnsibleModule( argument_spec=dict( state=dict(required=True, choices=['running', 'started', 'ongoing', 'absent']), - name=dict(required=False), - user=dict(required=False), + name=dict(), + user=dict(), token=dict(required=True, no_log=True), - service=dict(required=False, type='list', elements='str', aliases=["services"]), - window_id=dict(required=False), - requester_id=dict(required=False), - hours=dict(default='1', required=False), # @TODO change to int? - minutes=dict(default='0', required=False), # @TODO change to int? - desc=dict(default='Created by Ansible', required=False), + service=dict(type='list', elements='str', aliases=["services"]), + window_id=dict(), + requester_id=dict(), + hours=dict(default='1'), # @TODO change to int? + minutes=dict(default='0'), # @TODO change to int? + desc=dict(default='Created by Ansible'), validate_certs=dict(default=True, type='bool'), ) ) diff --git a/plugins/modules/pagerduty_alert.py b/plugins/modules/pagerduty_alert.py index 347e849822..e3d93e8718 100644 --- a/plugins/modules/pagerduty_alert.py +++ b/plugins/modules/pagerduty_alert.py @@ -12,7 +12,7 @@ DOCUMENTATION = r""" module: pagerduty_alert short_description: Trigger, acknowledge or resolve PagerDuty incidents description: - - This module will let you trigger, acknowledge or resolve a PagerDuty incident by sending events. + - This module lets you trigger, acknowledge or resolve a PagerDuty incident by sending events. author: - "Amanpreet Singh (@ApsOps)" - "Xiao Shen (@xshen1)" @@ -43,7 +43,7 @@ options: service_id: type: str description: - - ID of PagerDuty service when incidents will be triggered, acknowledged or resolved. + - ID of PagerDuty service when incidents are triggered, acknowledged or resolved. - Required if O(api_version=v1). service_key: type: str @@ -92,10 +92,9 @@ options: type: str description: - For O(state=triggered) - Required. Short description of the problem that led to this trigger. This field (or a truncated - version) will be used when generating phone calls, SMS messages and alert emails. It will also appear on the incidents - tables in the PagerDuty UI. The maximum length is 1024 characters. - - For O(state=acknowledged) or O(state=resolved) - Text that will appear in the incident's log associated with this - event. + version) is used when generating phone calls, SMS messages and alert emails. It also appears on the incidents tables + in the PagerDuty UI. The maximum length is 1024 characters. + - For O(state=acknowledged) or O(state=resolved) - Text that appears in the incident's log associated with this event. default: Created via Ansible incident_class: type: str @@ -106,12 +105,11 @@ options: type: str description: - Identifies the incident to which this O(state) should be applied. - - For O(state=triggered) - If there is no open (in other words unresolved) incident with this key, a new one will be - created. If there is already an open incident with a matching key, this event will be appended to that incident's - log. The event key provides an easy way to 'de-dup' problem reports. If no O(incident_key) is provided, then it will - be generated by PagerDuty. + - For O(state=triggered) - If there is no open (in other words unresolved) incident with this key, a new one is created. + If there is already an open incident with a matching key, this event is appended to that incident's log. The event + key provides an easy way to 'de-dup' problem reports. If no O(incident_key) is provided, then it is generated by PagerDuty. - For O(state=acknowledged) or O(state=resolved) - This should be the incident_key you received back when the incident - was first opened by a trigger event. Acknowledge events referencing resolved or nonexistent incidents will be discarded. + was first opened by a trigger event. Acknowledge events referencing resolved or nonexistent incidents is discarded. link_url: type: str description: diff --git a/plugins/modules/pagerduty_change.py b/plugins/modules/pagerduty_change.py index 2b63859f1d..de77016969 100644 --- a/plugins/modules/pagerduty_change.py +++ b/plugins/modules/pagerduty_change.py @@ -13,8 +13,8 @@ module: pagerduty_change short_description: Track a code or infrastructure change as a PagerDuty change event version_added: 1.3.0 description: - - This module will let you create a PagerDuty change event each time the module is run. - - This is not an idempotent action and a new change event will be created each time it is run. + - This module lets you create a PagerDuty change event each time the module is run. + - This is not an idempotent action and a new change event is created each time it is run. author: - Adam Vaughan (@adamvaughan) requirements: @@ -82,7 +82,7 @@ options: type: str validate_certs: description: - - If V(false), SSL certificates for the target URL will not be validated. This should only be used on personally controlled + - If V(false), SSL certificates for the target URL are not validated. This should only be used on personally controlled sites using self-signed certificates. required: false default: true @@ -121,15 +121,14 @@ def main(): argument_spec=dict( integration_key=dict(required=True, type='str', no_log=True), summary=dict(required=True, type='str'), - source=dict(required=False, default='Ansible', type='str'), - user=dict(required=False, type='str'), - repo=dict(required=False, type='str'), - revision=dict(required=False, type='str'), - environment=dict(required=False, type='str'), - link_url=dict(required=False, type='str'), - link_text=dict(required=False, type='str'), - url=dict(required=False, - default='https://events.pagerduty.com/v2/change/enqueue', type='str'), + source=dict(default='Ansible', type='str'), + user=dict(type='str'), + repo=dict(type='str'), + revision=dict(type='str'), + environment=dict(type='str'), + link_url=dict(type='str'), + link_text=dict(type='str'), + url=dict(default='https://events.pagerduty.com/v2/change/enqueue', type='str'), validate_certs=dict(default=True, type='bool') ), supports_check_mode=True diff --git a/plugins/modules/pagerduty_user.py b/plugins/modules/pagerduty_user.py index e03342c792..0830af97f3 100644 --- a/plugins/modules/pagerduty_user.py +++ b/plugins/modules/pagerduty_user.py @@ -188,7 +188,7 @@ def main(): state=dict(type='str', default='present', choices=['present', 'absent']), pd_role=dict(type='str', default='responder', choices=['global_admin', 'manager', 'responder', 'observer', 'stakeholder', 'limited_stakeholder', 'restricted_access']), - pd_teams=dict(type='list', elements='str', required=False)), + pd_teams=dict(type='list', elements='str')), required_if=[['state', 'present', ['pd_teams']], ], supports_check_mode=True, ) diff --git a/plugins/modules/pam_limits.py b/plugins/modules/pam_limits.py index d21781ac6c..536ba59662 100644 --- a/plugins/modules/pam_limits.py +++ b/plugins/modules/pam_limits.py @@ -80,7 +80,7 @@ options: default: false use_min: description: - - If set to V(true), the minimal value will be used or conserved. + - If set to V(true), the minimal value is used or conserved. - If the specified value is inferior to the value in the file, file content is replaced with the new value, else content is not modified. required: false @@ -88,7 +88,7 @@ options: default: false use_max: description: - - If set to V(true), the maximal value will be used or conserved. + - If set to V(true), the maximal value is used or conserved. - If the specified value is superior to the value in the file, file content is replaced with the new value, else content is not modified. required: false @@ -183,7 +183,7 @@ def main(): use_min=dict(default=False, type='bool'), backup=dict(default=False, type='bool'), dest=dict(default=limits_conf, type='str'), - comment=dict(required=False, default='', type='str') + comment=dict(default='', type='str') ), supports_check_mode=True, ) diff --git a/plugins/modules/pamd.py b/plugins/modules/pamd.py index ec2127483e..327316aa37 100644 --- a/plugins/modules/pamd.py +++ b/plugins/modules/pamd.py @@ -68,21 +68,20 @@ options: type: str module_arguments: description: - - When O(state=updated), the O(module_arguments) will replace existing module_arguments. - - When O(state=args_absent) args matching those listed in O(module_arguments) will be removed. + - When O(state=updated), the O(module_arguments) replace existing module_arguments. + - When O(state=args_absent) args matching those listed in O(module_arguments) are removed. - When O(state=args_present) any args listed in O(module_arguments) are added if missing from the existing rule. - - Furthermore, if the module argument takes a value denoted by C(=), the value will be changed to that specified in - module_arguments. + - Furthermore, if the module argument takes a value denoted by C(=), the value changes to that specified in module_arguments. type: list elements: str state: description: - - The default of V(updated) will modify an existing rule if type, control and module_path all match an existing rule. - - With V(before), the new rule will be inserted before a rule matching type, control and module_path. - - Similarly, with V(after), the new rule will be inserted after an existing rulematching type, control and module_path. + - The default of V(updated) modifies an existing rule if type, control and module_path all match an existing rule. + - With V(before), the new rule is inserted before a rule matching type, control and module_path. + - Similarly, with V(after), the new rule is inserted after an existing rulematching type, control and module_path. - With either V(before) or V(after) O(new_type), O(new_control), and O(new_module_path) must all be specified. - - If state is V(args_absent) or V(args_present), O(new_type), O(new_control), and O(new_module_path) will be ignored. - - State V(absent) will remove the rule. + - If state is V(args_absent) or V(args_present), O(new_type), O(new_control), and O(new_module_path) are ignored. + - State V(absent) removes the rule. type: str choices: [absent, before, after, args_absent, args_present, updated] default: updated diff --git a/plugins/modules/parted.py b/plugins/modules/parted.py index 7fc9f320d2..4bf0897afc 100644 --- a/plugins/modules/parted.py +++ b/plugins/modules/parted.py @@ -50,7 +50,7 @@ options: type: int unit: description: - - Selects the current default unit that Parted will use to display locations and capacities on the disk and to interpret + - Selects the current default unit that Parted uses to display locations and capacities on the disk and to interpret those given by the user if they are not suffixed by an unit. - When fetching information about a disk, it is recommended to always specify a unit. type: str @@ -59,8 +59,7 @@ options: label: description: - Disk label type or partition table to use. - - If O(device) already contains a different label, it will be changed to O(label) and any previous partitions will be - lost. + - If O(device) already contains a different label, it is changed to O(label) and any previous partitions are lost. - A O(name) must be specified for a V(gpt) partition table. type: str choices: [aix, amiga, bsd, dvh, gpt, loop, mac, msdos, pc98, sun] @@ -74,8 +73,8 @@ options: default: primary part_start: description: - - Where the partition will start as offset from the beginning of the disk, that is, the "distance" from the start of - the disk. Negative numbers specify distance from the end of the disk. + - Where the partition starts as offset from the beginning of the disk, that is, the "distance" from the start of the + disk. Negative numbers specify distance from the end of the disk. - The distance can be specified with all the units supported by parted (except compat) and it is case sensitive, for example V(10GiB), V(15%). - Using negative values may require setting of O(fs_type) (see notes). @@ -83,8 +82,8 @@ options: default: 0% part_end: description: - - Where the partition will end as offset from the beginning of the disk, that is, the "distance" from the start of the - disk. Negative numbers specify distance from the end of the disk. + - Where the partition ends as offset from the beginning of the disk, that is, the "distance" from the start of the disk. + Negative numbers specify distance from the end of the disk. - The distance can be specified with all the units supported by parted (except compat) and it is case sensitive, for example V(10GiB), V(15%). type: str @@ -100,13 +99,13 @@ options: state: description: - Whether to create or delete a partition. - - If set to V(info) the module will only return the device information. + - If set to V(info) the module only returns the device information. type: str choices: [absent, present, info] default: info fs_type: description: - - If specified and the partition does not exist, will set filesystem type to given partition. + - If specified and the partition does not exist, sets filesystem type to given partition. - Parameter optional, but see notes below about negative O(part_start) values. type: str version_added: '0.2.0' diff --git a/plugins/modules/pear.py b/plugins/modules/pear.py index 05135925bc..5eb84b509d 100644 --- a/plugins/modules/pear.py +++ b/plugins/modules/pear.py @@ -47,14 +47,14 @@ options: description: - List of regular expressions that can be used to detect prompts during pear package installation to answer the expected question. - - Prompts will be processed in the same order as the packages list. + - Prompts are processed in the same order as the packages list. - You can optionally specify an answer to any question in the list. - - If no answer is provided, the list item will only contain the regular expression. - - "To specify an answer, the item will be a dict with the regular expression as key and the answer as value C(my_regular_expression: + - If no answer is provided, the list item must contain only the regular expression. + - "To specify an answer, the item must be a dictionary with the regular expression as key and the answer as value C(my_regular_expression: 'an_answer')." - You can provide a list containing items with or without answer. - - A prompt list can be shorter or longer than the packages list but will issue a warning. - - If you want to specify that a package will not need prompts in the middle of a list, V(null). + - A prompt list can be shorter or longer than the packages list but it issues a warning. + - If you want to specify that a package does not need prompts in the middle of a list, V(null). type: list elements: raw version_added: 0.2.0 @@ -293,8 +293,8 @@ def main(): argument_spec=dict( name=dict(aliases=['pkg'], required=True), state=dict(default='present', choices=['present', 'installed', "latest", 'absent', 'removed']), - executable=dict(default=None, required=False, type='path'), - prompts=dict(default=None, required=False, type='list', elements='raw'), + executable=dict(type='path'), + prompts=dict(type='list', elements='raw'), ), supports_check_mode=True) diff --git a/plugins/modules/pingdom.py b/plugins/modules/pingdom.py index 192dd244f2..7c82063ab9 100644 --- a/plugins/modules/pingdom.py +++ b/plugins/modules/pingdom.py @@ -12,7 +12,7 @@ DOCUMENTATION = r""" module: pingdom short_description: Pause/unpause Pingdom alerts description: - - This module will let you pause/unpause Pingdom alerts. + - This module lets you pause/unpause Pingdom alerts. author: - "Dylan Silva (@thaumos)" - "Justin Johns (!UNKNOWN)" @@ -132,10 +132,10 @@ def main(): passwd = module.params['passwd'] key = module.params['key'] - if (state == "paused" or state == "stopped"): + if state == "paused" or state == "stopped": (rc, name, result) = pause(checkid, uid, passwd, key) - if (state == "running" or state == "started"): + if state == "running" or state == "started": (rc, name, result) = unpause(checkid, uid, passwd, key) if rc != 0: diff --git a/plugins/modules/pip_package_info.py b/plugins/modules/pip_package_info.py index ffe2e9f401..80bdedf7fe 100644 --- a/plugins/modules/pip_package_info.py +++ b/plugins/modules/pip_package_info.py @@ -20,8 +20,8 @@ extends_documentation_fragment: options: clients: description: - - A list of the pip executables that will be used to get the packages. They can be supplied with the full path or just - the executable name, for example V(pip3.7). + - A list of the pip executables that are used to get the packages. They can be supplied with the full path or just the + executable name, for example V(pip3.7). default: ['pip'] required: false type: list @@ -59,37 +59,39 @@ packages: returned: always type: dict sample: - "packages": { - "pip": { - "Babel": [ - { - "name": "Babel", - "source": "pip", - "version": "2.6.0" - } - ], - "Flask": [ - { - "name": "Flask", - "source": "pip", - "version": "1.0.2" - } - ], - "Flask-SQLAlchemy": [ - { - "name": "Flask-SQLAlchemy", - "source": "pip", - "version": "2.3.2" - } - ], - "Jinja2": [ - { - "name": "Jinja2", - "source": "pip", - "version": "2.10" - } - ], - }, + { + "packages": { + "pip": { + "Babel": [ + { + "name": "Babel", + "source": "pip", + "version": "2.6.0" + } + ], + "Flask": [ + { + "name": "Flask", + "source": "pip", + "version": "1.0.2" + } + ], + "Flask-SQLAlchemy": [ + { + "name": "Flask-SQLAlchemy", + "source": "pip", + "version": "2.3.2" + } + ], + "Jinja2": [ + { + "name": "Jinja2", + "source": "pip", + "version": "2.10" + } + ] + } + } } """ diff --git a/plugins/modules/pipx.py b/plugins/modules/pipx.py index 5633640ea4..778810be0c 100644 --- a/plugins/modules/pipx.py +++ b/plugins/modules/pipx.py @@ -154,7 +154,7 @@ options: version_added: 9.4.0 requirements: - When using O(name) with version specifiers, the Python package C(packaging) is required. - - If the package C(packaging) is at a version lesser than C(22.0.0), it will fail silently when processing invalid specifiers, + - If the package C(packaging) is at a version lesser than C(22.0.0), it fails silently when processing invalid specifiers, like C(tox<<<<4.0). author: - "Alexei Znamensky (@russoz)" diff --git a/plugins/modules/pipx_info.py b/plugins/modules/pipx_info.py index a381421aba..fc74df496a 100644 --- a/plugins/modules/pipx_info.py +++ b/plugins/modules/pipx_info.py @@ -115,7 +115,15 @@ cmd: returned: success type: list elements: str - sample: ["/usr/bin/python3.10", "-m", "pipx", "list", "--include-injected", "--json"] + sample: + [ + "/usr/bin/python3.10", + "-m", + "pipx", + "list", + "--include-injected", + "--json" + ] version: description: Version of pipx. diff --git a/plugins/modules/pkg5_publisher.py b/plugins/modules/pkg5_publisher.py index 01c9d48cce..26abded4e2 100644 --- a/plugins/modules/pkg5_publisher.py +++ b/plugins/modules/pkg5_publisher.py @@ -16,7 +16,7 @@ author: "Peter Oliver (@mavit)" short_description: Manages Solaris 11 Image Packaging System publishers description: - IPS packages are the native packages in Solaris 11 and higher. - - This modules will configure which publishers a client will download IPS packages from. + - This module configures which publishers a client downloads IPS packages from. extends_documentation_fragment: - community.general.attributes attributes: diff --git a/plugins/modules/pkgin.py b/plugins/modules/pkgin.py index 21a3b10016..8695f1b5af 100644 --- a/plugins/modules/pkgin.py +++ b/plugins/modules/pkgin.py @@ -26,7 +26,7 @@ author: - "Shaun Zinck (@szinck)" - "Jasper Lievisse Adriaanse (@jasperla)" notes: - - 'Known bug with pkgin < 0.8.0: if a package is removed and another package depends on it, the other package will be silently + - 'Known bug with pkgin < 0.8.0: if a package is removed and another package depends on it, the other package is silently removed as well.' extends_documentation_fragment: - community.general.attributes diff --git a/plugins/modules/pkgng.py b/plugins/modules/pkgng.py index 582abd3649..58eafb9e0c 100644 --- a/plugins/modules/pkgng.py +++ b/plugins/modules/pkgng.py @@ -30,7 +30,7 @@ options: name: description: - Name or list of names of packages to install/remove. - - With O(name=*), O(state=latest) will operate, but O(state=present) and O(state=absent) will be noops. + - With O(name=*), O(state=latest) operates, but O(state=present) and O(state=absent) are noops. required: true aliases: [pkg] type: list @@ -65,19 +65,19 @@ options: type: str rootdir: description: - - For C(pkgng) versions 1.5 and later, pkg will install all packages within the specified root directory. + - For C(pkgng) versions 1.5 and later, pkg installs all packages within the specified root directory. - Can not be used together with O(chroot) or O(jail) options. required: false type: path chroot: description: - - Pkg will chroot in the specified environment. + - Pkg chroots in the specified environment. - Can not be used together with O(rootdir) or O(jail) options. required: false type: path jail: description: - - Pkg will execute in the given jail name or ID. + - Pkg executes in the given jail name or ID. - Can not be used together with O(chroot) or O(rootdir) options. type: str autoremove: @@ -103,8 +103,8 @@ options: version_added: 9.3.0 author: "bleader (@bleader)" notes: - - When using pkgsite, be careful that already in cache packages will not be downloaded again. - - When used with a C(loop:) each package will be processed individually, it is much more efficient to pass the list directly + - When using pkgsite, be careful that already in cache packages are not downloaded again. + - When used with a C(loop:) each package is processed individually, it is much more efficient to pass the list directly to the O(name) option. """ @@ -422,17 +422,17 @@ def autoremove_packages(module, run_pkgng): def main(): module = AnsibleModule( argument_spec=dict( - state=dict(default="present", choices=["present", "latest", "absent"], required=False), + state=dict(default="present", choices=["present", "latest", "absent"]), name=dict(aliases=["pkg"], required=True, type='list', elements='str'), cached=dict(default=False, type='bool'), - ignore_osver=dict(default=False, required=False, type='bool'), - annotation=dict(required=False, type='list', elements='str'), - pkgsite=dict(required=False), - rootdir=dict(required=False, type='path'), - chroot=dict(required=False, type='path'), - jail=dict(required=False, type='str'), + ignore_osver=dict(default=False, type='bool'), + annotation=dict(type='list', elements='str'), + pkgsite=dict(), + rootdir=dict(type='path'), + chroot=dict(type='path'), + jail=dict(type='str'), autoremove=dict(default=False, type='bool'), - use_globs=dict(default=True, required=False, type='bool'), + use_globs=dict(default=True, type='bool'), ), supports_check_mode=True, mutually_exclusive=[["rootdir", "chroot", "jail"]]) diff --git a/plugins/modules/pkgutil.py b/plugins/modules/pkgutil.py index 7eb18cdb20..a40bff06ec 100644 --- a/plugins/modules/pkgutil.py +++ b/plugins/modules/pkgutil.py @@ -17,7 +17,7 @@ module: pkgutil short_description: OpenCSW package management on Solaris description: - This module installs, updates and removes packages from the OpenCSW project for Solaris. - - Unlike the M(community.general.svr4pkg) module, it will resolve and download dependencies. + - Unlike the M(community.general.svr4pkg) module, it resolves and downloads dependencies. - See U(https://www.opencsw.org/) for more information about the project. author: - Alexander Winkler (@dermute) @@ -50,7 +50,7 @@ options: state: description: - Whether to install (V(present)/V(installed)), or remove (V(absent)/V(removed)) packages. - - The upgrade (V(latest)) operation will update/install the packages to the latest version available. + - The upgrade (V(latest)) operation updates/installs the packages to the latest version available. type: str required: true choices: [absent, installed, latest, present, removed] diff --git a/plugins/modules/pmem.py b/plugins/modules/pmem.py index 66c1d27033..1555ec842e 100644 --- a/plugins/modules/pmem.py +++ b/plugins/modules/pmem.py @@ -46,9 +46,9 @@ options: type: int reserved: description: - - Percentage of the capacity to reserve (V(0)-V(100)). O(reserved) will not be mapped into the system physical address - space and will be presented as reserved capacity with Show Device and Show Memory Resources Commands. - - O(reserved) will be set automatically if this is not configured. + - Percentage of the capacity to reserve (V(0)-V(100)). O(reserved) is not mapped into the system physical address space + and is presented as reserved capacity with Show Device and Show Memory Resources Commands. + - O(reserved) is set automatically if this is not configured. type: int required: false socket: @@ -147,20 +147,21 @@ result: namespace: description: The list of the detail of namespace. type: list - sample: [ - { - "appdirect": 111669149696, - "memorymode": 970662608896, - "reserved": 3626500096, - "socket": 0 - }, - { - "appdirect": 111669149696, - "memorymode": 970662608896, - "reserved": 3626500096, - "socket": 1 - } - ] + sample: + [ + { + "appdirect": 111669149696, + "memorymode": 970662608896, + "reserved": 3626500096, + "socket": 0 + }, + { + "appdirect": 111669149696, + "memorymode": 970662608896, + "reserved": 3626500096, + "socket": 1 + } + ] """ EXAMPLES = r""" diff --git a/plugins/modules/pnpm.py b/plugins/modules/pnpm.py index c4dbf55dff..2dad63a608 100644 --- a/plugins/modules/pnpm.py +++ b/plugins/modules/pnpm.py @@ -77,14 +77,14 @@ options: production: description: - Install dependencies in production mode. - - Pnpm will ignore any dependencies under C(devDependencies) in package.json. + - Pnpm ignores any dependencies under C(devDependencies) in package.json. required: false type: bool default: false dev: description: - Install dependencies in development mode. - - Pnpm will ignore any regular dependencies in C(package.json). + - Pnpm ignores any regular dependencies in C(package.json). required: false default: false type: bool @@ -339,11 +339,11 @@ class Pnpm(object): def main(): arg_spec = dict( - name=dict(default=None), - alias=dict(default=None), - path=dict(default=None, type="path"), - version=dict(default=None), - executable=dict(default=None, type="path"), + name=dict(), + alias=dict(), + path=dict(type="path"), + version=dict(), + executable=dict(type="path"), ignore_scripts=dict(default=False, type="bool"), no_optional=dict(default=False, type="bool"), production=dict(default=False, type="bool"), diff --git a/plugins/modules/portage.py b/plugins/modules/portage.py index 4a1cb1b990..8a00b934dd 100644 --- a/plugins/modules/portage.py +++ b/plugins/modules/portage.py @@ -193,7 +193,7 @@ options: quietfail: description: - Suppresses display of the build log on stdout (--quiet-fail). - - Only the die message and the path of the build log will be displayed on stdout. + - Only the die message and the path of the build log are displayed on stdout. type: bool default: false @@ -510,13 +510,13 @@ portage_absent_states = ['absent', 'unmerged', 'removed'] def main(): module = AnsibleModule( argument_spec=dict( - package=dict(type='list', elements='str', default=None, aliases=['name']), + package=dict(type='list', elements='str', aliases=['name']), state=dict( default=portage_present_states[0], choices=portage_present_states + portage_absent_states, ), update=dict(default=False, type='bool'), - backtrack=dict(default=None, type='int'), + backtrack=dict(type='int'), deep=dict(default=False, type='bool'), newuse=dict(default=False, type='bool'), changed_use=dict(default=False, type='bool'), @@ -525,18 +525,18 @@ def main(): nodeps=dict(default=False, type='bool'), onlydeps=dict(default=False, type='bool'), depclean=dict(default=False, type='bool'), - select=dict(default=None, type='bool'), + select=dict(type='bool'), quiet=dict(default=False, type='bool'), verbose=dict(default=False, type='bool'), - sync=dict(default=None, choices=['yes', 'web', 'no']), + sync=dict(choices=['yes', 'web', 'no']), getbinpkgonly=dict(default=False, type='bool'), getbinpkg=dict(default=False, type='bool'), usepkgonly=dict(default=False, type='bool'), usepkg=dict(default=False, type='bool'), keepgoing=dict(default=False, type='bool'), - jobs=dict(default=None, type='int'), - loadavg=dict(default=None, type='float'), - withbdeps=dict(default=None, type='bool'), + jobs=dict(type='int'), + loadavg=dict(type='float'), + withbdeps=dict(type='bool'), quietbuild=dict(default=False, type='bool'), quietfail=dict(default=False, type='bool'), ), diff --git a/plugins/modules/pritunl_org.py b/plugins/modules/pritunl_org.py index f264fae875..f87813031b 100644 --- a/plugins/modules/pritunl_org.py +++ b/plugins/modules/pritunl_org.py @@ -35,9 +35,9 @@ options: type: bool default: false description: - - If O(force) is V(true) and O(state) is V(absent), the module will delete the organization, no matter if it contains - users or not. By default O(force) is V(false), which will cause the module to fail the deletion of the organization - when it contains users. + - If O(force) is V(true) and O(state) is V(absent), the module deletes the organization, no matter if it contains users + or not. By default O(force) is V(false), which causes the module to fail the deletion of the organization when it + contains users. state: type: str default: 'present' @@ -176,10 +176,8 @@ def main(): argument_spec.update( dict( name=dict(required=True, type="str", aliases=["org"]), - force=dict(required=False, type="bool", default=False), - state=dict( - required=False, choices=["present", "absent"], default="present" - ), + force=dict(type="bool", default=False), + state=dict(choices=["present", "absent"], default="present"), ) ) diff --git a/plugins/modules/pritunl_org_info.py b/plugins/modules/pritunl_org_info.py index c8e75190f1..952acd8963 100644 --- a/plugins/modules/pritunl_org_info.py +++ b/plugins/modules/pritunl_org_info.py @@ -27,7 +27,7 @@ options: - org default: null description: - - Name of the Pritunl organization to search for. If none provided, the module will return all Pritunl organizations. + - Name of the Pritunl organization to search for. If none provided, the module returns all Pritunl organizations. """ EXAMPLES = r""" @@ -113,7 +113,7 @@ def main(): argument_spec.update( dict( - organization=dict(required=False, type="str", default=None, aliases=["org"]) + organization=dict(type="str", aliases=["org"]) ) ) diff --git a/plugins/modules/pritunl_user.py b/plugins/modules/pritunl_user.py index c8cc9ea9c6..45de07eba6 100644 --- a/plugins/modules/pritunl_user.py +++ b/plugins/modules/pritunl_user.py @@ -320,18 +320,14 @@ def main(): argument_spec.update( dict( organization=dict(required=True, type="str", aliases=["org"]), - state=dict( - required=False, choices=["present", "absent"], default="present" - ), + state=dict(choices=["present", "absent"], default="present"), user_name=dict(required=True, type="str"), - user_type=dict( - required=False, choices=["client", "server"], default="client" - ), - user_email=dict(required=False, type="str", default=None), - user_groups=dict(required=False, type="list", elements="str", default=None), - user_disabled=dict(required=False, type="bool", default=None), - user_gravatar=dict(required=False, type="bool", default=None), - user_mac_addresses=dict(required=False, type="list", elements="str", default=None), + user_type=dict(choices=["client", "server"], default="client"), + user_email=dict(type="str"), + user_groups=dict(type="list", elements="str"), + user_disabled=dict(type="bool"), + user_gravatar=dict(type="bool"), + user_mac_addresses=dict(type="list", elements="str"), ) ) diff --git a/plugins/modules/pritunl_user_info.py b/plugins/modules/pritunl_user_info.py index 93786b166d..2e8180675a 100644 --- a/plugins/modules/pritunl_user_info.py +++ b/plugins/modules/pritunl_user_info.py @@ -151,12 +151,8 @@ def main(): argument_spec.update( dict( organization=dict(required=True, type="str", aliases=["org"]), - user_name=dict(required=False, type="str", default=None), - user_type=dict( - required=False, - choices=["client", "server"], - default="client", - ), + user_name=dict(type="str"), + user_type=dict(choices=["client", "server"], default="client"), ) ) diff --git a/plugins/modules/pubnub_blocks.py b/plugins/modules/pubnub_blocks.py index c8992b2aa7..316fced4be 100644 --- a/plugins/modules/pubnub_blocks.py +++ b/plugins/modules/pubnub_blocks.py @@ -56,13 +56,13 @@ options: default: {} account: description: - - Name of PubNub account for from which O(application) will be used to manage blocks. - - User's account will be used if value not set or empty. + - Name of PubNub account for from which O(application) is used to manage blocks. + - User's account is used if value not set or empty. type: str default: '' application: description: - - Name of target PubNub application for which blocks configuration on specific O(keyset) will be done. + - Name of target PubNub application for which blocks configuration on specific O(keyset) is done. type: str required: true keyset: @@ -72,19 +72,19 @@ options: required: true state: description: - - Intended block state after event handlers creation / update process will be completed. + - Intended block state after event handlers creation / update process is completed. required: false default: 'present' choices: ['started', 'stopped', 'present', 'absent'] type: str name: description: - - Name of managed block which will be later visible on admin.pubnub.com. + - Name of managed block which is later visible on admin.pubnub.com. required: true type: str description: description: - - Short block description which will be later visible on U(https://admin.pubnub.com). + - Short block description which is later visible on U(https://admin.pubnub.com). - Used only if block does not exists and does not change description for existing block. required: false type: str @@ -99,8 +99,8 @@ options: - Each entry for existing handlers should contain C(name) (so target handler can be identified). Rest parameters (C(src), C(channels) and C(event)) can be added if changes required for them. - It is possible to rename event handler by adding C(changes) key to event handler payload and pass dictionary, which - will contain single key C(name), where new name should be passed. - - To remove particular event handler it is possible to set C(state) for it to C(absent) and it will be removed. + contains single key C(name), where new name should be passed. + - To remove particular event handler it is possible to set C(state) for it to C(absent) and it is removed. required: false default: [] type: list @@ -115,7 +115,7 @@ options: validate_certs: description: - This key allow to try skip certificates check when performing REST API calls. Sometimes host may have issues with - certificates on it and this will cause problems to call PubNub REST API. + certificates on it and this causes problems to call PubNub REST API. - If check should be ignored V(false) should be passed to this parameter. required: false default: true @@ -532,9 +532,9 @@ def _content_of_file_at_path(path): def main(): fields = dict( - email=dict(default='', required=False, type='str'), - password=dict(default='', required=False, type='str', no_log=True), - account=dict(default='', required=False, type='str'), + email=dict(default='', type='str'), + password=dict(default='', type='str', no_log=True), + account=dict(default='', type='str'), application=dict(required=True, type='str'), keyset=dict(required=True, type='str', no_log=False), state=dict(default='present', type='str', diff --git a/plugins/modules/pulp_repo.py b/plugins/modules/pulp_repo.py index 0af129d26a..cc7f001837 100644 --- a/plugins/modules/pulp_repo.py +++ b/plugins/modules/pulp_repo.py @@ -36,7 +36,7 @@ options: description: - C(httplib2), the library used by the M(ansible.builtin.uri) module only sends authentication information when a webservice responds to an initial request with a 401 status. Since some basic auth services do not properly send a 401, logins - will fail. This option forces the sending of the Basic authentication header upon initial request. + fail. This option forces the sending of the Basic authentication header upon initial request. type: bool default: false generate_sqlite: @@ -131,22 +131,22 @@ options: default: true state: description: - - The repo state. A state of V(sync) will queue a sync of the repo. This is asynchronous but not delayed like a scheduled - sync. A state of V(publish) will use the repository's distributor to publish the content. + - The repo state. A state of V(sync) queues a sync of the repo. This is asynchronous but not delayed like a scheduled + sync. A state of V(publish) uses the repository's distributor to publish the content. default: present choices: ["present", "absent", "sync", "publish"] type: str url_password: description: - The password for use in HTTP basic authentication to the pulp API. If the O(url_username) parameter is not specified, - the O(url_password) parameter will not be used. + the O(url_password) parameter is not used. url_username: description: - The username for use in HTTP basic authentication to the pulp API. validate_certs: description: - - If V(false), SSL certificates will not be validated. This should only be used on personally controlled sites using - self-signed certificates. + - If V(false), SSL certificates are not validated. This should only be used on personally controlled sites using self-signed + certificates. type: bool default: true wait_for_completion: diff --git a/plugins/modules/puppet.py b/plugins/modules/puppet.py index a631a8ec55..a1ab66efc6 100644 --- a/plugins/modules/puppet.py +++ b/plugins/modules/puppet.py @@ -66,8 +66,8 @@ options: logdest: description: - Where the puppet logs should go, if puppet apply is being used. - - V(all) will go to both C(console) and C(syslog). - - V(stdout) will be deprecated and replaced by C(console). + - V(all) goes to both C(console) and C(syslog). + - V(stdout) is deprecated and replaced by C(console). type: str choices: [all, stdout, syslog] default: stdout @@ -128,8 +128,8 @@ options: - The default value, V(C), is supported on every system, but can lead to encoding errors if UTF-8 is used in the output. - Use V(C.UTF-8) or V(en_US.UTF-8) or similar UTF-8 supporting locales in case of problems. You need to make sure the selected locale is supported on the system the puppet agent runs on. - - Starting with community.general 9.1.0, you can use the value V(auto) and the module will try and determine the best - parseable locale to use. + - Starting with community.general 9.1.0, you can use the value V(auto) and the module tries to determine the best parseable + locale to use. type: str default: C version_added: 8.6.0 diff --git a/plugins/modules/pushbullet.py b/plugins/modules/pushbullet.py index 2f13f1dee2..990ac36525 100644 --- a/plugins/modules/pushbullet.py +++ b/plugins/modules/pushbullet.py @@ -114,12 +114,12 @@ def main(): module = AnsibleModule( argument_spec=dict( api_key=dict(type='str', required=True, no_log=True), - channel=dict(type='str', default=None), - device=dict(type='str', default=None), + channel=dict(type='str'), + device=dict(type='str'), push_type=dict(type='str', default="note", choices=['note', 'link']), title=dict(type='str', required=True), - body=dict(type='str', default=None), - url=dict(type='str', default=None), + body=dict(type='str'), + url=dict(type='str'), ), mutually_exclusive=( ['channel', 'device'], diff --git a/plugins/modules/pushover.py b/plugins/modules/pushover.py index ae57411531..dcfce34a06 100644 --- a/plugins/modules/pushover.py +++ b/plugins/modules/pushover.py @@ -15,7 +15,7 @@ short_description: Send notifications through U(https://pushover.net) description: - Send notifications through pushover to subscriber list of devices and email addresses. Requires pushover app on devices. notes: - - You will require a pushover.net account to use this module. But no account is required to receive messages. + - You need a pushover.net account to use this module. But no account is required to receive messages. extends_documentation_fragment: - community.general.attributes attributes: @@ -140,7 +140,7 @@ def main(): msg=dict(required=True), app_token=dict(required=True, no_log=True), user_key=dict(required=True, no_log=True), - pri=dict(required=False, default='0', choices=['-2', '-1', '0', '1', '2']), + pri=dict(default='0', choices=['-2', '-1', '0', '1', '2']), device=dict(type='str'), ), ) diff --git a/plugins/modules/python_requirements_info.py b/plugins/modules/python_requirements_info.py index a8ef5a952f..cbe93dd944 100644 --- a/plugins/modules/python_requirements_info.py +++ b/plugins/modules/python_requirements_info.py @@ -92,7 +92,7 @@ python_system_path: - /usr/lib/python/site-packages/ valid: description: A dictionary of dependencies that matched their desired versions. If no version was specified, then RV(ignore:desired) - will be V(null). + is V(null). returned: always type: dict sample: diff --git a/plugins/modules/redfish_command.py b/plugins/modules/redfish_command.py index 25f92bd1f7..f8578488e9 100644 --- a/plugins/modules/redfish_command.py +++ b/plugins/modules/redfish_command.py @@ -229,8 +229,8 @@ options: description: - Custom OEM properties for HTTP Multipart Push updates. - If set, then O(update_custom_oem_header) is required too. - - The properties will be passed raw without any validation or conversion by Ansible. This means the content can be a - file, a string, or any other data. If the content is a dict that should be converted to JSON, then the content must + - The properties are passed raw without any validation or conversion by Ansible. This means the content can be a file, + a string, or any other data. If the content is a dictionary that should be converted to JSON, then the content must be converted to JSON before passing it to this module using the P(ansible.builtin.to_json#filter) filter. type: raw version_added: '10.1.0' @@ -830,15 +830,16 @@ return_values: returned: on success type: dict version_added: 6.1.0 - sample: { - "update_status": { - "handle": "/redfish/v1/TaskService/TaskMonitors/735", - "messages": [], - "resets_requested": [], - "ret": true, - "status": "New" + sample: + { + "update_status": { + "handle": "/redfish/v1/TaskService/TaskMonitors/735", + "messages": [], + "resets_requested": [], + "ret": true, + "status": "New" + } } - } """ from ansible.module_utils.basic import AnsibleModule diff --git a/plugins/modules/redfish_config.py b/plugins/modules/redfish_config.py index 8700d4b8de..6eba0b0048 100644 --- a/plugins/modules/redfish_config.py +++ b/plugins/modules/redfish_config.py @@ -166,9 +166,9 @@ options: volume_details: required: false description: - - Setting dict of volume to be created. - - If C(CapacityBytes) key is not specified in this dictionary, the size of the volume will be determined by the Redfish - service. It is possible the size will not be the maximum available size. + - Setting dictionary of volume to be created. + - If C(CapacityBytes) key is not specified in this dictionary, the size of the volume is determined by the Redfish service. + It is possible the size is not the maximum available size. type: dict default: {} version_added: '7.5.0' diff --git a/plugins/modules/redhat_subscription.py b/plugins/modules/redhat_subscription.py index 6818253c9d..165bfb2891 100644 --- a/plugins/modules/redhat_subscription.py +++ b/plugins/modules/redhat_subscription.py @@ -21,7 +21,7 @@ notes: - 'The module tries to use the D-Bus C(rhsm) service (part of C(subscription-manager)) to register, starting from community.general 6.5.0: this is done so credentials (username, password, activation keys) can be passed to C(rhsm) in a secure way. C(subscription-manager) itself gets credentials only as arguments of command line parameters, which is I(not) secure, as they can be easily stolen - by checking the process listing on the system. Due to limitations of the D-Bus interface of C(rhsm), the module will I(not) + by checking the process listing on the system. Due to limitations of the D-Bus interface of C(rhsm), the module does I(not) use D-Bus for registration when trying either to register using O(token), or when specifying O(environment), or when the system is old (typically RHEL 7 older than 7.4, RHEL 6, and older).' - In order to register a system, subscription-manager requires either a username and password, or an activationkey and an @@ -132,10 +132,9 @@ options: pool_ids: description: - Specify subscription pool IDs to consume. - - 'A pool ID may be specified as a C(string) - just the pool ID (for example - V(0123456789abcdef0123456789abcdef)), or as a C(dict) with the pool ID as the key, and a quantity as the value (for - example V(0123456789abcdef0123456789abcdef: 2). If the quantity is provided, it is used to consume multiple entitlements - from a pool (the pool must support this).' + - 'A pool ID may be specified as a C(string) - just the pool ID (for example V(0123456789abcdef0123456789abcdef)), or + as a C(dict) with the pool ID as the key, and a quantity as the value (for example V(0123456789abcdef0123456789abcdef: + 2). If the quantity is provided, it is used to consume multiple entitlements from a pool (the pool must support this).' default: [] type: list elements: raw @@ -167,8 +166,8 @@ options: - Set syspurpose attributes in file C(/etc/rhsm/syspurpose/syspurpose.json) and synchronize these attributes with RHSM server. Syspurpose attributes help attach the most appropriate subscriptions to the system automatically. When C(syspurpose.json) file already contains some attributes, then new attributes overwrite existing attributes. When some attribute is not - listed in the new list of attributes, the existing attribute will be removed from C(syspurpose.json) file. Unknown - attributes are ignored. + listed in the new list of attributes, the existing attribute is removed from C(syspurpose.json) file. Unknown attributes + are ignored. type: dict suboptions: usage: @@ -187,7 +186,7 @@ options: sync: description: - When this option is V(true), then syspurpose attributes are synchronized with RHSM server immediately. When this - option is V(false), then syspurpose attributes will be synchronized with RHSM server by rhsmcertd daemon. + option is V(false), then syspurpose attributes are synchronized with RHSM server by rhsmcertd daemon. type: bool default: false """ diff --git a/plugins/modules/redis_data.py b/plugins/modules/redis_data.py index 03ae78dce3..4efe409b72 100644 --- a/plugins/modules/redis_data.py +++ b/plugins/modules/redis_data.py @@ -33,7 +33,7 @@ options: type: str expiration: description: - - Expiration time in milliseconds. Setting this flag will always result in a change in the database. + - Expiration time in milliseconds. Setting this option always results in a change in the database. required: false type: int non_existing: @@ -143,11 +143,11 @@ def main(): redis_auth_args = redis_auth_argument_spec() module_args = dict( key=dict(type='str', required=True, no_log=False), - value=dict(type='str', required=False), - expiration=dict(type='int', required=False), - non_existing=dict(type='bool', required=False), - existing=dict(type='bool', required=False), - keep_ttl=dict(type='bool', required=False), + value=dict(type='str'), + expiration=dict(type='int'), + non_existing=dict(type='bool'), + existing=dict(type='bool'), + keep_ttl=dict(type='bool'), state=dict(type='str', default='present', choices=['present', 'absent']), ) diff --git a/plugins/modules/redis_data_incr.py b/plugins/modules/redis_data_incr.py index 7630d621dc..d5f2fe05c2 100644 --- a/plugins/modules/redis_data_incr.py +++ b/plugins/modules/redis_data_incr.py @@ -21,8 +21,8 @@ attributes: support: partial details: - For C(check_mode) to work, the specified O(login_user) needs permission to run the C(GET) command on the key, otherwise - the module will fail. - - When using C(check_mode) the module will try to calculate the value that Redis would return. If the key is not present, + the module fails. + - When using C(check_mode) the module tries to calculate the value that Redis would return. If the key is not present, V(0.0) is used as value. diff_mode: support: none @@ -98,8 +98,8 @@ def main(): redis_auth_args = redis_auth_argument_spec() module_args = dict( key=dict(type='str', required=True, no_log=False), - increment_int=dict(type='int', required=False), - increment_float=dict(type='float', required=False), + increment_int=dict(type='int'), + increment_float=dict(type='float'), ) module_args.update(redis_auth_args) diff --git a/plugins/modules/rhevm.py b/plugins/modules/rhevm.py index a23448cc7a..7536b7843a 100644 --- a/plugins/modules/rhevm.py +++ b/plugins/modules/rhevm.py @@ -812,7 +812,7 @@ class RHEVConn(object): setChanged() HOST = self.get_Host(host_name) state = HOST.status.state - while (state != 'non_operational' and state != 'up'): + while state != 'non_operational' and state != 'up': HOST = self.get_Host(host_name) state = HOST.status.state time.sleep(1) diff --git a/plugins/modules/rhsm_release.py b/plugins/modules/rhsm_release.py index 6408d3c171..665c734849 100644 --- a/plugins/modules/rhsm_release.py +++ b/plugins/modules/rhsm_release.py @@ -14,8 +14,8 @@ short_description: Set or Unset RHSM Release version description: - Sets or unsets the release version used by RHSM repositories. notes: - - This module will fail on an unregistered system. Use the M(community.general.redhat_subscription) module to register a - system prior to setting the RHSM release. + - This module fails on an unregistered system. Use the M(community.general.redhat_subscription) module to register a system + prior to setting the RHSM release. - It is possible to interact with C(subscription-manager) only as root, so root permissions are required to successfully run this module. requirements: diff --git a/plugins/modules/rhsm_repository.py b/plugins/modules/rhsm_repository.py index c80caa0d6c..e59fcd27b4 100644 --- a/plugins/modules/rhsm_repository.py +++ b/plugins/modules/rhsm_repository.py @@ -48,7 +48,7 @@ options: purge: description: - Disable all currently enabled repositories that are not not specified in O(name). Only set this to V(true) if passing - in a list of repositories to the O(name) field. Using this with C(loop) will most likely not have the desired result. + in a list of repositories to the O(name) field. Using this with C(loop) is likely not to have the desired result. type: bool default: false """ diff --git a/plugins/modules/riak.py b/plugins/modules/riak.py index d7b45af5cd..2009ca0a22 100644 --- a/plugins/modules/riak.py +++ b/plugins/modules/riak.py @@ -62,8 +62,8 @@ options: type: str validate_certs: description: - - If V(false), SSL certificates will not be validated. This should only be used on personally controlled sites using - self-signed certificates. + - If V(false), SSL certificates are not validated. This should only be used on personally controlled sites using self-signed + certificates. type: bool default: true """ @@ -103,15 +103,13 @@ def main(): module = AnsibleModule( argument_spec=dict( - command=dict(required=False, default=None, choices=[ - 'ping', 'kv_test', 'join', 'plan', 'commit']), + command=dict(choices=['ping', 'kv_test', 'join', 'plan', 'commit']), config_dir=dict(default='/etc/riak', type='path'), - http_conn=dict(required=False, default='127.0.0.1:8098'), - target_node=dict(default='riak@127.0.0.1', required=False), + http_conn=dict(default='127.0.0.1:8098'), + target_node=dict(default='riak@127.0.0.1'), wait_for_handoffs=dict(default=0, type='int'), wait_for_ring=dict(default=0, type='int'), - wait_for_service=dict( - required=False, default=None, choices=['kv']), + wait_for_service=dict(choices=['kv']), validate_certs=dict(default=True, type='bool')) ) diff --git a/plugins/modules/rocketchat.py b/plugins/modules/rocketchat.py index b134916040..6da9b36e8d 100644 --- a/plugins/modules/rocketchat.py +++ b/plugins/modules/rocketchat.py @@ -69,7 +69,7 @@ options: description: - Emoji for the message sender. The representation for the available emojis can be got from Rocket Chat. - For example V(:thumbsup:). - - If O(icon_emoji) is set, O(icon_url) will not be used. + - If O(icon_emoji) is set, O(icon_url) is not used. link_names: type: int description: @@ -80,8 +80,8 @@ options: - 0 validate_certs: description: - - If V(false), SSL certificates will not be validated. This should only be used on personally controlled sites using - self-signed certificates. + - If V(false), SSL certificates are not validated. This should only be used on personally controlled sites using self-signed + certificates. type: bool default: true color: @@ -102,10 +102,10 @@ options: - Define a list of attachments. is_pre740: description: - - If V(true), the payload matches Rocket.Chat prior to 7.4.0 format. - This format has been used by the module since its inception, but is no longer supported by Rocket.Chat 7.4.0. - - The default value of the option will change to V(false) eventually. - - This parameter will be removed in a future release when Rocket.Chat 7.4.0 becomes the minimum supported version. + - If V(true), the payload matches Rocket.Chat prior to 7.4.0 format. This format has been used by the module since its + inception, but is no longer supported by Rocket.Chat 7.4.0. + - The default value of the option is going to change to V(false) eventually. + - This parameter is going to be removed in a future release when Rocket.Chat 7.4.0 becomes the minimum supported version. type: bool default: true version_added: 10.5.0 @@ -159,13 +159,6 @@ EXAMPLES = r""" delegate_to: localhost """ -RETURN = r""" -changed: - description: A flag indicating if any change was made or not. - returned: success - type: bool - sample: false -""" from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.urls import fetch_url @@ -181,7 +174,7 @@ def build_payload_for_rocketchat(module, text, channel, username, icon_url, icon elif text is not None: payload = dict(attachments=[dict(text=text, color=color)]) if channel is not None: - if (channel[0] == '#') or (channel[0] == '@'): + if channel[0] == '#' or channel[0] == '@': payload['channel'] = channel else: payload['channel'] = '#' + channel @@ -228,7 +221,7 @@ def main(): domain=dict(type='str', required=True), token=dict(type='str', required=True, no_log=True), protocol=dict(type='str', default='https', choices=['http', 'https']), - msg=dict(type='str', required=False), + msg=dict(type='str'), channel=dict(type='str'), username=dict(type='str', default='Ansible'), icon_url=dict(type='str', default='https://docs.ansible.com/favicon.ico'), @@ -236,7 +229,7 @@ def main(): link_names=dict(type='int', default=1, choices=[0, 1]), validate_certs=dict(default=True, type='bool'), color=dict(type='str', default='normal', choices=['normal', 'good', 'warning', 'danger']), - attachments=dict(type='list', elements='dict', required=False), + attachments=dict(type='list', elements='dict'), is_pre740=dict(default=True, type='bool') ) ) diff --git a/plugins/modules/rollbar_deployment.py b/plugins/modules/rollbar_deployment.py index a9658dbadf..e0cf4e31aa 100644 --- a/plugins/modules/rollbar_deployment.py +++ b/plugins/modules/rollbar_deployment.py @@ -61,7 +61,7 @@ options: default: 'https://api.rollbar.com/api/1/deploy/' validate_certs: description: - - If V(false), SSL certificates for the target URL will not be validated. This should only be used on personally controlled + - If V(false), SSL certificates for the target URL are not validated. This should only be used on personally controlled sites using self-signed certificates. required: false default: true @@ -100,13 +100,10 @@ def main(): token=dict(required=True, no_log=True), environment=dict(required=True), revision=dict(required=True), - user=dict(required=False), - rollbar_user=dict(required=False), - comment=dict(required=False), - url=dict( - required=False, - default='https://api.rollbar.com/api/1/deploy/' - ), + user=dict(), + rollbar_user=dict(), + comment=dict(), + url=dict(default='https://api.rollbar.com/api/1/deploy/'), validate_certs=dict(default=True, type='bool'), ), supports_check_mode=True diff --git a/plugins/modules/rpm_ostree_pkg.py b/plugins/modules/rpm_ostree_pkg.py index 652801ca67..01462b25f1 100644 --- a/plugins/modules/rpm_ostree_pkg.py +++ b/plugins/modules/rpm_ostree_pkg.py @@ -82,16 +82,6 @@ EXAMPLES = r""" """ RETURN = r""" -rc: - description: Return code of rpm-ostree command. - returned: always - type: int - sample: 0 -changed: - description: State changes. - returned: always - type: bool - sample: true action: description: Action performed. returned: always @@ -101,17 +91,7 @@ packages: description: A list of packages specified. returned: always type: list - sample: ['nfs-utils'] -stdout: - description: Stdout of rpm-ostree command. - returned: always - type: str - sample: 'Staging deployment...done\n...' -stderr: - description: Stderr of rpm-ostree command. - returned: always - type: str - sample: '' + sample: ["nfs-utils"] cmd: description: Full command used for performed action. returned: always diff --git a/plugins/modules/rundeck_job_run.py b/plugins/modules/rundeck_job_run.py index cb1941ab6a..1c5841b3c5 100644 --- a/plugins/modules/rundeck_job_run.py +++ b/plugins/modules/rundeck_job_run.py @@ -62,7 +62,7 @@ options: type: int description: - Job execution wait timeout in seconds. - - If the timeout is reached, the job will be aborted. + - If the timeout is reached, the job is aborted. - Keep in mind that there is a sleep based on O(wait_execution_delay) after each job status check. default: 120 abort_on_timeout: diff --git a/plugins/modules/runit.py b/plugins/modules/runit.py index f26f241537..5a575fa2ba 100644 --- a/plugins/modules/runit.py +++ b/plugins/modules/runit.py @@ -30,9 +30,10 @@ options: required: true state: description: - - V(started)/V(stopped) are idempotent actions that will not run commands unless necessary. V(restarted) will always - bounce the service (sv restart) and V(killed) will always bounce the service (sv force-stop). V(reloaded) will send - a HUP (sv reload). V(once) will run a normally downed sv once (sv once), not really an idempotent operation. + - V(started)/V(stopped) are idempotent actions that do not run commands unless necessary. + - V(restarted) always bounces the service (sv restart) and V(killed) always bounces the service (sv force-stop). + - V(reloaded) always sends a HUP (sv reload). + - V(once) runs a normally downed sv once (sv once), not really an idempotent operation. type: str choices: [killed, once, reloaded, restarted, started, stopped] enabled: diff --git a/plugins/modules/say.py b/plugins/modules/say.py index 2dc359083d..eff582f125 100644 --- a/plugins/modules/say.py +++ b/plugins/modules/say.py @@ -17,7 +17,8 @@ description: notes: - In 2.5, this module has been renamed from C(osx_say) to M(community.general.say). - If you like this module, you may also be interested in the osx_say callback plugin. - - A list of available voices, with language, can be found by running C(say -v ?) on a OSX host and C(espeak --voices) on a Linux host. + - A list of available voices, with language, can be found by running C(say -v ?) on a OSX host and C(espeak --voices) on + a Linux host. extends_documentation_fragment: - community.general.attributes attributes: @@ -66,7 +67,7 @@ def main(): module = AnsibleModule( argument_spec=dict( msg=dict(required=True), - voice=dict(required=False), + voice=dict(), ), supports_check_mode=True ) diff --git a/plugins/modules/scaleway_compute.py b/plugins/modules/scaleway_compute.py index c61030bede..f3653cd3b6 100644 --- a/plugins/modules/scaleway_compute.py +++ b/plugins/modules/scaleway_compute.py @@ -133,7 +133,7 @@ options: type: str description: - Security group unique identifier. - - If no value provided, the default security group or current security group will be used. + - If no value provided, the default security group or current security group is used. required: false """ diff --git a/plugins/modules/scaleway_container.py b/plugins/modules/scaleway_container.py index dc4df1c1d5..8351660fd6 100644 --- a/plugins/modules/scaleway_container.py +++ b/plugins/modules/scaleway_container.py @@ -89,7 +89,7 @@ options: secret_environment_variables: description: - Secret environment variables of the container namespace. - - Updating those values will not output a C(changed) state in Ansible. + - Updating those values does not output a C(changed) state in Ansible. - Injected in container at runtime. type: dict default: {} @@ -125,7 +125,7 @@ options: max_concurrency: description: - Maximum number of connections per container. - - This parameter will be used to trigger autoscaling. + - This parameter is used to trigger autoscaling. type: int protocol: diff --git a/plugins/modules/scaleway_container_namespace.py b/plugins/modules/scaleway_container_namespace.py index 802a491321..781c9ffc25 100644 --- a/plugins/modules/scaleway_container_namespace.py +++ b/plugins/modules/scaleway_container_namespace.py @@ -79,7 +79,7 @@ options: secret_environment_variables: description: - Secret environment variables of the container namespace. - - Updating those values will not output a C(changed) state in Ansible. + - Updating those values does not output a C(changed) state in Ansible. - Injected in containers at runtime. type: dict default: {} diff --git a/plugins/modules/scaleway_container_registry.py b/plugins/modules/scaleway_container_registry.py index 132dfe8bb6..4e352c5b9e 100644 --- a/plugins/modules/scaleway_container_registry.py +++ b/plugins/modules/scaleway_container_registry.py @@ -71,7 +71,7 @@ options: type: str description: - Default visibility policy. - - Everyone will be able to pull images from a V(public) registry. + - Everyone can pull images from a V(public) registry. choices: - public - private diff --git a/plugins/modules/scaleway_database_backup.py b/plugins/modules/scaleway_database_backup.py index d952452daf..48add5dfc6 100644 --- a/plugins/modules/scaleway_database_backup.py +++ b/plugins/modules/scaleway_database_backup.py @@ -354,8 +354,8 @@ def main(): region=dict(required=True, choices=SCALEWAY_REGIONS), id=dict(), name=dict(type='str'), - database_name=dict(required=False), - instance_id=dict(required=False), + database_name=dict(), + instance_id=dict(), expires_at=dict(), wait=dict(type='bool', default=False), wait_timeout=dict(type='int', default=300), diff --git a/plugins/modules/scaleway_function.py b/plugins/modules/scaleway_function.py index e2142dd1f2..4bc7c42688 100644 --- a/plugins/modules/scaleway_function.py +++ b/plugins/modules/scaleway_function.py @@ -89,7 +89,7 @@ options: secret_environment_variables: description: - Secret environment variables of the function. - - Updating those values will not output a C(changed) state in Ansible. + - Updating those values does not output a C(changed) state in Ansible. - Injected in function at runtime. type: dict default: {} diff --git a/plugins/modules/scaleway_function_namespace.py b/plugins/modules/scaleway_function_namespace.py index d43b42bc7f..e5e00bf681 100644 --- a/plugins/modules/scaleway_function_namespace.py +++ b/plugins/modules/scaleway_function_namespace.py @@ -79,7 +79,7 @@ options: secret_environment_variables: description: - Secret environment variables of the function namespace. - - Updating those values will not output a C(changed) state in Ansible. + - Updating those values does not output a C(changed) state in Ansible. - Injected in functions at runtime. type: dict default: {} diff --git a/plugins/modules/scaleway_image_info.py b/plugins/modules/scaleway_image_info.py index 44474218db..0b2fe0476d 100644 --- a/plugins/modules/scaleway_image_info.py +++ b/plugins/modules/scaleway_image_info.py @@ -57,7 +57,7 @@ scaleway_image_info: type: list elements: dict sample: - "scaleway_image_info": [ + [ { "arch": "x86_64", "creation_date": "2018-07-17T16:18:49.276456+00:00", diff --git a/plugins/modules/scaleway_ip_info.py b/plugins/modules/scaleway_ip_info.py index 8b2a78449e..0812746619 100644 --- a/plugins/modules/scaleway_ip_info.py +++ b/plugins/modules/scaleway_ip_info.py @@ -52,12 +52,12 @@ RETURN = r""" scaleway_ip_info: description: - Response from Scaleway API. - - 'For more details please refer to U(https://developers.scaleway.com/en/products/instance/api/).' + - For more details please refer to U(https://developers.scaleway.com/en/products/instance/api/). returned: success type: list elements: dict sample: - "scaleway_ip_info": [ + [ { "address": "163.172.170.243", "id": "ea081794-a581-8899-8451-386ddaf0a451", diff --git a/plugins/modules/scaleway_organization_info.py b/plugins/modules/scaleway_organization_info.py index 0aeabb94fd..a28b290bbc 100644 --- a/plugins/modules/scaleway_organization_info.py +++ b/plugins/modules/scaleway_organization_info.py @@ -44,7 +44,7 @@ scaleway_organization_info: type: list elements: dict sample: - "scaleway_organization_info": [ + [ { "address_city_name": "Paris", "address_country_code": "FR", diff --git a/plugins/modules/scaleway_security_group_info.py b/plugins/modules/scaleway_security_group_info.py index 04eb2da0d1..4cdb295282 100644 --- a/plugins/modules/scaleway_security_group_info.py +++ b/plugins/modules/scaleway_security_group_info.py @@ -56,7 +56,7 @@ scaleway_security_group_info: type: list elements: dict sample: - "scaleway_security_group_info": [ + [ { "description": "test-ams", "enable_default_security": true, diff --git a/plugins/modules/scaleway_server_info.py b/plugins/modules/scaleway_server_info.py index 8f4cbc6a2c..327715d2db 100644 --- a/plugins/modules/scaleway_server_info.py +++ b/plugins/modules/scaleway_server_info.py @@ -57,7 +57,7 @@ scaleway_server_info: type: list elements: dict sample: - "scaleway_server_info": [ + [ { "arch": "x86_64", "boot_type": "local", diff --git a/plugins/modules/scaleway_snapshot_info.py b/plugins/modules/scaleway_snapshot_info.py index ae6c3b532f..ead1826aa4 100644 --- a/plugins/modules/scaleway_snapshot_info.py +++ b/plugins/modules/scaleway_snapshot_info.py @@ -57,7 +57,7 @@ scaleway_snapshot_info: type: list elements: dict sample: - "scaleway_snapshot_info": [ + [ { "base_volume": { "id": "68386fae-4f55-4fbf-aabb-953036a85872", diff --git a/plugins/modules/scaleway_volume_info.py b/plugins/modules/scaleway_volume_info.py index c8e2cd1302..8a4986a724 100644 --- a/plugins/modules/scaleway_volume_info.py +++ b/plugins/modules/scaleway_volume_info.py @@ -57,7 +57,7 @@ scaleway_volume_info: type: list elements: dict sample: - "scaleway_volume_info": [ + [ { "creation_date": "2018-08-14T20:56:24.949660+00:00", "export_uri": null, diff --git a/plugins/modules/selinux_permissive.py b/plugins/modules/selinux_permissive.py index b5c0ee4a61..c6107309ac 100644 --- a/plugins/modules/selinux_permissive.py +++ b/plugins/modules/selinux_permissive.py @@ -24,7 +24,7 @@ attributes: options: domain: description: - - The domain that will be added or removed from the list of permissive domains. + - The domain that is added or removed from the list of permissive domains. type: str required: true aliases: [name] diff --git a/plugins/modules/selogin.py b/plugins/modules/selogin.py index 8f1b20c230..408d9221da 100644 --- a/plugins/modules/selogin.py +++ b/plugins/modules/selogin.py @@ -34,7 +34,8 @@ options: type: str aliases: [serange] description: - - MLS/MCS Security Range (MLS/MCS Systems only) SELinux Range for SELinux login mapping defaults to the SELinux user record range. + - MLS/MCS Security Range (MLS/MCS Systems only) SELinux Range for SELinux login mapping defaults to the SELinux user + record range. default: s0 state: type: str diff --git a/plugins/modules/sendgrid.py b/plugins/modules/sendgrid.py index 1099f579e1..c0e4b239bc 100644 --- a/plugins/modules/sendgrid.py +++ b/plugins/modules/sendgrid.py @@ -17,8 +17,8 @@ description: notes: - This module is non-idempotent because it sends an email through the external API. It is idempotent only in the case that the module fails. - - Like the other notification modules, this one requires an external dependency to work. In this case, you will need an - active SendGrid account. + - Like the other notification modules, this one requires an external dependency to work. In this case, you need an active + SendGrid account. - In order to use O(api_key), O(cc), O(bcc), O(attachments), O(from_name), O(html_body), and O(headers) you must C(pip install sendgrid). requirements: @@ -82,7 +82,7 @@ options: - The name you want to appear in the from field, for example V(John Doe). html_body: description: - - Whether the body is html content that should be rendered. + - Whether the body is HTML content that should be rendered. type: bool default: false headers: @@ -214,19 +214,19 @@ def post_sendgrid_api(module, username, password, from_address, to_addresses, def main(): module = AnsibleModule( argument_spec=dict( - username=dict(required=False), - password=dict(required=False, no_log=True), - api_key=dict(required=False, no_log=True), - bcc=dict(required=False, type='list', elements='str'), - cc=dict(required=False, type='list', elements='str'), - headers=dict(required=False, type='dict'), + username=dict(), + password=dict(no_log=True), + api_key=dict(no_log=True), + bcc=dict(type='list', elements='str'), + cc=dict(type='list', elements='str'), + headers=dict(type='dict'), from_address=dict(required=True), - from_name=dict(required=False), + from_name=dict(), to_addresses=dict(required=True, type='list', elements='str'), subject=dict(required=True), body=dict(required=True), - html_body=dict(required=False, default=False, type='bool'), - attachments=dict(required=False, type='list', elements='path') + html_body=dict(default=False, type='bool'), + attachments=dict(type='list', elements='path') ), supports_check_mode=True, mutually_exclusive=[ diff --git a/plugins/modules/sensu_check.py b/plugins/modules/sensu_check.py index 2cac434923..a4b5771528 100644 --- a/plugins/modules/sensu_check.py +++ b/plugins/modules/sensu_check.py @@ -14,7 +14,7 @@ module: sensu_check short_description: Manage Sensu checks description: - Manage the checks that should be run on a machine by I(Sensu). - - Most options do not have a default and will not be added to the check definition unless specified. + - Most options do not have a default and are not added to the check definition unless specified. - All defaults except O(path), O(state), O(backup) and O(metric) are not managed by this module, they are simply specified for your convenience. deprecated: @@ -45,8 +45,8 @@ options: type: str description: - Path to the JSON file of the check to be added/removed. - - Will be created if it does not exist (unless O(state=absent)). - - The parent folders need to exist when O(state=present), otherwise an error will be thrown. + - It is created if it does not exist (unless O(state=absent)). + - The parent folders need to exist when O(state=present), otherwise an error is thrown. default: /etc/sensu/conf.d/checks.json backup: description: @@ -99,7 +99,8 @@ options: type: list elements: str description: - - Other checks this check depends on, if dependencies fail handling of this check will be disabled. + - Other checks this one depends on. + - If dependencies fail handling of this check is disabled. metric: description: - Whether the check is a metric. diff --git a/plugins/modules/sensu_client.py b/plugins/modules/sensu_client.py index 955a25f44f..f87621bd6d 100644 --- a/plugins/modules/sensu_client.py +++ b/plugins/modules/sensu_client.py @@ -14,7 +14,7 @@ author: "David Moreau Simard (@dmsimard)" short_description: Manages Sensu client configuration description: - Manages Sensu client configuration. - - 'For more information, refer to the L(Sensu documentation, https://sensuapp.org/docs/latest/reference/clients.html).' + - For more information, refer to the L(Sensu documentation, https://sensuapp.org/docs/latest/reference/clients.html). deprecated: removed_in: 13.0.0 why: Sensu Core and Sensu Enterprise products have been End of Life since 2019/20. @@ -42,8 +42,8 @@ options: type: str description: - An address to help identify and reach the client. This is only informational, usually an IP address or hostname. - - If not specified it defaults to non-loopback IPv4 address as determined by Ruby C(Socket.ip_address_list) (provided by - Sensu). + - If not specified it defaults to non-loopback IPv4 address as determined by Ruby C(Socket.ip_address_list) (provided + by Sensu). subscriptions: type: list elements: str @@ -158,7 +158,13 @@ config: description: Effective client configuration, when state is present. returned: success type: dict - sample: {'name': 'client', 'subscriptions': ['default']} + sample: + { + "name": "client", + "subscriptions": [ + "default" + ] + } file: description: Path to the client configuration file. returned: success diff --git a/plugins/modules/sensu_handler.py b/plugins/modules/sensu_handler.py index ff4a77a6ff..5b5494bf1c 100644 --- a/plugins/modules/sensu_handler.py +++ b/plugins/modules/sensu_handler.py @@ -14,7 +14,7 @@ author: "David Moreau Simard (@dmsimard)" short_description: Manages Sensu handler configuration description: - Manages Sensu handler configuration. - - 'For more information, refer to the L(Sensu documentation, https://sensuapp.org/docs/latest/reference/handlers.html).' + - For more information, refer to the L(Sensu documentation, https://sensuapp.org/docs/latest/reference/handlers.html). deprecated: removed_in: 13.0.0 why: Sensu Core and Sensu Enterprise products have been End of Life since 2019/20. @@ -57,7 +57,7 @@ options: type: list elements: str description: - - An array of check result severities the handler will handle. + - An array of check result severities the handler handles. - 'NOTE: event resolution bypasses this filtering.' - "Example: [ 'warning', 'critical', 'unknown' ]." mutator: @@ -155,7 +155,12 @@ config: description: Effective handler configuration, when state is present. returned: success type: dict - sample: {'name': 'irc', 'type': 'pipe', 'command': '/usr/local/bin/notify-irc.sh'} + sample: + { + "name": "irc", + "type": "pipe", + "command": "/usr/local/bin/notify-irc.sh" + } file: description: Path to the handler configuration file. returned: success diff --git a/plugins/modules/sensu_silence.py b/plugins/modules/sensu_silence.py index a6d699f4c1..91e6f63496 100644 --- a/plugins/modules/sensu_silence.py +++ b/plugins/modules/sensu_silence.py @@ -38,10 +38,10 @@ options: expire: type: int description: - - If specified, the silence entry will be automatically cleared after this number of seconds. + - If specified, the silence entry is automatically cleared after this number of seconds. expire_on_resolve: description: - - If specified as true, the silence entry will be automatically cleared once the condition it is silencing is resolved. + - If specified as true, the silence entry is automatically cleared once the condition it is silencing is resolved. type: bool reason: type: str @@ -202,7 +202,7 @@ def create( expire_on_resolve, reason, subscription): (rc, out, changed) = query(module, url, check, subscription) for i in out: - if (i['subscription'] == subscription): + if i['subscription'] == subscription: if ( (check is None or check == i['check']) and ( @@ -265,14 +265,14 @@ def create( def main(): module = AnsibleModule( argument_spec=dict( - check=dict(required=False), - creator=dict(required=False), - expire=dict(type='int', required=False), - expire_on_resolve=dict(type='bool', required=False), - reason=dict(required=False), + check=dict(), + creator=dict(), + expire=dict(type='int'), + expire_on_resolve=dict(type='bool'), + reason=dict(), state=dict(default='present', choices=['present', 'absent']), subscription=dict(required=True), - url=dict(required=False, default='http://127.0.01:4567'), + url=dict(default='http://127.0.01:4567'), ), supports_check_mode=True ) diff --git a/plugins/modules/serverless.py b/plugins/modules/serverless.py index 937f7dcdea..8bba307440 100644 --- a/plugins/modules/serverless.py +++ b/plugins/modules/serverless.py @@ -51,7 +51,7 @@ options: deploy: description: - Whether or not to deploy artifacts after building them. - - When this option is V(false) all the functions will be built, but no stack update will be run to send them out. + - When this option is V(false) all the functions are built, but no stack update is run to send them out. - This is mostly useful for generating artifacts to be stored/deployed elsewhere. type: bool default: true diff --git a/plugins/modules/sl_vm.py b/plugins/modules/sl_vm.py index 31ec12db02..8b199f5698 100644 --- a/plugins/modules/sl_vm.py +++ b/plugins/modules/sl_vm.py @@ -173,8 +173,16 @@ options: type: int requirements: - softlayer >= 4.1.1 +notes: + - If using Python 2.7, you must install C(softlayer-python<=5.7.2). + - If using Python 3.6, you must install C(softlayer-python<=6.0.0). + - The C(softlayer-python) library, at version 6.2.6 (from Jan 2025), only supports Python version 3.8, 3.9 and 3.10. author: - Matt Colton (@mcltn) +seealso: + - name: SoftLayer API Python Client + description: The SoftLayer API Python Client is required for this module. + link: https://github.com/SoftLayer/softlayer-python """ EXAMPLES = r""" @@ -311,9 +319,9 @@ def create_virtual_instance(module): return False, None # Check if OS or Image Template is provided (Can't be both, defaults to OS) - if (module.params.get('os_code') is not None and module.params.get('os_code') != ''): + if module.params.get('os_code') is not None and module.params.get('os_code') != '': module.params['image_id'] = '' - elif (module.params.get('image_id') is not None and module.params.get('image_id') != ''): + elif module.params.get('image_id') is not None and module.params.get('image_id') != '': module.params['os_code'] = '' module.params['disks'] = [] # Blank out disks since it will use the template else: diff --git a/plugins/modules/slack.py b/plugins/modules/slack.py index 61ccfbfc9e..e009320d85 100644 --- a/plugins/modules/slack.py +++ b/plugins/modules/slack.py @@ -32,21 +32,24 @@ options: domain: type: str description: - - Slack (sub)domain for your environment without protocol. (For example V(example.slack.com).) In Ansible 1.8 and beyond, - this is deprecated and may be ignored. See token documentation for information. + - "When using new format 'Webhook token' and WebAPI tokens: this can be V(slack.com) or V(slack-gov.com) and is ignored + otherwise." + - "When using old format 'Webhook token': Slack (sub)domain for your environment without protocol. (For example V(example.slack.com).) + in Ansible 1.8 and beyond, this is deprecated and may be ignored. See token documentation for information." token: type: str description: - - Slack integration token. This authenticates you to the slack service. Make sure to use the correct type of token, + - Slack integration token. This authenticates you to the Slack service. Make sure to use the correct type of token, depending on what method you use. - 'Webhook token: Prior to Ansible 1.8, a token looked like V(3Ffe373sfhRE6y42Fg3rvf4GlK). In Ansible 1.8 and above, - Ansible adapts to the new slack API where tokens look like V(G922VJP24/D921DW937/3Ffe373sfhRE6y42Fg3rvf4GlK). If tokens - are in the new format then slack will ignore any value of domain. If the token is in the old format the domain is - required. Ansible has no control of when slack will get rid of the old API. When slack does that the old format will - stop working. ** Please keep in mind the tokens are not the API tokens but are the webhook tokens. In slack these - are found in the webhook URL which are obtained under the apps and integrations. The incoming webhooks can be added - in that area. In some cases this may be locked by your Slack admin and you must request access. It is there that the - incoming webhooks can be added. The key is on the end of the URL given to you in that section.' + Ansible adapts to the new Slack API where tokens look like V(G922VJP24/D921DW937/3Ffe373sfhRE6y42Fg3rvf4GlK). If tokens + are in the new format then Slack ignores any value of domain except V(slack.com) or V(slack-gov.com). If the token + is in the old format the domain is required. Ansible has no control of when Slack is going to remove the old API. + When Slack does that the old format is going to cease working. B(Please keep in mind the tokens are not the API tokens + but are the webhook tokens.) In Slack these are found in the webhook URL which are obtained under the apps and integrations. + The incoming webhooks can be added in that area. In some cases this may be locked by your Slack admin and you must + request access. It is there that the incoming webhooks can be added. The key is on the end of the URL given to you + in that section.' - "WebAPI token: Slack WebAPI requires a personal, bot or work application token. These tokens start with V(xoxp-), V(xoxb-) or V(xoxa-), for example V(xoxb-1234-56789abcdefghijklmnop). WebAPI token is required if you intend to receive thread_id. See Slack's documentation (U(https://api.slack.com/docs/token-types)) for more information." @@ -56,7 +59,8 @@ options: description: - Message to send. Note that the module does not handle escaping characters. Plain-text angle brackets and ampersands should be converted to HTML entities (for example C(&) to C(&)) before sending. See Slack's documentation - (U(https://api.slack.com/docs/message-formatting)) for more. + (U(https://api.slack.com/docs/message-formatting)) + for more. channel: type: str description: @@ -88,7 +92,7 @@ options: type: str description: - Emoji for the message sender. See Slack documentation for options. - - If O(icon_emoji) is set, O(icon_url) will not be used. + - If O(icon_emoji) is set, O(icon_url) is not used. link_names: type: int description: @@ -106,8 +110,8 @@ options: - 'none' validate_certs: description: - - If V(false), SSL certificates will not be validated. This should only be used on personally controlled sites using - self-signed certificates. + - If V(false), SSL certificates are not validated. This should only be used on personally controlled sites using self-signed + certificates. type: bool default: true color: @@ -137,11 +141,12 @@ options: - Setting for automatically prepending a V(#) symbol on the passed in O(channel). - The V(auto) method prepends a V(#) unless O(channel) starts with one of V(#), V(@), V(C0), V(GF), V(G0), V(CP). These prefixes only cover a small set of the prefixes that should not have a V(#) prepended. Since an exact condition which - O(channel) values must not have the V(#) prefix is not known, the value V(auto) for this option will be deprecated - in the future. It is best to explicitly set O(prepend_hash=always) or O(prepend_hash=never) to obtain the needed behavior. - - The B(current default) is V(auto), which has been B(deprecated) since community.general 10.2.0. It will change to - V(never) in community.general 12.0.0. To prevent deprecation warnings you can explicitly set O(prepend_hash) to the - value you want. We suggest to only use V(always) or V(never), but not V(auto), when explicitly setting a value. + O(channel) values must not have the V(#) prefix is not known, the value V(auto) for this option is deprecated in the + future. It is best to explicitly set O(prepend_hash=always) or O(prepend_hash=never) to obtain the needed behavior. + - The B(current default) is V(auto), which has been B(deprecated) since community.general 10.2.0. It is going to change + to V(never) in community.general 12.0.0. To prevent deprecation warnings you can explicitly set O(prepend_hash) to + the value you want. We suggest to only use V(always) or V(never), but not V(auto), when explicitly setting a value. + # when the default changes in community.general 12.0.0, add deprecation for the `auto` value for 14.0.0 choices: - 'always' - 'never' @@ -267,10 +272,10 @@ from ansible.module_utils.six.moves.urllib.parse import urlencode from ansible.module_utils.urls import fetch_url OLD_SLACK_INCOMING_WEBHOOK = 'https://%s/services/hooks/incoming-webhook?token=%s' -SLACK_INCOMING_WEBHOOK = 'https://hooks.slack.com/services/%s' -SLACK_POSTMESSAGE_WEBAPI = 'https://slack.com/api/chat.postMessage' -SLACK_UPDATEMESSAGE_WEBAPI = 'https://slack.com/api/chat.update' -SLACK_CONVERSATIONS_HISTORY_WEBAPI = 'https://slack.com/api/conversations.history' +SLACK_INCOMING_WEBHOOK = 'https://hooks.%s/services/%s' +SLACK_POSTMESSAGE_WEBAPI = 'https://%s/api/chat.postMessage' +SLACK_UPDATEMESSAGE_WEBAPI = 'https://%s/api/chat.update' +SLACK_CONVERSATIONS_HISTORY_WEBAPI = 'https://%s/api/conversations.history' # Escaping quotes and apostrophes to avoid ending string prematurely in ansible call. # We do not escape other characters used as Slack metacharacters (e.g. &, <, >). @@ -372,7 +377,11 @@ def build_payload_for_slack(text, channel, thread_id, username, icon_url, icon_e return payload -def get_slack_message(module, token, channel, ts): +def validate_slack_domain(domain): + return (domain if domain in ('slack.com', 'slack-gov.com') else 'slack.com') + + +def get_slack_message(module, domain, token, channel, ts): headers = { 'Content-Type': 'application/json; charset=UTF-8', 'Accept': 'application/json', @@ -384,7 +393,8 @@ def get_slack_message(module, token, channel, ts): 'limit': 1, 'inclusive': 'true', }) - url = SLACK_CONVERSATIONS_HISTORY_WEBAPI + '?' + qs + domain = validate_slack_domain(domain) + url = (SLACK_CONVERSATIONS_HISTORY_WEBAPI % domain) + '?' + qs response, info = fetch_url(module=module, url=url, headers=headers, method='GET') if info['status'] != 200: module.fail_json(msg="failed to get slack message") @@ -402,9 +412,11 @@ def do_notify_slack(module, domain, token, payload): use_webapi = False if token.count('/') >= 2: # New style webhook token - slack_uri = SLACK_INCOMING_WEBHOOK % token + domain = validate_slack_domain(domain) + slack_uri = SLACK_INCOMING_WEBHOOK % (domain, token) elif re.match(r'^xox[abp]-\S+$', token): - slack_uri = SLACK_UPDATEMESSAGE_WEBAPI if 'ts' in payload else SLACK_POSTMESSAGE_WEBAPI + domain = validate_slack_domain(domain) + slack_uri = (SLACK_UPDATEMESSAGE_WEBAPI if 'ts' in payload else SLACK_POSTMESSAGE_WEBAPI) % domain use_webapi = True else: if not domain: @@ -426,7 +438,7 @@ def do_notify_slack(module, domain, token, payload): if use_webapi: obscured_incoming_webhook = slack_uri else: - obscured_incoming_webhook = SLACK_INCOMING_WEBHOOK % '[obscured]' + obscured_incoming_webhook = SLACK_INCOMING_WEBHOOK % (domain, '[obscured]') module.fail_json(msg=" failed to send %s to %s: %s" % (data, obscured_incoming_webhook, info['msg'])) # each API requires different handling @@ -494,7 +506,7 @@ def main(): # if updating an existing message, we can check if there's anything to update if message_id is not None: changed = False - msg = get_slack_message(module, token, channel, message_id) + msg = get_slack_message(module, domain, token, channel, message_id) for key in ('icon_url', 'icon_emoji', 'link_names', 'color', 'attachments', 'blocks'): if msg.get(key) != module.params.get(key): changed = True diff --git a/plugins/modules/smartos_image_info.py b/plugins/modules/smartos_image_info.py index 19ad740b72..89c00f5c26 100644 --- a/plugins/modules/smartos_image_info.py +++ b/plugins/modules/smartos_image_info.py @@ -47,12 +47,20 @@ EXAMPLES = r""" - name: Print information ansible.builtin.debug: - msg: "{{ result.smartos_images[item]['name'] }}-{{ result.smartos_images[item]['version'] }} has {{ result.smartos_images[item]['clones'] }} VM(s)" + msg: >- + {{ + result.smartos_images[item]['name'] }}-{{ result.smartos_images[item]['version'] }} + has {{ result.smartos_images[item]['clones'] + }} VM(s) with_items: "{{ result.smartos_images.keys() | list }}" - name: Print information ansible.builtin.debug: - msg: "{{ smartos_images[item]['name'] }}-{{ smartos_images[item]['version'] }} has {{ smartos_images[item]['clones'] }} VM(s)" + msg: >- + {{ + smartos_images[item]['name'] }}-{{ smartos_images[item]['version'] }} + has {{ smartos_images[item]['clones'] + }} VM(s) with_items: "{{ smartos_images.keys() | list }}" """ diff --git a/plugins/modules/snap.py b/plugins/modules/snap.py index 3ffe9642fa..fd424e0dd9 100644 --- a/plugins/modules/snap.py +++ b/plugins/modules/snap.py @@ -37,8 +37,8 @@ options: state: description: - Desired state of the package. - - When O(state=present) the module will use C(snap install) if the snap is not installed, and C(snap refresh) if it - is installed but from a different channel. + - When O(state=present) the module uses C(snap install) if the snap is not installed, and C(snap refresh) if it is installed + but from a different channel. default: present choices: [absent, present, enabled, disabled] type: str @@ -56,19 +56,19 @@ options: description: - Define which release of a snap is installed and tracked for updates. This option can only be specified if there is a single snap in the task. - - If not passed, the C(snap) command will default to V(stable). - - If the value passed does not contain the C(track), it will default to C(latest). For example, if V(edge) is passed, - the module will assume the channel to be V(latest/edge). + - If not passed, the C(snap) command defaults to V(stable). + - If the value passed does not contain the C(track), it defaults to C(latest). For example, if V(edge) is passed, the + module assumes the channel to be V(latest/edge). - See U(https://snapcraft.io/docs/channels) for more details about snap channels. type: str required: false options: description: - - Set options with pattern C(key=value) or C(snap:key=value). If a snap name is given, the option will be applied to - that snap only. If the snap name is omitted, the options will be applied to all snaps listed in O(name). Options will - only be applied to active snaps. - - Options will only be applied when C(state) is set to V(present). This is done after the necessary installation or - refresh (upgrade/downgrade) of all the snaps listed in O(name). + - Set options with pattern C(key=value) or C(snap:key=value). If a snap name is given, the option is applied to that + snap only. If the snap name is omitted, the options are applied to all snaps listed in O(name). Options are only applied + to active snaps. + - Options are only applied when C(state) is set to V(present). This is done after the necessary installation or refresh + (upgrade/downgrade) of all the snaps listed in O(name). - See U(https://snapcraft.io/docs/configuration-in-snaps) for more details about snap configuration options. required: false type: list diff --git a/plugins/modules/snmp_facts.py b/plugins/modules/snmp_facts.py index a87e1d33a1..17c7bbd032 100644 --- a/plugins/modules/snmp_facts.py +++ b/plugins/modules/snmp_facts.py @@ -15,7 +15,7 @@ author: - Patrick Ogenstad (@ogenstad) short_description: Retrieve facts for a device using SNMP description: - - Retrieve facts for a device using SNMP, the facts will be inserted to the C(ansible_facts) key. + - Retrieve facts for a device using SNMP, the facts are inserted to the C(ansible_facts) key. requirements: - pysnmp extends_documentation_fragment: diff --git a/plugins/modules/solaris_zone.py b/plugins/modules/solaris_zone.py index 31e7919c08..431e0cb31d 100644 --- a/plugins/modules/solaris_zone.py +++ b/plugins/modules/solaris_zone.py @@ -51,7 +51,7 @@ options: required: true path: description: - - The path where the zone will be created. This is required when the zone is created, but not used otherwise. + - The path where the zone is created. This is required when the zone is created, but not used otherwise. type: str sparse: description: @@ -60,7 +60,7 @@ options: default: false root_password: description: - - The password hash for the root account. If not specified, the zone's root account will not have a password. + - The password hash for the root account. If not specified, the zone's root account does not have a password. type: str config: description: diff --git a/plugins/modules/sorcery.py b/plugins/modules/sorcery.py index fff3f55e07..de50741185 100644 --- a/plugins/modules/sorcery.py +++ b/plugins/modules/sorcery.py @@ -34,7 +34,7 @@ options: description: - Name of the spell or grimoire. - Multiple names can be given, separated by commas. - - Special value V(*) in conjunction with states V(latest) or V(rebuild) will update or rebuild the whole system respectively. + - Special value V(*) in conjunction with states V(latest) or V(rebuild) updates or rebuilds the whole system respectively. - The alias O(grimoire) was added in community.general 7.3.0. aliases: ["spell", "grimoire"] type: list @@ -44,7 +44,7 @@ options: description: - Repository location. - If specified, O(name) represents grimoire(s) instead of spell(s). - - Special value V(*) will pull grimoire from the official location. + - Special value V(*) pulls grimoire from the official location. - Only single item in O(name) in conjunction with V(*) can be used. - O(state=absent) must be used with a special value V(*). type: str @@ -697,11 +697,11 @@ def manage_spells(module): def main(): module = AnsibleModule( argument_spec=dict( - name=dict(default=None, aliases=['spell', 'grimoire'], type='list', elements='str'), - repository=dict(default=None, type='str'), + name=dict(aliases=['spell', 'grimoire'], type='list', elements='str'), + repository=dict(type='str'), state=dict(default='present', choices=['present', 'latest', 'absent', 'cast', 'dispelled', 'rebuild']), - depends=dict(default=None), + depends=dict(), update=dict(default=False, type='bool'), update_cache=dict(default=False, aliases=['update_codex'], type='bool'), cache_valid_time=dict(default=0, type='int') diff --git a/plugins/modules/spectrum_device.py b/plugins/modules/spectrum_device.py index 8bf4aa41b5..54cddbffb0 100644 --- a/plugins/modules/spectrum_device.py +++ b/plugins/modules/spectrum_device.py @@ -30,7 +30,7 @@ options: required: true description: - IP address of the device. - - If a hostname is given, it will be resolved to the IP address. + - If a hostname is given, it is resolved to the IP address. community: type: str description: @@ -69,13 +69,13 @@ options: - Oneclick user password. use_proxy: description: - - If V(false), it will not use a proxy, even if one is defined in an environment variable on the target hosts. + - If V(false), it does not use a proxy, even if one is defined in an environment variable on the target hosts. default: true type: bool validate_certs: description: - - If V(false), SSL certificates will not be validated. This should only be used on personally controlled sites using - self-signed certificates. + - If V(false), SSL certificates are not validated. This should only be used on personally controlled sites using self-signed + certificates. default: true type: bool agentport: @@ -85,8 +85,8 @@ options: - UDP port used for SNMP discovery. default: 161 notes: - - The devices will be created inside the I(Universe) container of the specified landscape. - - All the operations will be performed only on the specified landscape. + - The devices are created inside the I(Universe) container of the specified landscape. + - All the operations are performed only on the specified landscape. """ EXAMPLES = r""" @@ -119,7 +119,12 @@ device: description: Device data when O(state=present). returned: success type: dict - sample: {'model_handle': '0x1007ab', 'landscape': '0x100000', 'address': '10.10.5.1'} + sample: + { + "model_handle": "0x1007ab", + "landscape": "0x100000", + "address": "10.10.5.1" + } """ from socket import gethostbyname, gaierror diff --git a/plugins/modules/spectrum_model_attrs.py b/plugins/modules/spectrum_model_attrs.py index 9c9fba4deb..53cae10b74 100644 --- a/plugins/modules/spectrum_model_attrs.py +++ b/plugins/modules/spectrum_model_attrs.py @@ -47,7 +47,7 @@ options: aliases: [password] use_proxy: description: - - If V(false), it will not use a proxy, even if one is defined in an environment variable on the target hosts. + - If V(false), it does not use a proxy, even if one is defined in an environment variable on the target hosts. default: true required: false type: bool @@ -99,7 +99,7 @@ options: - C(sysName) (C(0x10b5b)); - C(Vendor_Name) (C(0x11570)); - C(Description) (C(0x230017)). - - Hex IDs are the direct identifiers in Spectrum and will always work. + - Hex IDs are the direct identifiers in Spectrum and always work. - 'To lookup hex IDs go to the UI: Locator -> Devices -> By Model Name -> -> Attributes tab.' type: str required: true @@ -123,7 +123,9 @@ EXAMPLES = r""" - name: "isManaged" value: "false" - name: "Notes" - value: "MM set on {{ ansible_date_time.iso8601 }} via CO {{ CO }} by {{ tower_user_name | default(ansible_user_id) }}" + value: >- + MM set on {{ ansible_date_time.iso8601 }} via CO {{ CO }} + by {{ tower_user_name | default(ansible_user_id) }} delegate_to: localhost register: spectrum_model_attrs_status """ diff --git a/plugins/modules/spotinst_aws_elastigroup.py b/plugins/modules/spotinst_aws_elastigroup.py index 9aa14afd8d..759a094626 100644 --- a/plugins/modules/spotinst_aws_elastigroup.py +++ b/plugins/modules/spotinst_aws_elastigroup.py @@ -11,9 +11,9 @@ short_description: Create, update or delete Spotinst AWS Elastigroups author: Spotinst (@talzur) description: - Can create, update, or delete Spotinst AWS Elastigroups Launch configuration is part of the elastigroup configuration, - so no additional modules are necessary for handling the launch configuration. You will have to have a credentials file - in this location - C($HOME/.spotinst/credentials). The credentials file must contain a row that looks like this C(token - = ). + so no additional modules are necessary for handling the launch configuration. You must have a credentials file in this + location - C($HOME/.spotinst/credentials). The credentials file must contain a row that looks like this C(token = ). - Full documentation available at U(https://help.spotinst.com/hc/en-us/articles/115003530285-Ansible-). requirements: - spotinst_sdk >= 1.0.38 @@ -41,8 +41,8 @@ options: token: description: - A Personal API Access Token issued by Spotinst. - - 'When not specified, the module will try to obtain it, in that order, from: environment variable E(SPOTINST_TOKEN), - or from the credentials path.' + - When not specified, the module tries to obtain it, in that order, from environment variable E(SPOTINST_TOKEN), or + from the credentials path. type: str availability_vs_cost: @@ -82,8 +82,7 @@ options: ebs_optimized: description: - - Enable EBS optimization for supported instances which are not enabled by default.; Note - additional charges will - be applied. + - Enable EBS optimization for supported instances which are not enabled by default. Note - additional charges are applied. type: bool ebs_volume_pool: @@ -106,7 +105,7 @@ options: fallback_to_od: description: - - In case of no spots available, Elastigroup will launch an On-demand instance instead. + - In case of no spots available, Elastigroup launches an On-demand instance instead. type: bool health_check_grace_period: @@ -140,15 +139,15 @@ options: id: description: - - The group ID if it already exists and you want to update, or delete it. This will not work unless the uniqueness_by - field is set to ID. When this is set, and the uniqueness_by field is set, the group will either be updated or deleted, + - The group ID if it already exists and you want to update, or delete it. This does not work unless the O(uniqueness_by) + field is set to ID. When this is set, and the O(uniqueness_by) field is set, the group is either updated or deleted, but not created. type: str image_id: description: - - The image ID used to launch the instance.; In case of conflict between Instance type and image type, an error will - be returned. + - The image ID used to launch the instance.; In case of conflict between Instance type and image type, an error is be + returned. required: true type: str @@ -214,13 +213,13 @@ options: on_demand_count: description: - Required if risk is not set. - - Number of on demand instances to launch. All other instances will be spot instances.; Either set this parameter or - the risk parameter. + - Number of on demand instances to launch. All other instances are spot instances.; Either set this parameter or the + O(risk) parameter. type: int on_demand_instance_type: description: - - On-demand instance type that will be provisioned. + - On-demand instance type that is provisioned. type: str opsworks: @@ -278,7 +277,7 @@ options: security_group_ids: description: - One or more security group IDs. - - In case of update it will override the existing Security Group with the new given array. + - In case of update it overrides the existing Security Group with the new given array. required: true type: list elements: str @@ -302,7 +301,7 @@ options: spot_instance_types: description: - - Spot instance type that will be provisioned. + - Spot instance type that is provisioned. required: true type: list elements: str @@ -388,7 +387,7 @@ options: - name description: - If your group names are not unique, you may use this feature to update or delete a specific group. Whenever this property - is set, you must set a group_id in order to update or delete a group, otherwise a group will be created. + is set, you must set a group_id in order to update or delete a group, otherwise a group is created. default: name type: str @@ -399,7 +398,7 @@ options: utilize_reserved_instances: description: - - In case of any available Reserved Instances, Elastigroup will utilize your reservations before purchasing Spot instances. + - In case of any available Reserved Instances, Elastigroup utilizes your reservations before purchasing Spot instances. type: bool wait_for_instances: diff --git a/plugins/modules/ss_3par_cpg.py b/plugins/modules/ss_3par_cpg.py index c9c9b4bd90..0869d67d84 100644 --- a/plugins/modules/ss_3par_cpg.py +++ b/plugins/modules/ss_3par_cpg.py @@ -38,7 +38,7 @@ options: type: str domain: description: - - Specifies the name of the domain in which the object will reside. + - Specifies the name of the domain in which the object resides. type: str growth_increment: description: @@ -46,11 +46,12 @@ options: type: str growth_limit: description: - - Specifies that the autogrow operation is limited to the specified storage amount that sets the growth limit(in MiB, GiB or TiB). + - Specifies that the autogrow operation is limited to the specified storage amount that sets the growth limit (in MiB, + GiB or TiB). type: str growth_warning: description: - - Specifies that the threshold(in MiB, GiB or TiB) of used logical disk space when exceeded results in a warning alert. + - Specifies that the threshold (in MiB, GiB or TiB) of used logical disk space when exceeded results in a warning alert. type: str high_availability: choices: diff --git a/plugins/modules/ssh_config.py b/plugins/modules/ssh_config.py index 07637e8003..6a83095f37 100644 --- a/plugins/modules/ssh_config.py +++ b/plugins/modules/ssh_config.py @@ -49,7 +49,7 @@ options: host: description: - The endpoint this configuration is valid for. - - Can be an actual address on the internet or an alias that will connect to the value of O(hostname). + - It can be an actual address on the internet or an alias that connects to the value of O(hostname). required: true type: str hostname: @@ -66,7 +66,7 @@ options: type: str identity_file: description: - - The path to an identity file (SSH private key) that will be used when connecting to this host. + - The path to an identity file (SSH private key) that is used when connecting to this host. - File need to exist and have mode V(0600) to be valid. type: path identities_only: @@ -141,7 +141,7 @@ options: version_added: 10.1.0 other_options: description: - - Provides the option to specify arbitrary SSH config entry options via a dictionary. + - Allows specifying arbitrary SSH config entry options using a dictionary. - The key names must be lower case. Keys with upper case values are rejected. - The values must be strings. Other values are rejected. type: dict @@ -162,6 +162,15 @@ EXAMPLES = r""" other_options: serveraliveinterval: '30' +- name: Add SSH config with key auto-added to agent + community.general.ssh_config: + user: devops + host: "example.com" + hostname: "staging.example.com" + identity_file: "/home/devops/.ssh/id_rsa" + add_keys_to_agent: true + state: present + - name: Delete a host from the configuration community.general.ssh_config: ssh_config_file: "{{ ssh_config_test }}" @@ -189,22 +198,27 @@ hosts_change_diff: description: A list of host diff changes. returned: on change type: list - sample: [ - { - "example.com": { - "new": { - "hostname": "github.com", - "identityfile": ["/tmp/test_ssh_config/fake_id_rsa"], - "port": "2224" - }, - "old": { - "hostname": "github.com", - "identityfile": ["/tmp/test_ssh_config/fake_id_rsa"], - "port": "2224" + sample: + [ + { + "example.com": { + "new": { + "hostname": "github.com", + "identityfile": [ + "/tmp/test_ssh_config/fake_id_rsa" + ], + "port": "2224" + }, + "old": { + "hostname": "github.com", + "identityfile": [ + "/tmp/test_ssh_config/fake_id_rsa" + ], + "port": "2224" + } } } - } - ] + ] """ import os @@ -376,7 +390,7 @@ class SSHConfig(object): def main(): module = AnsibleModule( argument_spec=dict( - group=dict(default=None, type='str'), + group=dict(type='str'), host=dict(type='str', required=True), hostname=dict(type='str'), host_key_algorithms=dict(type='str', no_log=False), @@ -384,24 +398,20 @@ def main(): identities_only=dict(type='bool'), other_options=dict(type='dict'), port=dict(type='str'), - proxycommand=dict(type='str', default=None), - proxyjump=dict(type='str', default=None), + proxycommand=dict(type='str'), + proxyjump=dict(type='str'), forward_agent=dict(type='bool'), add_keys_to_agent=dict(type='bool'), remote_user=dict(type='str'), - ssh_config_file=dict(default=None, type='path'), + ssh_config_file=dict(type='path'), state=dict(type='str', default='present', choices=['present', 'absent']), - strict_host_key_checking=dict( - type='str', - default=None, - choices=['yes', 'no', 'ask', 'accept-new'], - ), - controlmaster=dict(type='str', default=None, choices=['yes', 'no', 'ask', 'auto', 'autoask']), - controlpath=dict(type='str', default=None), - controlpersist=dict(type='str', default=None), + strict_host_key_checking=dict(type='str', choices=['yes', 'no', 'ask', 'accept-new']), + controlmaster=dict(type='str', choices=['yes', 'no', 'ask', 'auto', 'autoask']), + controlpath=dict(type='str'), + controlpersist=dict(type='str'), dynamicforward=dict(type='str'), - user=dict(default=None, type='str'), - user_known_hosts_file=dict(type='str', default=None), + user=dict(type='str'), + user_known_hosts_file=dict(type='str'), ), supports_check_mode=True, mutually_exclusive=[ diff --git a/plugins/modules/stacki_host.py b/plugins/modules/stacki_host.py index bfa4cccff5..095e0b7256 100644 --- a/plugins/modules/stacki_host.py +++ b/plugins/modules/stacki_host.py @@ -119,25 +119,6 @@ EXAMPLES = r""" state: absent """ -RETURN = r""" -changed: - description: Response to whether or not the API call completed successfully. - returned: always - type: bool - sample: true - -stdout: - description: The set of responses from the commands. - returned: always - type: list - sample: ['...', '...'] - -stdout_lines: - description: The value of stdout split into a list. - returned: always - type: list - sample: [['...', '...'], ['...'], ['...']] -""" import json diff --git a/plugins/modules/statusio_maintenance.py b/plugins/modules/statusio_maintenance.py index 9928267bde..c823a286c5 100644 --- a/plugins/modules/statusio_maintenance.py +++ b/plugins/modules/statusio_maintenance.py @@ -111,7 +111,7 @@ options: minutes: type: int description: - - The length of time in UTC that the maintenance will run (starting from playbook runtime). + - The duration of the maintenance window (starting from playbook runtime). default: 10 start_date: type: str @@ -344,30 +344,22 @@ def main(): api_id=dict(required=True), api_key=dict(required=True, no_log=True), statuspage=dict(required=True), - state=dict(required=False, default='present', - choices=['present', 'absent']), - url=dict(default='https://api.status.io', required=False), - components=dict(type='list', elements='str', required=False, default=None, - aliases=['component']), - containers=dict(type='list', elements='str', required=False, default=None, - aliases=['container']), - all_infrastructure_affected=dict(type='bool', default=False, - required=False), - automation=dict(type='bool', default=False, required=False), - title=dict(required=False, default='A new maintenance window'), - desc=dict(required=False, default='Created by Ansible'), - minutes=dict(type='int', required=False, default=10), - maintenance_notify_now=dict(type='bool', default=False, - required=False), - maintenance_notify_72_hr=dict(type='bool', default=False, - required=False), - maintenance_notify_24_hr=dict(type='bool', default=False, - required=False), - maintenance_notify_1_hr=dict(type='bool', default=False, - required=False), - maintenance_id=dict(required=False, default=None), - start_date=dict(default=None, required=False), - start_time=dict(default=None, required=False) + state=dict(default='present', choices=['present', 'absent']), + url=dict(default='https://api.status.io'), + components=dict(type='list', elements='str', aliases=['component']), + containers=dict(type='list', elements='str', aliases=['container']), + all_infrastructure_affected=dict(type='bool', default=False), + automation=dict(type='bool', default=False), + title=dict(default='A new maintenance window'), + desc=dict(default='Created by Ansible'), + minutes=dict(type='int', default=10), + maintenance_notify_now=dict(type='bool', default=False), + maintenance_notify_72_hr=dict(type='bool', default=False), + maintenance_notify_24_hr=dict(type='bool', default=False), + maintenance_notify_1_hr=dict(type='bool', default=False), + maintenance_id=dict(), + start_date=dict(), + start_time=dict() ), supports_check_mode=True, ) diff --git a/plugins/modules/sudoers.py b/plugins/modules/sudoers.py index ac1ff91ff5..f353859a98 100644 --- a/plugins/modules/sudoers.py +++ b/plugins/modules/sudoers.py @@ -42,7 +42,7 @@ options: required: true description: - The name of the sudoers rule. - - This will be used for the filename for the sudoers file managed by this rule. + - This is used for the filename for the sudoers file managed by this rule. type: str noexec: description: @@ -52,7 +52,7 @@ options: version_added: 8.4.0 nopassword: description: - - Whether a password is required when command is run with sudo. + - Whether a password is not required when command is run with sudo. default: true type: bool setenv: @@ -69,12 +69,12 @@ options: version_added: 6.2.0 runas: description: - - Specify the target user the command(s) will run as. + - Specify the target user the command(s) runs as. type: str version_added: 4.7.0 sudoers_path: description: - - The path which sudoers config files will be managed in. + - The path which sudoers config files are managed in. default: /etc/sudoers.d type: str state: @@ -92,9 +92,9 @@ options: type: str validation: description: - - If V(absent), the sudoers rule will be added without validation. - - If V(detect) and visudo is available, then the sudoers rule will be validated by visudo. - - If V(required), visudo must be available to validate the sudoers rule. + - If V(absent), the sudoers rule is added without validation. + - If V(detect) and C(visudo) is available, then the sudoers rule is validated by C(visudo). + - If V(required), C(visudo) must be available to validate the sudoers rule. type: str default: detect choices: [absent, detect, required] diff --git a/plugins/modules/supervisorctl.py b/plugins/modules/supervisorctl.py index 7df1674fea..c2ceb1a52b 100644 --- a/plugins/modules/supervisorctl.py +++ b/plugins/modules/supervisorctl.py @@ -26,8 +26,8 @@ options: type: str description: - The name of the supervisord program or group to manage. - - The name will be taken as group name when it ends with a colon V(:). - - If O(name=all), all programs and program groups will be managed. + - The name is taken as group name when it ends with a colon V(:). + - If O(name=all), all programs and program groups are managed. required: true config: type: path @@ -67,12 +67,11 @@ options: description: - Path to C(supervisorctl) executable. notes: - - When O(state=present), the module will call C(supervisorctl reread) then C(supervisorctl add) if the program/group does - not exist. - - When O(state=restarted), the module will call C(supervisorctl update) then call C(supervisorctl restart). - - When O(state=absent), the module will call C(supervisorctl reread) then C(supervisorctl remove) to remove the target program/group. - If the program/group is still running, the action will fail. If you want to stop the program/group before removing, use - O(stop_before_removing=true). + - When O(state=present), the module calls C(supervisorctl reread) then C(supervisorctl add) if the program/group does not + exist. + - When O(state=restarted), the module calls C(supervisorctl update) then calls C(supervisorctl restart). + - When O(state=absent), the module calls C(supervisorctl reread) then C(supervisorctl remove) to remove the target program/group. + If the program/group is still running, the action fails. If you want to stop the program/group before removing, use O(stop_before_removing=true). requirements: ["supervisorctl"] author: - "Matt Wright (@mattupstate)" diff --git a/plugins/modules/svc.py b/plugins/modules/svc.py index 42b6bcbeb9..4a6e21ef5f 100644 --- a/plugins/modules/svc.py +++ b/plugins/modules/svc.py @@ -30,10 +30,10 @@ options: required: true state: description: - - V(started)/V(stopped) are idempotent actions that will not run commands unless necessary. - - V(restarted) will always bounce the svc (svc -t) and V(killed) will always bounce the svc (svc -k). - - V(reloaded) will send a sigusr1 (svc -1). - - V(once) will run a normally downed svc once (svc -o), not really an idempotent operation. + - V(started)/V(stopped) are idempotent actions that do not run commands unless necessary. + - V(restarted) always bounces the svc (svc -t) and V(killed) always bounces the svc (svc -k). + - V(reloaded) sends a sigusr1 (svc -1). + - V(once) runs a normally downed svc once (svc -o), not really an idempotent operation. type: str choices: [killed, once, reloaded, restarted, started, stopped] downed: diff --git a/plugins/modules/svr4pkg.py b/plugins/modules/svr4pkg.py index 34aa599e01..76d65c8f43 100644 --- a/plugins/modules/svr4pkg.py +++ b/plugins/modules/svr4pkg.py @@ -16,7 +16,7 @@ short_description: Manage Solaris SVR4 packages description: - Manages SVR4 packages on Solaris 10 and 11. - These were the native packages on Solaris <= 10 and are available as a legacy feature in Solaris 11. - - Note that this is a very basic packaging system. It will not enforce dependencies on install or remove. + - Note that this is a very basic packaging system. It does not enforce dependencies on install or remove. author: "Boyd Adamson (@brontitall)" extends_documentation_fragment: - community.general.attributes @@ -192,10 +192,10 @@ def main(): argument_spec=dict( name=dict(required=True), state=dict(required=True, choices=['present', 'absent']), - src=dict(default=None), - proxy=dict(default=None), - response_file=dict(default=None), - zone=dict(required=False, default='all', choices=['current', 'all']), + src=dict(), + proxy=dict(), + response_file=dict(), + zone=dict(default='all', choices=['current', 'all']), category=dict(default=False, type='bool') ), supports_check_mode=True diff --git a/plugins/modules/swdepot.py b/plugins/modules/swdepot.py index 628c63f810..69ed726aa0 100644 --- a/plugins/modules/swdepot.py +++ b/plugins/modules/swdepot.py @@ -16,7 +16,7 @@ DOCUMENTATION = r""" module: swdepot short_description: Manage packages with swdepot package manager (HP-UX) description: - - Will install, upgrade and remove packages with swdepot package manager (HP-UX). + - Installs, upgrades, and removes packages with C(swdepot) package manager (HP-UX). notes: [] author: "Raul Melo (@melodous)" extends_documentation_fragment: @@ -134,7 +134,7 @@ def main(): argument_spec=dict( name=dict(aliases=['pkg'], required=True), state=dict(choices=['present', 'absent', 'latest'], required=True), - depot=dict(default=None, required=False) + depot=dict() ), supports_check_mode=True ) diff --git a/plugins/modules/swupd.py b/plugins/modules/swupd.py index 5b5dbbc48a..c01904821c 100644 --- a/plugins/modules/swupd.py +++ b/plugins/modules/swupd.py @@ -96,16 +96,6 @@ EXAMPLES = r""" manifest: 12920 """ -RETURN = r""" -stdout: - description: C(stdout) of C(swupd). - returned: always - type: str -stderr: - description: C(stderr) of C(swupd). - returned: always - type: str -""" import os from ansible.module_utils.basic import AnsibleModule diff --git a/plugins/modules/syslogger.py b/plugins/modules/syslogger.py index dbe4513d34..7f7dfabd38 100644 --- a/plugins/modules/syslogger.py +++ b/plugins/modules/syslogger.py @@ -167,17 +167,17 @@ def main(): module_args = dict( ident=dict(type='str', default='ansible_syslogger'), msg=dict(type='str', required=True), - priority=dict(type='str', required=False, + priority=dict(type='str', choices=["emerg", "alert", "crit", "err", "warning", "notice", "info", "debug"], default='info'), - facility=dict(type='str', required=False, + facility=dict(type='str', choices=["kern", "user", "mail", "daemon", "auth", "lpr", "news", "uucp", "cron", "syslog", "local0", "local1", "local2", "local3", "local4", "local5", "local6", "local7"], default='daemon'), - log_pid=dict(type='bool', required=False, default=False) + log_pid=dict(type='bool', default=False) ) module = AnsibleModule( diff --git a/plugins/modules/syspatch.py b/plugins/modules/syspatch.py index 3cedc220f7..f46671fa74 100644 --- a/plugins/modules/syspatch.py +++ b/plugins/modules/syspatch.py @@ -59,20 +59,6 @@ EXAMPLES = r""" """ RETURN = r""" -rc: - description: The command return code (0 means success). - returned: always - type: int -stdout: - description: C(syspatch) standard output. - returned: always - type: str - sample: "001_rip6cksum" -stderr: - description: C(syspatch) standard error. - returned: always - type: str - sample: "syspatch: need root privileges" reboot_needed: description: Whether or not a reboot is required after an update. returned: always @@ -103,7 +89,6 @@ def syspatch_run(module): cmd = module.get_bin_path('syspatch', True) changed = False reboot_needed = False - warnings = [] # Set safe defaults for run_flag and check_flag run_flag = ['-c'] @@ -145,11 +130,11 @@ def syspatch_run(module): # Kernel update applied reboot_needed = True elif out.lower().find('syspatch updated itself') >= 0: - warnings.append('Syspatch was updated. Please run syspatch again.') + module.warn('Syspatch was updated. Please run syspatch again.') # If no stdout, then warn user if len(out) == 0: - warnings.append('syspatch had suggested changes, but stdout was empty.') + module.warn('syspatch had suggested changes, but stdout was empty.') changed = True else: @@ -161,7 +146,6 @@ def syspatch_run(module): rc=rc, stderr=err, stdout=out, - warnings=warnings ) diff --git a/plugins/modules/sysrc.py b/plugins/modules/sysrc.py index dad379d1c0..a3e24830a0 100644 --- a/plugins/modules/sysrc.py +++ b/plugins/modules/sysrc.py @@ -7,6 +7,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later from __future__ import absolute_import, division, print_function + __metaclass__ = type DOCUMENTATION = r""" @@ -94,165 +95,122 @@ EXAMPLES = r""" jail: testjail """ -RETURN = r""" -changed: - description: Return changed for sysrc actions. - returned: always - type: bool - sample: true -""" -from ansible.module_utils.basic import AnsibleModule +from ansible_collections.community.general.plugins.module_utils.module_helper import StateModuleHelper + +import os import re -class Sysrc(object): - def __init__(self, module, name, value, path, delim, jail): - self.module = module - self.name = name - self.changed = False - self.value = value - self.path = path - self.delim = delim - self.jail = jail - self.sysrc = module.get_bin_path('sysrc', True) - - def has_unknown_variable(self, out, err): - # newer versions of sysrc use stderr instead of stdout - return err.find("unknown variable") > 0 or out.find("unknown variable") > 0 - - def exists(self): - """ - Tests whether the name is in the file. If parameter value is defined, - then tests whether name=value is in the file. These tests are necessary - because sysrc doesn't use exit codes. Instead, let sysrc read the - file's content and create a dictionary comprising the configuration. - Use this dictionary to preform the tests. - """ - (rc, out, err) = self.run_sysrc('-e', '-a') - conf = dict([i.split('=', 1) for i in out.splitlines()]) - if self.value is None: - return self.name in conf - else: - return self.name in conf and conf[self.name] == '"%s"' % self.value - - def contains(self): - (rc, out, err) = self.run_sysrc('-n', self.name) - if self.has_unknown_variable(out, err): - return False - - return self.value in out.strip().split(self.delim) - - def present(self): - if self.exists(): - return - - if not self.module.check_mode: - (rc, out, err) = self.run_sysrc("%s=%s" % (self.name, self.value)) - - self.changed = True - - def absent(self): - if not self.exists(): - return - - # inversed since we still need to mark as changed - if not self.module.check_mode: - (rc, out, err) = self.run_sysrc('-x', self.name) - if self.has_unknown_variable(out, err): - return - - self.changed = True - - def value_present(self): - if self.contains(): - return - - if self.module.check_mode: - self.changed = True - return - - setstring = '%s+=%s%s' % (self.name, self.delim, self.value) - (rc, out, err) = self.run_sysrc(setstring) - if out.find("%s:" % self.name) == 0: - values = out.split(' -> ')[1].strip().split(self.delim) - if self.value in values: - self.changed = True - - def value_absent(self): - if not self.contains(): - return - - if self.module.check_mode: - self.changed = True - return - - setstring = '%s-=%s%s' % (self.name, self.delim, self.value) - (rc, out, err) = self.run_sysrc(setstring) - if out.find("%s:" % self.name) == 0: - values = out.split(' -> ')[1].strip().split(self.delim) - if self.value not in values: - self.changed = True - - def run_sysrc(self, *args): - cmd = [self.sysrc, '-f', self.path] - if self.jail: - cmd += ['-j', self.jail] - cmd.extend(args) - - (rc, out, err) = self.module.run_command(cmd) - - return (rc, out, err) - - -def main(): - module = AnsibleModule( +class Sysrc(StateModuleHelper): + module = dict( argument_spec=dict( name=dict(type='str', required=True), - value=dict(type='str', default=None), + value=dict(type='str'), state=dict(type='str', default='present', choices=['absent', 'present', 'value_present', 'value_absent']), path=dict(type='str', default='/etc/rc.conf'), delim=dict(type='str', default=' '), - jail=dict(type='str', default=None), + jail=dict(type='str') ), - supports_check_mode=True, + supports_check_mode=True ) + output_params = ('value',) + use_old_vardict = False - name = module.params.pop('name') - # OID style names are not supported - if not re.match('^[a-zA-Z0-9_]+$', name): - module.fail_json( - msg="Name may only contain alphanumeric and underscore characters" - ) + def __init_module__(self): + # OID style names are not supported + if not re.match(r'^\w+$', self.vars.name, re.ASCII): + self.module.fail_json(msg="Name may only contain alpha-numeric and underscore characters") - value = module.params.pop('value') - state = module.params.pop('state') - path = module.params.pop('path') - delim = module.params.pop('delim') - jail = module.params.pop('jail') - result = dict( - name=name, - state=state, - value=value, - path=path, - delim=delim, - jail=jail - ) + self.sysrc = self.module.get_bin_path('sysrc', True) - rc_value = Sysrc(module, name, value, path, delim, jail) + def _contains(self): + value = self._get() + if value is None: + return False, None - if state == 'present': - rc_value.present() - elif state == 'absent': - rc_value.absent() - elif state == 'value_present': - rc_value.value_present() - elif state == 'value_absent': - rc_value.value_absent() + value = value.split(self.vars.delim) - result['changed'] = rc_value.changed + return self.vars.value in value, value - module.exit_json(**result) + def _get(self): + if not os.path.exists(self.vars.path): + return None + + (rc, out, err) = self._sysrc('-v', '-n', self.vars.name) + if "unknown variable" in err or "unknown variable" in out: + # Prior to FreeBSD 11.1 sysrc would write "unknown variable" to stdout and not stderr + # https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=229806 + return None + + if out.startswith(self.vars.path): + return out.split(':', 1)[1].strip() + + return None + + def _modify(self, op, changed): + (rc, out, err) = self._sysrc("%s%s=%s%s" % (self.vars.name, op, self.vars.delim, self.vars.value)) + if out.startswith("%s:" % self.vars.name): + return changed(out.split(' -> ')[1].strip().split(self.vars.delim)) + + return False + + def _sysrc(self, *args): + cmd = [self.sysrc, '-f', self.vars.path] + if self.vars.jail: + cmd += ['-j', self.vars.jail] + cmd.extend(args) + + (rc, out, err) = self.module.run_command(cmd) + if "Permission denied" in err: + self.module.fail_json(msg="Permission denied for %s" % self.vars.path) + + return rc, out, err + + def state_absent(self): + if self._get() is None: + return + + if not self.check_mode: + self._sysrc('-x', self.vars.name) + + self.changed = True + + def state_present(self): + value = self._get() + if value == self.vars.value: + return + + if self.vars.value is None: + self.vars.set('value', value) + return + + if not self.check_mode: + self._sysrc("%s=%s" % (self.vars.name, self.vars.value)) + + self.changed = True + + def state_value_absent(self): + (contains, _unused) = self._contains() + if not contains: + return + + self.changed = self.check_mode or self._modify('-', lambda values: self.vars.value not in values) + + def state_value_present(self): + (contains, value) = self._contains() + if contains: + return + + if self.vars.value is None: + self.vars.set('value', value) + return + + self.changed = self.check_mode or self._modify('+', lambda values: self.vars.value in values) + + +def main(): + Sysrc.execute() if __name__ == '__main__': diff --git a/plugins/modules/systemd_creds_decrypt.py b/plugins/modules/systemd_creds_decrypt.py index fbe80f2f16..c896737a93 100644 --- a/plugins/modules/systemd_creds_decrypt.py +++ b/plugins/modules/systemd_creds_decrypt.py @@ -100,16 +100,12 @@ def main(): """Decrypt secret using systemd-creds.""" module = AnsibleModule( argument_spec=dict( - name=dict(type="str", required=False), - newline=dict(type="bool", required=False, default=False), + name=dict(type="str"), + newline=dict(type="bool", default=False), secret=dict(type="str", required=True, no_log=True), - timestamp=dict(type="str", required=False), - transcode=dict( - type="str", - choices=["base64", "unbase64", "hex", "unhex"], - required=False, - ), - user=dict(type="str", required=False), + timestamp=dict(type="str"), + transcode=dict(type="str", choices=["base64", "unbase64", "hex", "unhex"]), + user=dict(type="str"), ), supports_check_mode=True, ) diff --git a/plugins/modules/systemd_creds_encrypt.py b/plugins/modules/systemd_creds_encrypt.py index 6f6e635416..2c4912427e 100644 --- a/plugins/modules/systemd_creds_encrypt.py +++ b/plugins/modules/systemd_creds_encrypt.py @@ -97,12 +97,12 @@ def main(): """Encrypt secret using systemd-creds.""" module = AnsibleModule( argument_spec=dict( - name=dict(type="str", required=False), - not_after=dict(type="str", required=False), + name=dict(type="str"), + not_after=dict(type="str"), pretty=dict(type="bool", default=False), secret=dict(type="str", required=True, no_log=True), - timestamp=dict(type="str", required=False), - user=dict(type="str", required=False), + timestamp=dict(type="str"), + user=dict(type="str"), ), supports_check_mode=True, ) diff --git a/plugins/modules/systemd_info.py b/plugins/modules/systemd_info.py index 139365856d..12f308849c 100644 --- a/plugins/modules/systemd_info.py +++ b/plugins/modules/systemd_info.py @@ -14,13 +14,13 @@ short_description: Gather C(systemd) unit info description: - This module gathers info about systemd units (services, targets, sockets, mounts, timers). - Timer units are supported since community.general 10.5.0. - - It runs C(systemctl list-units) (or processes selected units) and collects properties - for each unit using C(systemctl show). - - In case a unit has multiple properties with the same name, only the value of the first one will be collected. - - Even if a unit has a RV(units.loadstate) of V(not-found) or V(masked), it is returned, - but only with the minimal properties (RV(units.name), RV(units.loadstate), RV(units.activestate), RV(units.substate)). - - When O(unitname) and O(extra_properties) are used, the module first checks if the unit exists, - then check if properties exist. If not, the module fails. + - It runs C(systemctl list-units) (or processes selected units) and collects properties for each unit using C(systemctl + show). + - In case a unit has multiple properties with the same name, only the value of the first one is collected. + - Even if a unit has a RV(units.loadstate) of V(not-found) or V(masked), it is returned, but only with the minimal properties + (RV(units.name), RV(units.loadstate), RV(units.activestate), RV(units.substate)). + - When O(unitname) and O(extra_properties) are used, the module first checks if the unit exists, then check if properties + exist. If not, the module fails. - When O(unitname) is used with wildcard expressions, the module checks for units that match the indicated expressions, if units are not present for all the indicated expressions, the module fails. version_added: "10.4.0" @@ -89,7 +89,7 @@ RETURN = r""" units: description: - Dictionary of systemd unit info keyed by unit name. - - Additional fields will be returned depending on the value of O(extra_properties). + - Additional fields are returned depending on the value of O(extra_properties). returned: success type: dict elements: dict @@ -116,7 +116,8 @@ units: substate: description: - The detailed sub state of the unit. - - The most common values are V(running), V(dead), V(exited), V(failed), V(listening), V(active), and V(mounted), but other values are possible as well. + - The most common values are V(running), V(dead), V(exited), V(failed), V(listening), V(active), and V(mounted), but + other values are possible as well. returned: always type: str sample: running diff --git a/plugins/modules/sysupgrade.py b/plugins/modules/sysupgrade.py index cb9eb08226..d247e9d74c 100644 --- a/plugins/modules/sysupgrade.py +++ b/plugins/modules/sysupgrade.py @@ -25,7 +25,7 @@ options: snapshot: description: - Apply the latest snapshot. - - Otherwise release will be applied. + - Otherwise release is applied. default: false type: bool force: @@ -36,14 +36,13 @@ options: keep_files: description: - Keep the files under C(/home/_sysupgrade). - - By default, the files will be deleted after the upgrade. + - By default, the files are deleted after the upgrade. default: false type: bool fetch_only: description: - Fetch and verify files and create C(/bsd.upgrade) but do not reboot. - - Set to V(false) if you want C(sysupgrade) to reboot. This will cause Ansible to error, as it expects the module to - exit gracefully. See the examples. + - Set to V(false) if you want C(sysupgrade) to reboot. This causes the module to fail. See the examples. default: true type: bool installurl: @@ -79,21 +78,6 @@ EXAMPLES = r""" ignore_errors: true """ -RETURN = r""" -rc: - description: The command return code (0 means success). - returned: always - type: int -stdout: - description: Sysupgrade standard output. - returned: always - type: str -stderr: - description: Sysupgrade standard error. - returned: always - type: str - sample: "sysupgrade: need root privileges" -""" from ansible.module_utils.basic import AnsibleModule @@ -102,7 +86,6 @@ def sysupgrade_run(module): sysupgrade_bin = module.get_bin_path('/usr/sbin/sysupgrade', required=True) cmd = [sysupgrade_bin] changed = False - warnings = [] # Setup command flags if module.params['snapshot']: @@ -138,7 +121,6 @@ def sysupgrade_run(module): rc=rc, stderr=err, stdout=out, - warnings=warnings ) diff --git a/plugins/modules/taiga_issue.py b/plugins/modules/taiga_issue.py index e614b235ec..d7f8824c95 100644 --- a/plugins/modules/taiga_issue.py +++ b/plugins/modules/taiga_issue.py @@ -255,18 +255,18 @@ def manage_issue(taiga_host, project_name, issue_subject, issue_priority, def main(): module = AnsibleModule( argument_spec=dict( - taiga_host=dict(type='str', required=False, default="https://api.taiga.io"), + taiga_host=dict(type='str', default="https://api.taiga.io"), project=dict(type='str', required=True), subject=dict(type='str', required=True), issue_type=dict(type='str', required=True), - priority=dict(type='str', required=False, default="Normal"), - status=dict(type='str', required=False, default="New"), - severity=dict(type='str', required=False, default="Normal"), - description=dict(type='str', required=False, default=""), - attachment=dict(type='path', required=False, default=None), - attachment_description=dict(type='str', required=False, default=""), - tags=dict(required=False, default=[], type='list', elements='str'), - state=dict(type='str', required=False, choices=['present', 'absent'], default='present'), + priority=dict(type='str', default="Normal"), + status=dict(type='str', default="New"), + severity=dict(type='str', default="Normal"), + description=dict(type='str', default=""), + attachment=dict(type='path'), + attachment_description=dict(type='str', default=""), + tags=dict(default=[], type='list', elements='str'), + state=dict(type='str', choices=['present', 'absent'], default='present'), ), supports_check_mode=True ) diff --git a/plugins/modules/telegram.py b/plugins/modules/telegram.py index 6773f48bf5..abaa72c83e 100644 --- a/plugins/modules/telegram.py +++ b/plugins/modules/telegram.py @@ -21,7 +21,7 @@ description: - Send notifications using telegram bot, to a verified group or user. - Also, the user may try to use any other telegram bot API method, if you specify O(api_method) argument. notes: - - You will require a telegram account and create telegram bot to use this module. + - You need a telegram account and create telegram bot to use this module. extends_documentation_fragment: - community.general.attributes attributes: diff --git a/plugins/modules/terraform.py b/plugins/modules/terraform.py index dd34ba9a0e..a5adbcbe7e 100644 --- a/plugins/modules/terraform.py +++ b/plugins/modules/terraform.py @@ -58,19 +58,19 @@ options: purge_workspace: description: - Only works with state = absent. - - If true, the workspace will be deleted after the "terraform destroy" action. - - The 'default' workspace will not be deleted. + - If V(true), the O(workspace) is deleted after the C(terraform destroy) action. + - If O(workspace=default) then it is not deleted. default: false type: bool plan_file: description: - - The path to an existing Terraform plan file to apply. If this is not specified, Ansible will build a new TF plan and - execute it. Note that this option is required if 'state' has the 'planned' value. + - The path to an existing Terraform plan file to apply. If this is not specified, Ansible builds a new TF plan and execute + it. Note that this option is required if O(state=planned). type: path state_file: description: - The path to an existing Terraform state file to use when building plan. If this is not specified, the default C(terraform.tfstate) - will be used. + is used. - This option is ignored when plan is specified. type: path variables_files: @@ -91,7 +91,7 @@ options: - Ansible dictionaries are mapped to terraform objects. - Ansible lists are mapped to terraform lists. - Ansible booleans are mapped to terraform booleans. - - B(Note) passwords passed as variables will be visible in the log output. Make sure to use C(no_log=true) in production!. + - B(Note) passwords passed as variables are visible in the log output. Make sure to use C(no_log=true) in production!. type: dict complex_vars: description: @@ -104,7 +104,7 @@ options: version_added: 5.7.0 targets: description: - - A list of specific resources to target in this plan/application. The resources selected here will also auto-include + - A list of specific resources to target in this plan/application. The resources selected here are also auto-include any dependencies. type: list elements: str @@ -120,7 +120,7 @@ options: type: int force_init: description: - - To avoid duplicating infra, if a state file cannot be found this will force a C(terraform init). Generally, this should + - To avoid duplicating infra, if a state file cannot be found this forces a C(terraform init). Generally, this should be turned off unless you intend to provision an entirely new Terraform deployment. default: false type: bool @@ -272,11 +272,6 @@ outputs: type: str returned: always description: The value of the output as interpolated by Terraform. -stdout: - type: str - description: Full C(terraform) command stdout, in case you want to display it or examine the event log. - returned: always - sample: '' command: type: str description: Full C(terraform) command built by this module, in case you want to re-run the command outside the module or diff --git a/plugins/modules/timezone.py b/plugins/modules/timezone.py index 37eb2f94a6..6e105c0bad 100644 --- a/plugins/modules/timezone.py +++ b/plugins/modules/timezone.py @@ -57,20 +57,6 @@ author: - Indrajit Raychaudhuri (@indrajitr) """ -RETURN = r""" -diff: - description: The differences about the given arguments. - returned: success - type: complex - contains: - before: - description: The values before change. - type: dict - after: - description: The values after change. - type: dict -""" - EXAMPLES = r""" - name: Set timezone to Asia/Tokyo become: true diff --git a/plugins/modules/twilio.py b/plugins/modules/twilio.py index 09169075a1..4d9dd6ac19 100644 --- a/plugins/modules/twilio.py +++ b/plugins/modules/twilio.py @@ -150,7 +150,7 @@ def main(): msg=dict(required=True), from_number=dict(required=True), to_numbers=dict(required=True, aliases=['to_number'], type='list', elements='str'), - media_url=dict(default=None, required=False), + media_url=dict(), ), supports_check_mode=True ) diff --git a/plugins/modules/typetalk.py b/plugins/modules/typetalk.py index 505c1a4abd..8728bfb21a 100644 --- a/plugins/modules/typetalk.py +++ b/plugins/modules/typetalk.py @@ -14,6 +14,10 @@ module: typetalk short_description: Send a message to typetalk description: - Send a message to typetalk using typetalk API. +deprecated: + removed_in: 13.0.0 + why: The typetalk service will be discontinued on Dec 2025. See U(https://nulab.com/blog/company-news/typetalk-sunsetting/). + alternative: There is none. extends_documentation_fragment: - community.general.attributes attributes: diff --git a/plugins/modules/urpmi.py b/plugins/modules/urpmi.py index 5760a4829f..454921eaf3 100644 --- a/plugins/modules/urpmi.py +++ b/plugins/modules/urpmi.py @@ -184,7 +184,7 @@ def install_packages(module, pkgspec, root, force=True, no_recommends=True): def root_option(root): - if (root): + if root: return "--root=%s" % (root) else: return "" diff --git a/plugins/modules/utm_aaa_group.py b/plugins/modules/utm_aaa_group.py index b29f3d50af..d1444b5bd7 100644 --- a/plugins/modules/utm_aaa_group.py +++ b/plugins/modules/utm_aaa_group.py @@ -28,7 +28,7 @@ attributes: options: name: description: - - The name of the object. Will be used to identify the entry. + - The name of the object that identifies the entry. type: str required: true adirectory_groups: @@ -210,20 +210,20 @@ def main(): module = UTMModule( argument_spec=dict( name=dict(type='str', required=True), - adirectory_groups=dict(type='list', elements='str', required=False, default=[]), - adirectory_groups_sids=dict(type='dict', required=False, default={}), - backend_match=dict(type='str', required=False, default="none", + adirectory_groups=dict(type='list', elements='str', default=[]), + adirectory_groups_sids=dict(type='dict', default={}), + backend_match=dict(type='str', default="none", choices=["none", "adirectory", "edirectory", "radius", "tacacs", "ldap"]), - comment=dict(type='str', required=False, default=""), - dynamic=dict(type='str', required=False, default="none", choices=["none", "ipsec_dn", "directory_groups"]), - edirectory_groups=dict(type='list', elements='str', required=False, default=[]), - ipsec_dn=dict(type='str', required=False, default=""), - ldap_attribute=dict(type='str', required=False, default=""), - ldap_attribute_value=dict(type='str', required=False, default=""), - members=dict(type='list', elements='str', required=False, default=[]), - network=dict(type='str', required=False, default=""), - radius_groups=dict(type='list', elements='str', required=False, default=[]), - tacacs_groups=dict(type='list', elements='str', required=False, default=[]), + comment=dict(type='str', default=""), + dynamic=dict(type='str', default="none", choices=["none", "ipsec_dn", "directory_groups"]), + edirectory_groups=dict(type='list', elements='str', default=[]), + ipsec_dn=dict(type='str', default=""), + ldap_attribute=dict(type='str', default=""), + ldap_attribute_value=dict(type='str', default=""), + members=dict(type='list', elements='str', default=[]), + network=dict(type='str', default=""), + radius_groups=dict(type='list', elements='str', default=[]), + tacacs_groups=dict(type='list', elements='str', default=[]), ) ) try: diff --git a/plugins/modules/utm_aaa_group_info.py b/plugins/modules/utm_aaa_group_info.py index 91fe8ce930..ee0d1c1234 100644 --- a/plugins/modules/utm_aaa_group_info.py +++ b/plugins/modules/utm_aaa_group_info.py @@ -29,7 +29,7 @@ options: name: type: str description: - - The name of the object. Will be used to identify the entry. + - The name of the object that identifies the entry. required: true extends_documentation_fragment: diff --git a/plugins/modules/utm_ca_host_key_cert.py b/plugins/modules/utm_ca_host_key_cert.py index b67531c061..1e6fa1c713 100644 --- a/plugins/modules/utm_ca_host_key_cert.py +++ b/plugins/modules/utm_ca_host_key_cert.py @@ -29,7 +29,7 @@ attributes: options: name: description: - - The name of the object. Will be used to identify the entry. + - The name of the object that identifies the entry. required: true type: str ca: @@ -148,9 +148,9 @@ def main(): ca=dict(type='str', required=True), meta=dict(type='str', required=True), certificate=dict(type='str', required=True), - comment=dict(type='str', required=False), - encrypted=dict(type='bool', required=False, default=False), - key=dict(type='str', required=False, no_log=True), + comment=dict(type='str'), + encrypted=dict(type='bool', default=False), + key=dict(type='str', no_log=True), ) ) try: diff --git a/plugins/modules/utm_ca_host_key_cert_info.py b/plugins/modules/utm_ca_host_key_cert_info.py index cab6657ab6..a0fcb97146 100644 --- a/plugins/modules/utm_ca_host_key_cert_info.py +++ b/plugins/modules/utm_ca_host_key_cert_info.py @@ -28,7 +28,7 @@ options: name: type: str description: - - The name of the object. Will be used to identify the entry. + - The name of the object that identifies the entry. required: true extends_documentation_fragment: diff --git a/plugins/modules/utm_dns_host.py b/plugins/modules/utm_dns_host.py index 2eb404b38c..e1a63e1f73 100644 --- a/plugins/modules/utm_dns_host.py +++ b/plugins/modules/utm_dns_host.py @@ -29,7 +29,7 @@ options: name: type: str description: - - The name of the object. Will be used to identify the entry. + - The name of the object that identifies the entry. required: true address: type: str @@ -130,7 +130,7 @@ result: description: Whether the ipv6 address is resolved or not. type: bool timeout: - description: The timeout until a new resolving will be attempted. + description: The timeout until a new resolving is attempted. type: int """ @@ -144,14 +144,14 @@ def main(): module = UTMModule( argument_spec=dict( name=dict(type='str', required=True), - address=dict(type='str', required=False, default='0.0.0.0'), - address6=dict(type='str', required=False, default='::'), - comment=dict(type='str', required=False, default=""), - hostname=dict(type='str', required=False), - interface=dict(type='str', required=False, default=""), - resolved=dict(type='bool', required=False, default=False), - resolved6=dict(type='bool', required=False, default=False), - timeout=dict(type='int', required=False, default=0), + address=dict(type='str', default='0.0.0.0'), + address6=dict(type='str', default='::'), + comment=dict(type='str', default=""), + hostname=dict(type='str'), + interface=dict(type='str', default=""), + resolved=dict(type='bool', default=False), + resolved6=dict(type='bool', default=False), + timeout=dict(type='int', default=0), ) ) try: diff --git a/plugins/modules/utm_network_interface_address.py b/plugins/modules/utm_network_interface_address.py index 1e3d2ee5c3..7212897655 100644 --- a/plugins/modules/utm_network_interface_address.py +++ b/plugins/modules/utm_network_interface_address.py @@ -29,7 +29,7 @@ options: name: type: str description: - - The name of the object. Will be used to identify the entry. + - The name of the object that identifies the entry. required: true address: type: str @@ -123,10 +123,10 @@ def main(): argument_spec=dict( name=dict(type='str', required=True), address=dict(type='str', required=True), - comment=dict(type='str', required=False, default=""), - address6=dict(type='str', required=False), - resolved=dict(type='bool', required=False), - resolved6=dict(type='bool', required=False), + comment=dict(type='str', default=""), + address6=dict(type='str'), + resolved=dict(type='bool'), + resolved6=dict(type='bool'), ) ) try: diff --git a/plugins/modules/utm_network_interface_address_info.py b/plugins/modules/utm_network_interface_address_info.py index b9c394c848..a5b3ff7b3b 100644 --- a/plugins/modules/utm_network_interface_address_info.py +++ b/plugins/modules/utm_network_interface_address_info.py @@ -27,7 +27,7 @@ options: name: type: str description: - - The name of the object. Will be used to identify the entry. + - The name of the object that identifies the entry. required: true extends_documentation_fragment: diff --git a/plugins/modules/utm_proxy_auth_profile.py b/plugins/modules/utm_proxy_auth_profile.py index 207c4ba156..96ae3aa869 100644 --- a/plugins/modules/utm_proxy_auth_profile.py +++ b/plugins/modules/utm_proxy_auth_profile.py @@ -30,7 +30,7 @@ options: name: type: str description: - - The name of the object. Will be used to identify the entry. + - The name of the object that identifies the entry. required: true aaa: type: list @@ -316,29 +316,29 @@ def main(): name=dict(type='str', required=True), aaa=dict(type='list', elements='str', required=True), basic_prompt=dict(type='str', required=True), - backend_mode=dict(type='str', required=False, default="None", choices=['Basic', 'None']), - backend_strip_basic_auth=dict(type='bool', required=False, default=True), - backend_user_prefix=dict(type='str', required=False, default=""), - backend_user_suffix=dict(type='str', required=False, default=""), - comment=dict(type='str', required=False, default=""), - frontend_cookie=dict(type='str', required=False), - frontend_cookie_secret=dict(type='str', required=False, no_log=True), - frontend_form=dict(type='str', required=False), - frontend_form_template=dict(type='str', required=False, default=""), - frontend_login=dict(type='str', required=False), - frontend_logout=dict(type='str', required=False), - frontend_mode=dict(type='str', required=False, default="Basic", choices=['Basic', 'Form']), - frontend_realm=dict(type='str', required=False), - frontend_session_allow_persistency=dict(type='bool', required=False, default=False), + backend_mode=dict(type='str', default="None", choices=['Basic', 'None']), + backend_strip_basic_auth=dict(type='bool', default=True), + backend_user_prefix=dict(type='str', default=""), + backend_user_suffix=dict(type='str', default=""), + comment=dict(type='str', default=""), + frontend_cookie=dict(type='str'), + frontend_cookie_secret=dict(type='str', no_log=True), + frontend_form=dict(type='str'), + frontend_form_template=dict(type='str', default=""), + frontend_login=dict(type='str'), + frontend_logout=dict(type='str'), + frontend_mode=dict(type='str', default="Basic", choices=['Basic', 'Form']), + frontend_realm=dict(type='str'), + frontend_session_allow_persistency=dict(type='bool', default=False), frontend_session_lifetime=dict(type='int', required=True), - frontend_session_lifetime_limited=dict(type='bool', required=False, default=True), - frontend_session_lifetime_scope=dict(type='str', required=False, default="hours", choices=['days', 'hours', 'minutes']), + frontend_session_lifetime_limited=dict(type='bool', default=True), + frontend_session_lifetime_scope=dict(type='str', default="hours", choices=['days', 'hours', 'minutes']), frontend_session_timeout=dict(type='int', required=True), - frontend_session_timeout_enabled=dict(type='bool', required=False, default=True), - frontend_session_timeout_scope=dict(type='str', required=False, default="minutes", choices=['days', 'hours', 'minutes']), - logout_delegation_urls=dict(type='list', elements='str', required=False, default=[]), - logout_mode=dict(type='str', required=False, default="None", choices=['None', 'Delegation']), - redirect_to_requested_url=dict(type='bool', required=False, default=False) + frontend_session_timeout_enabled=dict(type='bool', default=True), + frontend_session_timeout_scope=dict(type='str', default="minutes", choices=['days', 'hours', 'minutes']), + logout_delegation_urls=dict(type='list', elements='str', default=[]), + logout_mode=dict(type='str', default="None", choices=['None', 'Delegation']), + redirect_to_requested_url=dict(type='bool', default=False) ) ) try: diff --git a/plugins/modules/utm_proxy_exception.py b/plugins/modules/utm_proxy_exception.py index 96cb592e59..174156394c 100644 --- a/plugins/modules/utm_proxy_exception.py +++ b/plugins/modules/utm_proxy_exception.py @@ -29,7 +29,7 @@ attributes: options: name: description: - - The name of the object. Will be used to identify the entry. + - The name of the object that identifies the entry. required: true type: str op: @@ -220,20 +220,20 @@ def main(): module = UTMModule( argument_spec=dict( name=dict(type='str', required=True), - op=dict(type='str', required=False, default='AND', choices=['AND', 'OR']), - path=dict(type='list', elements='str', required=False, default=[]), - skip_custom_threats_filters=dict(type='list', elements='str', required=False, default=[]), - skip_threats_filter_categories=dict(type='list', elements='str', required=False, default=[]), - skipav=dict(type='bool', required=False, default=False), - skipbadclients=dict(type='bool', required=False, default=False), - skipcookie=dict(type='bool', required=False, default=False), - skipform=dict(type='bool', required=False, default=False), - skipform_missingtoken=dict(type='bool', required=False, default=False), - skiphtmlrewrite=dict(type='bool', required=False, default=False), - skiptft=dict(type='bool', required=False, default=False), - skipurl=dict(type='bool', required=False, default=False), - source=dict(type='list', elements='str', required=False, default=[]), - status=dict(type='bool', required=False, default=True), + op=dict(type='str', default='AND', choices=['AND', 'OR']), + path=dict(type='list', elements='str', default=[]), + skip_custom_threats_filters=dict(type='list', elements='str', default=[]), + skip_threats_filter_categories=dict(type='list', elements='str', default=[]), + skipav=dict(type='bool', default=False), + skipbadclients=dict(type='bool', default=False), + skipcookie=dict(type='bool', default=False), + skipform=dict(type='bool', default=False), + skipform_missingtoken=dict(type='bool', default=False), + skiphtmlrewrite=dict(type='bool', default=False), + skiptft=dict(type='bool', default=False), + skipurl=dict(type='bool', default=False), + source=dict(type='list', elements='str', default=[]), + status=dict(type='bool', default=True), ) ) try: diff --git a/plugins/modules/utm_proxy_frontend.py b/plugins/modules/utm_proxy_frontend.py index 09f0cdd4bc..5330311516 100644 --- a/plugins/modules/utm_proxy_frontend.py +++ b/plugins/modules/utm_proxy_frontend.py @@ -30,7 +30,7 @@ options: name: type: str description: - - The name of the object. Will be used to identify the entry. + - The name of the object that identifies the entry. required: true add_content_type_header: description: @@ -76,12 +76,12 @@ options: default: [] htmlrewrite: description: - - Whether to enable html rewrite or not. + - Whether to enable HTML rewrite or not. type: bool default: false htmlrewrite_cookies: description: - - Whether to enable html rewrite cookie or not. + - Whether to enable HTML rewrite cookie or not. type: bool default: false implicitredirect: @@ -204,7 +204,7 @@ result: description: List of associated proxy exceptions. type: list htmlrewrite: - description: State of html rewrite. + description: State of HTML rewrite. type: bool htmlrewrite_cookies: description: Whether the HTML rewrite cookie is set. @@ -251,26 +251,26 @@ def main(): module = UTMModule( argument_spec=dict( name=dict(type='str', required=True), - add_content_type_header=dict(type='bool', required=False, default=False), - address=dict(type='str', required=False, default="REF_DefaultInternalAddress"), - allowed_networks=dict(type='list', elements='str', required=False, default=["REF_NetworkAny"]), - certificate=dict(type='str', required=False, default=""), - comment=dict(type='str', required=False, default=""), - disable_compression=dict(type='bool', required=False, default=False), - domain=dict(type='list', elements='str', required=False), - exceptions=dict(type='list', elements='str', required=False, default=[]), - htmlrewrite=dict(type='bool', required=False, default=False), - htmlrewrite_cookies=dict(type='bool', required=False, default=False), - implicitredirect=dict(type='bool', required=False, default=False), - lbmethod=dict(type='str', required=False, default="bybusyness", + add_content_type_header=dict(type='bool', default=False), + address=dict(type='str', default="REF_DefaultInternalAddress"), + allowed_networks=dict(type='list', elements='str', default=["REF_NetworkAny"]), + certificate=dict(type='str', default=""), + comment=dict(type='str', default=""), + disable_compression=dict(type='bool', default=False), + domain=dict(type='list', elements='str'), + exceptions=dict(type='list', elements='str', default=[]), + htmlrewrite=dict(type='bool', default=False), + htmlrewrite_cookies=dict(type='bool', default=False), + implicitredirect=dict(type='bool', default=False), + lbmethod=dict(type='str', default="bybusyness", choices=['bybusyness', 'bytraffic', 'byrequests', '']), - locations=dict(type='list', elements='str', required=False, default=[]), - port=dict(type='int', required=False, default=80), - preservehost=dict(type='bool', required=False, default=False), - profile=dict(type='str', required=False, default=""), - status=dict(type='bool', required=False, default=True), - type=dict(type='str', required=False, default="http", choices=['http', 'https']), - xheaders=dict(type='bool', required=False, default=False), + locations=dict(type='list', elements='str', default=[]), + port=dict(type='int', default=80), + preservehost=dict(type='bool', default=False), + profile=dict(type='str', default=""), + status=dict(type='bool', default=True), + type=dict(type='str', default="http", choices=['http', 'https']), + xheaders=dict(type='bool', default=False), ) ) try: diff --git a/plugins/modules/utm_proxy_frontend_info.py b/plugins/modules/utm_proxy_frontend_info.py index 722e2621a2..859ee67de1 100644 --- a/plugins/modules/utm_proxy_frontend_info.py +++ b/plugins/modules/utm_proxy_frontend_info.py @@ -29,7 +29,7 @@ options: name: type: str description: - - The name of the object. Will be used to identify the entry. + - The name of the object that identifies the entry. required: true extends_documentation_fragment: @@ -90,7 +90,7 @@ result: description: List of associated proxy exceptions. type: list htmlrewrite: - description: State of html rewrite. + description: State of HTML rewrite. type: bool htmlrewrite_cookies: description: Whether the HTML rewrite cookie is set. diff --git a/plugins/modules/utm_proxy_location.py b/plugins/modules/utm_proxy_location.py index 95ee210e97..15b89bb1a2 100644 --- a/plugins/modules/utm_proxy_location.py +++ b/plugins/modules/utm_proxy_location.py @@ -30,7 +30,7 @@ options: name: type: str description: - - The name of the object. Will be used to identify the entry. + - The name of the object that identifies the entry. required: true access_control: description: @@ -198,19 +198,19 @@ def main(): module = UTMModule( argument_spec=dict( name=dict(type='str', required=True), - access_control=dict(type='str', required=False, default="0", choices=['0', '1']), - allowed_networks=dict(type='list', elements='str', required=False, default=['REF_NetworkAny']), - auth_profile=dict(type='str', required=False, default=""), - backend=dict(type='list', elements='str', required=False, default=[]), - be_path=dict(type='str', required=False, default=""), - comment=dict(type='str', required=False, default=""), - denied_networks=dict(type='list', elements='str', required=False, default=[]), - hot_standby=dict(type='bool', required=False, default=False), - path=dict(type='str', required=False, default="/"), - status=dict(type='bool', required=False, default=True), - stickysession_id=dict(type='str', required=False, default='ROUTEID'), - stickysession_status=dict(type='bool', required=False, default=False), - websocket_passthrough=dict(type='bool', required=False, default=False), + access_control=dict(type='str', default="0", choices=['0', '1']), + allowed_networks=dict(type='list', elements='str', default=['REF_NetworkAny']), + auth_profile=dict(type='str', default=""), + backend=dict(type='list', elements='str', default=[]), + be_path=dict(type='str', default=""), + comment=dict(type='str', default=""), + denied_networks=dict(type='list', elements='str', default=[]), + hot_standby=dict(type='bool', default=False), + path=dict(type='str', default="/"), + status=dict(type='bool', default=True), + stickysession_id=dict(type='str', default='ROUTEID'), + stickysession_status=dict(type='bool', default=False), + websocket_passthrough=dict(type='bool', default=False), ) ) try: diff --git a/plugins/modules/utm_proxy_location_info.py b/plugins/modules/utm_proxy_location_info.py index 0512d4be15..7a8db919c2 100644 --- a/plugins/modules/utm_proxy_location_info.py +++ b/plugins/modules/utm_proxy_location_info.py @@ -29,7 +29,7 @@ options: name: type: str description: - - The name of the object. Will be used to identify the entry. + - The name of the object that identifies the entry. required: true extends_documentation_fragment: diff --git a/plugins/modules/vdo.py b/plugins/modules/vdo.py index a176e038eb..dbfa44f5b6 100644 --- a/plugins/modules/vdo.py +++ b/plugins/modules/vdo.py @@ -48,8 +48,8 @@ options: default: present activated: description: - - The C(activate) status for a VDO volume. If this is set to V(false), the VDO volume cannot be started, and it will - not start on system startup. However, on initial creation, a VDO volume with "activated" set to "off" will be running, + - The C(activate) status for a VDO volume. If this is set to V(false), the VDO volume cannot be started, and it does + not start on system startup. However, on initial creation, a VDO volume with O(activated=false) is set to be running until stopped. This is the default behavior of the C(vdo create) command; it provides the user an opportunity to write a base amount of metadata (filesystem, LVM headers, and so on) to the VDO volume prior to stopping the volume, and leaving it deactivated until ready to use. diff --git a/plugins/modules/vertica_configuration.py b/plugins/modules/vertica_configuration.py index 39ed27dc2d..d97fbf5ed4 100644 --- a/plugins/modules/vertica_configuration.py +++ b/plugins/modules/vertica_configuration.py @@ -139,12 +139,12 @@ def main(): module = AnsibleModule( argument_spec=dict( parameter=dict(required=True, aliases=['name']), - value=dict(default=None), - db=dict(default=None), + value=dict(), + db=dict(), cluster=dict(default='localhost'), port=dict(default='5433'), login_user=dict(default='dbadmin'), - login_password=dict(default=None, no_log=True), + login_password=dict(no_log=True), ), supports_check_mode=True) if not pyodbc_found: diff --git a/plugins/modules/vertica_info.py b/plugins/modules/vertica_info.py index 29f8669c27..340e782f31 100644 --- a/plugins/modules/vertica_info.py +++ b/plugins/modules/vertica_info.py @@ -227,9 +227,9 @@ def main(): argument_spec=dict( cluster=dict(default='localhost'), port=dict(default='5433'), - db=dict(default=None), + db=dict(), login_user=dict(default='dbadmin'), - login_password=dict(default=None, no_log=True), + login_password=dict(no_log=True), ), supports_check_mode=True) if not pyodbc_found: diff --git a/plugins/modules/vertica_role.py b/plugins/modules/vertica_role.py index d814aca273..550c612b8d 100644 --- a/plugins/modules/vertica_role.py +++ b/plugins/modules/vertica_role.py @@ -180,7 +180,7 @@ def main(): module = AnsibleModule( argument_spec=dict( role=dict(required=True, aliases=['name']), - assigned_roles=dict(default=None, aliases=['assigned_role']), + assigned_roles=dict(aliases=['assigned_role']), state=dict(default='present', choices=['absent', 'present']), db=dict(), cluster=dict(default='localhost'), diff --git a/plugins/modules/vmadm.py b/plugins/modules/vmadm.py index 8808eeea11..fc7504fba5 100644 --- a/plugins/modules/vmadm.py +++ b/plugins/modules/vmadm.py @@ -107,7 +107,8 @@ options: flexible_disk_size: required: false description: - - This sets an upper bound for the amount of space that a bhyve instance may use for its disks and snapshots of those disks (in MiBs). + - This sets an upper bound for the amount of space that a bhyve instance may use for its disks and snapshots of those + disks (in MiBs). type: int version_added: 10.5.0 force: diff --git a/plugins/modules/xattr.py b/plugins/modules/xattr.py index fe48ce2eef..cbd9dcc05c 100644 --- a/plugins/modules/xattr.py +++ b/plugins/modules/xattr.py @@ -209,7 +209,7 @@ def main(): not (namespace == 'user' and key.startswith('user.'))): key = '%s.%s' % (namespace, key) - if (state == 'present' or value is not None): + if state == 'present' or value is not None: current = get_xattr(module, path, key, follow) if current is None or key not in current or value != current[key]: if not module.check_mode: diff --git a/plugins/modules/xbps.py b/plugins/modules/xbps.py index 3087e4d79d..dc9d131bd7 100644 --- a/plugins/modules/xbps.py +++ b/plugins/modules/xbps.py @@ -363,7 +363,7 @@ def main(): module = AnsibleModule( argument_spec=dict( - name=dict(default=None, aliases=['pkg', 'package'], type='list', elements='str'), + name=dict(aliases=['pkg', 'package'], type='list', elements='str'), state=dict(default='present', choices=['present', 'installed', 'latest', 'absent', 'removed']), diff --git a/plugins/modules/xcc_redfish_command.py b/plugins/modules/xcc_redfish_command.py index 8e5cbf7d3e..9dbbe8016f 100644 --- a/plugins/modules/xcc_redfish_command.py +++ b/plugins/modules/xcc_redfish_command.py @@ -273,33 +273,34 @@ redfish_facts: description: Resource content. returned: when command == GetResource or command == GetCollectionResource type: dict - sample: '{ - "redfish_facts": { - "data": { - "@odata.etag": "\"3179bf00d69f25a8b3c\"", - "@odata.id": "/redfish/v1/Managers/1/NetworkProtocol/Oem/Lenovo/DNS", - "@odata.type": "#LenovoDNS.v1_0_0.LenovoDNS", - "DDNS": [ - { - "DDNSEnable": true, - "DomainName": "", - "DomainNameSource": "DHCP" - } - ], - "DNSEnable": true, - "Description": "This resource is used to represent a DNS resource for a Redfish implementation.", - "IPv4Address1": "10.103.62.178", - "IPv4Address2": "0.0.0.0", - "IPv4Address3": "0.0.0.0", - "IPv6Address1": "::", - "IPv6Address2": "::", - "IPv6Address3": "::", - "Id": "LenovoDNS", - "PreferredAddresstype": "IPv4" - }, - "ret": true + sample: + { + "redfish_facts": { + "data": { + "@odata.etag": "\"3179bf00d69f25a8b3c\"", + "@odata.id": "/redfish/v1/Managers/1/NetworkProtocol/Oem/Lenovo/DNS", + "@odata.type": "#LenovoDNS.v1_0_0.LenovoDNS", + "DDNS": [ + { + "DDNSEnable": true, + "DomainName": "", + "DomainNameSource": "DHCP" + } + ], + "DNSEnable": true, + "Description": "This resource is used to represent a DNS resource for a Redfish implementation.", + "IPv4Address1": "10.103.62.178", + "IPv4Address2": "0.0.0.0", + "IPv4Address3": "0.0.0.0", + "IPv6Address1": "::", + "IPv6Address2": "::", + "IPv6Address3": "::", + "Id": "LenovoDNS", + "PreferredAddresstype": "IPv4" + }, + "ret": true + } } - }' """ from ansible.module_utils.basic import AnsibleModule diff --git a/plugins/modules/xdg_mime.py b/plugins/modules/xdg_mime.py index 7974420a8d..cf297187a4 100644 --- a/plugins/modules/xdg_mime.py +++ b/plugins/modules/xdg_mime.py @@ -31,16 +31,15 @@ attributes: options: mime_types: description: - - One or more MIME types for which a default handler will be set. + - One or more MIME types for which a default handler is set. type: list elements: str required: true handler: description: - Sets the default handler for the specified MIME types. - - The desktop file must be installed in the system. - If the desktop file is not installed, the module - does not fail, but the handler is not set either. + - The desktop file must be installed in the system. If the desktop file is not installed, the module does not fail, + but the handler is not set either. - You must pass a handler in the form V(*.desktop), otherwise the module fails. type: str required: true diff --git a/plugins/modules/xenserver_guest.py b/plugins/modules/xenserver_guest.py index da1f5439d0..44f9192b7e 100644 --- a/plugins/modules/xenserver_guest.py +++ b/plugins/modules/xenserver_guest.py @@ -394,141 +394,143 @@ instance: description: Metadata about the VM. returned: always type: dict - sample: { - "cdrom": { - "type": "none" - }, - "customization_agent": "native", - "disks": [ - { - "name": "testvm_11-0", - "name_desc": "", - "os_device": "xvda", - "size": 42949672960, - "sr": "Local storage", - "sr_uuid": "0af1245e-bdb0-ba33-1446-57a962ec4075", - "vbd_userdevice": "0" + sample: + { + "cdrom": { + "type": "none" }, - { - "name": "testvm_11-1", - "name_desc": "", - "os_device": "xvdb", - "size": 42949672960, - "sr": "Local storage", - "sr_uuid": "0af1245e-bdb0-ba33-1446-57a962ec4075", - "vbd_userdevice": "1" + "customization_agent": "native", + "disks": [ + { + "name": "testvm_11-0", + "name_desc": "", + "os_device": "xvda", + "size": 42949672960, + "sr": "Local storage", + "sr_uuid": "0af1245e-bdb0-ba33-1446-57a962ec4075", + "vbd_userdevice": "0" + }, + { + "name": "testvm_11-1", + "name_desc": "", + "os_device": "xvdb", + "size": 42949672960, + "sr": "Local storage", + "sr_uuid": "0af1245e-bdb0-ba33-1446-57a962ec4075", + "vbd_userdevice": "1" + } + ], + "domid": "56", + "folder": "", + "hardware": { + "memory_mb": 8192, + "num_cpu_cores_per_socket": 2, + "num_cpus": 4 + }, + "home_server": "", + "is_template": false, + "name": "testvm_11", + "name_desc": "", + "networks": [ + { + "gateway": "192.168.0.254", + "gateway6": "fc00::fffe", + "ip": "192.168.0.200", + "ip6": [ + "fe80:0000:0000:0000:e9cb:625a:32c5:c291", + "fc00:0000:0000:0000:0000:0000:0000:0001" + ], + "mac": "ba:91:3a:48:20:76", + "mtu": "1500", + "name": "Pool-wide network associated with eth1", + "netmask": "255.255.255.128", + "prefix": "25", + "prefix6": "64", + "vif_device": "0" + } + ], + "other_config": { + "base_template_name": "Windows Server 2016 (64-bit)", + "import_task": "OpaqueRef:e43eb71c-45d6-5351-09ff-96e4fb7d0fa5", + "install-methods": "cdrom", + "instant": "true", + "mac_seed": "f83e8d8a-cfdc-b105-b054-ef5cb416b77e" + }, + "platform": { + "acpi": "1", + "apic": "true", + "cores-per-socket": "2", + "device_id": "0002", + "hpet": "true", + "nx": "true", + "pae": "true", + "timeoffset": "-25200", + "vga": "std", + "videoram": "8", + "viridian": "true", + "viridian_reference_tsc": "true", + "viridian_time_ref_count": "true" + }, + "state": "poweredon", + "uuid": "e3c0b2d5-5f05-424e-479c-d3df8b3e7cda", + "xenstore_data": { + "vm-data": "" } - ], - "domid": "56", - "folder": "", - "hardware": { - "memory_mb": 8192, - "num_cpu_cores_per_socket": 2, - "num_cpus": 4 - }, - "home_server": "", - "is_template": false, - "name": "testvm_11", - "name_desc": "", - "networks": [ - { - "gateway": "192.168.0.254", - "gateway6": "fc00::fffe", - "ip": "192.168.0.200", - "ip6": [ - "fe80:0000:0000:0000:e9cb:625a:32c5:c291", - "fc00:0000:0000:0000:0000:0000:0000:0001" - ], - "mac": "ba:91:3a:48:20:76", - "mtu": "1500", - "name": "Pool-wide network associated with eth1", - "netmask": "255.255.255.128", - "prefix": "25", - "prefix6": "64", - "vif_device": "0" - } - ], - "other_config": { - "base_template_name": "Windows Server 2016 (64-bit)", - "import_task": "OpaqueRef:e43eb71c-45d6-5351-09ff-96e4fb7d0fa5", - "install-methods": "cdrom", - "instant": "true", - "mac_seed": "f83e8d8a-cfdc-b105-b054-ef5cb416b77e" - }, - "platform": { - "acpi": "1", - "apic": "true", - "cores-per-socket": "2", - "device_id": "0002", - "hpet": "true", - "nx": "true", - "pae": "true", - "timeoffset": "-25200", - "vga": "std", - "videoram": "8", - "viridian": "true", - "viridian_reference_tsc": "true", - "viridian_time_ref_count": "true" - }, - "state": "poweredon", - "uuid": "e3c0b2d5-5f05-424e-479c-d3df8b3e7cda", - "xenstore_data": { - "vm-data": "" } - } changes: description: Detected or made changes to VM. returned: always type: list - sample: [ - { - "hardware": [ - "num_cpus" - ] - }, - { - "disks_changed": [ - [], - [ - "size" + sample: + [ + { + "hardware": [ + "num_cpus" ] - ] - }, - { - "disks_new": [ - { - "name": "new-disk", - "name_desc": "", - "position": 2, - "size_gb": "4", - "vbd_userdevice": "2" - } - ] - }, - { - "cdrom": [ - "type", - "iso_name" - ] - }, - { - "networks_changed": [ - [ - "mac" - ], - ] - }, - { - "networks_new": [ - { - "name": "Pool-wide network associated with eth2", - "position": 1, - "vif_device": "1" - } - ] - }, - "need_poweredoff" - ] + }, + { + "disks_changed": [ + [], + [ + "size" + ] + ] + }, + { + "disks_new": [ + { + "name": "new-disk", + "name_desc": "", + "position": 2, + "size_gb": "4", + "vbd_userdevice": "2" + } + ] + }, + { + "cdrom": [ + "type", + "iso_name" + ] + }, + { + "networks_changed": [ + [ + "mac" + ] + ] + }, + { + "networks_new": [ + { + "name": "Pool-wide network associated with eth2", + "position": 1, + "vif_device": "1" + } + ] + }, + "need_poweredoff" + ] """ import re diff --git a/plugins/modules/xfconf.py b/plugins/modules/xfconf.py index a63ada665f..1cae7fb12b 100644 --- a/plugins/modules/xfconf.py +++ b/plugins/modules/xfconf.py @@ -178,7 +178,7 @@ class XFConfProperty(StateModuleHelper): output_params = ('property', 'channel', 'value') module = dict( argument_spec=dict( - state=dict(type='str', choices=("present", "absent"), default="present"), + state=dict(type='str', choices=('present', 'absent'), default='present'), channel=dict(type='str', required=True), property=dict(type='str', required=True), value_type=dict(type='list', elements='str', @@ -191,8 +191,6 @@ class XFConfProperty(StateModuleHelper): supports_check_mode=True, ) - default_state = 'present' - def __init_module__(self): self.runner = xfconf_runner(self.module) self.vars.version = get_xfconf_version(self.runner) @@ -208,8 +206,8 @@ class XFConfProperty(StateModuleHelper): self.do_raise('xfconf-query failed with error (rc={0}): {1}'.format(rc, err)) result = out.rstrip() - if "Value is an array with" in result: - result = result.split("\n") + if 'Value is an array with' in result: + result = result.split('\n') result.pop(0) result.pop(0) @@ -225,7 +223,7 @@ class XFConfProperty(StateModuleHelper): self.vars.stdout = ctx.results_out self.vars.stderr = ctx.results_err self.vars.cmd = ctx.cmd - self.vars.set("run_info", ctx.run_info, verbosity=4) + self.vars.set('run_info', ctx.run_info, verbosity=4) self.vars.value = None def state_present(self): @@ -255,7 +253,7 @@ class XFConfProperty(StateModuleHelper): self.vars.stdout = ctx.results_out self.vars.stderr = ctx.results_err self.vars.cmd = ctx.cmd - self.vars.set("run_info", ctx.run_info, verbosity=4) + self.vars.set('run_info', ctx.run_info, verbosity=4) if not self.vars.is_array: self.vars.value = self.vars.value[0] diff --git a/plugins/modules/xml.py b/plugins/modules/xml.py index ef79cdbfbc..3a41cd8514 100644 --- a/plugins/modules/xml.py +++ b/plugins/modules/xml.py @@ -333,12 +333,15 @@ actions: description: A dictionary with the original xpath, namespaces and state. type: dict returned: success - sample: {xpath: xpath, namespaces: [namespace1, namespace2], state: present} -backup_file: - description: The name of the backup file that was created. - type: str - returned: when O(backup=true) - sample: /path/to/file.xml.1942.2017-08-24@14:16:01~ + sample: + { + "xpath": "xpath", + "namespaces": [ + "namespace1", + "namespace2" + ], + "state": "present" + } count: description: The count of xpath matches. type: int @@ -348,10 +351,6 @@ matches: description: The xpath matches found. type: list returned: when parameter O(print_match) is set -msg: - description: A message related to the performed action(s). - type: str - returned: always xmlstring: description: An XML string of the resulting output. type: str @@ -635,7 +634,7 @@ def check_or_make_target(module, tree, xpath, namespaces): # module.fail_json(msg="now tree=%s" % etree.tostring(tree, pretty_print=True)) elif eoa == "": for node in tree.xpath(inner_xpath, namespaces=namespaces): - if (node.text != eoa_value): + if node.text != eoa_value: node.text = eoa_value changed = True diff --git a/plugins/modules/yarn.py b/plugins/modules/yarn.py index 553e789e89..75b624e9d2 100644 --- a/plugins/modules/yarn.py +++ b/plugins/modules/yarn.py @@ -283,12 +283,12 @@ class Yarn(object): def main(): arg_spec = dict( - name=dict(default=None), - path=dict(default=None, type='path'), - version=dict(default=None), + name=dict(), + path=dict(type='path'), + version=dict(), production=dict(default=False, type='bool'), - executable=dict(default=None, type='path'), - registry=dict(default=None), + executable=dict(type='path'), + registry=dict(), state=dict(default='present', choices=['present', 'absent', 'latest']), ignore_scripts=dict(default=False, type='bool'), ) diff --git a/plugins/modules/yum_versionlock.py b/plugins/modules/yum_versionlock.py index 9982700928..183ffdc6fe 100644 --- a/plugins/modules/yum_versionlock.py +++ b/plugins/modules/yum_versionlock.py @@ -80,7 +80,7 @@ packages: returned: success type: list elements: str - sample: ['httpd'] + sample: ["httpd"] state: description: State of package(s). returned: success diff --git a/plugins/modules/zpool.py b/plugins/modules/zpool.py index 0de563078c..3cce255415 100644 --- a/plugins/modules/zpool.py +++ b/plugins/modules/zpool.py @@ -20,8 +20,8 @@ attributes: check_mode: support: partial details: - - In check mode, any C(zpool) subcommand that supports the dry-run flag (C(-n)) will be run with C(-n) and its - simulated output is included in the module's diff results. + - In check mode, any C(zpool) subcommand that supports the dry-run flag (C(-n)) will be run with C(-n) and its simulated + output is included in the module's diff results. diff_mode: support: full author: diff --git a/plugins/modules/zypper.py b/plugins/modules/zypper.py index 8ed359d32e..a9e3bf5257 100644 --- a/plugins/modules/zypper.py +++ b/plugins/modules/zypper.py @@ -605,22 +605,22 @@ def main(): module = AnsibleModule( argument_spec=dict( name=dict(required=True, aliases=['pkg'], type='list', elements='str'), - state=dict(required=False, default='present', choices=['absent', 'installed', 'latest', 'present', 'removed', 'dist-upgrade']), - type=dict(required=False, default='package', choices=['package', 'patch', 'pattern', 'product', 'srcpackage', 'application']), - extra_args_precommand=dict(required=False, default=None), - disable_gpg_check=dict(required=False, default=False, type='bool'), - disable_recommends=dict(required=False, default=True, type='bool'), - force=dict(required=False, default=False, type='bool'), - force_resolution=dict(required=False, default=False, type='bool'), - update_cache=dict(required=False, aliases=['refresh'], default=False, type='bool'), - oldpackage=dict(required=False, default=False, type='bool'), - extra_args=dict(required=False, default=None), - allow_vendor_change=dict(required=False, default=False, type='bool'), - replacefiles=dict(required=False, default=False, type='bool'), - clean_deps=dict(required=False, default=False, type='bool'), - simple_errors=dict(required=False, default=False, type='bool'), - quiet=dict(required=False, default=True, type='bool'), - skip_post_errors=dict(required=False, default=False, type='bool'), + state=dict(default='present', choices=['absent', 'installed', 'latest', 'present', 'removed', 'dist-upgrade']), + type=dict(default='package', choices=['package', 'patch', 'pattern', 'product', 'srcpackage', 'application']), + extra_args_precommand=dict(), + disable_gpg_check=dict(default=False, type='bool'), + disable_recommends=dict(default=True, type='bool'), + force=dict(default=False, type='bool'), + force_resolution=dict(default=False, type='bool'), + update_cache=dict(aliases=['refresh'], default=False, type='bool'), + oldpackage=dict(default=False, type='bool'), + extra_args=dict(), + allow_vendor_change=dict(default=False, type='bool'), + replacefiles=dict(default=False, type='bool'), + clean_deps=dict(default=False, type='bool'), + simple_errors=dict(default=False, type='bool'), + quiet=dict(default=True, type='bool'), + skip_post_errors=dict(default=False, type='bool'), ), supports_check_mode=True ) diff --git a/plugins/modules/zypper_repository.py b/plugins/modules/zypper_repository.py index 17de63bb6d..e6beeca9a4 100644 --- a/plugins/modules/zypper_repository.py +++ b/plugins/modules/zypper_repository.py @@ -250,7 +250,7 @@ def repo_exists(module, repodata, overwrite_multiple): module.fail_json(msg=errmsg) -def addmodify_repo(module, repodata, old_repos, zypper_version, warnings): +def addmodify_repo(module, repodata, old_repos, zypper_version): "Adds the repo, removes old repos before, that would conflict." repo = repodata['url'] cmd = _get_cmd(module, 'addrepo', '--check') @@ -263,7 +263,7 @@ def addmodify_repo(module, repodata, old_repos, zypper_version, warnings): if zypper_version >= LooseVersion('1.12.25'): cmd.extend(['--priority', str(repodata['priority'])]) else: - warnings.append("Setting priority only available for zypper >= 1.12.25. Ignoring priority argument.") + module.warn("Setting priority only available for zypper >= 1.12.25. Ignoring priority argument.") if repodata['enabled'] == '0': cmd.append('--disable') @@ -277,7 +277,7 @@ def addmodify_repo(module, repodata, old_repos, zypper_version, warnings): else: cmd.append('--no-gpgcheck') else: - warnings.append("Enabling/disabling gpgcheck only available for zypper >= 1.6.2. Using zypper default value.") + module.warn("Enabling/disabling gpgcheck only available for zypper >= 1.6.2. Using zypper default value.") if repodata['autorefresh'] == '1': cmd.append('--refresh') @@ -326,17 +326,17 @@ def runrefreshrepo(module, auto_import_keys=False, shortname=None): def main(): module = AnsibleModule( argument_spec=dict( - name=dict(required=False), - repo=dict(required=False), + name=dict(), + repo=dict(), state=dict(choices=['present', 'absent'], default='present'), - runrefresh=dict(required=False, default=False, type='bool'), - description=dict(required=False), - disable_gpg_check=dict(required=False, default=False, type='bool'), - autorefresh=dict(required=False, default=True, type='bool', aliases=['refresh']), - priority=dict(required=False, type='int'), - enabled=dict(required=False, default=True, type='bool'), - overwrite_multiple=dict(required=False, default=False, type='bool'), - auto_import_keys=dict(required=False, default=False, type='bool'), + runrefresh=dict(default=False, type='bool'), + description=dict(), + disable_gpg_check=dict(default=False, type='bool'), + autorefresh=dict(default=True, type='bool', aliases=['refresh']), + priority=dict(type='int'), + enabled=dict(default=True, type='bool'), + overwrite_multiple=dict(default=False, type='bool'), + auto_import_keys=dict(default=False, type='bool'), ), supports_check_mode=False, required_one_of=[['state', 'runrefresh']], @@ -350,7 +350,6 @@ def main(): runrefresh = module.params['runrefresh'] zypper_version = get_zypper_version(module) - warnings = [] # collect warning messages for final output repodata = { 'url': repo, @@ -460,7 +459,7 @@ def main(): if runrefresh: runrefreshrepo(module, auto_import_keys, shortname) exit_unchanged() - rc, stdout, stderr = addmodify_repo(module, repodata, old_repos, zypper_version, warnings) + rc, stdout, stderr = addmodify_repo(module, repodata, old_repos, zypper_version) if rc == 0 and (runrefresh or auto_import_keys): runrefreshrepo(module, auto_import_keys, shortname) elif state == 'absent': @@ -469,9 +468,9 @@ def main(): rc, stdout, stderr = remove_repo(module, shortname) if rc == 0: - module.exit_json(changed=True, repodata=repodata, state=state, warnings=warnings) + module.exit_json(changed=True, repodata=repodata, state=state) else: - module.fail_json(msg="Zypper failed with rc %s" % rc, rc=rc, stdout=stdout, stderr=stderr, repodata=repodata, state=state, warnings=warnings) + module.fail_json(msg="Zypper failed with rc %s" % rc, rc=rc, stdout=stdout, stderr=stderr, repodata=repodata, state=state) if __name__ == '__main__': diff --git a/tests/integration/targets/android_sdk/tasks/setup.yml b/tests/integration/targets/android_sdk/tasks/setup.yml index 8ded283533..9965403367 100644 --- a/tests/integration/targets/android_sdk/tasks/setup.yml +++ b/tests/integration/targets/android_sdk/tasks/setup.yml @@ -15,6 +15,7 @@ files: - '{{ ansible_distribution }}-{{ ansible_distribution_version }}.yml' - '{{ ansible_distribution }}-{{ ansible_distribution_major_version }}.yml' + - '{{ ansible_distribution }}.yml' - '{{ ansible_os_family }}.yml' paths: - '{{ role_path }}/vars' diff --git a/tests/integration/targets/android_sdk/vars/Fedora.yml b/tests/integration/targets/android_sdk/vars/Fedora.yml new file mode 100644 index 0000000000..e48443f0b5 --- /dev/null +++ b/tests/integration/targets/android_sdk/vars/Fedora.yml @@ -0,0 +1,6 @@ +--- +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +openjdk_pkg: java-21-openjdk-headless diff --git a/tests/integration/targets/android_sdk/vars/RedHat-9.yml b/tests/integration/targets/android_sdk/vars/RedHat-9.yml new file mode 100644 index 0000000000..e48443f0b5 --- /dev/null +++ b/tests/integration/targets/android_sdk/vars/RedHat-9.yml @@ -0,0 +1,6 @@ +--- +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +openjdk_pkg: java-21-openjdk-headless diff --git a/tests/integration/targets/apache2_module/tasks/actualtest.yml b/tests/integration/targets/apache2_module/tasks/actualtest.yml index 5bf66db9fb..88e063fe92 100644 --- a/tests/integration/targets/apache2_module/tasks/actualtest.yml +++ b/tests/integration/targets/apache2_module/tasks/actualtest.yml @@ -186,7 +186,7 @@ - name: ensure configcheck fails task with when run without mpm modules assert: that: - - "{{ item.failed }}" + - item is failed with_items: "{{ remove_with_configcheck.results }}" - name: try to disable all mpm modules without configcheck diff --git a/tests/integration/targets/apk/tasks/main.yml b/tests/integration/targets/apk/tasks/main.yml index 0e1b0ae429..c800b1fa1c 100644 --- a/tests/integration/targets/apk/tasks/main.yml +++ b/tests/integration/targets/apk/tasks/main.yml @@ -158,3 +158,63 @@ that: - results is not changed - (results.packages | default([]) | length) == 0 + + - name: Install package with empty name + community.general.apk: + name: "" + register: result_empty + ignore_errors: true + + - name: Assert failure due to empty package name + ansible.builtin.assert: + that: + - result_empty is failed + - "'Package name(s) cannot be empty or whitespace-only' == result_empty.msg" + + - name: Install package name with only spaces + community.general.apk: + name: [" "] + register: result_spaces + ignore_errors: true + + - name: Assert failure due to whitespace-only package name + ansible.builtin.assert: + that: + - result_spaces is failed + - "'Package name(s) cannot be empty or whitespace-only' == result_spaces.msg" + + - name: Accept list with valid and empty string + community.general.apk: + name: ["busybox", ""] + register: result_valid_mixed + ignore_errors: true + + - name: Assert success with mixed package list + ansible.builtin.assert: + that: + - result_valid_mixed is not failed + + - name: Reject package name list with multiple empty/whitespace-only strings + community.general.apk: + name: ["", " "] + register: result_multiple_empty + ignore_errors: true + + - name: Assert failure due to all package names being empty or whitespace + ansible.builtin.assert: + that: + - result_multiple_empty is failed + - "'Package name(s) cannot be empty or whitespace-only' == result_multiple_empty.msg" + + - name: Reject empty package name with update_cache parameter + community.general.apk: + name: "" + update_cache: true + register: result_empty_package_with_update_cache + ignore_errors: true + + - name: Assert failure due to all package names being empty or whitespace + ansible.builtin.assert: + that: + - result_empty_package_with_update_cache is failed + - "'Package name(s) cannot be empty or whitespace-only' == result_empty_package_with_update_cache.msg" diff --git a/tests/integration/targets/callback_tasks_only/aliases b/tests/integration/targets/callback_tasks_only/aliases new file mode 100644 index 0000000000..3e2dd244c1 --- /dev/null +++ b/tests/integration/targets/callback_tasks_only/aliases @@ -0,0 +1,6 @@ +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +azp/posix/3 +needs/target/callback diff --git a/tests/integration/targets/callback_tasks_only/tasks/main.yml b/tests/integration/targets/callback_tasks_only/tasks/main.yml new file mode 100644 index 0000000000..b02ddc8efc --- /dev/null +++ b/tests/integration/targets/callback_tasks_only/tasks/main.yml @@ -0,0 +1,79 @@ +--- +#################################################################### +# WARNING: These are designed specifically for Ansible tests # +# and should not be used as examples of how to write Ansible roles # +#################################################################### + +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +- block: + - name: Create temporary file + tempfile: + register: tempfile + + - name: Run tests + include_role: + name: callback + vars: + tests: + - name: Simple test + environment: + ANSIBLE_NOCOLOR: 'true' + ANSIBLE_FORCE_COLOR: 'false' + ANSIBLE_PYTHON_INTERPRETER: "{{ ansible_python_interpreter }}" + ANSIBLE_STDOUT_CALLBACK: community.general.tasks_only + playbook: | + - hosts: testhost + gather_facts: true + tasks: + - name: Create file + copy: + dest: "{{ tempfile.path }}" + content: | + Foo bar + + - name: Modify file + copy: + dest: "{{ tempfile.path }}" + content: | + Foo bar + Bar baz bam! + expected_output: + - "" + - "TASK [Gathering Facts] *********************************************************" + - "ok: [testhost]" + - "" + - "TASK [Create file] *************************************************************" + - "changed: [testhost]" + - "" + - "TASK [Modify file] *************************************************************" + - "changed: [testhost]" + - name: Different column width + environment: + ANSIBLE_NOCOLOR: 'true' + ANSIBLE_FORCE_COLOR: 'false' + ANSIBLE_PYTHON_INTERPRETER: "{{ ansible_python_interpreter }}" + ANSIBLE_STDOUT_CALLBACK: community.general.tasks_only + ANSIBLE_COLLECTIONS_TASKS_ONLY_NUMBER_OF_COLUMNS: 40 + playbook: | + - hosts: testhost + gather_facts: false + tasks: + - name: A task + debug: + msg: Test. + expected_output: + - "" + - "TASK [A task] ***************************" + - "ok: [testhost] => {" + - ' "msg": "Test."' + - "}" + + + always: + - name: Clean up temp file + file: + path: "{{ tempfile.path }}" + state: absent diff --git a/tests/integration/targets/cronvar/tasks/main.yml b/tests/integration/targets/cronvar/tasks/main.yml index 73ec41abca..0d3ae30daf 100644 --- a/tests/integration/targets/cronvar/tasks/main.yml +++ b/tests/integration/targets/cronvar/tasks/main.yml @@ -122,3 +122,36 @@ - custom_varcheck1.stdout == '1' - custom_varcheck2.stdout == '1' - custom_varcheck3.stdout == '0' + + +- name: Add variable with empty string + community.general.cronvar: + name: EMPTY_VAR + value: "" + state: present + +- name: Assert empty var present + ansible.builtin.shell: crontab -l + register: result + changed_when: false + +- name: Assert line is quoted + ansible.builtin.assert: + that: >- + 'EMPTY_VAR=""' in result.stdout + +- name: Attempt to add cron variable to non-existent parent directory + cronvar: + name: NOPARENT_VAR + value: noparentval + cron_file: /nonexistent/foo + user: root + register: invalid_directory_cronvar_result + ignore_errors: true + +- name: Assert that the cronvar task failed due to invalid directory + ansible.builtin.assert: + that: + - invalid_directory_cronvar_result is failed + - >- + "Parent directory '/nonexistent' does not exist for cron_file: '/nonexistent/foo'" == invalid_directory_cronvar_result.msg diff --git a/tests/integration/targets/decompress/tasks/dest.yml b/tests/integration/targets/decompress/tasks/dest.yml index 9a7bbe499f..4afd39e7b3 100644 --- a/tests/integration/targets/decompress/tasks/dest.yml +++ b/tests/integration/targets/decompress/tasks/dest.yml @@ -34,7 +34,8 @@ - name: Test that file exists assert: - that: "{{ item.stat.exists }}" + that: + - item.stat.exists quiet: true loop: "{{ result_files_stat.results }}" loop_control: diff --git a/tests/integration/targets/django_command/aliases b/tests/integration/targets/django_command/aliases index a742f24fea..c14251f85e 100644 --- a/tests/integration/targets/django_command/aliases +++ b/tests/integration/targets/django_command/aliases @@ -20,4 +20,5 @@ skip/rhel9.2 skip/rhel9.3 skip/rhel9.4 skip/rhel9.5 +skip/rhel9.6 skip/rhel10.0 diff --git a/tests/integration/targets/django_manage/aliases b/tests/integration/targets/django_manage/aliases index a742f24fea..c14251f85e 100644 --- a/tests/integration/targets/django_manage/aliases +++ b/tests/integration/targets/django_manage/aliases @@ -20,4 +20,5 @@ skip/rhel9.2 skip/rhel9.3 skip/rhel9.4 skip/rhel9.5 +skip/rhel9.6 skip/rhel10.0 diff --git a/tests/integration/targets/filter_jc/aliases b/tests/integration/targets/filter_jc/aliases index 62fbc2daba..978a58095d 100644 --- a/tests/integration/targets/filter_jc/aliases +++ b/tests/integration/targets/filter_jc/aliases @@ -8,3 +8,4 @@ skip/freebsd13.3 # FIXME - ruyaml compilation fails skip/freebsd14.0 # FIXME - ruyaml compilation fails skip/freebsd14.1 # FIXME - ruyaml compilation fails skip/freebsd14.2 # FIXME - ruyaml compilation fails +skip/freebsd14.3 # FIXME - ruyaml compilation fails diff --git a/tests/integration/targets/hg/tasks/install.yml b/tests/integration/targets/hg/tasks/install.yml index caa2e21512..efc0549e95 100644 --- a/tests/integration/targets/hg/tasks/install.yml +++ b/tests/integration/targets/hg/tasks/install.yml @@ -26,11 +26,11 @@ shell: apt-get -y update && apt-get -y install mercurial when: ansible_facts.pkg_mgr == 'apt' -- name: install packages (apk) +- name: install mercurial package package: name: mercurial state: present - when: ansible_facts.pkg_mgr in ['apk', 'community.general.apk'] + when: ansible_facts.pkg_mgr in ['apk', 'community.general.apk', 'pacman', 'community.general.pacman', 'pkgng', 'community.general.pkgng', 'zypper', 'community.general.zypper'] - name: install mercurial (dnf) dnf: @@ -42,21 +42,6 @@ name: mercurial when: ansible_facts.pkg_mgr == 'yum' -- name: install mercurial (pacman) - package: - name: mercurial - when: ansible_facts.pkg_mgr in ['pacman', 'community.general.pacman'] - -- name: install mercurial (pkgng) - package: - name: mercurial - when: ansible_facts.pkg_mgr in ['pkgng', 'community.general.pkgng'] - -- name: install mercurial (zypper) - package: - name: mercurial - when: ansible_facts.pkg_mgr in ['zypper', 'community.general.zypper'] - - name: preserve the updated python command: cp -av "{{ which_python.stdout }}" "{{ which_python.stdout }}.updated" diff --git a/tests/integration/targets/hg/tasks/main.yml b/tests/integration/targets/hg/tasks/main.yml index 8c79d20b86..842f4c6570 100644 --- a/tests/integration/targets/hg/tasks/main.yml +++ b/tests/integration/targets/hg/tasks/main.yml @@ -14,13 +14,6 @@ register: has_hg ignore_errors: true -- name: warn if the underlying system is not capable of running these tests - debug: - msg: >- - The mercurial client is not able to check out Bitbucket repositories as per the changes mentioned here: - https://bitbucket.org/blog/deprecating-tlsv1-tlsv1-1-2018-12-01 . Therefore these tests are skipped. - when: (ansible_distribution == "Ubuntu" and ansible_distribution_version == "14.04") or ansible_python_version is version("2.7.9", "<") - - block: - name: install mercurial include_tasks: install.yml @@ -32,14 +25,3 @@ - name: uninstall mercurial include_tasks: uninstall.yml when: has_hg is failed - - # As per the bitbucket changes in https://bitbucket.org/blog/deprecating-tlsv1-tlsv1-1-2018-12-01 , this - # test will fail under certain circumstances, to avoid false positives, we skip these tests under the following - # circumstances: - # - # - The ubuntu 14.04 image used on shippable runs python 2.7.6, so we skip explicitly for this image. - # - When ansible_python_version is not 2.7.9 or higher, mercurial is likely to also run using this same (old) - # python version, which causes issues as per the link above. - when: - - not (ansible_distribution == "Ubuntu" and ansible_distribution_version == "14.04") - - ansible_python_version is version("2.7.9", ">=") diff --git a/tests/integration/targets/hg/tasks/run-tests.yml b/tests/integration/targets/hg/tasks/run-tests.yml index 928b7cb68d..07aa08d225 100644 --- a/tests/integration/targets/hg/tasks/run-tests.yml +++ b/tests/integration/targets/hg/tasks/run-tests.yml @@ -4,17 +4,13 @@ # GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) # SPDX-License-Identifier: GPL-3.0-or-later - -- name: set where to extract the repo +- name: set variables for tests set_fact: + repo: "http://hg.code.sf.net/p/cg-hg-test-repo/hgtest" checkout_dir: "{{ remote_tmp_dir }}/hg_project_test" -- name: set what repo to use - set_fact: - repo: "http://hg.pf.osdn.net/view/a/ak/akasurde/hg_project_test" - - name: clean out the remote_tmp_dir - shell: rm -rf {{ remote_tmp_dir }}/* + shell: rm -rf "{{ checkout_dir }}" - name: verify that mercurial is installed so this test can continue shell: which hg @@ -25,8 +21,6 @@ dest: "{{ checkout_dir }}" register: hg_result -- debug: var=hg_result - - shell: ls {{ checkout_dir }} - name: verify information about the initial clone @@ -45,23 +39,20 @@ - debug: var=hg_result2 -- name: check for tags +- name: check if tags exists stat: path: "{{ checkout_dir }}/.hgtags" - register: tags + register: hg_tags - name: check for remotes stat: path: "{{ checkout_dir }}/.hg/branch" register: branches -- debug: var=tags -- debug: var=branches - - name: assert presence of tags/trunk/branches assert: that: - - "tags.stat.isreg" + - "hg_tags.stat.isreg" - "branches.stat.isreg" - name: verify on a re-clone things are marked unchanged @@ -71,7 +62,7 @@ - name: Checkout non-existent repo clone hg: - repo: "http://hg.pf.osdn.net/view/a/ak/akasurde/hg_project_test_1" + repo: "http://hg.code.sf.net/p/cg-hg-test-repo1" clone: false update: false register: hg_result3 @@ -80,6 +71,5 @@ - name: Verify result of non-existent repo clone assert: that: - - hg_result3.msg - - "'abort: HTTP Error 404: Not Found' in hg_result3.msg" + - "'abort: HTTP Error' in hg_result3.msg" - "not hg_result3.changed" diff --git a/tests/integration/targets/hg/tasks/uninstall.yml b/tests/integration/targets/hg/tasks/uninstall.yml index b2274caf1f..73c50f4909 100644 --- a/tests/integration/targets/hg/tasks/uninstall.yml +++ b/tests/integration/targets/hg/tasks/uninstall.yml @@ -16,12 +16,6 @@ line: "#!{{ stat_hg_interpreter.stat.path }}" when: stat_hg_interpreter.stat.islnk -- name: uninstall packages which were not originally installed (apk) - package: - name: mercurial - state: absent - when: ansible_facts.pkg_mgr in ['apk', 'community.general.apk'] - # using the apt module prevents autoremove from working, so call apt-get via shell instead - name: uninstall packages which were not originally installed (apt) shell: apt-get -y remove mercurial && apt-get -y autoremove @@ -39,11 +33,11 @@ shell: yum -y autoremove mercurial when: ansible_facts.pkg_mgr == 'yum' -- name: uninstall packages which were not originally installed (pacman) +- name: uninstall packages which were not originally installed package: name: mercurial state: absent - when: ansible_facts.pkg_mgr in ['pacman', 'community.general.pacman'] + when: ansible_facts.pkg_mgr in ['pacman', 'community.general.pacman', 'zypper', 'community.general.zypper', 'apk', 'community.general.apk'] - name: uninstall packages which were not originally installed (pkgng) package: @@ -52,12 +46,6 @@ autoremove: true when: ansible_facts.pkg_mgr in ['pkgng', 'community.general.pkgng'] -- name: uninstall packages which were not originally installed (zypper) - package: - name: mercurial - state: absent - when: ansible_facts.pkg_mgr in ['zypper', 'community.general.zypper'] - - name: restore the default python raw: mv "{{ which_python.stdout }}.default" "{{ which_python.stdout }}" diff --git a/tests/integration/targets/homectl/aliases b/tests/integration/targets/homectl/aliases index 3e4ed8c114..3621858566 100644 --- a/tests/integration/targets/homectl/aliases +++ b/tests/integration/targets/homectl/aliases @@ -13,4 +13,5 @@ skip/rhel9.2 # See https://www.reddit.com/r/Fedora/comments/si7nzk/homectl/ skip/rhel9.3 # See https://www.reddit.com/r/Fedora/comments/si7nzk/homectl/ skip/rhel9.4 # See https://www.reddit.com/r/Fedora/comments/si7nzk/homectl/ skip/rhel9.5 # See https://www.reddit.com/r/Fedora/comments/si7nzk/homectl/ +skip/rhel9.6 # See https://www.reddit.com/r/Fedora/comments/si7nzk/homectl/ skip/rhel10.0 # See https://www.reddit.com/r/Fedora/comments/si7nzk/homectl/ diff --git a/tests/integration/targets/iso_extract/aliases b/tests/integration/targets/iso_extract/aliases index 2c58f9253e..00569608e0 100644 --- a/tests/integration/targets/iso_extract/aliases +++ b/tests/integration/targets/iso_extract/aliases @@ -13,6 +13,7 @@ skip/rhel9.2 # FIXME skip/rhel9.3 # FIXME skip/rhel9.4 # FIXME skip/rhel9.5 # FIXME +skip/rhel9.6 # FIXME skip/rhel10.0 # FIXME skip/freebsd12.4 # FIXME skip/freebsd13.2 # FIXME @@ -22,3 +23,4 @@ skip/freebsd13.5 # FIXME skip/freebsd14.0 # FIXME skip/freebsd14.1 # FIXME skip/freebsd14.2 # FIXME +skip/freebsd14.3 # FIXME diff --git a/tests/integration/targets/jenkins_credential/README.md b/tests/integration/targets/jenkins_credential/README.md new file mode 100644 index 0000000000..3b1dc74c15 --- /dev/null +++ b/tests/integration/targets/jenkins_credential/README.md @@ -0,0 +1,16 @@ + + +The integration test can be performed as follows: + +``` +# 1. Start docker-compose: +docker-compose -f tests/integration/targets/jenkins_credential/docker-compose.yml down +docker-compose -f tests/integration/targets/jenkins_credential/docker-compose.yml up -d + +# 2. Run the integration tests: +ansible-test integration jenkins_credential --allow-unsupported -v +``` diff --git a/tests/integration/targets/jenkins_credential/aliases b/tests/integration/targets/jenkins_credential/aliases new file mode 100644 index 0000000000..d2086eecf8 --- /dev/null +++ b/tests/integration/targets/jenkins_credential/aliases @@ -0,0 +1,5 @@ +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +unsupported \ No newline at end of file diff --git a/tests/integration/targets/jenkins_credential/docker-compose.yml b/tests/integration/targets/jenkins_credential/docker-compose.yml new file mode 100644 index 0000000000..c99c9ed575 --- /dev/null +++ b/tests/integration/targets/jenkins_credential/docker-compose.yml @@ -0,0 +1,21 @@ +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +version: "3.8" + +services: + jenkins: + image: bitnami/jenkins + container_name: jenkins-test + ports: + - "8080:8080" + environment: + JENKINS_USERNAME: "FishLegs" + JENKINS_PASSWORD: "MeatLug" + JENKINS_PLUGINS: "credentials,cloudbees-folder,plain-credentials,github-branch-source,github-api,scm-api,workflow-step-api" + healthcheck: + test: curl -s http://localhost:8080/login || exit 1 + interval: 10s + timeout: 10s + retries: 10 diff --git a/tests/integration/targets/jenkins_credential/tasks/add.yml b/tests/integration/targets/jenkins_credential/tasks/add.yml new file mode 100644 index 0000000000..c956773454 --- /dev/null +++ b/tests/integration/targets/jenkins_credential/tasks/add.yml @@ -0,0 +1,169 @@ +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +- name: Add CUSTOM scope (run {{ run_number }}) + community.general.jenkins_credential: + id: "CUSTOM" + type: "scope" + jenkins_user: "{{ jenkins_username }}" + token: "{{ token }}" + description: "Custom scope credential" + inc_path: + - "include/path" + - "include/path2" + exc_path: + - "exclude/path" + - "exclude/path2" + inc_hostname: + - "included-hostname" + - "included-hostname2" + exc_hostname: + - "excluded-hostname" + - "excluded-hostname2" + schemes: + - "http" + - "https" + inc_hostname_port: + - "included-hostname:7000" + - "included-hostname2:7000" + exc_hostname_port: + - "excluded-hostname:7000" + - "excluded-hostname2:7000" + register: custom_scope + +- name: Assert CUSTOM scope changed value + assert: + that: + - custom_scope.changed == (run_number == 1) + fail_msg: "CUSTOM scope changed status incorrect on run {{ run_number }}" + success_msg: "CUSTOM scope behaved correctly on run {{ run_number }}" + +- name: Add user_and_pass credential (run {{ run_number }}) + community.general.jenkins_credential: + id: "userpass-id" + type: "user_and_pass" + jenkins_user: "{{ jenkins_username }}" + token: "{{ token }}" + description: "User and password credential" + username: "user1" + password: "pass1" + register: userpass_cred + +- name: Assert user_and_pass changed value + assert: + that: + - userpass_cred.changed == (run_number == 1) + fail_msg: "user_and_pass credential changed status incorrect on run {{ run_number }}" + success_msg: "user_and_pass credential behaved correctly on run {{ run_number }}" + +- name: Add file credential to custom scope (run {{ run_number }}) + community.general.jenkins_credential: + id: "file-id" + type: "file" + jenkins_user: "{{ jenkins_username }}" + token: "{{ token }}" + scope: "CUSTOM" + description: "File credential" + file_path: "{{ output_dir }}/my-secret.pem" + register: file_cred + +- name: Assert file credential changed value + assert: + that: + - file_cred.changed == (run_number == 1) + fail_msg: "file credential changed status incorrect on run {{ run_number }}" + success_msg: "file credential behaved correctly on run {{ run_number }}" + +- name: Add text credential to folder (run {{ run_number }}) + community.general.jenkins_credential: + id: "text-id" + type: "text" + jenkins_user: "{{ jenkins_username }}" + token: "{{ token }}" + description: "Text credential" + secret: "mysecrettext" + location: "folder" + url: "http://localhost:8080/job/test" + register: text_cred + +- name: Assert text credential changed value + assert: + that: + - text_cred.changed == (run_number == 1) + fail_msg: "text credential changed status incorrect on run {{ run_number }}" + success_msg: "text credential behaved correctly on run {{ run_number }}" + +- name: Add githubApp credential (run {{ run_number }}) + community.general.jenkins_credential: + id: "githubapp-id" + type: "github_app" + jenkins_user: "{{ jenkins_username }}" + token: "{{ token }}" + description: "GitHub app credential" + appID: "12345" + private_key_path: "{{ output_dir }}/github.pem" + owner: "github_owner" + register: githubapp_cred + +- name: Assert githubApp credential changed value + assert: + that: + - githubapp_cred.changed == (run_number == 1) + fail_msg: "githubApp credential changed status incorrect on run {{ run_number }}" + success_msg: "githubApp credential behaved correctly on run {{ run_number }}" + +- name: Add sshKey credential (run {{ run_number }}) + community.general.jenkins_credential: + id: "sshkey-id" + type: "ssh_key" + jenkins_user: "{{ jenkins_username }}" + token: "{{ token }}" + description: "SSH key credential" + username: "sshuser" + private_key_path: "{{ output_dir }}/ssh_key" + passphrase: 1234 + register: sshkey_cred + +- name: Assert sshKey credential changed value + assert: + that: + - sshkey_cred.changed == (run_number == 1) + fail_msg: "sshKey credential changed status incorrect on run {{ run_number }}" + success_msg: "sshKey credential behaved correctly on run {{ run_number }}" + +- name: Add certificate (p12) credential (run {{ run_number }}) + community.general.jenkins_credential: + id: "certificate-id" + type: "certificate" + jenkins_user: "{{ jenkins_username }}" + token: "{{ token }}" + description: "Certificate credential" + password: "12345678901234" + file_path: "{{ output_dir }}/certificate.p12" + register: cert_p12_cred + +- name: Assert certificate (p12) credential changed value + assert: + that: + - cert_p12_cred.changed == (run_number == 1) + fail_msg: "certificate (p12) credential changed status incorrect on run {{ run_number }}" + success_msg: "certificate (p12) credential behaved correctly on run {{ run_number }}" + +- name: Add certificate (pem) credential (run {{ run_number }}) + community.general.jenkins_credential: + id: "certificate-id-pem" + type: "certificate" + jenkins_user: "{{ jenkins_username }}" + token: "{{ token }}" + description: "Certificate credential (pem)" + file_path: "{{ output_dir }}/cert.pem" + private_key_path: "{{ output_dir }}/private.key" + register: cert_pem_cred + +- name: Assert certificate (pem) credential changed value + assert: + that: + - cert_pem_cred.changed == (run_number == 1) + fail_msg: "certificate (pem) credential changed status incorrect on run {{ run_number }}" + success_msg: "certificate (pem) credential behaved correctly on run {{ run_number }}" diff --git a/tests/integration/targets/jenkins_credential/tasks/del.yml b/tests/integration/targets/jenkins_credential/tasks/del.yml new file mode 100644 index 0000000000..036b65d3a1 --- /dev/null +++ b/tests/integration/targets/jenkins_credential/tasks/del.yml @@ -0,0 +1,128 @@ +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +- name: Delete user_and_pass credential (run {{ run_number }}) + community.general.jenkins_credential: + id: "userpass-id" + jenkins_user: "{{ jenkins_username }}" + token: "{{ token }}" + state: "absent" + register: userpass_cred + +- name: Assert user_and_pass changed value + assert: + that: + - userpass_cred.changed == (run_number == 1) + fail_msg: "user_and_pass credential changed status incorrect on run {{ run_number }}" + success_msg: "user_and_pass credential behaved correctly on run {{ run_number }}" + +- name: Delete file credential to custom scope (run {{ run_number }}) + community.general.jenkins_credential: + id: "file-id" + jenkins_user: "{{ jenkins_username }}" + token: "{{ token }}" + scope: "CUSTOM" + state: "absent" + register: file_cred + +- name: Assert file credential changed value + assert: + that: + - file_cred.changed == (run_number == 1) + fail_msg: "file credential changed status incorrect on run {{ run_number }}" + success_msg: "file credential behaved correctly on run {{ run_number }}" + +- name: Delete CUSTOM scope credential (run {{ run_number}}) + community.general.jenkins_credential: + id: "CUSTOM" + type: "scope" + jenkins_user: "{{ jenkins_username }}" + token: "{{ token }}" + state: "absent" + register: custom_scope + +- name: Assert CUSTOM scope changed value + assert: + that: + - custom_scope.changed == (run_number == 1) + fail_msg: "CUSTOM scope changed status incorrect on run {{ run_number }}" + success_msg: "CUSTOM scope behaved correctly on run {{ run_number }}" + +- name: Delete text credential to folder (run {{ run_number }}) + community.general.jenkins_credential: + id: "text-id" + jenkins_user: "{{ jenkins_username }}" + token: "{{ token }}" + state: "absent" + location: "folder" + url: "http://localhost:8080/job/test" + register: text_cred + +- name: Assert text credential changed value + assert: + that: + - text_cred.changed == (run_number == 1) + fail_msg: "text credential changed status incorrect on run {{ run_number }}" + success_msg: "text credential behaved correctly on run {{ run_number }}" + +- name: Delete githubApp credential (run {{ run_number }}) + community.general.jenkins_credential: + id: "githubapp-id" + jenkins_user: "{{ jenkins_username }}" + token: "{{ token }}" + state: "absent" + register: githubapp_cred + +- name: Assert githubApp credential changed value + assert: + that: + - githubapp_cred.changed == (run_number == 1) + fail_msg: "githubApp credential changed status incorrect on run {{ run_number }}" + success_msg: "githubApp credential behaved correctly on run {{ run_number }}" + +- name: Delete sshKey credential (run {{ run_number }}) + community.general.jenkins_credential: + id: "sshkey-id" + jenkins_user: "{{ jenkins_username }}" + token: "{{ token }}" + description: "SSH key credential" + state: "absent" + register: sshkey_cred + +- name: Assert sshKey credential changed value + assert: + that: + - sshkey_cred.changed == (run_number == 1) + fail_msg: "sshKey credential changed status incorrect on run {{ run_number }}" + success_msg: "sshKey credential behaved correctly on run {{ run_number }}" + +- name: Delete certificate credential (p12) (run {{ run_number }}) + community.general.jenkins_credential: + id: "certificate-id" + jenkins_user: "{{ jenkins_username }}" + token: "{{ token }}" + state: "absent" + register: cert_p12_cred + +- name: Assert certificate (p12) credential changed value + assert: + that: + - cert_p12_cred.changed == (run_number == 1) + fail_msg: "certificate (p12) credential changed status incorrect on run {{ run_number }}" + success_msg: "certificate (p12) credential behaved correctly on run {{ run_number }}" + +- name: Delete certificate credential (pem) (run {{ run_number }}) + community.general.jenkins_credential: + id: "certificate-id-pem" + jenkins_user: "{{ jenkins_username }}" + token: "{{ token }}" + state: "absent" + register: cert_pem_cred + +- name: Assert certificate (pem) credential changed value + assert: + that: + - cert_pem_cred.changed == (run_number == 1) + fail_msg: "certificate (pem) credential changed status incorrect on run {{ run_number }}" + success_msg: "certificate (pem) credential behaved correctly on run {{ run_number }}" diff --git a/tests/integration/targets/jenkins_credential/tasks/edit.yml b/tests/integration/targets/jenkins_credential/tasks/edit.yml new file mode 100644 index 0000000000..bd8d1eff7b --- /dev/null +++ b/tests/integration/targets/jenkins_credential/tasks/edit.yml @@ -0,0 +1,192 @@ +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +- name: Generate token + community.general.jenkins_credential: + id: "{{ tokenUuid}}" + name: "test-token-2" + jenkins_user: "{{ jenkins_username }}" + jenkins_password: "{{ jenkins_password }}" + type: "token" + force: true + register: token_result + +- name: Set token in vars + set_fact: + token: "{{ token_result.token }}" + tokenUuid: "{{ token_result.token_uuid }}" + +- name: Edit CUSTOM scope credential + community.general.jenkins_credential: + id: "CUSTOM" + type: "scope" + jenkins_user: "{{ jenkins_username }}" + token: "{{ token }}" + description: "New custom scope credential" + inc_path: + - "new_include/path" + - "new_include/path2" + exc_path: + - "new_exclude/path" + - "new_exclude/path2" + inc_hostname: + - "new_included-hostname" + - "new_included-hostname2" + exc_hostname: + - "new_excluded-hostname" + - "new_excluded-hostname2" + schemes: + - "new_http" + - "new_https" + inc_hostname_port: + - "new_included-hostname:7000" + - "new_included-hostname2:7000" + exc_hostname_port: + - "new_excluded-hostname:7000" + - "new_excluded-hostname2:7000" + force: true + register: custom_scope + +- name: Assert CUSTOM scope changed value + assert: + that: + - custom_scope.changed == true + fail_msg: "CUSTOM scope changed status when it shouldn't" + success_msg: "CUSTOM scope behaved correctly" + +- name: Edit user_and_pass credential + community.general.jenkins_credential: + id: "userpass-id" + type: "user_and_pass" + jenkins_user: "{{ jenkins_username }}" + token: "{{ token }}" + description: "new user and password credential" + username: "user2" + password: "pass2" + force: true + register: userpass_cred + +- name: Assert user_and_pass changed value + assert: + that: + - userpass_cred.changed == true + fail_msg: "user_and_pass credential changed status incorrect" + success_msg: "user_and_pass credential behaved correctly" + +- name: Edit file credential to custom scope + community.general.jenkins_credential: + id: "file-id" + type: "file" + jenkins_user: "{{ jenkins_username }}" + token: "{{ token }}" + scope: "CUSTOM" + description: "New file credential" + file_path: "{{ output_dir }}/my-secret.pem" + force: true + register: file_cred + +- name: Assert file credential changed value + assert: + that: + - file_cred.changed == true + fail_msg: "file credential changed status incorrect" + success_msg: "file credential behaved correctly" + +- name: Edit text credential to folder + community.general.jenkins_credential: + id: "text-id" + type: "text" + jenkins_user: "{{ jenkins_username }}" + token: "{{ token }}" + description: "New text credential" + secret: "mynewsecrettext" + location: "folder" + url: "http://localhost:8080/job/test" + force: true + register: text_cred + +- name: Assert text credential changed value + assert: + that: + - text_cred.changed == true + fail_msg: "text credential changed status incorrect" + success_msg: "text credential behaved correctly" + +- name: Edit githubApp credential + community.general.jenkins_credential: + id: "githubapp-id" + type: "github_app" + jenkins_user: "{{ jenkins_username }}" + token: "{{ token }}" + description: "New GitHub app credential" + appID: "12345678" + private_key_path: "{{ output_dir }}/github.pem" + owner: "new_github_owner" + force: true + register: githubapp_cred + +- name: Assert githubApp credential changed value + assert: + that: + - githubapp_cred.changed == true + fail_msg: "githubApp credential changed status incorrect" + success_msg: "githubApp credential behaved correctly" + +- name: Edit sshKey credential + community.general.jenkins_credential: + id: "sshkey-id" + type: "ssh_key" + jenkins_user: "{{ jenkins_username }}" + token: "{{ token }}" + description: "New SSH key credential" + username: "new_sshuser" + private_key_path: "{{ output_dir }}/ssh_key" + passphrase: 1234 + force: true + register: sshkey_cred + +- name: Assert sshKey credential changed value + assert: + that: + - sshkey_cred.changed == true + fail_msg: "sshKey credential changed status incorrect" + success_msg: "sshKey credential behaved correctly" + +- name: Edit certificate credential (p12) + community.general.jenkins_credential: + id: "certificate-id" + type: "certificate" + jenkins_user: "{{ jenkins_username }}" + token: "{{ token }}" + description: "New certificate credential" + password: "12345678901234" + file_path: "{{ output_dir }}/certificate.p12" + force: true + register: cert_p12_cred + +- name: Assert certificate (p12) credential changed value + assert: + that: + - cert_p12_cred.changed == true + fail_msg: "certificate (p12) credential changed status incorrect" + success_msg: "certificate (p12) credential behaved correctly" + +- name: Edit certificate credential (pem) + community.general.jenkins_credential: + id: "certificate-id-pem" + type: "certificate" + jenkins_user: "{{ jenkins_username }}" + token: "{{ token }}" + description: "New certificate credential (pem)" + file_path: "{{ output_dir }}/cert.pem" + private_key_path: "{{ output_dir }}/private.key" + force: true + register: cert_pem_cred + +- name: Assert certificate (pem) credential changed value + assert: + that: + - cert_pem_cred.changed == true + fail_msg: "certificate (pem) credential changed status incorrect" + success_msg: "certificate (pem) credential behaved correctly" diff --git a/tests/integration/targets/jenkins_credential/tasks/main.yml b/tests/integration/targets/jenkins_credential/tasks/main.yml new file mode 100644 index 0000000000..88ee0693cf --- /dev/null +++ b/tests/integration/targets/jenkins_credential/tasks/main.yml @@ -0,0 +1,79 @@ +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +- name: Prepare the test environment + include_tasks: pre.yml + vars: + output_dir: "{{ playbook_dir }}/generated" + +- name: Generate token + community.general.jenkins_credential: + name: "test-token" + jenkins_user: "{{ jenkins_username }}" + jenkins_password: "{{ jenkins_password }}" + type: "token" + no_log: true + register: token_result + +- name: Assert token and tokenUuid are returned + assert: + that: + - token_result.token is defined + - token_result.token_uuid is defined + fail_msg: "Token generation failed" + success_msg: "Token and tokenUuid successfully returned" + +- name: Set token facts + set_fact: + token: "{{ token_result.token }}" + tokenUuid: "{{ token_result.token_uuid }}" + +- name: Test adding new credentials and scopes + include_tasks: add.yml + vars: + run_number: 1 + output_dir: "{{ playbook_dir }}/generated" + +- name: Test adding credentials and scopes when they already exist + include_tasks: add.yml + vars: + run_number: 2 + output_dir: "{{ playbook_dir }}/generated" + +- name: Test editing credentials + include_tasks: edit.yml + vars: + output_dir: "{{ playbook_dir }}/generated" + +- name: Test deleting credentials and scopes + include_tasks: del.yml + vars: + run_number: 1 + +- name: Test deleting credentials and scopes when they don't exist + include_tasks: del.yml + vars: + run_number: 2 + +- name: Delete token + community.general.jenkins_credential: + id: "{{ tokenUuid }}" + name: "test-token-2" + jenkins_user: "{{ jenkins_username }}" + jenkins_password: "{{ jenkins_password }}" + state: "absent" + type: "token" + register: delete_token_result + +- name: Assert token deletion + assert: + that: + - delete_token_result.changed is true + fail_msg: "Token deletion failed" + success_msg: "Token successfully deleted" + +- name: Remove generated test files + ansible.builtin.file: + path: "{{ playbook_dir }}/generated" + state: absent diff --git a/tests/integration/targets/jenkins_credential/tasks/pre.yml b/tests/integration/targets/jenkins_credential/tasks/pre.yml new file mode 100644 index 0000000000..abb649ae1e --- /dev/null +++ b/tests/integration/targets/jenkins_credential/tasks/pre.yml @@ -0,0 +1,92 @@ +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +- name: Include Jenkins user variables + include_vars: "{{ role_path }}/vars/credentials.yml" + +- name: Make sure Jenkins is ready + uri: + url: http://localhost:8080/login + status_code: 200 + return_content: false + timeout: 30 + register: result + retries: 10 + delay: 5 + until: result.status == 200 + +- name: Get Jenkins crumb and save cookie + shell: | + curl -s -c cookies.txt -u FishLegs:MeatLug http://localhost:8080/crumbIssuer/api/json > crumb.json + args: + executable: /bin/bash + +- name: Read crumb value + set_fact: + crumb_data: "{{ lookup('file', 'crumb.json') | from_json }}" + +- name: Create Jenkins folder 'test' + shell: | + curl -b cookies.txt -u {{ jenkins_username }}:{{ jenkins_password }} \ + -H "{{ crumb_data.crumbRequestField }}: {{ crumb_data.crumb }}" \ + -H "Content-Type: application/xml" \ + --data-binary @- http://localhost:8080/createItem?name=test < + Test Folder + + + EOF + args: + executable: /bin/bash + +- name: Create output directory + ansible.builtin.file: + path: "{{ output_dir }}" + state: directory + mode: "0755" + +- name: Generate private key + community.crypto.openssl_privatekey: + path: "{{ output_dir }}/private.key" + size: 2048 + type: RSA + +- name: Generate CSR (certificate signing request) + community.crypto.openssl_csr: + path: "{{ output_dir }}/request.csr" + privatekey_path: "{{ output_dir }}/private.key" + common_name: "dummy.local" + +- name: Generate self-signed certificate + community.crypto.x509_certificate: + path: "{{ output_dir }}/cert.pem" + privatekey_path: "{{ output_dir }}/private.key" + csr_path: "{{ output_dir }}/request.csr" + provider: selfsigned + +- name: Create PKCS#12 (.p12) file + community.crypto.openssl_pkcs12: + path: "{{ output_dir }}/certificate.p12" + privatekey_path: "{{ output_dir }}/private.key" + certificate_path: "{{ output_dir }}/cert.pem" + friendly_name: "dummy-cert" + passphrase: "12345678901234" + +- name: Copy cert.pem to github.pem + ansible.builtin.copy: + src: "{{ output_dir }}/cert.pem" + dest: "{{ output_dir }}/github.pem" + remote_src: true + +- name: Copy private.key to my-secret.pem + ansible.builtin.copy: + src: "{{ output_dir }}/private.key" + dest: "{{ output_dir }}/my-secret.pem" + remote_src: true + +- name: Generate dummy SSH key + community.crypto.openssh_keypair: + path: "{{ output_dir }}/ssh_key" + type: rsa + size: 2048 diff --git a/tests/integration/targets/jenkins_credential/vars/credentials.yml b/tests/integration/targets/jenkins_credential/vars/credentials.yml new file mode 100644 index 0000000000..27df98700b --- /dev/null +++ b/tests/integration/targets/jenkins_credential/vars/credentials.yml @@ -0,0 +1,6 @@ +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +jenkins_username: FishLegs +jenkins_password: MeatLug diff --git a/tests/integration/targets/keycloak_modules_authentication/tasks/main.yml b/tests/integration/targets/keycloak_modules_authentication/tasks/main.yml index 1553e29c1c..b788865de9 100644 --- a/tests/integration/targets/keycloak_modules_authentication/tasks/main.yml +++ b/tests/integration/targets/keycloak_modules_authentication/tasks/main.yml @@ -3,6 +3,19 @@ # GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) # SPDX-License-Identifier: GPL-3.0-or-later +- name: Reset public login in master admin-cli (if potentially previous test failed) + community.general.keycloak_client: + auth_keycloak_url: "{{ url }}" + auth_realm: "{{ admin_realm }}" + auth_username: "{{ admin_user }}" + auth_password: "{{ admin_password }}" + auth_client_id: "admin-cli" + auth_client_secret: "{{ client_secret }}" + client_id: "admin-cli" + secret: "{{ client_secret }}" + public_client: true + state: present + - name: Create realm community.general.keycloak_realm: auth_keycloak_url: "{{ url }}" @@ -201,6 +214,89 @@ debug: var: result +- name: PREPARE - Temporarily disable public login in master admin-cli + community.general.keycloak_client: + auth_keycloak_url: "{{ url }}" + auth_realm: "{{ admin_realm }}" + auth_username: "{{ admin_user }}" + auth_password: "{{ admin_password }}" + auth_client_id: "admin-cli" + auth_client_secret: "{{ client_secret }}" + client_id: "admin-cli" + secret: "{{ client_secret }}" + public_client: false + service_accounts_enabled: true + client_authenticator_type: "client-secret" + state: present + +- name: PREPARE - Get admin role id + community.general.keycloak_role: + auth_keycloak_url: "{{ url }}" + auth_realm: "{{ admin_realm }}" + auth_username: "{{ admin_user }}" + auth_password: "{{ admin_password }}" + auth_client_id: "admin-cli" + auth_client_secret: "{{ client_secret }}" + name: "admin" + register: admin_role + +- name: PREPARE - Assign admin role to admin-cli in master + community.general.keycloak_user_rolemapping: + auth_keycloak_url: "{{ url }}" + auth_realm: "{{ admin_realm }}" + auth_username: "{{ admin_user }}" + auth_password: "{{ admin_password }}" + auth_client_id: "admin-cli" + auth_client_secret: "{{ client_secret }}" + realm: "master" + roles: + - name: "admin" + service_account_user_client_id: "admin-cli" + +- name: Create new realm role with valid client_id and client_secret + community.general.keycloak_role: + auth_keycloak_url: "{{ url }}" + auth_realm: "{{ admin_realm }}" + auth_client_id: "admin-cli" + auth_client_secret: "{{ client_secret }}" + realm: "{{ realm }}" + name: "{{ role }}" + description: "{{ keycloak_role_description }}" + state: present + register: result + +- name: Debug + debug: + var: result + +- name: Reset temporarily disabled public login in master admin-cli + community.general.keycloak_client: + auth_keycloak_url: "{{ url }}" + auth_realm: "{{ admin_realm }}" + auth_username: "{{ admin_user }}" + auth_password: "{{ admin_password }}" + auth_client_id: "admin-cli" + auth_client_secret: "{{ client_secret }}" + client_id: "admin-cli" + secret: "{{ client_secret }}" + public_client: true + state: present + +- name: Remove created realm role + community.general.keycloak_role: + auth_keycloak_url: "{{ url }}" + auth_realm: "{{ admin_realm }}" + auth_username: "{{ admin_user }}" + auth_password: "{{ admin_password }}" + realm: "{{ realm }}" + name: "{{ role }}" + state: absent + register: result + +- name: Debug + debug: + var: result + ### Unhappy path tests - name: Fail to create new realm role with invalid username/password @@ -215,7 +311,6 @@ state: present register: result failed_when: > - (result.exception is not defined) or ("HTTP Error 401: Unauthorized" not in result.msg) - name: Fail to create new realm role with invalid auth token @@ -228,7 +323,6 @@ state: present register: result failed_when: > - (result.exception is not defined) or ("HTTP Error 401: Unauthorized" not in result.msg) - name: Fail to create new realm role with invalid auth and refresh tokens, and invalid username/password @@ -245,5 +339,4 @@ state: present register: result failed_when: > - (result.exception is not defined) or ("HTTP Error 401: Unauthorized" not in result.msg) diff --git a/tests/integration/targets/keycloak_modules_authentication/vars/main.yml b/tests/integration/targets/keycloak_modules_authentication/vars/main.yml index 02ad618e1b..f57d791d86 100644 --- a/tests/integration/targets/keycloak_modules_authentication/vars/main.yml +++ b/tests/integration/targets/keycloak_modules_authentication/vars/main.yml @@ -9,6 +9,7 @@ admin_user: admin admin_password: password realm: myrealm client_id: myclient +client_secret: myclientsecret role: myrole keycloak_role_name: test diff --git a/tests/integration/targets/ldap_search/tasks/tests/schema.yml b/tests/integration/targets/ldap_search/tasks/tests/schema.yml index 63dd3fdf68..ca26305b82 100644 --- a/tests/integration/targets/ldap_search/tasks/tests/schema.yml +++ b/tests/integration/targets/ldap_search/tasks/tests/schema.yml @@ -22,4 +22,5 @@ that: - output is not failed - output.results | length >= 1 - - "{{ 'displayName' in output.results.0.attrs }}" + - >- + 'displayName' in output.results.0.attrs diff --git a/tests/integration/targets/listen_ports_facts/tasks/main.yml b/tests/integration/targets/listen_ports_facts/tasks/main.yml index 0e583e7a13..5da5b03784 100644 --- a/tests/integration/targets/listen_ports_facts/tasks/main.yml +++ b/tests/integration/targets/listen_ports_facts/tasks/main.yml @@ -110,3 +110,32 @@ loop: "{{ [tcp_listen, udp_listen]|flatten }}" when: item.name == 'nc' ignore_errors: true + + +- when: ansible_os_family == "Debian" + block: + - name: Remove netstat and ss dependencies to simulate missing executables + ansible.builtin.package: + name: + - net-tools + - iproute2 + state: absent + ignore_errors: true + + - name: Trigger listen_ports_facts with missing tools + community.general.listen_ports_facts: + register: listen_ports_failure_result + ignore_errors: true + + - name: Assert graceful failure when dependencies are missing + ansible.builtin.assert: + that: + - listen_ports_failure_result is failed + - "'Unable to find any of the supported commands' in listen_ports_failure_result.msg" + + - name: Reinstall netstat and ss dependencies after test + ansible.builtin.package: + name: + - net-tools + - iproute2 + state: present diff --git a/tests/integration/targets/lookup_lmdb_kv/aliases b/tests/integration/targets/lookup_lmdb_kv/aliases index 9c7febe241..5ecc8bfd38 100644 --- a/tests/integration/targets/lookup_lmdb_kv/aliases +++ b/tests/integration/targets/lookup_lmdb_kv/aliases @@ -5,3 +5,4 @@ azp/posix/2 destructive skip/aix +disabled # TODO: currently broken diff --git a/tests/integration/targets/lvg/aliases b/tests/integration/targets/lvg/aliases index cbe489d88b..eb76529397 100644 --- a/tests/integration/targets/lvg/aliases +++ b/tests/integration/targets/lvg/aliases @@ -11,3 +11,4 @@ skip/freebsd skip/osx skip/macos skip/alpine3.21 # TODO try to fix +skip/alpine3.22 # TODO try to fix diff --git a/tests/integration/targets/odbc/aliases b/tests/integration/targets/odbc/aliases index 3802d30f87..ee15fde5bb 100644 --- a/tests/integration/targets/odbc/aliases +++ b/tests/integration/targets/odbc/aliases @@ -13,5 +13,6 @@ skip/rhel9.2 skip/rhel9.3 skip/rhel9.4 skip/rhel9.5 +skip/rhel9.6 skip/rhel10.0 skip/freebsd diff --git a/tests/integration/targets/pkgng/tasks/freebsd.yml b/tests/integration/targets/pkgng/tasks/freebsd.yml index 2dcd7b02a8..b51ad836bd 100644 --- a/tests/integration/targets/pkgng/tasks/freebsd.yml +++ b/tests/integration/targets/pkgng/tasks/freebsd.yml @@ -534,12 +534,14 @@ # # NOTE: FreeBSD 14.2 fails as well (someone with FreeBSD knowledge has to take a look) # + # NOTE: FreeBSD 14.3 fails as well (someone with FreeBSD knowledge has to take a look) + # # See also # https://github.com/ansible-collections/community.general/issues/5795 when: >- (ansible_distribution_version is version('12.01', '>=') and ansible_distribution_version is version('12.3', '<')) or (ansible_distribution_version is version('13.6', '>=') and ansible_distribution_version is version('14.0', '<')) - or ansible_distribution_version is version('14.3', '>=') + or ansible_distribution_version is version('14.4', '>=') block: - name: Setup testjail include_tasks: setup-testjail.yml diff --git a/tests/integration/targets/setup_java_keytool/tasks/main.yml b/tests/integration/targets/setup_java_keytool/tasks/main.yml index 9f156425d8..56ba7a9581 100644 --- a/tests/integration/targets/setup_java_keytool/tasks/main.yml +++ b/tests/integration/targets/setup_java_keytool/tasks/main.yml @@ -22,6 +22,7 @@ files: - '{{ ansible_distribution }}-{{ ansible_distribution_version }}.yml' - '{{ ansible_distribution }}-{{ ansible_distribution_major_version }}.yml' + - '{{ ansible_distribution }}.yml' - '{{ ansible_os_family }}.yml' paths: - '{{ role_path }}/vars' diff --git a/tests/integration/targets/setup_java_keytool/vars/Fedora.yml b/tests/integration/targets/setup_java_keytool/vars/Fedora.yml new file mode 100644 index 0000000000..5f77ea9bba --- /dev/null +++ b/tests/integration/targets/setup_java_keytool/vars/Fedora.yml @@ -0,0 +1,7 @@ +--- +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +keytool_package_names: + - java-21-openjdk-headless diff --git a/tests/integration/targets/setup_snap/tasks/D-RedHat-9.3.yml b/tests/integration/targets/setup_snap/tasks/D-RedHat-9.3.yml deleted file mode 100644 index 5bbfaff128..0000000000 --- a/tests/integration/targets/setup_snap/tasks/D-RedHat-9.3.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -# Copyright (c) Ansible Project -# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) -# SPDX-License-Identifier: GPL-3.0-or-later - -# Do nothing diff --git a/tests/integration/targets/setup_snap/tasks/D-RedHat-9.3.yml b/tests/integration/targets/setup_snap/tasks/D-RedHat-9.3.yml new file mode 120000 index 0000000000..0b06951496 --- /dev/null +++ b/tests/integration/targets/setup_snap/tasks/D-RedHat-9.3.yml @@ -0,0 +1 @@ +nothing.yml \ No newline at end of file diff --git a/tests/integration/targets/setup_snap/tasks/D-RedHat-9.5.yml b/tests/integration/targets/setup_snap/tasks/D-RedHat-9.5.yml deleted file mode 100644 index 5bbfaff128..0000000000 --- a/tests/integration/targets/setup_snap/tasks/D-RedHat-9.5.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -# Copyright (c) Ansible Project -# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) -# SPDX-License-Identifier: GPL-3.0-or-later - -# Do nothing diff --git a/tests/integration/targets/setup_snap/tasks/D-RedHat-9.5.yml b/tests/integration/targets/setup_snap/tasks/D-RedHat-9.5.yml new file mode 120000 index 0000000000..0b06951496 --- /dev/null +++ b/tests/integration/targets/setup_snap/tasks/D-RedHat-9.5.yml @@ -0,0 +1 @@ +nothing.yml \ No newline at end of file diff --git a/tests/integration/targets/setup_snap/tasks/D-RedHat-9.6.yml b/tests/integration/targets/setup_snap/tasks/D-RedHat-9.6.yml new file mode 120000 index 0000000000..0b06951496 --- /dev/null +++ b/tests/integration/targets/setup_snap/tasks/D-RedHat-9.6.yml @@ -0,0 +1 @@ +nothing.yml \ No newline at end of file diff --git a/tests/integration/targets/sysrc/files/10394.conf b/tests/integration/targets/sysrc/files/10394.conf new file mode 100644 index 0000000000..fe0bc5b145 --- /dev/null +++ b/tests/integration/targets/sysrc/files/10394.conf @@ -0,0 +1,7 @@ +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later +k1="v1" +jail_list=" + foo + bar" \ No newline at end of file diff --git a/tests/integration/targets/sysrc/tasks/main.yml b/tests/integration/targets/sysrc/tasks/main.yml index 8b55101f66..f1135d488f 100644 --- a/tests/integration/targets/sysrc/tasks/main.yml +++ b/tests/integration/targets/sysrc/tasks/main.yml @@ -141,12 +141,12 @@ # # NOTE: currently fails with FreeBSD 12 with minor version less than 4 # NOTE: currently fails with FreeBSD 13 with minor version less than 4 - # NOTE: currently fails with FreeBSD 14 with minor version less than 1 + # NOTE: currently fails with FreeBSD 14 with minor version less than 2 # when: >- ansible_distribution_version is version('12.4', '>=') and ansible_distribution_version is version('13', '<') or ansible_distribution_version is version('13.4', '>=') and ansible_distribution_version is version('14', '<') - or ansible_distribution_version is version('14.1', '>=') + or ansible_distribution_version is version('14.2', '>=') block: - name: Setup testjail include_tasks: setup-testjail.yml @@ -369,14 +369,79 @@ - "value_2 == sysrc_equals_sign_2.value" - "value_2 == conf.spamd_flags" + ## + ## sysrc - #10004 state=absent when using default settings will report `changed=true` + ## + - name: Test that a key from /etc/defaults/rc.conf is not used to mark changed + sysrc: + name: dumpdev + state: absent + path: /tmp/10004.conf + register: sysrc_10004_absent + failed_when: sysrc_10004_absent.changed + + - name: Test that a delimited key from /etc/defaults/rc.conf is not used to mark changed + sysrc: + name: rc_conf_files + state: value_absent + path: /tmp/10004.conf + register: sysrc_10004_value_absent + failed_when: sysrc_10004_value_absent.changed + + - name: Test that a key from /etc/defaults/rc.conf is not used to mark changed without a path + sysrc: + name: static_routes + state: absent + register: sysrc_absent_default + failed_when: sysrc_absent_default.changed + + ## + ## sysrc - #10394 Ensure that files with multi-line values work + ## + - name: Copy 10394.conf + copy: + src: 10394.conf + dest: /tmp/10394.conf + + - name: Change value for k1 + sysrc: + name: k1 + value: v2 + path: /tmp/10394.conf + register: sysrc_10394_changed + + - name: Get file content + shell: "cat /tmp/10394.conf" + register: sysrc_10394_content + + - name: Ensure sysrc changed k1 from v1 to v2 + assert: + that: + - sysrc_10394_changed.changed + - > + 'k1="v2"' in sysrc_10394_content.stdout_lines + + ## + ## sysrc - additional tests + ## + - name: Ensure failure on OID style name since sysrc does not support them + sysrc: + name: not.valid.var + value: test + register: sysrc_name_check + failed_when: + - sysrc_name_check is not failed + - > + 'Name may only contain alpha-numeric and underscore characters' != sysrc_name_check.msg + always: - name: Restore /etc/rc.conf copy: - content: "{{ cached_etc_rcconf_content }}" + content: "{{ cached_etc_rcconf_content.stdout }}" dest: /etc/rc.conf - name: Restore /boot/loader.conf copy: - content: "{{ cached_boot_loaderconf_content }}" + content: "{{ cached_boot_loaderconf_content.stdout }}" dest: /boot/loader.conf diff --git a/tests/integration/targets/ufw/aliases b/tests/integration/targets/ufw/aliases index 0d89cc8fea..07227edc3f 100644 --- a/tests/integration/targets/ufw/aliases +++ b/tests/integration/targets/ufw/aliases @@ -15,6 +15,7 @@ skip/rhel9.2 # FIXME skip/rhel9.3 # FIXME skip/rhel9.4 # FIXME skip/rhel9.5 # FIXME +skip/rhel9.6 # FIXME skip/rhel10.0 # FIXME skip/docker needs/root diff --git a/tests/integration/targets/zpool/aliases b/tests/integration/targets/zpool/aliases index 80743b7cb5..083656f786 100644 --- a/tests/integration/targets/zpool/aliases +++ b/tests/integration/targets/zpool/aliases @@ -12,3 +12,4 @@ skip/osx skip/macos skip/rhel skip/docker +skip/alpine # TODO: figure out what goes wrong diff --git a/tests/sanity/ignore-2.16.txt b/tests/sanity/ignore-2.16.txt index 1642c0d275..1a4c8f89b1 100644 --- a/tests/sanity/ignore-2.16.txt +++ b/tests/sanity/ignore-2.16.txt @@ -1,3 +1,4 @@ +plugins/callback/tasks_only.py yamllint:unparsable-with-libyaml plugins/connection/wsl.py yamllint:unparsable-with-libyaml plugins/inventory/gitlab_runners.py yamllint:unparsable-with-libyaml plugins/inventory/iocage.py yamllint:unparsable-with-libyaml diff --git a/tests/sanity/ignore-2.15.txt b/tests/sanity/ignore-2.20.txt similarity index 54% rename from tests/sanity/ignore-2.15.txt rename to tests/sanity/ignore-2.20.txt index 63b01e5cd6..97751e5a92 100644 --- a/tests/sanity/ignore-2.15.txt +++ b/tests/sanity/ignore-2.20.txt @@ -1,21 +1,14 @@ -.azure-pipelines/scripts/publish-codecov.py replace-urlopen -plugins/connection/wsl.py yamllint:unparsable-with-libyaml -plugins/inventory/gitlab_runners.py yamllint:unparsable-with-libyaml -plugins/inventory/iocage.py yamllint:unparsable-with-libyaml -plugins/inventory/linode.py yamllint:unparsable-with-libyaml -plugins/inventory/lxd.py yamllint:unparsable-with-libyaml -plugins/inventory/nmap.py yamllint:unparsable-with-libyaml -plugins/inventory/scaleway.py yamllint:unparsable-with-libyaml -plugins/inventory/virtualbox.py yamllint:unparsable-with-libyaml -plugins/lookup/dependent.py validate-modules:unidiomatic-typecheck plugins/modules/consul_session.py validate-modules:parameter-state-invalid-choice plugins/modules/homectl.py import-3.11 # Uses deprecated stdlib library 'crypt' +plugins/modules/homectl.py import-3.12 # Uses deprecated stdlib library 'crypt' plugins/modules/iptables_state.py validate-modules:undocumented-parameter # params _back and _timeout used by action plugin plugins/modules/lxc_container.py validate-modules:use-run-command-not-popen plugins/modules/osx_defaults.py validate-modules:parameter-state-invalid-choice plugins/modules/parted.py validate-modules:parameter-state-invalid-choice plugins/modules/rhevm.py validate-modules:parameter-state-invalid-choice plugins/modules/udm_user.py import-3.11 # Uses deprecated stdlib library 'crypt' +plugins/modules/udm_user.py import-3.12 # Uses deprecated stdlib library 'crypt' plugins/modules/xfconf.py validate-modules:return-syntax-error -plugins/test/ansible_type.py yamllint:unparsable-with-libyaml +plugins/module_utils/univention_umc.py pylint:use-yield-from # suggested construct does not work with Python 2 +tests/unit/plugins/modules/uthelper.py pylint:use-yield-from # suggested construct does not work with Python 2 tests/unit/plugins/modules/test_gio_mime.yaml no-smart-quotes diff --git a/tests/sanity/ignore-2.15.txt.license b/tests/sanity/ignore-2.20.txt.license similarity index 100% rename from tests/sanity/ignore-2.15.txt.license rename to tests/sanity/ignore-2.20.txt.license diff --git a/tests/unit/plugins/connection/test_wsl.py b/tests/unit/plugins/connection/test_wsl.py index 768f9a8d27..c28d1fbec9 100644 --- a/tests/unit/plugins/connection/test_wsl.py +++ b/tests/unit/plugins/connection/test_wsl.py @@ -12,12 +12,14 @@ from ansible_collections.community.general.plugins.connection.wsl import authent from ansible_collections.community.general.plugins.module_utils._filelock import FileLock, LockTimeout from ansible.errors import AnsibleError, AnsibleAuthenticationFailure, AnsibleConnectionFailure from ansible.module_utils.common.text.converters import to_bytes -from ansible.module_utils.compat.paramiko import paramiko from ansible.playbook.play_context import PlayContext from ansible.plugins.loader import connection_loader from io import StringIO from pathlib import Path -from unittest.mock import patch, MagicMock, mock_open +from ansible_collections.community.internal_test_tools.tests.unit.compat.mock import patch, MagicMock, mock_open + + +paramiko = pytest.importorskip('paramiko') @pytest.fixture diff --git a/tests/unit/plugins/inventory/test_linode.py b/tests/unit/plugins/inventory/test_linode.py index 0f239f2dd9..ead41591a7 100644 --- a/tests/unit/plugins/inventory/test_linode.py +++ b/tests/unit/plugins/inventory/test_linode.py @@ -7,14 +7,8 @@ from __future__ import (absolute_import, division, print_function) __metaclass__ = type import pytest -import sys linode_apiv4 = pytest.importorskip('linode_api4') -mandatory_py_version = pytest.mark.skipif( - sys.version_info < (2, 7), - reason='The linode_api4 dependency requires python2.7 or higher' -) - from ansible.errors import AnsibleError from ansible.parsing.dataloader import DataLoader diff --git a/tests/unit/plugins/lookup/test_dependent.py b/tests/unit/plugins/lookup/test_dependent.py index ad02cecf19..fef53dec00 100644 --- a/tests/unit/plugins/lookup/test_dependent.py +++ b/tests/unit/plugins/lookup/test_dependent.py @@ -9,10 +9,9 @@ from __future__ import absolute_import, division, print_function __metaclass__ = type +from ansible.template import Templar + from ansible_collections.community.internal_test_tools.tests.unit.compat.unittest import TestCase -from ansible_collections.community.internal_test_tools.tests.unit.compat.mock import ( - MagicMock, -) from ansible_collections.community.internal_test_tools.tests.unit.utils.trust import make_trusted from ansible.plugins.loader import lookup_loader @@ -20,8 +19,7 @@ from ansible.plugins.loader import lookup_loader class TestLookupModule(TestCase): def setUp(self): - templar = MagicMock() - templar._loader = None + templar = Templar(loader=None) self.lookup = lookup_loader.get("community.general.dependent", templar=templar) def test_empty(self): diff --git a/tests/unit/plugins/module_utils/net_tools/pritunl/test_api.py b/tests/unit/plugins/module_utils/net_tools/pritunl/test_api.py index 6ddc827a14..a176a55768 100644 --- a/tests/unit/plugins/module_utils/net_tools/pritunl/test_api.py +++ b/tests/unit/plugins/module_utils/net_tools/pritunl/test_api.py @@ -13,7 +13,7 @@ from ansible.module_utils.six import iteritems from ansible_collections.community.general.plugins.module_utils.net_tools.pritunl import ( api, ) -from mock import MagicMock +from ansible_collections.community.internal_test_tools.tests.unit.compat.mock import MagicMock __metaclass__ = type diff --git a/tests/unit/plugins/module_utils/xenserver/conftest.py b/tests/unit/plugins/module_utils/xenserver/conftest.py index 3fcea55617..6190bb1ea0 100644 --- a/tests/unit/plugins/module_utils/xenserver/conftest.py +++ b/tests/unit/plugins/module_utils/xenserver/conftest.py @@ -16,7 +16,7 @@ import pytest from .FakeAnsibleModule import FakeAnsibleModule from ansible.module_utils import six -from mock import MagicMock +from ansible_collections.community.internal_test_tools.tests.unit.compat.mock import MagicMock @pytest.fixture diff --git a/tests/unit/plugins/modules/test_github_repo.py b/tests/unit/plugins/modules/test_github_repo.py index bbb1f624f4..9a76fc4b69 100644 --- a/tests/unit/plugins/modules/test_github_repo.py +++ b/tests/unit/plugins/modules/test_github_repo.py @@ -7,12 +7,13 @@ __metaclass__ = type import re import json -import sys +import pytest from httmock import with_httmock, urlmatch, response from ansible_collections.community.internal_test_tools.tests.unit.compat import unittest from ansible_collections.community.general.plugins.modules import github_repo -GITHUB_MINIMUM_PYTHON_VERSION = (2, 7) + +pytest.importorskip('github') @urlmatch(netloc=r'.*') @@ -167,11 +168,6 @@ def delete_repo_notfound_mock(url, request): class TestGithubRepo(unittest.TestCase): - def setUp(self): - if sys.version_info < GITHUB_MINIMUM_PYTHON_VERSION: - self.skipTest("Python %s+ is needed for PyGithub" % - ",".join(map(str, GITHUB_MINIMUM_PYTHON_VERSION))) - @with_httmock(get_orgs_mock) @with_httmock(get_repo_notfound_mock) @with_httmock(create_new_org_repo_mock) diff --git a/tests/unit/plugins/modules/test_jenkins_credential.py b/tests/unit/plugins/modules/test_jenkins_credential.py new file mode 100644 index 0000000000..b74b7c4b59 --- /dev/null +++ b/tests/unit/plugins/modules/test_jenkins_credential.py @@ -0,0 +1,348 @@ +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +from ansible_collections.community.general.plugins.modules import jenkins_credential +from ansible_collections.community.internal_test_tools.tests.unit.compat.mock import ( + MagicMock, + patch, + mock_open, +) + +import json +import sys + +if sys.version_info[0] == 3: + import builtins + open_path = "builtins.open" +else: + import __builtin__ as builtins + open_path = "__builtin__.open" + + +def test_validate_file_exist_passes_when_file_exists(): + module = MagicMock() + with patch("os.path.exists", return_value=True): + jenkins_credential.validate_file_exist(module, "/some/file/path") + module.fail_json.assert_not_called() + + +def test_validate_file_exist_fails_when_file_missing(): + module = MagicMock() + with patch("os.path.exists", return_value=False): + jenkins_credential.validate_file_exist(module, "/missing/file/path") + module.fail_json.assert_called_once_with( + msg="File not found: /missing/file/path" + ) + + +@patch( + "ansible_collections.community.general.plugins.modules.jenkins_credential.fetch_url" +) +def test_get_jenkins_crumb_sets_crumb_header(fetch_mock): + module = MagicMock() + module.params = {"type": "file", "url": "http://localhost:8080"} + headers = {} + + fake_response = MagicMock() + fake_response.read.return_value = json.dumps( + {"crumbRequestField": "crumb_field", "crumb": "abc123"} + ).encode("utf-8") + + fetch_mock.return_value = ( + fake_response, + {"status": 200, "set-cookie": "JSESSIONID=something; Path=/"}, + ) + + crumb_request_field, crumb, session_coockie = jenkins_credential.get_jenkins_crumb( + module, headers + ) + + assert "Cookie" not in headers + assert "crumb_field" in headers + assert crumb == "abc123" + assert headers[crumb_request_field] == crumb + + +@patch( + "ansible_collections.community.general.plugins.modules.jenkins_credential.fetch_url" +) +def test_get_jenkins_crumb_sets_cookie_if_type_token(fetch_mock): + module = MagicMock() + module.params = {"type": "token", "url": "http://localhost:8080"} + headers = {} + + fake_response = MagicMock() + fake_response.read.return_value = json.dumps( + {"crumbRequestField": "crumb_field", "crumb": "secure"} + ).encode("utf-8") + + fetch_mock.return_value = ( + fake_response, + {"status": 200, "set-cookie": "JSESSIONID=token-cookie; Path=/"}, + ) + + crumb_request_field, crumb, session_cookie = jenkins_credential.get_jenkins_crumb( + module, headers + ) + + assert "crumb_field" in headers + assert crumb == "secure" + assert headers[crumb_request_field] == crumb + assert headers["Cookie"] == session_cookie + + +@patch( + "ansible_collections.community.general.plugins.modules.jenkins_credential.fetch_url" +) +def test_get_jenkins_crumb_fails_on_non_200_status(fetch_mock): + module = MagicMock() + module.params = {"type": "file", "url": "http://localhost:8080"} + headers = {} + + fetch_mock.return_value = (MagicMock(), {"status": 403}) + + jenkins_credential.get_jenkins_crumb(module, headers) + + module.fail_json.assert_called_once() + assert "Failed to fetch Jenkins crumb" in module.fail_json.call_args[1]["msg"] + + +@patch( + "ansible_collections.community.general.plugins.modules.jenkins_credential.fetch_url" +) +def test_get_jenkins_crumb_removes_job_from_url(fetch_mock): + module = MagicMock() + module.params = {"type": "file", "url": "http://localhost:8080/job/test"} + headers = {} + + fake_response = MagicMock() + fake_response.read.return_value = json.dumps( + {"crumbRequestField": "Jenkins-Crumb", "crumb": "xyz"} + ).encode("utf-8") + + fetch_mock.return_value = (fake_response, {"status": 200, "set-cookie": ""}) + + jenkins_credential.get_jenkins_crumb(module, headers) + + url_called = fetch_mock.call_args[0][1] + assert url_called == "http://localhost:8080/crumbIssuer/api/json" + + +def test_clean_data_removes_extraneous_fields(): + data = { + "id": "cred1", + "description": "test", + "jenkins_user": "admin", + "token": "secret", + "url": "http://localhost:8080", + "file_path": None, + } + expected = {"id": "cred1", "description": "test"} + result = jenkins_credential.clean_data(data) + assert result == expected, "Expected {}, got {}".format(expected, result) + + +@patch( + "ansible_collections.community.general.plugins.modules.jenkins_credential.fetch_url" +) +def test_target_exists_returns_true_on_200(fetch_url_mock): + module = MagicMock() + module.params = { + "url": "http://localhost:8080", + "location": "system", + "scope": "_", + "id": "my-id", + "jenkins_user": "admin", + "token": "secret", + "type": "file", + } + + fetch_url_mock.return_value = (MagicMock(), {"status": 200}) + assert jenkins_credential.target_exists(module) is True + + +@patch( + "ansible_collections.community.general.plugins.modules.jenkins_credential.fetch_url" +) +def test_target_exists_returns_false_on_404(fetch_url_mock): + module = MagicMock() + module.params = { + "url": "http://localhost:8080", + "location": "system", + "scope": "_", + "id": "my-id", + "jenkins_user": "admin", + "token": "secret", + "type": "file", + } + + fetch_url_mock.return_value = (MagicMock(), {"status": 404}) + assert jenkins_credential.target_exists(module) is False + + +@patch( + "ansible_collections.community.general.plugins.modules.jenkins_credential.fetch_url" +) +def test_target_exists_calls_fail_json_on_unexpected_status(fetch_url_mock): + module = MagicMock() + module.params = { + "url": "http://localhost:8080", + "location": "system", + "scope": "_", + "id": "my-id", + "jenkins_user": "admin", + "token": "secret", + "type": "file", + } + + fetch_url_mock.return_value = (MagicMock(), {"status": 500}) + jenkins_credential.target_exists(module) + module.fail_json.assert_called_once() + assert "Unexpected status code" in module.fail_json.call_args[1]["msg"] + + +@patch( + "ansible_collections.community.general.plugins.modules.jenkins_credential.fetch_url" +) +def test_target_exists_skips_check_for_token_type(fetch_url_mock): + module = MagicMock() + module.params = { + "type": "token", + "url": "ignored", + "location": "ignored", + "scope": "ignored", + "id": "ignored", + "jenkins_user": "ignored", + "token": "ignored", + } + + assert jenkins_credential.target_exists(module) is False + fetch_url_mock.assert_not_called() + + +@patch( + "ansible_collections.community.general.plugins.modules.jenkins_credential.fetch_url" +) +def test_delete_target_fails_deleting(fetch_mock): + module = MagicMock() + module.params = { + "type": "token", + "jenkins_user": "admin", + "url": "http://localhost:8080", + "id": "token-id", + "location": "system", + "scope": "_", + } + headers = {"Authorization": "Basic abc", "Content-Type": "whatever"} + + fetch_mock.return_value = (MagicMock(), {"status": 500}) + + jenkins_credential.delete_target(module, headers) + + module.fail_json.assert_called_once() + assert "Failed to delete" in module.fail_json.call_args[1]["msg"] + + +@patch( + "ansible_collections.community.general.plugins.modules.jenkins_credential.fetch_url", + side_effect=Exception("network error"), +) +def test_delete_target_raises_exception(fetch_mock): + module = MagicMock() + module.params = { + "type": "scope", + "jenkins_user": "admin", + "location": "system", + "url": "http://localhost:8080", + "id": "domain-id", + "scope": "_", + } + headers = {"Authorization": "Basic auth"} + + jenkins_credential.delete_target(module, headers) + + module.fail_json.assert_called_once() + assert "Exception during delete" in module.fail_json.call_args[1]["msg"] + assert "network error" in module.fail_json.call_args[1]["msg"] + + +def test_read_privateKey_returns_trimmed_contents(): + module = MagicMock() + module.params = {"private_key_path": "/fake/path/key.pem"} + + mocked_file = mock_open( + read_data="\n \t -----BEGIN PRIVATE KEY-----\nKEYDATA\n-----END PRIVATE KEY----- \n\n" + ) + with patch(open_path, mocked_file): + result = jenkins_credential.read_privateKey(module) + + expected = "-----BEGIN PRIVATE KEY-----\nKEYDATA\n-----END PRIVATE KEY-----" + + assert result == expected + mocked_file.assert_called_once_with("/fake/path/key.pem", "r") + + +def test_read_privateKey_handles_file_read_error(): + module = MagicMock() + module.params = {"private_key_path": "/invalid/path.pem"} + + with patch(open_path, side_effect=IOError("cannot read file")): + jenkins_credential.read_privateKey(module) + + module.fail_json.assert_called_once() + assert "Failed to read private key file" in module.fail_json.call_args[1]["msg"] + + +def test_embed_file_into_body_returns_multipart_fields(): + module = MagicMock() + file_path = "/fake/path/secret.pem" + credentials = {"id": "my-id"} + fake_file_content = b"MY SECRET DATA" + + mock = mock_open() + mock.return_value.read.return_value = fake_file_content + + with patch("os.path.basename", return_value="secret.pem"), patch.object( + builtins, "open", mock + ): + body, content_type = jenkins_credential.embed_file_into_body( + module, file_path, credentials.copy() + ) + + assert "multipart/form-data; boundary=" in content_type + + # Check if file content is embedded in body + assert b"MY SECRET DATA" in body + assert b'filename="secret.pem"' in body + + +def test_embed_file_into_body_fails_when_file_unreadable(): + module = MagicMock() + file_path = "/fake/path/missing.pem" + credentials = {"id": "something"} + + with patch(open_path, side_effect=IOError("can't read file")): + jenkins_credential.embed_file_into_body(module, file_path, credentials) + + module.fail_json.assert_called_once() + assert "Failed to read file" in module.fail_json.call_args[1]["msg"] + + +def test_embed_file_into_body_injects_file_keys_into_credentials(): + module = MagicMock() + file_path = "/fake/path/file.txt" + credentials = {"id": "test"} + + with patch(open_path, mock_open(read_data=b"1234")), patch( + "os.path.basename", return_value="file.txt" + ): + + jenkins_credential.embed_file_into_body(module, file_path, credentials) + + assert credentials["file"] == "file0" + assert credentials["fileName"] == "file.txt" diff --git a/tests/unit/plugins/modules/test_linode_v4.py b/tests/unit/plugins/modules/test_linode_v4.py index d4bcdf3243..47e77a52e8 100644 --- a/tests/unit/plugins/modules/test_linode_v4.py +++ b/tests/unit/plugins/modules/test_linode_v4.py @@ -7,15 +7,10 @@ __metaclass__ = type import json import os -import sys import pytest linode_apiv4 = pytest.importorskip('linode_api4') -mandatory_py_version = pytest.mark.skipif( - sys.version_info < (2, 7), - reason='The linode_api4 dependency requires python2.7 or higher' -) from linode_api4.errors import ApiError as LinodeApiError from linode_api4 import LinodeClient diff --git a/tests/unit/plugins/modules/test_lxca_cmms.py b/tests/unit/plugins/modules/test_lxca_cmms.py index 888a6c8d52..3c79148022 100644 --- a/tests/unit/plugins/modules/test_lxca_cmms.py +++ b/tests/unit/plugins/modules/test_lxca_cmms.py @@ -61,8 +61,8 @@ class TestMyModule(): command_options=dict(default='cmms', choices=['cmms', 'cmms_by_uuid', 'cmms_by_chassis_uuid']), auth_url=dict(required=True), - uuid=dict(default=None), - chassis=dict(default=None), + uuid=dict(), + chassis=dict(), ) _setup_conn.return_value = "Fake connection" _execute_module.return_value = [] diff --git a/tests/unit/plugins/modules/test_lxca_nodes.py b/tests/unit/plugins/modules/test_lxca_nodes.py index 98c8a551d4..1f8ab84368 100644 --- a/tests/unit/plugins/modules/test_lxca_nodes.py +++ b/tests/unit/plugins/modules/test_lxca_nodes.py @@ -63,8 +63,8 @@ class TestMyModule(): 'nodes_status_managed', 'nodes_status_unmanaged']), auth_url=dict(required=True), - uuid=dict(default=None), - chassis=dict(default=None), + uuid=dict(), + chassis=dict(), ) _setup_conn.return_value = "Fake connection" _execute_module.return_value = [] diff --git a/tests/unit/plugins/modules/test_modprobe.py b/tests/unit/plugins/modules/test_modprobe.py index 12f6af7273..bada481cfc 100644 --- a/tests/unit/plugins/modules/test_modprobe.py +++ b/tests/unit/plugins/modules/test_modprobe.py @@ -147,7 +147,7 @@ class TestUnloadModule(ModuleTestCase): class TestModuleIsLoadedPersistently(ModuleTestCase): def setUp(self): - if (sys.version_info[0] == 3 and sys.version_info[1] < 7) or (sys.version_info[0] == 2 and sys.version_info[1] < 7): + if sys.version_info[0] == 3 and sys.version_info[1] < 7: self.skipTest("open_mock doesn't support readline in earlier python versions") super(TestModuleIsLoadedPersistently, self).setUp() @@ -222,7 +222,7 @@ class TestModuleIsLoadedPersistently(ModuleTestCase): class TestPermanentParams(ModuleTestCase): def setUp(self): - if (sys.version_info[0] == 3 and sys.version_info[1] < 7) or (sys.version_info[0] == 2 and sys.version_info[1] < 7): + if sys.version_info[0] == 3 and sys.version_info[1] < 7: self.skipTest("open_mock doesn't support readline in earlier python versions") super(TestPermanentParams, self).setUp() diff --git a/tests/unit/plugins/modules/test_pacemaker_cluster.py b/tests/unit/plugins/modules/test_pacemaker_cluster.py new file mode 100644 index 0000000000..ad69411a9c --- /dev/null +++ b/tests/unit/plugins/modules/test_pacemaker_cluster.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Author: Dexter Le (dextersydney2001@gmail.com) +# Largely adapted from test_redhat_subscription by +# Jiri Hnidek (jhnidek@redhat.com) +# +# Copyright (c) Dexter Le (dextersydney2001@gmail.com) +# Copyright (c) Jiri Hnidek (jhnidek@redhat.com) +# +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + + +from ansible_collections.community.general.plugins.modules import pacemaker_cluster +from .uthelper import UTHelper, RunCommandMock + +UTHelper.from_module(pacemaker_cluster, __name__, mocks=[RunCommandMock]) diff --git a/tests/unit/plugins/modules/test_pacemaker_cluster.yaml b/tests/unit/plugins/modules/test_pacemaker_cluster.yaml new file mode 100644 index 0000000000..785a7cb4f6 --- /dev/null +++ b/tests/unit/plugins/modules/test_pacemaker_cluster.yaml @@ -0,0 +1,488 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Dexter Le (dextersydney2001@gmail.com) +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +--- +anchors: + environ: &env-def {environ_update: {LANGUAGE: C, LC_ALL: C}, check_rc: false} +test_cases: + - id: test_online_minimal_input_initial_online_all_no_maintenance + input: + state: online + output: + changed: false + previous_value: ' * Online: [ pc1, pc2, pc3 ]' + value: ' * Online: [ pc1, pc2, pc3 ]' + mocks: + run_command: + - command: [/testbin/pcs, cluster, status] + environ: *env-def + rc: 0 + out: ' * Online: [ pc1, pc2, pc3 ]' + err: "" + - command: [/testbin/pcs, cluster, start, --all, --wait=300] + environ: *env-def + rc: 0 + out: "Starting Cluster..." + err: "" + - command: [/testbin/pcs, property, config] + environ: *env-def + rc: 1 + out: | + Cluster Properties: cib-bootstrap-options + cluster-infrastructure=corosync + cluster-name=hacluster + dc-version=2.1.9-1.fc41-7188dbf + have-watchdog=false + err: "" + - command: [/testbin/pcs, cluster, status] + environ: *env-def + rc: 0 + out: ' * Online: [ pc1, pc2, pc3 ]' + err: "" + - id: test_online_minimal_input_initial_offline_all_maintenance + input: + state: online + output: + changed: true + previous_value: 'Error: cluster is not currently running on this node' + value: ' * Online: [ pc1, pc2, pc3 ]' + mocks: + run_command: + - command: [/testbin/pcs, cluster, status] + environ: *env-def + rc: 1 + out: 'Error: cluster is not currently running on this node' + err: "" + - command: [/testbin/pcs, cluster, start, --all, --wait=300] + environ: *env-def + rc: 0 + out: "Starting Cluster..." + err: "" + - command: [/testbin/pcs, property, config] + environ: *env-def + rc: 0 + out: | + Cluster Properties: cib-bootstrap-options + cluster-infrastructure=corosync + cluster-name=hacluster + dc-version=2.1.9-1.fc41-7188dbf + have-watchdog=false + maintenance-mode=true + err: "" + - command: [/testbin/pcs, property, set, maintenance-mode=false] + environ: *env-def + rc: 0 + out: "" + err: "" + - command: [/testbin/pcs, cluster, status] + environ: *env-def + rc: 0 + out: ' * Online: [ pc1, pc2, pc3 ]' + err: "" + - id: test_online_minimal_input_initial_offline_single_nonlocal_no_maintenance + input: + state: online + name: pc2 + output: + changed: true + previous_value: '* Node pc2: UNCLEAN (offline)\n * Online: [ pc1, pc3 ]' + value: ' * Online: [ pc1, pc2, pc3 ]' + mocks: + run_command: + - command: [/testbin/pcs, cluster, status] + environ: *env-def + rc: 0 + out: '* Node pc2: UNCLEAN (offline)\n * Online: [ pc1, pc3 ]' + err: "" + - command: [/testbin/pcs, cluster, start, pc2, --wait=300] + environ: *env-def + rc: 0 + out: "Starting Cluster..." + err: "" + - command: [/testbin/pcs, property, config] + environ: *env-def + rc: 1 + out: | + Cluster Properties: cib-bootstrap-options + cluster-infrastructure=corosync + cluster-name=hacluster + dc-version=2.1.9-1.fc41-7188dbf + have-watchdog=false + err: "" + - command: [/testbin/pcs, cluster, status] + environ: *env-def + rc: 0 + out: ' * Online: [ pc1, pc2, pc3 ]' + err: "" + - id: test_online_minimal_input_initial_offline_single_local_no_maintenance + input: + state: online + name: pc1 + output: + changed: true + previous_value: 'Error: cluster is not currently running on this node' + value: ' * Online: [ pc1, pc2, pc3 ]' + mocks: + run_command: + - command: [/testbin/pcs, cluster, status] + environ: *env-def + rc: 1 + out: 'Error: cluster is not currently running on this node' + err: "" + - command: [/testbin/pcs, cluster, start, pc1, --wait=300] + environ: *env-def + rc: 0 + out: "Starting Cluster..." + err: "" + - command: [/testbin/pcs, property, config] + environ: *env-def + rc: 1 + out: | + Cluster Properties: cib-bootstrap-options + cluster-infrastructure=corosync + cluster-name=hacluster + dc-version=2.1.9-1.fc41-7188dbf + have-watchdog=false + err: "" + - command: [/testbin/pcs, cluster, status] + environ: *env-def + rc: 0 + out: ' * Online: [ pc1, pc2, pc3 ]' + err: "" + - id: test_offline_minimal_input_initial_online_all + input: + state: offline + output: + changed: true + previous_value: ' * Online: [ pc1, pc2, pc3 ]' + value: 'Error: cluster is not currently running on this node' + mocks: + run_command: + - command: [/testbin/pcs, cluster, status] + environ: *env-def + rc: 0 + out: ' * Online: [ pc1, pc2, pc3 ]' + err: "" + - command: [/testbin/pcs, cluster, stop, --all, --wait=300] + environ: *env-def + rc: 0 + out: "Stopping Cluster..." + err: "" + - command: [/testbin/pcs, cluster, status] + environ: *env-def + rc: 1 + out: 'Error: cluster is not currently running on this node' + err: "" + - id: test_offline_minimal_input_initial_offline_all + input: + state: offline + output: + changed: false + previous_value: 'Error: cluster is not currently running on this node' + value: 'Error: cluster is not currently running on this node' + mocks: + run_command: + - command: [/testbin/pcs, cluster, status] + environ: *env-def + rc: 1 + out: 'Error: cluster is not currently running on this node' + err: "" + - command: [/testbin/pcs, cluster, stop, --all, --wait=300] + environ: *env-def + rc: 0 + out: "Stopping Cluster..." + err: "" + - command: [/testbin/pcs, cluster, status] + environ: *env-def + rc: 1 + out: 'Error: cluster is not currently running on this node' + err: "" + - id: test_offline_minimal_input_initial_offline_single_nonlocal + input: + state: offline + name: pc3 + output: + changed: true + previous_value: '* Node pc2: UNCLEAN (offline)\n * Online: [ pc1, pc3 ]' + value: '* Node pc2: UNCLEAN (offline)\n* Node pc3: UNCLEAN (offline)\n * Online: [ pc1 ]' + mocks: + run_command: + - command: [/testbin/pcs, cluster, status] + environ: *env-def + rc: 0 + out: '* Node pc2: UNCLEAN (offline)\n * Online: [ pc1, pc3 ]' + err: "" + - command: [/testbin/pcs, cluster, stop, pc3, --wait=300] + environ: *env-def + rc: 0 + out: "Stopping Cluster..." + err: "" + - command: [/testbin/pcs, cluster, status] + environ: *env-def + rc: 0 + out: '* Node pc2: UNCLEAN (offline)\n* Node pc3: UNCLEAN (offline)\n * Online: [ pc1 ]' + err: "" + - id: test_restart_minimal_input_initial_online_all_no_maintenance + input: + state: restart + output: + changed: false + previous_value: ' * Online: [ pc1, pc2, pc3 ]' + value: ' * Online: [ pc1, pc2, pc3 ]' + mocks: + run_command: + - command: [/testbin/pcs, cluster, status] + environ: *env-def + rc: 0 + out: ' * Online: [ pc1, pc2, pc3 ]' + err: "" + - command: [/testbin/pcs, cluster, stop, --all, --wait=300] + environ: *env-def + rc: 0 + out: "Stopping Cluster..." + err: "" + - command: [/testbin/pcs, cluster, start, --all, --wait=300] + environ: *env-def + rc: 0 + out: "Starting Cluster..." + err: "" + - command: [/testbin/pcs, property, config] + environ: *env-def + rc: 1 + out: | + Cluster Properties: cib-bootstrap-options + cluster-infrastructure=corosync + cluster-name=hacluster + dc-version=2.1.9-1.fc41-7188dbf + have-watchdog=false + err: "" + - command: [/testbin/pcs, cluster, status] + environ: *env-def + rc: 0 + out: ' * Online: [ pc1, pc2, pc3 ]' + err: "" + - id: test_restart_minimal_input_initial_offline_all_no_maintenance + input: + state: restart + output: + changed: true + previous_value: 'Error: cluster is not currently running on this node' + value: ' * Online: [ pc1, pc2, pc3 ]' + mocks: + run_command: + - command: [/testbin/pcs, cluster, status] + environ: *env-def + rc: 1 + out: 'Error: cluster is not currently running on this node' + err: "" + - command: [/testbin/pcs, cluster, stop, --all, --wait=300] + environ: *env-def + rc: 0 + out: "Stopping Cluster..." + err: "" + - command: [/testbin/pcs, cluster, start, --all, --wait=300] + environ: *env-def + rc: 0 + out: "Starting Cluster..." + err: "" + - command: [/testbin/pcs, property, config] + environ: *env-def + rc: 1 + out: | + Cluster Properties: cib-bootstrap-options + cluster-infrastructure=corosync + cluster-name=hacluster + dc-version=2.1.9-1.fc41-7188dbf + have-watchdog=false + err: "" + - command: [/testbin/pcs, cluster, status] + environ: *env-def + rc: 0 + out: ' * Online: [ pc1, pc2, pc3 ]' + err: "" + - id: test_restart_minimal_input_initial_offline_all_maintenance + input: + state: restart + output: + changed: true + previous_value: 'Error: cluster is not currently running on this node' + value: ' * Online: [ pc1, pc2, pc3 ]' + mocks: + run_command: + - command: [/testbin/pcs, cluster, status] + environ: *env-def + rc: 1 + out: 'Error: cluster is not currently running on this node' + err: "" + - command: [/testbin/pcs, cluster, stop, --all, --wait=300] + environ: *env-def + rc: 0 + out: "Stopping Cluster..." + err: "" + - command: [/testbin/pcs, cluster, start, --all, --wait=300] + environ: *env-def + rc: 0 + out: "Starting Cluster..." + err: "" + - command: [/testbin/pcs, property, config] + environ: *env-def + rc: 0 + out: | + Cluster Properties: cib-bootstrap-options + cluster-infrastructure=corosync + cluster-name=hacluster + dc-version=2.1.9-1.fc41-7188dbf + have-watchdog=false + maintenance-mode=true + err: "" + - command: [/testbin/pcs, property, set, maintenance-mode=false] + environ: *env-def + rc: 0 + out: "" + err: "" + - command: [/testbin/pcs, cluster, status] + environ: *env-def + rc: 0 + out: ' * Online: [ pc1, pc2, pc3 ]' + err: "" + - id: test_maintenance_minimal_input_initial_online + input: + state: maintenance + output: + changed: true + previous_value: 'maintenance-mode=false (default)' + value: 'maintenance-mode=true' + mocks: + run_command: + - command: [/testbin/pcs, property, config, maintenance-mode] + environ: *env-def + rc: 0 + out: 'maintenance-mode=false (default)' + err: "" + - command: [/testbin/pcs, property, set, maintenance-mode=true] + environ: *env-def + rc: 0 + out: "" + err: "" + - command: [/testbin/pcs, property, config, maintenance-mode] + environ: *env-def + rc: 0 + out: 'maintenance-mode=true' + err: "" + - id: test_maintenance_minimal_input_initial_offline + input: + state: maintenance + output: + failed: true + msg: "pcs failed with error (rc=1): Error: unable to get cib" + mocks: + run_command: + - command: [/testbin/pcs, property, config, maintenance-mode] + environ: *env-def + rc: 1 + out: "" + err: "Error: unable to get cib" + - command: [/testbin/pcs, property, set, maintenance-mode=true] + environ: *env-def + rc: 1 + out: "" + err: "Error: unable to get cib" + - id: test_maintenance_minimal_input_initial_maintenance + input: + state: maintenance + output: + changed: false + previous_value: 'maintenance-mode=true' + value: 'maintenance-mode=true' + mocks: + run_command: + - command: [/testbin/pcs, property, config, maintenance-mode] + environ: *env-def + rc: 0 + out: 'maintenance-mode=true' + err: "" + - command: [/testbin/pcs, property, set, maintenance-mode=true] + environ: *env-def + rc: 0 + out: "" + err: "" + - command: [/testbin/pcs, property, config, maintenance-mode] + environ: *env-def + rc: 0 + out: 'maintenance-mode=true' + err: "" + - id: test_cleanup_minimal_input_initial_resources_not_exist + input: + state: cleanup + output: + changed: false + previous_value: "NO resources configured" + value: "NO resources configured" + mocks: + run_command: + - command: [/testbin/pcs, resource, status] + environ: *env-def + rc: 0 + out: "NO resources configured" + err: "" + - command: [/testbin/pcs, resource, cleanup] + environ: *env-def + rc: 0 + out: "Cleaned up all resources on all nodes" + err: "" + - command: [/testbin/pcs, resource, status] + environ: *env-def + rc: 0 + out: "NO resources configured" + err: "" + - id: test_cleanup_minimal_input_initial_resources_exists + input: + state: cleanup + output: + changed: true + previous_value: " * virtual-ip\t(ocf:heartbeat:IPAddr2):\t Started" + value: "NO resources configured" + mocks: + run_command: + - command: [/testbin/pcs, resource, status] + environ: *env-def + rc: 0 + out: " * virtual-ip\t(ocf:heartbeat:IPAddr2):\t Started" + err: "" + - command: [/testbin/pcs, resource, cleanup] + environ: *env-def + rc: 0 + out: "Cleaned up all resources on all nodes" + err: "" + - command: [/testbin/pcs, resource, status] + environ: *env-def + rc: 0 + out: "NO resources configured" + err: "" + - id: test_cleanup_specific_minimal_input_initial_resources_exists + input: + state: cleanup + name: virtual-ip + output: + changed: true + previous_value: " * virtual-ip\t(ocf:heartbeat:IPAddr2):\t Started" + value: "NO resources configured" + mocks: + run_command: + - command: [/testbin/pcs, resource, status, virtual-ip] + environ: *env-def + rc: 0 + out: " * virtual-ip\t(ocf:heartbeat:IPAddr2):\t Started" + err: "" + - command: [/testbin/pcs, resource, cleanup, virtual-ip] + environ: *env-def + rc: 0 + out: "Cleaned up virtual-ip on X" + err: "" + - command: [/testbin/pcs, resource, status, virtual-ip] + environ: *env-def + rc: 0 + out: "NO resources configured" + err: "" diff --git a/tests/unit/plugins/modules/test_pacemaker_resource.yaml b/tests/unit/plugins/modules/test_pacemaker_resource.yaml index 7d4b4b2855..76679d14d9 100644 --- a/tests/unit/plugins/modules/test_pacemaker_resource.yaml +++ b/tests/unit/plugins/modules/test_pacemaker_resource.yaml @@ -51,6 +51,63 @@ test_cases: rc: 0 out: " * virtual-ip\t(ocf:heartbeat:IPAddr2):\t Started" err: "" + - id: test_present_filled_input_resource_not_exist + input: + state: present + name: virtual-ip + resource_type: + resource_name: IPaddr2 + resource_option: + - "ip=[192.168.2.1]" + resource_operation: + - operation_action: start + operation_option: + - timeout=1200 + - operation_action: stop + operation_option: + - timeout=1200 + - operation_action: monitor + operation_option: + - timeout=1200 + resource_meta: + - test_meta1=123 + - test_meta2=456 + resource_argument: + argument_action: group + argument_option: + - test_group + wait: 200 + output: + changed: true + previous_value: null + value: " * virtual-ip\t(ocf:heartbeat:IPAddr2):\t Started" + mocks: + run_command: + - command: [/testbin/pcs, resource, status, virtual-ip] + environ: *env-def + rc: 1 + out: "" + err: "Error: resource or tag id 'virtual-ip' not found" + - command: [/testbin/pcs, property, config] + environ: *env-def + rc: 1 + out: | + Cluster Properties: cib-bootstrap-options + cluster-infrastructure=corosync + cluster-name=hacluster + dc-version=2.1.9-1.fc41-7188dbf + have-watchdog=false + err: "" + - command: [/testbin/pcs, resource, create, virtual-ip, IPaddr2, "ip=[192.168.2.1]", op, start, timeout=1200, op, stop, timeout=1200, op, monitor, timeout=1200, meta, test_meta1=123, meta, test_meta2=456, --group, test_group, --wait=200] + environ: *env-def + rc: 0 + out: "Assumed agent name 'ocf:heartbeat:IPaddr2' (deduced from 'IPAddr2')" + err: "" + - command: [/testbin/pcs, resource, status, virtual-ip] + environ: *env-def + rc: 0 + out: " * virtual-ip\t(ocf:heartbeat:IPAddr2):\t Started" + err: "" - id: test_present_minimal_input_resource_exists input: state: present diff --git a/tests/unit/plugins/modules/test_slack.py b/tests/unit/plugins/modules/test_slack.py index e656ab902f..e0c87f907f 100644 --- a/tests/unit/plugins/modules/test_slack.py +++ b/tests/unit/plugins/modules/test_slack.py @@ -103,6 +103,22 @@ class TestSlackModule(ModuleTestCase): self.assertTrue(fetch_url_mock.call_count, 1) self.assertEqual(fetch_url_mock.call_args[1]['url'], "https://slack.com/api/chat.postMessage") + def test_govslack_message(self): + with set_module_args({ + 'token': 'xoxa-123456789abcdef', + 'domain': 'slack-gov.com', + 'msg': 'test with ts' + }): + with patch.object(slack, "fetch_url") as fetch_url_mock: + mock_response = Mock() + mock_response.read.return_value = '{"fake":"data"}' + fetch_url_mock.return_value = (mock_response, {"status": 200}) + with self.assertRaises(AnsibleExitJson): + self.module.main() + + self.assertTrue(fetch_url_mock.call_count, 1) + self.assertEqual(fetch_url_mock.call_args[1]['url'], "https://slack-gov.com/api/chat.postMessage") + def test_edit_message(self): with set_module_args({ 'token': 'xoxa-123456789abcdef',