使用 CDP Neighbor 映射网络中所有路由器和交换机的 Ansible 剧本
Ansible playbook for Mapping all Routers and Switches in the network using CDP Neighbor
您好,我需要帮助编写一个用于查找网络中所有路由器和交换机的剧本。
环境:
- Ansible 2.8
- Python 2.7
- eve-ng 中的测试网络
- 路由器和交换机有ios
问题陈述:
从核心交换机开始,使用 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 中编写。
问题:
- 当我发现具有 cdp 邻居的新主机时,我不知道如何动态修改主机。
- 另外我需要递归来探索未知的深度
- 此外,我是第一次学习 Ansible,我担心我会使事情过于复杂并编写臃肿的代码。
感谢您的宝贵时间。
你在这里做的是编程。您正在尝试使用一种比现有的任何编程语言都不太适合编程的工具来编写程序。可能是 brainfuck 更糟,但我不确定。
您关于 'how to do this complicated business logic with Ansible' 的问题没有好的答案,就像关于 'how to tighten a nut with a hammer'.
的问题没有好的答案一样
您需要做的(任一):
- 编写一个独立的应用程序并将其与 Ansible 结合使用(通过 rest API、inventory、stdin/out,随你便)
- 为 Ansible 编写一个模块。你在 stdin 得到 json,你在 stdout 上用 json 回答。 Python 有 ansible heplers,但您可以自由使用任何语言的模块。
- 为 Ansible 编写一个查找插件。这更棘手,您需要随着 Ansible 的发展保持它的可操作性。
我建议你选择 1 号或 2 号。
您好,我需要帮助编写一个用于查找网络中所有路由器和交换机的剧本。
环境:
- Ansible 2.8
- Python 2.7
- eve-ng 中的测试网络
- 路由器和交换机有ios
问题陈述:
从核心交换机开始,使用 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 中编写。
问题:
- 当我发现具有 cdp 邻居的新主机时,我不知道如何动态修改主机。
- 另外我需要递归来探索未知的深度
- 此外,我是第一次学习 Ansible,我担心我会使事情过于复杂并编写臃肿的代码。
感谢您的宝贵时间。
你在这里做的是编程。您正在尝试使用一种比现有的任何编程语言都不太适合编程的工具来编写程序。可能是 brainfuck 更糟,但我不确定。
您关于 'how to do this complicated business logic with Ansible' 的问题没有好的答案,就像关于 'how to tighten a nut with a hammer'.
的问题没有好的答案一样您需要做的(任一):
- 编写一个独立的应用程序并将其与 Ansible 结合使用(通过 rest API、inventory、stdin/out,随你便)
- 为 Ansible 编写一个模块。你在 stdin 得到 json,你在 stdout 上用 json 回答。 Python 有 ansible heplers,但您可以自由使用任何语言的模块。
- 为 Ansible 编写一个查找插件。这更棘手,您需要随着 Ansible 的发展保持它的可操作性。
我建议你选择 1 号或 2 号。