使用Ansible自动将网络设备的标签VLAN接口注册到Netbox中的方法一

首先

我看到了一篇关于将NetBox上的配置信息用作Ansible清单的示例文章,于是我考虑尝试从网络设备的配置信息中提取配置信息,并将其自动保存到NetBox的机制。

由于文章变得很长,所以我将其分为两部分。
后半部分将是以下文章。
使用Ansible自动将网络设备的标签VLAN接口注册到Netbox②。

示威活动的组织

本次演示将采用以下的Ansible、NetBox和Juniper公司的虚拟路由器vSRX配置进行。

image.png

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的顺序。

    1. 我将在demo02.yaml中使用ansible注册到Nw设备执行所需的清单信息。

 

    1. local_context_data中包含ansible的清单信息的方法参考以下文章。

 

    1. 创建管理接口。

 

    1. 将管理接口分配给目标设备并注册地址。

 

    将在步骤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屏幕截图。

地点

undefined

角色

undefined

设备类型

undefined

设备

undefined
bannerAds