背景:1500 多个站点运行 Ubuntu Server + ubuntu-desktop-minimal
,大多数仍在使用 20.04,新站点均部署了 22.04(带有ubuntu-desktop-minimal --no-install-recommends
22.04 标志)。用户需要能够与网络设置 GUI 交互,因此我们使用NetworkManager
(通过 进行设置netplan
)来管理网络设置。
我们在使用 Ubuntu Server 22.04 时遇到了一个有趣的问题,在运行netplan
以在客户端的 2 个 NIC 端口上设置静态 IP/DHCP 设置后,它们会在多次重启后“翻转”,其中开启的 MACeth0
将显示为 的 MAC 地址eth1
。物理交换电缆eth1
将恢复与最初分配给 的静态 IP 的连接eth0
。再次重启后,端口将翻转回来(如果在此过程中也交换了电缆,则需要再次更换电缆)。根据我们的经验,这种交换没有再次发生。
netplan
在准备这些系统的过程中,我们使用了两个剧本:
00-installer-config.yaml
- 这是在 PXE 安装过程中安装和应用的,将两个接口都设置为启用 DHCP
cat /etc/netplan/00-installer-config.yaml # This is the network config written by 'subiquity' network: ethernets: eth0: dhcp-identifier: mac dhcp4: true eth1: dhcp-identifier: mac dhcp4: true version: 2
01-network-manager-all.yaml
- Playbook 在站点配置过程中运行,在映像生成后不久。我们最初认为问题“翻转”是在运行此 Playbook 后开始的;进一步的测试证明事实并非如此。
cat /etc/netplan/01-network-manager-all.yaml #BEGIN ANSIBLE MANAGED BLOCK network: version: 2 renderer: NetworkManager ethernets: eth0: dhcp4: no addresses: - 172.31.252.51/24 routes: - to: default via: 172.31.252.254 nameservers: addresses: [172.16.103.251,172.16.103.252] eth1: dhcp4: no #END ANSIBLE MANAGED BLOCK
这对我们来说是一个重大问题,因为每当添加/替换其中一个系统时,它基本上就像一个滴答作响的时钟,等待它从无响应的网络重启中恢复。
有谁见过或听说过这样的错误吗?我还有很多信息,想让置顶帖子保持合理,很乐意提供更多详细信息。
尝试的补救措施:
- 在 PXE 安装过程中将内核版本更新至 6.0、6.1 和 6.4
- 删除了所有 After Imaging 服务
systemd-networkd
以强制一切NetworkManager
- 添加了
match
变量,name
并driver
匹配。netplan 成功应用,重启 5 次没有问题,端口在第 6 次重启时翻转。 macaddress
越来越近了。在 Ansible 中匹配netplan
,在成像后创建了 01。4 次重启后端口翻转,但奇怪的是,尽管ip addr
显示翻转的 IP,但连接仍然保留。
- name: Copy network configuration in 01-network-manager-all.yaml blockinfile: path: /etc/netplan/01-network-manager-all.yaml block: | network: version: 2 renderer: NetworkManager ethernets: eth0: match: macaddress: {{ansible_eth0.macaddress}} dhcp4: no addresses: - {{ ansible_host }}/24 routes: - to: default via: {{ ansible_host.split('.')[0:3] | join('.') }}.254 nameservers: addresses: {{ default_dns }} eth1: match: macaddress: {{ansible_eth1.macaddress}} dhcp4: no
结果netplan
:
cat /etc/netplan/01-network-manager-all.yaml #BEGIN ANSIBLE MANAGED BLOCK network: version: 2 renderer: NetworkManager ethernets: eth0: match: macaddress: c4:00:ad:87:be:20 dhcp4: no addresses: - 172.31.252.51/24 routes: - to: default via: 172.31.252.254 nameservers: addresses: [172.16.103.251,172.16.103.252] eth1: match: macaddress: c4:00:ad:87:be:1f dhcp4: no #END ANSIBLE MANAGED BLOCK
翻转端口(仍然允许 ssh 到 172.31.252.51,无需电缆移动):
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000 link/ether c4:00:ad:87:be:1f brd ff:ff:ff:ff:ff:ff altname enp0s31f6 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether c4:00:ad:87:be:20 brd ff:ff:ff:ff:ff:ff altname enp1s0 inet 172.31.252.51/24 brd 172.31.252.255 scope global noprefixroute eth1 valid_lft forever preferred_lft forever