Hi  team,


I’m having trouble getting the actions plugin inside the collection being 
used on playbook execution


This happens due to the name change from dellos10.py to os10.py for the 
plugin

 

*Summary of issue*

*====================*

Action Plugin in collection: 
/root/.ansible/collections/ansible_collections/dellemc_networking/os10/plugins/action/os10.py

Roles Task yaml referring module: 
/root/.ansible/collections/ansible_collections/dellemc_networking/os10/roles/os10_vlan/tasks/provision_os10.yaml

 

- name: "Provisioning VLAN configuration for os10"

   os10_config:

      src: os10_vlan.j2

   when: (ansible_network_os is defined and ansible_network_os == 
"dellemc_networking.os10.os10")

#   notify: save config os10

   register: output

 

When a playbook referring role os10_vlan is getting executed, the Action 
plugin os10.py is not being loaded. Only the ‘normal’ action plugin got 
loaded and eventually, the playbook failed.

 

*Root cause:*

*==========*

In Ansible(2.9.4),  file: lib/ansible/executor/task_executor.py Function: 
_get_action_handler

We have the following code that loads the appropriate Action plugin for the 
module used in the playbook(os10_config)

*module_prefix = self._task.action.split('.')[-1].split('_')[0]*

*collections = self._task.collections*

 

*if self._shared_loader_obj.action_loader.has_plugin(self._task.action, 
collection_list=collections):*

*            handler_name = self._task.action*

*        # FIXME: is this code path even live anymore? check w/ networking 
folks; it trips sometimes when it shouldn't*

*elif all((module_prefix in C.NETWORK_GROUP_MODULES, module_prefix in 
self._shared_loader_obj.action_loader)):*

*            handler_name = module_prefix*

*else:*

*            # FUTURE: once we're comfortable with collections impl, 
preface this action with ansible.builtin so it can't be hijacked*

*            handler_name = 'normal'*

*            collections = None  # until then, we don't want the task's 
collection list to be consulted; use the builtin*

 

The first IF statement, checks for a Action plugin with the same name as 
module name(os0_config) in the collection. This IF check fails ,since our 
plugin is ‘os10’ and not ‘os10_config’

The second ELIF statement, checks if the module prefix(‘os10’) is part of 
NETWORK_GROUP_MODULES and if so, searches it for Action plugin in 
collections.

The Ansible maintains only the following list of prefixes in 
NETWORK_GROUP_MODULES by default.Since ‘os10’ prefix is not part of this 
list,

the ELIF check also fails. Eventually we end up loading ‘normal’ plugin.

 

File: : lib/ansible/config/base.yml

*NETWORK_GROUP_MODULES:*

*  name: Network module families*

*  default: [eos, nxos, ios, iosxr, junos, enos, ce, vyos, sros, dellos9, 
dellos10, dellos6, asa, aruba, aireos, bigip, ironware, onyy*

*x, netconf]*

*  description: 'TODO: write it'*

 

*Fix:*

*====*

export ANSIBLE_NETWORK_GROUP_MODULES=os10


Is this the right way to handle this?


Thanks

Mohamed Javeed


-- 
You received this message because you are subscribed to the Google Groups 
"Ansible Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-devel/dd0b278d-ee97-496b-a375-ab42de02d270%40googlegroups.com.

Reply via email to