使用 CDP Neighbor 映射网络中所有路由器和交换机的 Ansible 剧本

Ansible playbook for Mapping all Routers and Switches in the network using CDP Neighbor

您好,我需要帮助编写一个用于查找网络中所有路由器和交换机的剧本。

环境:

问题陈述:

从核心交换机开始,使用 cdp 邻居遍历所有路径,直到域内的最后一个 switch/router。 网络深度未知。

输出: JSON 包含网络设备的分层排序。

{

A:{A1,A2},

C:{C1,C5:{C5i:{..},C5j}

}

我的尝试:

---
- name: Backup show run (enable mode commands)
  hosts: ["testrouter"]
  gather_facts: false
  connection: network_cli

  vars:
    ansible_network_os: ios
    grand_parent: ["testrouter"]

  tasks:
    - name: CDP for "{{ inventory_hostname }}"
      register: all_facts
      ios_facts:
        gather_subset: all
    - name: filter cdp neighbors for all facts
      debug:
        msg: "Child of {{ inventory_hostname }} is {{ item.value[0].host }}"
      loop: "{{ lookup('dict', all_facts.ansible_facts.ansible_net_neighbors) }}"
      when: item.value|length == 1
    - name: Remove previous grand_parent
      set_fact:
        root: "['{{ parent[0] }}']"
      when: parent|length == 2
    - name: Add the latest host as grand_parent
      set_fact:
        root: "{{ parent + [ inventory_hostname ] }}"
      when: parent|length == 1

我之前使用 netmiko 在 python 中编写了这个脚本,但现在我们要求它在 Ansible 中编写。

问题:

感谢您的宝贵时间。

你在这里做的是编程。您正在尝试使用一种比现有的任何编程语言都不太适合编程的工具来编写程序。可能是 brainfuck 更糟,但我不确定。

您关于 'how to do this complicated business logic with Ansible' 的问题没有好的答案,就像关于 'how to tighten a nut with a hammer'.

的问题没有好的答案一样

您需要做的(任一):

  1. 编写一个独立的应用程序并将其与 Ansible 结合使用(通过 rest API、inventory、stdin/out,随你便)
  2. 为 Ansible 编写一个模块。你在 stdin 得到 json,你在 stdout 上用 json 回答。 Python 有 ansible heplers,但您可以自由使用任何语言的模块。
  3. 为 Ansible 编写一个查找插件。这更棘手,您需要随着 Ansible 的发展保持它的可操作性。

我建议你选择 1 号或 2 号。