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_values
list_deprecations
handle_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