1

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.

  • Ansible Network modules? I think you mean roles. – 030 Feb 9 '18 at 21:56
2

Elaborating on @030's answer, here's how you can use variables for modules:

  1. 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.

  2. 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.

  1. 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
  • 2
    "Action" is what I was looking for, thanks. – Matt W Feb 9 '18 at 21:31
2

It is possible to declare group and host vars http://docs.ansible.com/ansible/latest/playbooks_best_practices.html

group_vars/
   group1                 # here we assign variables to particular groups
   group2                 # ""
host_vars/
   hostname1              # if systems need specific variables, put them here
   hostname2              # ""
  • While this is correct, and thanks for the help, this doesn't answer the question. I understand how to add group, variables, and group variables. What I want is to execute a different module based on those group variables. – Matt W Feb 9 '18 at 21:32
  • module or role? – 030 Feb 9 '18 at 21:54
  • @030 Module, like yum or apt. See the accepted answer. – DylanYoung Nov 21 '18 at 21:03

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.