Change Ansible module based on variable or group There are many Ansible Network modules (for example: ios_user, asa_user, nxos_user) which share the same (or similar enough) interfaces. Currently, my playbook has to conditionally execute tasks based on the host's group or variables. This leads to a lot of duplicated code as the only real difference between the tasks is the module name.

Is there a way to select the module to be run based on group or variable values without adding extra tasks, roles, or playbooks?

For example, this is how the playbook currently looks:

- hosts: ios
  tasks:
    ios_user:
      provider: "{{ cli }}"
      ...
- hosts: asa
  tasks:
    asa_user:
      provider: "{{ cli }}"
      ...
- hosts: nxos
  tasks:
    nxos_user:
      provider: "{{ cli }}"
      ...


I'd love to have something like this:

- hosts: all
  tasks:
    {{ module_name }}:
      provider: "{{ cli }}"
      ...


I swear I saw some feature like this in passing, but I'm having a hard time finding it again. Along with version 2.5 making netconf_cli a first-class connection type, this would solve a large number of problems and inconveniences in our org.
Elaborating on @030's answer, here's how you can use variables for modules:


You need to group the target hosts in groups, for the example I'm using server1.example.com as member of hosts1 group and server2.example.com as member of hosts2 group.
You create group variables:


group_vars/hosts1
group_vars/hosts2



Both files contain a variable named module with different value, in the test I use stat.


Your playbook will look like this:


test.yml

---
 - hosts: all        
   user: me        
   tasks:
     - name: test module variables
       action: "{{ module }} path=/home/me/myfile"


The result of the play:

[me@myserver]$ ansible-playbook test.yml -i test

PLAY [all] ********************************************************************************

TASK [Gathering Facts] ********************************************************************
ok: [server1.example.com]
ok: [server2.example.com]

TASK [test module variables] **************************************************************
ok: [server1.example.com]
ok: [server2.example.com]

PLAY RECAP ********************************************************************************
server1.example.com        : ok=2    changed=0    unreachable=0    failed=0
server2.example.com        : ok=2    changed=0    unreachable=0    failed=0