NVUE 代码片段

NVUE 支持传统代码片段和灵活代码片段

  • 使用传统代码片段将配置添加到 /etc/network/interfaces/etc/frr/frr.conf/etc/frr/daemons/etc/cumulus/switchd.conf/etc/cumulus/datapath/traffic.conf/etc/ssh/sshd_config 文件。
  • 使用灵活代码片段来管理系统上的任何其他文本文件。

  • 代码片段配置与特定配置文件关联的单个参数。
  • 您只能设置或取消设置代码片段;您不能修改、部分更新或更改代码片段。
  • 设置代码片段值会替换任何现有代码片段值。
  • Cumulus Linux 仅支持一个配置文件的代码片段。
  • 只有某些配置文件支持代码片段。
  • NVUE 不解析或验证代码片段内容,也不在您应用代码片段后验证生成的文件。
  • PATCH 只是应用代码片段的方法,并不指任何代码片段功能。
  • 随着 NVUE 支持更多功能并引入新语法,代码片段和灵活代码片段将变为无效。在您将 Cumulus Linux 升级到新版本之前,请查看新增功能以了解新的 NVUE 语法,如果 NVUE 为代码片段配置的功能引入了新语法,请删除该代码片段。

传统代码片段

如果您使用 NVUE 命令配置 Cumulus Linux,然后想要配置尚不支持 NVUE 对象模型的功能,请使用传统代码片段。您以 yaml 格式创建代码片段,然后使用 nv config patch 命令将配置添加到文件。

nv config patch 命令要求您使用代码片段 .yaml 文件的完全限定路径名;例如,您不能将 ./nv config patch 命令一起使用。

/etc/frr/frr.conf 代码片段

示例 1:顶层配置

NVUE 不支持配置 BGP 以跨默认路由进行对等。以下示例配置 BGP 以从默认 VRF 跨默认路由进行对等

  1. 使用以下传统代码片段创建 .yaml 文件

    cumulus@switch:~$ sudo nano bgp_snippet.yaml
    - set:
        system:
          config:
            snippet:
              frr.conf: |
                ip nht resolve-via-default
    
  2. 运行以下命令以修补配置

    cumulus@switch:~$ nv config patch bgp_snippet.yaml
    
  3. 运行 nv config apply 命令以应用配置

    cumulus@switch:~$ nv config apply
    
  4. 验证配置是否存在于 /etc/frr/frr.conf 文件的末尾

    cumulus@switch:~$ sudo cat /etc/frr/frr.conf
    ...
    ! end of router ospf block
    !---- CUE snippets ----
    ip nht resolve-via-default
    

示例 2:嵌套配置

NVUE 不支持使用来自 RFC 8365 的自动派生值配置 EVPN 路由目标。以下示例配置 BGP 以启用 RFC 8365 派生的路由器目标

  1. 使用以下传统代码片段创建 .yaml 文件

    cumulus@switch:~$ sudo nano bgp_snippet.yaml
    - set:
        system:
          config:
            snippet:
              frr.conf: |
                router bgp 65517 vrf default
                  address-family l2vpn evpn
                    autort rfc8365-compatible
    

确保使用空格而不是制表符;解析器期望 yaml 格式中使用空格。

  1. 运行以下命令以修补配置

    cumulus@switch:~$ nv config patch bgp_snippet.yaml
    
  2. 运行 nv config apply 命令以应用配置

    cumulus@switch:~$ nv config apply
    
  3. 验证配置是否存在于 /etc/frr/frr.conf 文件的末尾

    cumulus@switch:~$ sudo cat /etc/frr/frr.conf
    ...
    ! end of router bgp 65517 vrf default
    !---- CUE snippets ----
    router bgp 65517 vrf default
    address-family l2vpn evpn
    autort rfc8365-compatible
    

FRR 的传统代码片段将内容写入 /etc/frr/frr.conf 文件。当您使用 nv config apply 命令应用配置和代码片段时,FRR 服务会遍历并读取 /etc/frr/frr.conf 文件。

示例 3:EVPN 多宿主 FRR 调试

NVUE 不支持为 EVPN 多宿主配置 FRR 调试。以下示例配置 FRR 调试

  1. 创建一个 .yaml 文件并添加以下传统代码片段

    cumulus@switch:~$ sudo nano mh_debug_snippet.yaml
    - set:
        system:
          config:
            snippet:
              frr.conf: |
                debug bgp evpn mh es
                debug bgp evpn mh route
                debug bgp zebra
                debug zebra evpn mh es
                debug zebra evpn mh mac
                debug zebra evpn mh neigh
                debug zebra evpn mh nh
                debug zebra vxlan
    
  2. 运行以下命令以修补配置

    cumulus@switch:~$ nv config patch mh_debug_snippet.yaml
    
  3. 运行 nv config apply 命令以应用配置

    cumulus@switch:~$ nv config apply
    
  4. 验证配置是否存在于 /etc/frr/frr.conf 文件中

    cumulus@switch:~$ sudo cat /etc/frr/frr.conf
    ...
    !---- NVUE snippets ----
    debug bgp evpn mh es
    debug bgp evpn mh route
    debug bgp zebra
    debug zebra evpn mh es
    debug zebra evpn mh mac
    debug zebra evpn mh neigh
    debug zebra evpn mh nh
    debug zebra vxlan
    

FRR 的传统代码片段将内容写入 /etc/frr/frr.conf 文件。当您使用 nv config apply 命令应用配置和代码片段时,FRR 服务会遍历并读取 /etc/frr/frr.conf 文件。

/etc/network/interfaces 代码片段

MLAG 定时器示例

NVUE 仅支持配置 MLAG 服务超时(initDelay)中的一个。以下示例将 MLAG 对等超时配置为 400 秒

  1. 创建一个 .yaml 文件并添加以下传统代码片段

    cumulus@switch:~$ sudo nano mlag_snippet.yaml
    - set:
        system:
          config:
            snippet:
              ifupdown2_eni:
                peerlink.4094: |
                  clagd-args --peerTimeout 400
    
  2. 运行以下命令以修补配置

    cumulus@switch:~$ nv config patch mlag_snippet.yaml
    
  3. 运行 nv config apply 命令以应用配置

    cumulus@switch:~$ nv config apply
    
  4. 验证配置是否存在于 /etc/network/interfaces 文件的 peerlink.4094 节中

    cumulus@switch:~$ sudo cat /etc/network/interfaces
    ...
    auto peerlink.4094
    iface peerlink.4094
     clagd-args --peerTimeout 400
     clagd-peer-ip linklocal
     clagd-backup-ip 10.10.10.2
     clagd-sys-mac 44:38:39:BE:EF:AA
     clagd-args --initDelay 180
    ...
    

传统桥接示例

NVUE 不支持配置传统网桥。以下示例配置一个名为 br0 的传统网桥,IP 地址为 11.0.0.10/24。swp1、swp2 是网桥的成员。

  1. 创建一个 .yaml 文件并添加以下传统代码片段

    cumulus@switch:~$ sudo nano bridge_snippet.yaml
    - set:
        system:
         config:
           snippet:
             ifupdown2_eni:
               eni_stanzas: |
                 auto br0
                 iface br0
                   address 11.0.0.10/24
                   bridge-ports swp1 swp2
                   bridge-vlan-aware no
    
  2. 运行以下命令以修补配置

    cumulus@switch:~$ nv config patch bridge_snippet.yaml
    
  3. 运行 nv config apply 命令以应用配置

    cumulus@switch:~$ nv config apply
    
  4. 验证配置是否存在于 /etc/network/interfaces 文件的末尾

    cumulus@switch:~$ sudo cat /etc/network/interfaces
    ...
    auto br0
    iface br0
      address 11.0.0.10/24
      bridge-ports swp1 swp2
      bridge-vlan-aware no
    

VLAN 感知 RSTP 定时器示例

NVUE 不支持在 VLAN 感知网桥上配置 RSTP 定时器。以下示例为 NVUE 默认网桥 br_default 配置非默认 RSTP 定时器

  1. 创建一个 .yaml 文件并添加以下传统代码片段

    cumulus@switch:~$ sudo nano vlan-aware_bridge_snippet.yaml
    - set:
        system:
          config:
            snippet:
              ifupdown2_eni:
                br_default: |
                  mstpctl-maxage 10
                  mstpctl-hello 1
                  mstpctl-fdelay 8
    
  2. 运行以下命令以修补配置

    cumulus@switch:~$ nv config patch vlan-aware_bridge_snippet.yaml
    
  3. 运行 nv config apply 命令以应用配置

    cumulus@switch:~$ nv config apply
    
  4. 验证配置是否存在于 /etc/network/interfaces 文件的末尾

    cumulus@switch:~$ sudo cat /etc/network/interfaces
    ...
    auto br_default
    iface br_default
        mstpctl-maxage 10
        mstpctl-hello 1
        mstpctl-fdelay 8
    ...
    

/etc/cumulus/datapath/traffic.conf 代码片段

要为 NVUE 尚不支持的 Cumulus Linux switchd 模块添加数据路径配置,请创建 traffic.conf 代码片段。

以下示例创建一个名为 traffic_conf_snippet.yaml 的文件,并启用弹性哈希设置。

  1. 创建一个 .yaml 文件并添加以下传统代码片段

    cumulus@switch:~$ sudo nano traffic_conf_snippet.yaml
    - set:
        system:
          config:
            snippet:
              traffic.conf: |
                resilient_hash_enable = TRUE
    
  2. 运行以下命令以修补配置

    cumulus@switch:~$ nv config patch traffic_conf_snippet.yaml
    
  3. 运行 nv config apply 命令以应用配置

    cumulus@switch:~$ nv config apply
    
  4. 验证配置是否存在于 /etc/cumulus/datapath/traffic.conf 文件的末尾

    cumulus@switch:~$ sudo cat /etc/cumulus/datapath/traffic.conf
    ...
    !---- NVUE snippets ----
    resilient_hash_enable = TRUE
    

/etc/snmp/snmpd.conf 代码片段

要添加 NVUE 命令尚不可用的 Cumulus Linux SNMP 代理配置,请创建 snmpd.conf 代码片段。

以下示例创建一个名为 snmpd.conf_snippet.yaml 的文件,并将只读社区字符串和侦听地址设置为在 mgmt VRF 中运行。

除非您首先使用 NVUE nv set system snmp-server state enablenv set system snmp-server listening-address 命令(或使用等效的 REST API 方法)启用 SNMP,否则 SNMP 代码片段不会生效。

  1. 创建一个 .yaml 文件并添加以下传统代码片段

    cumulus@switch:~$ sudo nano snmpd.conf_snippet.yaml
    - set:
        system:
          config:
            snippet:
              snmpd.conf: |
                rocommunity cumuluspassword default
                agentaddress udp:@mgmt:161
    
  2. 运行以下命令以修补配置

    cumulus@switch:~$ nv config patch snmpd.conf_snippet.yaml
    
  3. 运行 nv config apply 命令以应用配置

    cumulus@switch:~$ nv config apply
    
  4. 验证配置是否存在于 /etc/snmp/snmpd.conf 文件的末尾

    cumulus@switch:~$ sudo cat /etc/snmp/snmpd.conf
    ...
    !---- NVUE SNMP Server Snippets ----
    rocommunity cumuluspassword default
    agentaddress udp:@mgmt:161
    

/etc/ssh/sshd_config 代码片段

要添加 NVUE 命令尚不可用的 SSH 服务配置,请创建 sshd_config 代码片段。

以下示例创建一个名为 sshd_config_snippet.yaml 的文件,以允许 root 登录并为除用户 anoncvs 之外的所有用户启用 X11 转发。该代码片段还禁用用户 anoncvs 的 TCP 转发,并在 anoncvs 登录时运行 cvs server 命令。

  1. 创建一个 .yaml 文件并添加以下传统代码片段

    cumulus@switch:~$ sudo nano sshd_config_snippet.yaml
    - set:
        system:
          config:
            snippet:
              sshd_config: |
                PermitRootLogin yes
                X11Forwarding yes
                Match User anoncvs
                   X11Forwarding no
                   AllowTcpForwarding no
                   ForceCommand cvs server
    
  2. 运行以下命令以修补配置

    cumulus@switch:~$ nv config patch sshd_config_snippet.yaml
    
  3. 运行 nv config apply 命令以应用配置

    cumulus@switch:~$ nv config apply
    
  4. 验证配置是否存在于 /etc/ssh/sshd_config 文件的末尾

    cumulus@switch:~$ sudo cat /etc/ssh/sshd_config
    ...
    !---- NVUE snippets ----
    PermitRootLogin yes
    X11Forwarding yes
    Match User anoncvs
       X11Forwarding no
       AllowTcpForwarding no
       ForceCommand cvs server
    

灵活代码片段

灵活代码片段是传统代码片段的扩展,可让您管理系统上的任何文本文件。

  • 您可以创建新文件或修改 NVUE 不管理的现有文件。
  • 您可以将配置添加到 NVUE 管理的文件。

您通过 CLI 或 REST API 用于配置和管理灵活代码片段的帐户必须在 sudo 组中,其中包括 NVUE system-admin 角色,或者您必须是 root 用户。

NVUE 管理的文件

您可以使用灵活代码片段将配置添加到以下 NVUE 管理的文件

文件名
描述
/etc/cumulus/csmgrdcsmgrctl 命令的配置文件。
/etc/default/isc-dhcp-relay-<VRF>DHCP 中继的配置文件。对此文件的更改需要重启 dhcrelay@<VRF>.service
/etc/resolv.confDNS 解析的配置文件。
/etc/hosts交换机主机名的配置文件。
/etc/default/isc-dhcp-server-<VRF>DHCP 服务器的配置文件。对此文件的更改需要重启 dhcpd@<VRF>.service
/etc/default/isc-dhcp-server6-<VRF>IPv6 DHCP 服务器的配置文件。对此文件的更改需要重启 dhcpd6@<VRF>.service
/etc/dhcp/dhcpd-<VRF>.confdhcpd 服务的配置文件。对此文件的更改需要重启 dhcpd@<VRF>.service
/etc/dhcp/dhcpd6-<VRF>.confIPv6 dhcpd 服务的配置文件。对此文件的更改需要重启 dhcpd6@<VRF>.service
etc/ntpsec/ntp.confNTP 服务器的配置文件。对此文件的更改需要重启 ntp 服务。
/etc/default/isc-dhcp-relay6-<VRF>IPv6 DHCP 中继的配置文件。对此文件的更改需要重启 dhcrelay6@<VRF>.service
/etc/snmp/snmpd.confSNMP 的配置文件。对此文件的更改需要重启 snmpd
/etc/cumulus/datapath/traffic.conf转发表配置文件的配置文件。对此文件的更改需要重启 switchd
/etc/cumulus/switchd.confswitchd 的配置文件。对此文件的更改需要重启 switchd

灵活代码片段支持

  • 二进制文件。
  • 符号链接。
  • 超过 1MB 的内容。
  • 同一目标文件中的多个灵活代码片段。

创建灵活代码片段时请谨慎

  • 如果您错误地配置灵活代码片段,它们可能会影响交换机功能。例如,即使灵活代码片段验证仅允许您添加文本内容,Cumulus Linux 也不会阻止您创建添加到敏感文本文件(例如 /boot/grub.cfg/etc/fstab)或添加损坏内容的灵活代码片段。此类代码片段可能会导致交换机无法使用或造成潜在的安全漏洞(NVUE 服务 (nvued) 以超级用户权限运行)。
  • 请勿手动更新您向其中添加灵活代码片段的配置文件。
  • 纯文本中的任何敏感数据(例如密码)都以纯文本形式显示在 NVUE 管理的配置文件中。

创建灵活代码片段

要创建灵活代码片段

  1. yaml 格式创建一个文件,并按以下格式添加您要应用的每个灵活代码片段。NVUE 将灵活代码片段附加到现有文件的末尾。如果该文件不存在,NVUE 将创建该文件,然后添加内容。

    cumulus@leaf01:mgmt:~$ sudo nano <filename>.yaml>
    - set:
        system:
         config:
           snippet:
             <snippet-name>:
               file: "<filename>"
               permissions: "<umask-permissions>"
               content: |
                 # This is my content
               services:
                  <name>:
                    service: <service-name>
                    action: <action>
    
    • 您只能为创建的新文件设置 umast 权限。添加 permissions: 行是可选的。默认 umask 权限为 644。
    • 您可以添加具有操作的服务,例如 startrestartstop。添加 services: 行是可选的;但是,如果您添加 service: 行,则必须至少指定一项服务。
  2. 运行以下命令以修补配置

    cumulus@switch:~$ nv config patch <filename>.yaml>
    
  3. 运行 nv config apply 命令以应用配置

    cumulus@switch:~$ nv config apply
    
  4. 验证修补的配置。

nv config patch 命令要求您使用代码片段 .yaml 文件的完全限定路径名;例如,您不能将 ./nv config patch 命令一起使用。

灵活代码片段示例

以下名为 crontab-flex-snippet 的灵活代码片段将单行 @daily /opt/utils/run-backup.sh 附加到现有 /etc/crontab 文件的末尾,然后重启 cron 服务。

cumulus@leaf01:mgmt:~$ sudo nano crontab-flex-snippet.yaml
- set:
    system:
      config:
        snippet:
          crontab-flex-snippet:
            file: "/etc/crontab"
            content: |
              @daily /opt/utils/run-backup.sh
            services:
              schedule:
                service: cron
                action: restart

以下名为 apt-flex-snippet 的灵活代码片段创建一个新的文件 /etc/apt/sources.list.d/microsoft-prod.list,权限为 0644,并添加多行文本

cumulus@leaf01:mgmt:~$ sudo nano apt-flex-snippet.yaml
- set:
    system:
      config:
        snippet:
          apt-flexible-snippet:
            file: "/etc/apt/sources.list.d/microsoft-prod.list"
            content: |
              # Adding Microsoft SQL Server Sources
              deb [arch=amd64] https://packages.microsoft.com/debian/10/prod buster main
            permissions: "0644"

以下名为 lldp_config_snipppet 的灵活代码片段使用 configure system interface pattern-blacklist 命令禁用 swp1 和 swp2 上的 LLDP

cumulus@leaf01:mgmt:~$ sudo nano lldp_config_snipppet.yaml
- set:
    system:
      config:
        snippet:
          lldp-interfaces-config:
            file: "/etc/lldpd.d/lldp-interfaces.conf"
            content: |
              configure system interface pattern-blacklist swp1,swp2
              services:
                lldp:
                  service: lldpd
                  action: restart

以下名为 lldp_config_snipppet 的灵活代码片段使用 system interface pattern 关键字禁用 swp1 和 swp2 上的 LLDP

cumulus@leaf01:mgmt:~$ sudo nano lldp_config_snipppet.yaml
- set:
    system:
      config:
        snippet:
          lldp-interfaces-config:
            file: "/etc/lldpd.d/lldp-interfaces.conf"
            content: |
              configure system interface pattern eth*,swp*,!swp1,!swp2
            services:
              lldp:
                service: lldpd
                action: restart

在您修补并应用上述配置后,该代码片段将在 /etc/lldp.d 目录中创建一个新文件,然后重启 lldpd 服务以停止在 swp1 和 swp2 上发送和接收 LLDP。其他接口将继续参与 LLDP。

如果您尝试将灵活代码片段应用于 NVUE 不允许的文件,您将看到类似于以下的错误消息

cumulus@leaf01:mgmt:~$ nv config apply
Invalid config [rev_id: 8]
  Flexible snippets are not allowed to be configured on the file '/etc/cumulus/ports.conf’.
  Flexible snippets are not allowed to be configured on the file '/etc/cumulus/ports_width.conf’.

如果您尝试将灵活代码片段应用于支持传统代码片段的文件,您将看到类似于以下的错误消息

cumulus@leaf01:mgmt:~$ nv config apply
Invalid config [rev_id: 1]
  Flexible snippet cannot be used to modify the file '/etc/ssh/sshd_config'. Traditional snippets (for e.g., 'sshd_config') are supported on this file. Consult NVIDIA NVUE documentation for further information on snippets.

您还可以使用 REST API 创建灵活代码片段。请参阅 NVUE API

删除代码片段

要删除传统或灵活代码片段,请编辑代码片段 .yaml 文件以将 set 更改为 unset,然后修补并应用配置。您也可以使用 REST API DELETE 和 PATCH 方法。

以下示例删除上面创建的用于配置 MLAG 对等超时的MLAG 定时器传统代码片段

  1. 编辑 mlag_snippet.yaml 文件以将 set 更改为 unset

    cumulus@switch:~$ sudo nano mlag_snippet.yaml
    - unset:
        system:
          config:
            snippet:
              ifupdown2_eni:
    
  2. 运行以下命令以修补配置

    cumulus@switch:~$ nv config patch mlag_snippet.yaml
    
  3. 运行 nv config apply 命令以应用配置

    cumulus@switch:~$ nv config apply
    
  4. 验证对等超时参数不再存在于 /etc/network/interfaces 文件的 peerlink.4094 节中

    cumulus@switch:~$ sudo cat /etc/network/interfaces
    ...
    auto peerlink.4094
    iface peerlink.4094
     clagd-peer-ip linklocal
     clagd-backup-ip 10.10.10.2
     clagd-sys-mac 44:38:39:BE:EF:AA
     clagd-args --initDelay 180
    ...