This section discusses the behavioral changes between ansible-base 2.10 and ansible-core 2.11.
It is intended to assist in updating your playbooks, plugins and other parts of your Ansible infrastructure so they work with this version of ansible-core.
We suggest you read this page along with the ansible-core Changelog for 2.11 to understand what updates you may need to make.
ansible-core is mainly of interest for developers and users who only want to use a small, controlled subset of the available collections. Regular users should install Ansible.
The complete list of porting guides can be found at porting guides.
jinja2_native setting now does not affect the template module which implicitly returns strings. For the template lookup there is a new argument jinja2_native (off by default) to control that functionality. The rest of the Jinja2 expressions still operate based on the jinja2_native setting.ansible-galaxy login command has been removed, as the underlying API it used for GitHub auth has been shut down. Publishing roles or collections to Galaxy with ansible-galaxy now requires that a Galaxy API token be passed to the CLI using a token file (default location ~/.ansible/galaxy_token) or (insecurely) with the --token argument to ansible-galaxy.The constant ansible.module_utils.basic._CHECK_ARGUMENT_TYPES_DISPATCHER is deprecated. Use ansible.module_utils.common.parameters.DEFAULT_TYPE_VALIDATORS instead.
AnsibleModule
With the move to ArgumentSpecValidator for performing argument spec validation, the following private methods in AnsibleModule have been removed:
_check_argument_types()_check_argument_values()_check_arguments()_check_mutually_exclusive() –> ansible.module_utils.common.validation.check_mutually_exclusive()
_check_required_arguments() –> ansible.module_utils.common.validation.check_required_arguments()
_check_required_by() –> ansible.module_utils.common.validation.check_required_by()
_check_required_if() –> ansible.module_utils.common.validation.check_required_if()
_check_required_one_of() –> ansible.module_utils.common.validation.check_required_one_of()
_check_required_together() –> ansible.module_utils.common.validation.check_required_together()
_check_type_bits() –> ansible.module_utils.common.validation.check_type_bits()
_check_type_bool() –> ansible.module_utils.common.validation.check_type_bool()
_check_type_bytes() –> ansible.module_utils.common.validation.check_type_bytes()
_check_type_dict() –> ansible.module_utils.common.validation.check_type_dict()
_check_type_float() –> ansible.module_utils.common.validation.check_type_float()
_check_type_int() –> ansible.module_utils.common.validation.check_type_int()
_check_type_jsonarg() –> ansible.module_utils.common.validation.check_type_jsonarg()
_check_type_list() –> ansible.module_utils.common.validation.check_type_list()
_check_type_path() –> ansible.module_utils.common.validation.check_type_path()
_check_type_raw() –> ansible.module_utils.common.validation.check_type_raw()
_check_type_str() –> ansible.module_utils.common.validation.check_type_str()
_count_terms() –> ansible.module_utils.common.validation.count_terms()
_get_wanted_type()_handle_aliases()_handle_no_log_values()_handle_options()_set_defaults()_set_fallbacks()Modules or plugins using these private methods should use the public functions in ansible.module_utils.common.validation or ArgumentSpecValidator.validate() if no public function was listed above.
ansible.module_utils.common.parameters
The following functions in ansible.module_utils.common.parameters are now private and should not be used directly. Use ArgumentSpecValidator.validate() instead.
list_no_log_valueslist_deprecationshandle_aliasesansible < 2.10 or from ansible-base and using pip, you must pip uninstall ansible or pip uninstall ansible-base before installing ansible-core to avoid conflicts.ansible-core 2.11 still works with the same versions of Python that ansible-base 2.10 worked with, however 2.11 emits a warning when running on a controller node with a Python version less than 3.8. This warning can be disabled by setting ANSIBLE_CONTROLLER_PYTHON_WARNING=False in your environment. ansible-core 2.12 will require Python 3.8 or greater.choices field, so any settings that violate it and were ignored in 2.10 cause an error in 2.11. For example, ANSIBLE_COLLECTIONS_ON_ANSIBLE_VERSION_MISMATCH=0 now causes an error (valid choices are ignore, warn or error).ansible-galaxy command now uses resolvelib for resolving dependencies. In most cases this should not make a user-facing difference beyond being more performant, but we note it here for posterity and completeness.module_utils into any modules you maintain, you may now mark the import as optional during the module payload build by wrapping the import statement in a try or if block. This allows modules to use module_utils that may not be present in all versions of Ansible or a collection, and to perform arbitrary recovery or fallback actions during module runtime.apt_key module has explicitly defined file as mutually exclusive with data, keyserver and url. They cannot be used together anymore.meta module now supports tags for user-defined tasks. Set the task’s tags to ‘always’ to maintain the previous behavior. Internal meta tasks continue to always run.The following modules no longer exist:
No notable changes
ansible_virtualization_type now tries to report a more accurate result than xen when virtualized and not running on Xen.virtualization_tech_guest and virtualization_tech_host keys. These are lists of virtualization technologies that a guest is a part of, or that a host provides, respectively. As an example, if you set up a host to provide both KVM and VirtualBox, both values are included in virtualization_tech_host. Similarly, a podman container running on a VM powered by KVM has a virtualization_tech_guest of ["kvm", "podman", "container"].filter type is changed from string to list in the setup module in order to use more than one filter. Previous behavior (using a string) still remains and works as a single filter.CachePluginAdjudicator.flush() now calls the underlying cache plugin’s flush() instead of only deleting keys that it knows about. Inventory plugins should use delete() to remove any specific keys. As a user, this means that when an inventory plugin calls its clear_cache() method, facts could also be flushed from the cache. To work around this, users can configure inventory plugins to use a cache backend that is independent of the facts cache.meta task execution is now sent to v2_playbook_on_task_start like any other task. By default, only explicit meta tasks are sent there. Callback plugins can opt-in to receiving internal, implicitly created tasks to act on those as well, as noted in the plugin development documentation.choices are now validated, so plugins that were using incorrect or incomplete choices issue an error in 2.11 if the value provided does not match. This has a simple fix: update the entries in choices to match reality.No notable changes
© 2012–2018 Michael DeHaan
© 2018–2025 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/latest/porting_guides/porting_guide_core_2.11.html