Ansible-core 2.11 Porting Guide
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.
Playbook
- The
jinja2_nativesetting now does not affect the template module which implicitly returns strings. For the template lookup there is a new argumentjinja2_native(off by default) to control that functionality. The rest of the Jinja2 expressions still operate based on thejinja2_nativesetting.
Command Line
- The
ansible-galaxy logincommand has been removed, as the underlying API it used for GitHub auth has been shut down. Publishing roles or collections to Galaxy withansible-galaxynow requires that a Galaxy API token be passed to the CLI using a token file (default location~/.ansible/galaxy_token) or (insecurely) with the--tokenargument toansible-galaxy.
Deprecated
The constant ansible.module_utils.basic._CHECK_ARGUMENT_TYPES_DISPATCHER is deprecated. Use ansible.module_utils.common.parameters.DEFAULT_TYPE_VALIDATORS instead.
Breaking Changes
Changes to 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.
Changes to 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_aliases
Other
-
Upgrading: If upgrading from
ansible < 2.10or fromansible-baseand using pip, you mustpip uninstall ansibleorpip uninstall ansible-basebefore installingansible-coreto avoid conflicts. - Python 3.8 on the controller node is a soft requirement for this release.
ansible-core2.11 still works with the same versions of Python thatansible-base2.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 settingANSIBLE_CONTROLLER_PYTHON_WARNING=Falsein your environment.ansible-core2.12 will require Python 3.8 or greater. - The configuration system now validates the
choicesfield, 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=0now causes an error (valid choices areignore,warnorerror). - The
ansible-galaxycommand now usesresolvelibfor 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. - If you import Python
module_utilsinto any modules you maintain, you may now mark the import as optional during the module payload build by wrapping theimportstatement in atryorifblock. This allows modules to usemodule_utilsthat may not be present in all versions of Ansible or a collection, and to perform arbitrary recovery or fallback actions during module runtime.
Modules
- The
apt_keymodule has explicitly definedfileas mutually exclusive withdata,keyserverandurl. They cannot be used together anymore. - The
metamodule now supports tags for user-defined tasks. Set the task’s tags to ‘always’ to maintain the previous behavior. Internalmetatasks continue to always run.
Modules removed
The following modules no longer exist:
- No notable changes
Deprecation notices
No notable changes
Noteworthy module changes
- facts - On NetBSD,
ansible_virtualization_typenow tries to report a more accurate result thanxenwhen virtualized and not running on Xen. - facts - Virtualization facts now include
virtualization_tech_guestandvirtualization_tech_hostkeys. 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 invirtualization_tech_host. Similarly, a podman container running on a VM powered by KVM has avirtualization_tech_guestof["kvm", "podman", "container"]. - The parameter
filtertype is changed fromstringtolistin the setup module in order to use more than one filter. Previous behavior (using astring) still remains and works as a single filter.
Plugins
- inventory plugins -
CachePluginAdjudicator.flush()now calls the underlying cache plugin’sflush()instead of only deleting keys that it knows about. Inventory plugins should usedelete()to remove any specific keys. As a user, this means that when an inventory plugin calls itsclear_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. - callback plugins -
metatask execution is now sent tov2_playbook_on_task_startlike 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. - The
choicesare 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 inchoicesto match reality.
Porting custom scripts
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/projects/ansible/latest/porting_guides/porting_guide_core_2.11.html