配置

为了使用此机制驱动程序,需要创建/更新 Neutron 配置文件,并包含适当的配置信息。

交换机配置格式

[genericswitch:<switch name>]
device_type = <netmiko device type>
ngs_mac_address = <switch mac address>
ip = <IP address of switch>
port = <ssh port>
username = <credential username>
password = <credential password>
use_keys = <set to True when key_file is set>
key_file = <ssh key file>
secret = <enable secret>
ngs_allowed_vlans = <comma-separated list of allowed vlans for switch>
ngs_allowed_ports = <comma-separated list of allowed ports for switch>

# If set ngs_port_default_vlan to default_vlan, switch's
# interface will restore the default_vlan.
ngs_port_default_vlan = <port default vlan>

device_type 条目是必需的。大多数其他配置条目是可选的,请参阅下文。

引入了两个新的可选配置参数 ngs_allowed_vlansngs_allowed_ports,用于管理交换机上允许的 VLAN 和端口。如果未设置,则允许所有端口或 VLAN。

注意

交换机将通过 local_link_connection/switch_info 或 ngs_mac_address 选择。因此,如果未设置 local_link_connection/switch_info,则可以使用交换机的 MAC 地址来识别交换机。

示例

这些示例设备配置片段假定是特定文件 /etc/neutron/plugins/ml2/ml2_conf_genericswitch.ini 的一部分,但它们也可以直接添加到 /etc/neutron/plugins/ml2/ml2_conf.ini 中。

以下是 Cisco 300 系列设备的示例

[genericswitch:sw-hostname]
device_type = netmiko_cisco_s300
ngs_mac_address = <switch mac address>
username = admin
password = password
ip = <switch mgmt ip address>

针对 Cisco IOS 设备

[genericswitch:sw-hostname]
device_type = netmiko_cisco_ios
ngs_mac_address = <switch mac address>
username = admin
password = password
secret = secret
ip = <switch mgmt ip address>

针对 Cisco NX-OS 设备

[genericswitch:sw-hostname]
device_type = netmiko_cisco_nxos
ngs_mac_address = <switch mac address>
ip = <switch mgmt ip address>
username = admin
password = password
secret = secret

针对华为 VRPV3 或 VRPV5 设备

[genericswitch:sw-hostname]
device_type = netmiko_huawei
ngs_mac_address = <switch mac address>
username = admin
password = password
port = 8222
secret = secret
ip = <switch mgmt ip address>

针对华为 VRPV8 设备

[genericswitch:sw-hostname]
device_type = netmiko_huawei_vrpv8
ngs_mac_address = <switch mac address>
username = admin
password = password
port = 8222
secret = secret
ip = <switch mgmt ip address>

针对 Arista EOS 设备

[genericswitch:arista-hostname]
device_type = netmiko_arista_eos
ngs_mac_address = <switch mac address>
ip = <switch mgmt ip address>
username = admin
key_file = /opt/data/arista_key

针对 Dell Force10 设备

[genericswitch:dell-hostname]
device_type = netmiko_dell_force10
ngs_mac_address = <switch mac address>
ip = <switch mgmt ip address>
username = admin
password = password
secret = secret

针对 Dell OS10 设备

[genericswitch:dell-hostname]
device_type = netmiko_dell_os10
ngs_mac_address = <switch mac address>
ip = <switch mgmt ip address>
username = admin
password = password
secret = secret

针对 Dell PowerConnect 设备

[genericswitch:dell-hostname]
device_type = netmiko_dell_powerconnect
ip = <switch mgmt ip address>
username = admin
password = password
secret = secret

# You can set ngs_switchport_mode according to switchmode you have set on
# the switch. The following options are supported: general, access. It
# will default to access mode if left unset. In general mode, the port
# be set to transmit untagged packets.
ngs_switchport_mode = access

Dell PowerConnect 设备已被发现存在多个并发配置会话的问题。有关如何限制每个设备的并发活动连接数量的详细信息,请参阅 同步批量处理

针对 Brocade FastIron (ICX) 设备

[genericswitch:hostname-for-fast-iron]
device_type = netmiko_brocade_fastiron
ngs_mac_address = <switch mac address>
ip = <switch mgmt ip address>
username = admin
password = password

针对 Ruijie 设备

[genericswitch:sw-hostname]
device_type = netmiko_ruijie
ngs_mac_address = <switch mac address>
username = admin
password = password
secret = secret
ip = <switch mgmt ip address>

针对 HPE 5900 系列设备

[genericswitch:sw-hostname]
device_type = netmiko_hp_comware
username = admin
password = password
ip = <switch mgmt ip address>

针对 Juniper Junos OS 设备

[genericswitch:hostname-for-juniper]
device_type = netmiko_juniper
ip = <switch mgmt ip address>
username = admin
password = password
ngs_commit_timeout = <optional commit timeout (seconds)>
ngs_commit_interval = <optional commit interval (seconds)>

针对 Cumulus Linux 设备

[genericswitch:hostname-for-cumulus]
device_type = netmiko_cumulus
ip = <switch mgmt_ip address>
username = admin
password = password
secret = secret
ngs_mac_address = <switch mac address>

针对 Cumulus NVUE Linux 设备

[genericswitch:hostname-for-cumulus]
device_type = netmiko_cumulus_nvue
ip = <switch mgmt_ip address>
username = admin
password = password
secret = secret
ngs_mac_address = <switch mac address>

针对 Nokia SRL 系列设备

[genericswitch:sw-hostname]
device_type = netmiko_nokia_srl
username = admin
password = password
ip = <switch mgmt ip address>

针对 Pluribus 交换机

[genericswitch:sw-hostname]
device_type = netmiko_pluribus
username = admin
password = password
ip = <switch mgmt ip address>

针对 ArubaOS-CX 交换机

[genericswitch:aruba-hostname]
device_type = netmiko_aruba_os
username = admin
password = password
ip = <switch mgmt ip address>

针对 Supermicro 设备

[genericswitch:sw-hostname]
device_type = netmiko_supermicro_smis
ngs_mac_address = <switch mac address>
ip = <switch mgmt ip address>
username = admin
password = password
secret = secret

通用配置

此外,需要从 ml2 配置文件 /etc/neutron/plugins/ml2/ml2_conf.ini 中启用 GenericSwitch 机制驱动程序

[ml2]
tenant_network_types = vlan
type_drivers = local,flat,vlan,gre,vxlan
mechanism_drivers = openvswitch,genericswitch
...

物理网络也需要在 ML2 配置中声明,并指定可以分配给租户网络的 VLAN 范围。可以同时存在多个物理网络,可能具有重叠的 VLAN 范围:在这种情况下,每个交换机配置都需要包含其物理网络,请参阅 多个物理网络。以下是包含两个物理网络的 /etc/neutron/plugins/ml2/ml2_conf.ini 示例

[ml2_type_vlan]
network_vlan_ranges = physnet1:700:799,physnet2:600:850

对于给定的物理网络,可以通过多次重复物理网络名称来指定几个不相交的 VLAN 范围

[ml2_type_vlan]
network_vlan_ranges = physnet1:700:720,physnet1:750:760

如果驱动程序支持安全组,则可以将 genericswitch_security_group 附加到 service_plugins 列表(这也需要在每个交换机配置中启用)

[DEFAULT]
service_plugins = qos,ovn-router,trunk,segments,port_forwarding,log,genericswitch_security_group

(重新)启动 neutron-server,指定包含交换机配置的附加配置文件

neutron-server \
    --config-file /etc/neutron/neutron.conf \
    --config-file /etc/neutron/plugins/ml2/ml2_conf.ini \
    --config-file /etc/neutron/plugins/ml2/ml2_conf_genericswitch.ini

同步

某些设备在可以支持的并发 SSH 会话数量方面受到限制,或者不支持并发配置数据库更新。在这些情况下,使用外部服务来同步对受管设备的访问可能很有用。此同步由 Tooz 库 提供,该库支持多种不同的后端,包括 Etcd、ZooKeeper 等。应按如下方式配置后端的连接 URL

[ngs_coordination]
backend_url = <backend URL>

后端 URL 格式包括 Tooz 驱动程序作为方案,并通过查询字符串参数传递驱动程序选项。例如,要使用 etcd3gw 驱动程序和 API 版本 v3 以及指向 CA 证书的路径

[ngs_coordination]
backend_url = etcd3+https://etcd.example.com?api_version=v3,ca_cert=/path/to/ca/cert.crt

默认行为是限制每个设备的并发活动连接数量为 1,但可以按如下方式配置每个设备的数量

[genericswitch:device-hostname]
ngs_max_connections = <max connections>

当使用同步时,执行 networking-generic-switch 插件的每个 Neutron 线程将尝试获取锁,默认超时时间为 60 秒,然后失败。可以按如下方式配置此超时时间(设置为 0 表示没有超时)

[ngs_coordination]
...
acquire_timeout = <timeout in seconds>

批量处理

对于许多网络设备,每个网络或端口配置更改都会产生显著的 SSH 连接开销。在具有许多并发更改的大规模系统中,这种开销会迅速累积。自 Antelope 版本以来,Generic Switch 驱动程序包含支持将交换机配置更改批量处理并通过单个 SSH 连接应用它们的功能。

这使用 etcd 作为队列系统来实现。命令被添加到输入键,然后工作线程处理特定交换机设备的可用命令。我们使用添加键时的版本从队列中取出,从而提供 FIFO 样式的队列。原始请求线程正在监视输出键中的每个命令集的结果。分布式锁用于序列化每个交换机设备的命令处理。

etcd 端点使用与 同步 中使用的相同的 [ngs_coordination] backend_url 选项进行配置,但限制是仅支持 etcd3gw

此外,将使用批量配置的每个设备应包含以下选项

[genericswitch:device-hostname]
ngs_batch_requests = True

禁用不活动端口

默认情况下,交换机接口在不使用时仍处于管理启用状态,并且删除了访问 VLAN 关联。在大多数设备上,这将导致接口成为默认 VLAN 的成员,通常是 VLAN 1。这可能是一个安全问题,未分配的端口具有访问共享网络的权限。

为了解决此问题,可以配置接口在不使用时处于管理关闭状态。这是逐设备完成的,使用 ngs_disable_inactive_ports 标志

[genericswitch:device-hostname]
ngs_disable_inactive_ports = <optional boolean>

这目前与以下设备兼容

  • ArubaOS-CX

  • Cisco NX-OS (Nexus)

  • Cumulus Linux (通过 NCLU)

  • Cumulus Linux(通过 NVUE)

  • Dell OS10 (netmiko_dell_os10)

  • Juniper Junos OS

网络名称格式

默认情况下,当在交换机上创建网络时,如果交换机支持为 VLAN 分配名称,则它们会被分配 neutron 网络 UUID 作为名称。例如

8f60256e4b6343bf873026036606ce5e

可以使用 ngs_network_name_format 选项使用不同的网络名称格式。此选项使用 Python 字符串格式化语法,并接受参数 {network_id}{segmentation_id}。例如

[genericswitch:device-hostname]
ngs_network_name_format = neutron-{network_id}-{segmentation_id}

有些交换机在分配以数字开头的 VLAN 名称时存在问题,可以使用此配置选项来避免这种情况。

管理 VLAN

默认情况下,在创建网络时,VLAN 会添加到所有交换机。以类似的方式,当不再需要 VLAN 时,它们会被删除。但是,在某些情况下,只有一部分端口由 Neutron 管理。以类似的方式,当使用多个交换机时,网络管理员通常会限制允许的 VLAN。在这些情况下,在交换机上添加和删除 VLAN 几乎没有用处。此过程需要时间,因此不执行此操作可以加快许多常见操作。一个可能导致问题的情况是,当用于交换机管理接口或 Neutron 未管理的任何其他端口的 VLAN 被此 Neutron 驱动程序删除时。

为了阻止 networking generic switch 尝试在交换机上添加或删除 VLAN,管理员预计会预先添加所有启用的 VLAN,并将在干线端口上标记这些 VLAN。配置这些 VLAN 和干线端口后,可以使用以下配置来停止 networking generic switch 添加或删除任何 VLAN

[genericswitch:device-hostname]
ngs_manage_vlans = False

在设备上保存配置

默认情况下,所有配置更改都保存到设备的持久存储中,使用特定于模型的命令。这发生在每次更改之后。

出于性能原因,或者如果您有定期保存配置的外部方式,这可能是不希望的。在这种情况下,可以禁用配置保存

[genericswitch:device-hostname]
ngs_save_configuration = False

干线端口

当在交换机上创建 VLAN 时,通常希望在一个或多个干线端口上标记这些 VLAN。为此,需要声明一个由 Networking Generic Switch 可以管理的干线端口的逗号分隔列表。然后,它将在创建和删除 VLAN 时动态标记和取消标记这些端口上的 VLAN。例如

[genericswitch:device-hostname]
ngs_trunk_ports = Ethernet1/48, Port-channel1

当管理同一物理网络中的多个交换机时,这很有用,因为它们可能通过干线链路互连。另一个重要的用例是使用干线端口连接 DHCP 代理,因为代理需要访问所有活动 VLAN。

请注意,只有在 ngs_manage_vlans = True 时,才会使用此选项。

多个物理网络

可以使用 Networking Generic Switch 管理多个物理网络。所需的物理网络由 Neutron API 客户端在创建网络对象时选择。

在这种情况下,您可能只想在属于请求的物理网络的交换机上创建 VLAN,尤其是因为来自单独物理网络的 VLAN 范围可能会重叠。这也有助于提高重新配置性能,因为在创建/删除网络时,需要配置的交换机更少。

为此,每个交换机都可以配置为其所属的物理网络列表

[genericswitch:device-hostname]
ngs_physical_networks = physnet1, physnet2

物理网络名称应与 ML2 配置中定义的名称匹配。

如果在交换机配置中未声明任何物理网络,则所有物理网络的 VLAN 都将在该交换机上创建。

请注意,只有在 ngs_manage_vlans = True 时,才会使用此选项。

SSH 算法配置

您可能需要调整某些设备的 SSH 协商过程。原因包括使用更快的密钥交换算法、禁用目标设备上存在错误实现的算法,或解决与 FIPS 要求相关的限制。

配置参数 ngs_ssh_disabled_algorithms 允许选择性地禁用给定类型(密钥交换、密码、MAC 等)的算法。它基于 Paramiko 的 disabled_algorithms 设置

格式是需要禁用的 <type>:<algorithm> 条目的列表。可以多次重复相同的类型,并使用不同的算法。这是一个示例配置

[genericswitch:device-hostname]
ngs_ssh_disabled_algorithms = kex:diffie-hellman-group-exchange-sha1, ciphers:blowfish-cbc, ciphers:3des-cbc

截至 Paramiko 2.9.1,有效的类型是 ciphersmacskeyspubkeyskexgsskex。但是,这可能会根据 Paramiko 的版本而变化。请检查 Paramiko 源代码或文档以确定接受的算法类型。

高级 Netmiko 配置

有时需要执行 Netmiko 的高级配置,例如调整连接超时或其他低级 SSH 参数。

任何不以 ngs_ 开头的设备配置参数都将直接传递给 Netmiko。众所周知的 Netmiko 参数将通过类型转换步骤传递,以确保与 Netmiko 的兼容性。

这是一个包含浮点数、布尔值和字符串的示例配置

[genericswitch:device-hostname]
conn_timeout = 1.5
alt_host_keys = True
alt_key_file = /path/to/host_keys

可以在 Netmiko 文档 中查阅可用参数的列表和描述。