Add support for Cumulus NVUE switches

Change-Id: I900e3000e492b4eb668815ee6789c9d6e3637c68
This commit is contained in:
Michal Nasiadka 2024-03-28 12:47:50 +01:00
parent 9765b64826
commit ef0a6f9594
7 changed files with 133 additions and 2 deletions

View File

@ -32,6 +32,7 @@
- junos
- mellanox
- nclu
- nvue
- openvswitch
tasks:
- name: Fail if both interface name and description limits are specified
@ -170,3 +171,13 @@
- role: nclu-switch
nclu_switch_config: "{{ switch_config }}"
nclu_switch_interface_config: "{{ switch_interface_config }}"
- name: Ensure Cumulus physical switches are configured with NVUE
hosts: switches_of_type_nvue:&switches_in_display_mode_False
gather_facts: no
roles:
- role: ssh-known-host
- role: nvue-switch
nclu_switch_config: "{{ switch_config }}"
nclu_switch_interface_config: "{{ switch_interface_config }}"

View File

@ -0,0 +1,75 @@
NVUE Switch
===========
This role configures Cumulus switches using the `nvue` Ansible module. It
provides a fairly minimal abstraction of the configuration interface provided
by the `nvue` module, allowing for application of arbitrary switch
configuration options.
Requirements
------------
The switches should be configured to allow SSH access.
Role Variables
--------------
`nvue_switch_config` is a list of NCLU commands to apply to the switch, and
defaults to an empty list. Commands must be formatted without the `nv` prefix,
which is added by the `nvue` module before execution on the switch.
`nvue_switch_interface_config` contains interface configuration. It is a dict
mapping switch interface names to configuration dicts. Interfaces can be switch
physical interfaces, but also special interfaces such as bridges or bonds. Each
dict may contain the following items:
- `description` - a description to apply to the interface.
- `config` - a list of per-interface configuration, each applied with a `net
add <type> <interface-name>` prefix.
- `type` - type of interface, e.g. `bond` or `bridge`. If this field is absent,
the `interface` keyword is used.
Dependencies
------------
None
Example Playbook
----------------
The following playbook configures hosts in the `nvue-switches` group. It
applies global configuration to configure a BGP AS and add two EBGP neighbors
using BGP Unnumbered, enables two host interfaces with jumbo frames, and
attaches them to a traditional bridge called `bridge1` configured with an IP
address.
---
- name: Ensure Cumulus switches are configured with NVUE
hosts: nvue-switches
gather_facts: no
roles:
- role: nvue-switch
nvue_switch_config:
- "set router bgp autonomous-system 65000"
- "set router bgp neighbor swp51 interface remote-as external"
- "set router bgp neighbor swp52 interface remote-as external"
nvue_switch_interface_config:
swp1:
description: server1
config:
- "mtu 9000"
swp2:
description: server2
config:
- "mtu 9000"
bridge1:
type: bridge
config:
- "ip address 10.100.100.1/24"
- "ports swp1"
- "ports swp2"
Author Information
------------------
- Michal Nasiadka (<mnasiadka@gmail.com>)

View File

@ -0,0 +1,9 @@
---
# List of configuration lines to apply to the switch.
nvue_switch_config: []
# Interface configuration. Dict mapping switch interface names to configuration
# dicts. Each dict contains a 'description' item, an optional 'type' item
# (default is 'interface'), and a 'config' item which should contain a list of
# per-interface configuration.
nvue_switch_interface_config: {}

View File

@ -0,0 +1,5 @@
---
- name: Ensure Cumulus switches are configured with NVUE
nvidia.nvue.command:
template: "{{ lookup('template', 'nvue-config.j2') }}"
atomic: true

View File

@ -0,0 +1,13 @@
#jinja2: trim_blocks: True,lstrip_blocks: True
{% for line in nclu_switch_config %}
{{ line }}
{% endfor %}
{% for interface, config in nclu_switch_interface_config.items() %}
{% for line in config.config %}
add {{ config.type | default("interface") }} {{ interface }} {{ line }}
{% endfor %}
{% if config.description is defined %}
add {{ config.type | default("interface") }} {{ interface }} alias {{ config.description }}
{% endif %}
{% endfor %}

View File

@ -17,6 +17,8 @@ The following switch operating systems are currently supported:
* Arista EOS
* Cumulus Linux (via `Network Command Line Utility (NCLU)
<https://docs.nvidia.com/networking-ethernet-software/cumulus-linux-44/System-Configuration/Network-Command-Line-Utility-NCLU/>`__)
* Cumulus Linux (via `NVIDIA User Experience command line utility (NVUE)
<https://docs.nvidia.com/networking-ethernet-software/cumulus-linux/System-Configuration/NVIDIA-User-Experience-NVUE/>`__)
* Dell OS 6
* Dell OS 9
* Dell OS 10
@ -211,11 +213,20 @@ Configuration for these devices is applied using the ``nclu`` Ansible module.
``switch_type`` should be set to ``nclu``.
Cumulus Linux (with NVUE)
-------------------------
Configuration for these devices is applied using the ``nvidia.nvue.command``
Ansible module.
``switch_type`` should be set to ``nvue``.
SSH configuration
^^^^^^^^^^^^^^^^^
As with any non-switch host in the inventory, the ``nclu`` module relies on the
default connection parameters used by Ansible:
As with any non-switch host in the inventory, the ``nclu`` and
``nvidia.nvue.command`` modules rely on the default connection parameters used
by Ansible:
* ``ansible_host`` is the hostname or IP address. Optional.

View File

@ -0,0 +1,7 @@
---
features:
- |
Adds support for configuring Cumulus switches using the `NVIDIA User
Experience command line utility (NVUE)
<https://docs.nvidia.com/networking-ethernet-software/cumulus-linux/System-Configuration/NVIDIA-User-Experience-NVUE/>`__.
This is integrated with the ``kayobe physical network configure`` command.