使用 Bash 脚本配置文件接口

虽然许多数据中心的长期策略是自动化 NVIDIA 交换机的配置,但这对于较小的环境通常是过度配置。

但是,手动将每个交换机端口添加到配置文件可能是一项枯燥的任务。因此,NCLU 支持 globs 是一件好事,因此您可以使用它快速定义端口范围。

但是,如果您是老派风格并且想要使用本机 Bash shell 提供的工具,本文将向您展示如何使用 Bash 脚本快速添加交换机端口。

  1. 使用 ip link show 命令确定设备上的交换机端口标识符

    cumulus@switch$ ip link show
    1:  lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN mode DEFAULT
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    2:  eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
        link/ether 08:9e:01:f8:9b:ac brd ff:ff:ff:ff:ff:ff
    3:  swp1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 500
        link/ether 08:9e:01:f8:9b:af brd ff:ff:ff:ff:ff:ff
    ...
    53: swp51: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 500
        link/ether 08:9e:01:f8:9b:df brd ff:ff:ff:ff:ff:ff
    54: swp52: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 500
        link/ether 08:9e:01:f8:9b:e0 brd ff:ff:ff:ff:ff:ff
    

    对于此设备,您需要配置 swp1 到 swp52。

  2. 备份当前的 /etc/network/interfaces 文件

    cumulus@switch$ sudo cp /etc/network/interfaces /etc/network/interfaces.orig
    

    如果您不小心损坏了要更新的文件,此步骤是一项保险策略。

  3. cumulus 用户主目录中创建脚本。将以 while 开头的行上的数字替换为您交换机上编号最高的 swp。

    cumulus@switch$ vi populate.sh
    
    #!/bin/bash
    
    mycount=1
    
    while (( $mycount <= 52 ))
    do
    echo  >> /etc/network/interfaces
    echo auto swp$mycount >> /etc/network/interfaces
    echo iface swp$mycount >> /etc/network/interfaces
    ((mycount++))
    done
    

    准确转录间距和特殊字符,否则脚本可能会损坏您的 /etc/network/interfaces 文件。这就是您在步骤 2 中制作副本的原因。

  4. 使用 sudo 运行脚本,然后应用更改

    cumulus@switch$ chmod 744 populate.sh
    cumulus@switch$ sudo bash populate.sh
    cumulus@switch$ cat /etc/network/interfaces
    # This file describes the network interfaces available on your system
    # and how to activate them. For more information, see interfaces(5), ifup(8)
    #
    # Please see /usr/share/doc/python-ifupdown2/examples/ for examples
    #
    #
    
    # The loopback network interface
    auto lo
    iface lo inet loopback
    
    # The primary network interface
    auto eth0
    iface eth0 inet dhcp
    
    auto swp1
    iface swp1
    ...
    
    auto swp52
    iface swp52
    
    cumulus@switch$ sudo ifreload -a
    
  5. 使用 ip link show 命令验证端口是否处于活动状态

    cumulus@switch$ ip link show
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN mode DEFAULT
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
        link/ether 08:9e:01:f8:9b:ac brd ff:ff:ff:ff:ff:ff
    3: swp1: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP mode DEFAULT qlen 500
       link/ether 08:9e:01:f8:9b:af brd ff:ff:ff:ff:ff:ff
    ...
    53: swp51: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP mode DEFAULT qlen 500
       link/ether 08:9e:01:f8:9b:df brd ff:ff:ff:ff:ff:ff
    54: swp52: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP mode DEFAULT qlen 500
       link/ether 08:9e:01:f8:9b:e0 brd ff:ff:ff:ff:ff:ff
    

奖励部分:此脚本的工作原理

步骤 3 中的脚本按编写方式工作——只需将其复制到您的交换机上(调整编号最高的 swp 的编号),它就可以正常工作。但是,如果您想开始学习 Bash 脚本编写,请逐行查看以下脚本。

您可以使用多种方法完成 shell 脚本编写中描述的任务。此示例使用了一些首选方法——有关脚本工具的更完整讨论,请查阅其他资源(例如,nixCraft)。

 #!/bin/bash

此语句告诉脚本您应该使用哪个 shell(命令解释器)来运行它。通常,# 字符表示注释,但在这里它实际上将信息传递给脚本。

 mycount=1

脚本使用计数器来循环遍历 swp 接口。在这里,您将名为 mycount 的变量设置为初始值 1

while (( $mycount <= 52 ))

while 语句指示一个循环,只要指定的条件为真,该循环就会继续运行。包含在 dodone 语句之间的所有命令在循环的每次传递时运行。

双括号包含条件检查。使用 $ 字符替换它前面的变量的当前值——在本例中为 mycount。此行检查计数器是否大于或等于交换机上最高的端口 ID。

此行中的空格至关重要——如果间距不正确,则使用的表示法将不起作用。

echo  >> /etc/network/interfaces
echo auto swp$mycount >> /etc/network/interfaces
echo iface swp$mycount >> /etc/network/interfaces

echo 命令通常将任何参数直接打印到屏幕。添加 >> 字符会将该输出重定向并将其附加到指定文件的末尾。小心;单个 > 字符会覆盖文件,而不是添加到文件的末尾。

此代码块添加一个空行,后跟标准 auto 和 iface 语句,同时替换 mycount 变量的当前值以生成 swp 接口名称。

((mycount++))

这是此 while 循环中最关键的部分。如果计数器未递增,则循环不会自动退出,因为条件检查永远不会更改。