Ansible to connect to certain switchports on Cisco 2960

115 views
Skip to first unread message

Jason

unread,
Jun 19, 2020, 11:04:55 PM6/19/20
to Ansible Project
I am working on a project that would require me to bump (shutdown and re-enable) switchports that are connected to an Access Point. 

I have created a playbook to run a command "show cdp neighbours" on the switch, and that output would look like:
sh cdp neighbours.JPG

What I want to do, is to use ansible to only run a command (ansible play) on Gig 1/0/19 in this case. For other switches, it may be more switchports and maybe in different format (eg. Gi 2/0/35). 

Is there a way to filter ansible output by looking for 'AIR-AP280' and then extract that corresponding Local Interface (switchport number)?

Or if there is another way to get done what I want, then great. 

Any suggestions/recommendations?

It is over 50 switches, so it would be great if ansible can do what I want to do. 

J C

unread,
Jun 19, 2020, 11:22:31 PM6/19/20
to ansible...@googlegroups.com
I would use the genie module and run the show cdp neighbor command. Then set fact and use that with the when command.

--
You received this message because you are subscribed to the Google Groups "Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ansible-proje...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/fd4b0f7a-85ba-4921-b252-9b760d1bd3d8o%40googlegroups.com.

Jason

unread,
Jun 20, 2020, 2:34:11 PM6/20/20
to Ansible Project
Thanks. If you don't mind me asking because I am not familiar with this, can you give me an example of how to use the set fact and when statement for my case? 


On Friday, June 19, 2020 at 11:22:31 PM UTC-4, J C wrote:
I would use the genie module and run the show cdp neighbor command. Then set fact and use that with the when command.

On Fri, Jun 19, 2020, 10:05 PM Jason <jasonno...@gmail.com> wrote:
I am working on a project that would require me to bump (shutdown and re-enable) switchports that are connected to an Access Point. 

I have created a playbook to run a command "show cdp neighbours" on the switch, and that output would look like:
sh cdp neighbours.JPG

What I want to do, is to use ansible to only run a command (ansible play) on Gig 1/0/19 in this case. For other switches, it may be more switchports and maybe in different format (eg. Gi 2/0/35). 

Is there a way to filter ansible output by looking for 'AIR-AP280' and then extract that corresponding Local Interface (switchport number)?

Or if there is another way to get done what I want, then great. 

Any suggestions/recommendations?

It is over 50 switches, so it would be great if ansible can do what I want to do. 

--
You received this message because you are subscribed to the Google Groups "Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ansible...@googlegroups.com.

J C

unread,
Jun 22, 2020, 9:07:18 AM6/22/20
to ansible...@googlegroups.com
Something like that I suppose. 


#Sets a varaiable for cdp neighbor detail
  - name: Run show cdp neighbors command
    ios_command:
      commands:
        - show cdp neighbors detail
    register: neighbors

# Using the Genie Filter Plugin from the Genie Parse Role
# Set pyats_neighbors as a dictionary
  - name: Set fact with Genie Filter Plugin
    set_fact:
      pyats_neighbors: "{{ neighbors['stdout'][0] | clay584.genie.parse_genie(command='show cdp neighbors detail', os='ios') }}"
  - name: Add interface desription
    ios_interfaces:
      config:
        - name: "{{ item.value.local_interface }}"
          description: "{{ item.value.device_id }} - {{ item.value.port_id }}"
      state: merged
    loop: "{{ q('dict', pyats_neighbors.index) }}"
    when: item.value.port_id is "AIR-AP280"

To unsubscribe from this group and stop receiving emails from it, send an email to ansible-proje...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/644c6f2a-5a02-49fd-b84a-1c74ad722daao%40googlegroups.com.

Jason

unread,
Jun 22, 2020, 3:44:21 PM6/22/20
to Ansible Project
Thanks alot. 

I have been getting this error for the past few days when trying to use genie:

fatal: [SW1]: FAILED! => {
    "msg": "template error while templating string: no filter named 'clay584.genie.parse_genie'. String: {{ neighbors['stdout'][0] | clay584.genie.parse_genie(command='show cdp neighbors', os='ios') }}"
}

This is my playbook (what you sent but I needed to import the role first):
- hosts: uwioc-switches
  gather_facts: no
  tasks:
    - name: Import role
      include_role:
        name: clay584.parse_genie


    - name: Run show cdp neighbors
      ios_command:
        commands:
          - show cdp neighbors
      register: neighbors

# Using the Genie Filter Plugin from the Genie Parse Role
# Set pyats_neighbors as a dictionary
    - name: Set fact with Genie
    - name: Import role
      include_role:
        name: clay584.parse_genie


    - name: Run show cdp neighbors
      ios_command:
        commands:
          - show cdp neighbors
      register: neighbors

# Using the Genie Filter Plugin from the Genie Parse Role
# Set pyats_neighbors as a dictionary
    - name: Set fact with Genie Filter Plugin
      set_fact:
        pyats_neighbors: "{{ neighbors['stdout'][0] | clay584.genie.parse_genie(command='show cdp neighbors', os='ios') }}"


    - name: Add interface description

      ios_interfaces:
        config:
          - name: "{{ item.value.local_interface }}"
            description: "{{ item.value.device_id }} - {{ item.value.port_id }}"
        state: merged
      loop: "{{ q('dict', pyats_neighbors.index) }}"
      when: item.value.port_id is "AIR-AP280"

My python version is 3.6.8 and Ansible is 2.9.9

I followed this guide to install the necessary libraries:

The error still persists.  Also posted the issue on GitHub. Not sure if it is bug in the parsing library. 

Any assistance would greatly be appreciated. 

Thanks.

J C

unread,
Jun 22, 2020, 4:16:54 PM6/22/20
to ansible...@googlegroups.com
I am using the collection not the role.  So it looks like this at the top.  Had to add the interpreter variable because Ansible kept using Python 2

---
- name: Interface Descrpitions
  hosts: all
  gather_facts: no
  connection: network_cli
  collections:
    - clay584.genie
  vars:
    ansible_python_interpreter: "{{ ansible_playbook_python }}"

To unsubscribe from this group and stop receiving emails from it, send an email to ansible-proje...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/9a09ee0c-1184-4d74-a41f-b69a89fca04co%40googlegroups.com.

Jason

unread,
Jun 22, 2020, 4:48:48 PM6/22/20
to Ansible Project
This error shows:
fatal: [SW1]: FAILED! => {"msg": "template error while templating string: no filter named 'clay584.genie.parse_genie'. String: {{ neighbors['stdout'][0] | clay584.genie.parse_genie(command='show cdp neighbors', os='ios') }}"}


This is the full playbook I am using:
---
- name: Interface Descrpitions
  hosts: uwioc-switches
  gather_facts: no
  connection: network_cli
  collections:
    - clay584.genie
  vars:
    ansible_python_interpreter: "{{ ansible_playbook_python }}"
  tasks:
    - name: Run show cdp neighbors
      ios_command:
        commands:
          - show cdp neighbors
      register: neighbors
# Using the Genie Filter Plugin from the Genie Parse Role
# Set pyats_neighbors as a dictionary
    - name: Set fact with Genie Filter Plugin
      set_fact:
       pyats_neighbors: "{{ neighbors['stdout'][0] | clay584.genie.parse_genie(command='show cdp neighbors', os='ios') }}"


Tried changing vars to set_facts too, but didn't work. 

J C

unread,
Jun 23, 2020, 11:22:11 AM6/23/20
to ansible...@googlegroups.com
Not sure it seems like it is looking for the filter.  Have you used a collection before?  Is the collections_path defined in the ansible.cfg?

To unsubscribe from this group and stop receiving emails from it, send an email to ansible-proje...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/36cda932-fe68-499b-a70b-acf81cd693cfo%40googlegroups.com.

Jason

unread,
Jun 23, 2020, 11:29:27 AM6/23/20
to Ansible Project
No I have never used a collection before. So my ansible.cfg is currently to the default

J C

unread,
Jun 23, 2020, 11:34:31 AM6/23/20
to ansible...@googlegroups.com
You need to add a new line under [defaults]

collections_paths = /path/to/collections

To unsubscribe from this group and stop receiving emails from it, send an email to ansible-proje...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/cda449ee-3155-40ab-9feb-474d1355bf8eo%40googlegroups.com.

Jason

unread,
Jun 23, 2020, 1:30:16 PM6/23/20
to Ansible Project
I added it. Now this shows:

fatal: [SW1]: FAILED! => {
    "msg": "parse_genie: Genie package is not installed. To install, run 'pip install genie'."
}

When I do pip or pip3 install genie, it says requirements already satisfied (as I already installed it). 

Just to show you what my directories look like:

directory genie.JPG


And under [defaults] in my ansible.cfg:

collections_paths = /etc/ansible/collections/ansible_collections/ 

Tried putting a less specific and then a more specifc path to the collections folder also. (= /etc/ansible/collections, = /etc/ansible/collections/ansible_collections/clay584/genie)

Prior to this, I did a  ansible-galaxy collection install clay584.genie to install the collection and it said this:
Installing 'clay584.genie:0.1.11' to '/root/.ansible/collections/ansible_collections/clay584/genie'

Did I do anything wrong?

J C

unread,
Jun 23, 2020, 2:05:38 PM6/23/20
to ansible...@googlegroups.com
Well at this point I would probably remove genie.  Then create a virtual python environment.  Run the pip install commands and see if that works for you.  If you are still running into issues I would reach out to the guys who made genie - I think Clay is in the group there too.




---------- Forwarded message ---------
From: Jason <jasonno...@gmail.com>
Date: Tue, Jun 23, 2020, 12:30 PM
Subject: Re: [ansible-project] Ansible to connect to certain switchports on Cisco 2960
To: Ansible Project <ansible...@googlegroups.com>


I added it. Now, this shows:

fatal: [SW1]: FAILED! => {
    "msg": "parse_genie: Genie package is not installed. To install, run 'pip install genie'."
}

When I do pip or pip3 install genie, it says requirements already satisfied (as I already installed it). 

Just to show you what my directories look like:

directory genie.JPG


And under [defaults] in my ansible.cfg:

collections_paths = /etc/ansible/collections/ansible_collections/ 

Tried putting a less specific and then a more specifc path to the collections folder also. (= /etc/ansible/collections, = /etc/ansible/collections/ansible_collections/clay584/genie)

Before this, I did a  ansible-galaxy collection install clay584.genie to install the collection and it said this:
Installing 'clay584.genie:0.1.11' to '/root/.ansible/collections/ansible_collections/clay584/genie'

Did I do anything wrong?


To unsubscribe from this group and stop receiving emails from it, send an email to ansible-proje...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/cb187525-7951-44d3-b7d5-3dfb704b1ffco%40googlegroups.com.
Reply all
Reply to author
Forward
0 new messages