使用Ansible自动将网络设备的标签VLAN接口注册到Netbox中的方法一
首先
我看到了一篇关于将NetBox上的配置信息用作Ansible清单的示例文章,于是我考虑尝试从网络设备的配置信息中提取配置信息,并将其自动保存到NetBox的机制。
由于文章变得很长,所以我将其分为两部分。
后半部分将是以下文章。
使用Ansible自动将网络设备的标签VLAN接口注册到Netbox②。
示威活动的组织
本次演示将采用以下的Ansible、NetBox和Juniper公司的虚拟路由器vSRX配置进行。

TTP是一个类似于TextFSM的工具,用于解析命令执行结果的配置,与TextFSM相比,TTP能够直观地通过模板定义来创建,而无需考虑正则表达式。
- AnsibleとNetboxのバージョン一覧
ansible==2.10.7
ansible-base==2.10.10
NetBox==v2.11.4
安装ansible-galaxy的集合和pip软件包。
要进行Netbox和vSRX的处理,需要安装以下ansible-galaxy的收集和pip软件包。
$ ansible-galaxy collection install ansible.netcommon ansible.utils netbox.netbox
$ pip install netaddr paramiko pynetbox jmespath ttp
准备vsrx01
准备vSRX的虚拟机。
首先进行设置以启用SSH登录,并配置三个接口。
-
- マネジメント用 Interface: ge-0/0/0
-
- Trunk VLAN Interface(複数VLAN): ge-0/0/1
- Trunk VLAN Interface(単一VLAN): ge-0/0/2
为了说明cli_parser使用ttp的规范,我们准备了两种情况:一种是具有多个VLAN,另一种是只有一个VLAN。
以下是本次示范的配置。
> show configuration interfaces
ge-0/0/0 {
unit 0 {
family inet {
address 172.16.0.101/24;
}
}
}
ge-0/0/1 {
flexible-vlan-tagging;
unit 1000 {
vlan-id 1000;
family inet {
address 172.20.0.1/24;
}
}
unit 1001 {
vlan-id 1001;
family inet {
address 172.20.1.1/24;
}
}
}
ge-0/0/2 {
flexible-vlan-tagging;
unit 2000 {
vlan-id 2000;
family inet {
address 172.21.0.1/24;
}
}
}
准备运行演示的步骤①:创建清单文件。
用NetBox创建库存信息。
※我个人偏好用yaml格式记录。
all:
children:
netbox:
hosts:
netbox:
ansible_host: {{ NetBoxのアドレス }}
只需要一个选项,用中文重新表达以下内容:
执行准备工作2:创建ansible.cfg文件。
在ansible.cfg中,启用netbox的inventory并启用SSH登录到NW设备时的初始连接设置。将此文件创建在inventory的hosts文件所在的目录中。
[defaults]
host_key_checking = False
inventory = netbox_inventory.yaml
准备执行演示的步骤③:创建demo01.yaml。
为了将NetBox用作Ansible的库存,我们将创建一个名为demo01.yaml的Playbook,以将vSRX的配置信息注册到NetBox中。
将该Playbook创建在inventory的hosts文件所在的目录中。
由于该Playbook较长,所以我们将分解并解释Playbook的内容。
主持人定义的部分解释。
在collections中指定安装的netbox,并在task中定义所需的变量。
---
- hosts: netbox
gather_facts: false
connection: local
collections:
- netbox.netbox
vars:
ansible_python_interpreter: /usr/bin/python3
netbox_url: http://{{ NetBoxのURL }}
netbox_token: {{ NetBoxのApi tokens }}
site: myhome
manufacture: Juniper
role: core
ansible_network_os: junos
ansible_user: {{ vSRXのユーザ名 }}
ansible_password: {{ vSRXのログインパスワード }}
target: vsrx01
model: vsrx
primary_ip4: "172.16.0.101/24"
ifname: ge-0/0/0
NetBox的变量定义
我参考了横地先生的博客,并提取了在Netbox中所需的变量。
-
- site: 拠点名を指定
-
- manufacture: ベンダー名を指定
-
- role: 対象の機器の役割を指定
- model: モデル名を指定
设备信息的变量定义
-
- target: 対象のNW機器名を指定
-
- model: NW機器の機種名を指定
-
- primary_ip4: 対象のNW機器の管理用アドレスを指定
- ifname: 対象のNW機器の管理用Interfaceを指定
任务的定义之一
需要先注册设备信息,才能注册NW机器。请按照以下任务流程进行注册。
-
- Netboxへ拠点名を登録
-
- ベンダー名を登録
-
- 機器の役割を登録
- 機種名を登録
tasks:
- name: site
netbox_site:
netbox_url: "{{ netbox_url }}"
netbox_token: "{{ netbox_token }}"
data:
name: "{{ site }}"
state: present
- name: add manufacturers
netbox_manufacturer:
netbox_url: "{{ netbox_url }}"
netbox_token: "{{ netbox_token }}"
data:
name: "{{ manufacture }}"
state: present
- netbox_device_role:
netbox_url: "{{ netbox_url }}"
netbox_token: "{{ netbox_token }}"
data:
name: "{{ role }}"
slug: "{{ role }}"
color: FFFFFF
state: present
- netbox_device_type:
netbox_url: "{{ netbox_url }}"
netbox_token: "{{ netbox_token }}"
data:
slug: "{{ model }}"
model: "{{ model }}"
manufacturer: "{{ manufacture }}"
state: present
register: result
任务定义2
以下是将NW设备的库存信息注册到NetBox的顺序。
-
- 我将在demo02.yaml中使用ansible注册到Nw设备执行所需的清单信息。
-
- local_context_data中包含ansible的清单信息的方法参考以下文章。
-
- 创建管理接口。
-
- 将管理接口分配给目标设备并注册地址。
- 将在步骤3中注册的地址与目标设备的管理地址关联。
- name: add devices
netbox_device:
netbox_url: "{{ netbox_url }}"
netbox_token: "{{ netbox_token }}"
data:
name: "{{ target }}"
device_type: "{{ model }}"
device_role: "{{ role }}"
local_context_data:
ansible_persistent_log_messages: True
ansible_network_os: "{{ ansible_network_os }}"
ansible_user: "{{ ansible_user }}"
ansible_password: "{{ ansible_password }}"
site: "{{ site }}"
- name: Create interface
netbox_device_interface:
netbox_url: "{{ netbox_url }}"
netbox_token: "{{ netbox_token }}"
data:
device: "{{ target }}"
name: "{{ ifname }}"
enabled: true
type: 1000Base-t (1GE)
mtu: 1500
mgmt_only: true
mode: Access
state: present
- name: Create IP address and assign device ifname
netbox_ip_address:
netbox_url: "{{ netbox_url }}"
netbox_token: "{{ netbox_token }}"
data:
status: active
address: "{{ primary_ip4 }}"
assigned_object:
name: "{{ ifname }}"
device: "{{ target }}"
state: present
- name: set primary ipv4
netbox_device:
netbox_url: "{{ netbox_url }}"
netbox_token: "{{ netbox_token }}"
data:
name: "{{ target }}"
primary_ip4: "{{ primary_ip4 }}"
state: present
如何进行示威活动
ansible-playbook -i ./hosts demo01.yaml \
-e target=vsrx01 -e netbox_url=http://{{ NetBoxのURL }} \
-e netbox_token={{ NetBoxのApi tokens }} \
-e role=core -e manufacture=Juniper \
-e ansible_network_os=junos -e ansible_user={{ vSRXのユーザ名 }} \
-e ansible_password={{ vSRXのログインパスワード }} -e model=vsrx \
-e primary_ip4=172.16.0.101/24 -e ifname=ge-0/0/0 -v
网盒界面
以下是demo01.yaml执行结果的NetBox屏幕截图。
地点

角色

设备类型

设备
