Skip to content
Snippets Groups Projects
Commit 1ee19568 authored by Pierre Riteau's avatar Pierre Riteau
Browse files

Add support for configuring Cumulus switches with NCLU

This extends the physical network configuration in Kayobe to configure
Cumulus physical switches using the nclu Ansible module.

Change-Id: I960027ead301c5793a0ada1959a23549a71bdbfb
parent afa42f72
No related branches found
No related tags found
No related merge requests found
......@@ -30,6 +30,7 @@
- dell-powerconnect
- junos
- mellanox
- nclu
- openvswitch
tasks:
- name: Fail if both interface name and description limits are specified
......@@ -155,3 +156,13 @@
mellanox_switch_provider: "{{ switch_mellanox_provider }}"
mellanox_switch_config: "{{ switch_config }}"
mellanox_switch_interface_config: "{{ switch_interface_config }}"
- name: Ensure Cumulus physical switches are configured with NCLU
hosts: switches_of_type_nclu:&switches_in_display_mode_False
gather_facts: no
roles:
- role: ssh-known-host
- role: nclu-switch
nclu_switch_config: "{{ switch_config }}"
nclu_switch_interface_config: "{{ switch_interface_config }}"
NCLU Switch
===========
This role configures Cumulus switches using the `nclu` Ansible module. It
provides a fairly minimal abstraction of the configuration interface provided
by the `nclu` module, allowing for application of arbitrary switch
configuration options.
Requirements
------------
The switches should be configured to allow SSH access.
Role Variables
--------------
`nclu_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 `net` prefix,
which is added by the `nclu` module before execution on the switch.
`nclu_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 `nclu-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 NCLU
hosts: nclu-switches
gather_facts: no
roles:
- role: nclu-switch
nclu_switch_config:
- "add bgp autonomous-system 65000"
- "add bgp neighbor swp51 interface remote-as external"
- "add bgp neighbor swp52 interface remote-as external"
nclu_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
------------------
- Pierre Riteau (<pierre@stackhpc.com>)
---
# List of configuration lines to apply to the switch.
nclu_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.
nclu_switch_interface_config: {}
---
- name: Ensure Cumulus switches are configured with NCLU
nclu:
template: "{{ lookup('template', 'nclu-config.j2') }}"
atomic: true
#jinja2: trim_blocks: True,lstrip_blocks: True
{% for line in nclu_switch_config %}
{{ line }}
{% endfor %}
{% for interface, config in nclu_switch_interface_config.items() %}
{% if config.description is defined %}
add {{ config.type | default("interface") }} {{ interface }} alias {{ config.description }}
{% endif %}
{% for line in config.config %}
add {{ config.type | default("interface") }} {{ interface }} {{ line }}
{% endfor %}
{% endfor %}
......@@ -12,8 +12,10 @@ Devices are added to the Ansible inventory, and configured using Ansible's
networking modules. Configuration is applied via the ``kayobe physical network
configure`` command. See :ref:`physical-network` for details.
The following switches are currently supported:
The following switch operating systems are currently supported:
* Cumulus Linux (via `Network Command Line Utility (NCLU)
<https://docs.cumulusnetworks.com/display/DOCS/Network+Command+Line+Utility+-+NCLU>`__)
* Dell OS 6
* Dell OS 9
* Dell PowerConnect
......@@ -173,6 +175,23 @@ example:
Device-specific Configuration Variables
=======================================
Cumulus Linux (with NCLU)
-------------------------
Configuration for these devices is applied using the ``nclu`` Ansible module.
``switch_type`` should be set to ``nclu``.
SSH configuration
^^^^^^^^^^^^^^^^^
As with any non-switch host in the inventory, the ``nclu`` module relies on the
default connection parameters used by Ansible:
* ``ansible_host`` is the hostname or IP address. Optional.
* ``ansible_user`` is the SSH username.
Dell OS6 and OS9
----------------
......
---
features:
- |
Adds support for configuring Cumulus switches using the `Network Command
Line Utility (NCLU)
<https://docs.cumulusnetworks.com/display/DOCS/Network+Command+Line+Utility+-+NCLU>`__.
This is integrated with the ``kayobe physical network configure`` command.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment