ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Salt 中 NetworkManager 时代的网络配置:nm_ip 模块如何让 network.managed 在 RHEL/CentOS 8+ 上重新可用

Salt 中 NetworkManager 时代的网络配置:nm_ip 模块如何让 network.managed 在 RHEL/CentOS 8+ 上重新可用 运维配置管理后端【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址https://gitcode.com/gh_mirrors/sa/salt点击查看免费下载本文围绕 Salt 项目 changelog changelog/54791.fixed.md 记录的功能变更深入解析新增的nm_ip执行模块它作为network.managed状态在 NetworkManager 管理下的 RedHat 系系统RHEL/CentOS/Alma/Rocky 8、Fedora上的新 provider解决了旧rh_ipprovider 在 EL8 上因缺少network-scripts包而报No such file or directory: ifdown、接口配置完全失效的问题。读完本文你将理解nm_ip的 provider 认领机制、支持的配置子集、keyfile 生成细节与幂等性设计并能直接用 Salt 在 NetworkManager 系统上编排静态地址、DHCP、Bond、Bridge、VLAN 与静态路由。背景EL8 上 ifcfg 时代的终结在 RedHat 家族的传统网络管理中Salt 的ip虚拟执行模块由rh_ip源码见 salt/modules/rh_ip.py提供实现它向/etc/sysconfig/network-scripts/写入ifcfg-*文件并通过network-scripts包中的ifup/ifdown命令来拉起或关闭接口。问题在于从 EL8RHEL 8 / CentOS 8 / AlmaLinux / Rocky Linux开始network-scripts包不再默认安装NetworkManager 成为系统网络管理的唯一权威到 EL10 该包已被彻底移除。因此在这些系统上执行network.managed时rh_ip会在调用ifdown时抛出No such file or directory: ifdown并且什么都不配置——接口保持原样状态结果却是失败的。该问题在 changelog/54791.fixed.md 中记录同时关联了 issue #68252 与 #62844。方案新增 nm_ip 模块以 keyfile nmcli 为技术底座针对上述问题Salt 新增了 NetworkManager providernm_ip模块源码见 salt/modules/nm_ip.py。它的核心思路与rh_ip完全不同不再写ifcfg-*文件而是在/etc/NetworkManager/system-connections/下写入 NetworkManager 原生 keyfileiface.nmconnection不再调用ifup/ifdown而是用nmcli connection reload让 NetworkManager 重载配置再用nmcli connection up/down激活或停用连接模块 docstring 标注.. versionadded:: 3006.28即该能力自 Salt 3006.28 版本引入。这也是 NetworkManager 时代 RedHat 系统上受支持的标准管理方式NM 通过 inotify 监视system-connections目录keyfile 一经写入即可被感知并加载。Provider 认领为什么恰好只有一个模块拥有 ip 虚拟名Salt 的虚拟模块机制允许多个模块声明同一个虚拟名ip但必须保证最终只有一个被认领。nm_ip的__virtual__()salt/modules/nm_ip.py设置了两个必要条件__grains__[os_family] RedHat仅适用于 RedHat 系发行版nm_managed()返回 TrueNetworkManager 正在管理该系统且不存在旧式ifup/ifdown工具。nm_managed()salt/modules/nm_ip.py的判定条件很明确且刻意设计为加载期即可安全求值无需运行时调用系统服务nmcli命令可用在 PATH 中NetworkManager 正在运行/run/NetworkManager目录存在系统 PATH 上既没有ifup也没有ifdown。只有这三个条件同时成立nm_ip才认领ip虚拟名。反过来仍然安装着network-scripts的主机即ifup/ifdown仍可用会保留旧的rh_ip行为行为完全不变。正如nm_ip模块 docstring 所述rh_ip defers under the same condition and precisely one provider claims ip——两者在条件判断上互补不会同时认领。你可以通过以下命令在任何 minion 上直接检测当前是否由 NetworkManager 托管salt * ip.nm_managed支持的配置子集以 keyfile 可表达为边界因为 NetworkManager 是网络事实来源nm_ip只支持network.managed中能干净映射到 NM connection keyfile 的字段子集。模块 docstring 与源码实现共同明确了支持清单类别支持的参数IPv4 寻址ipaddr、ipaddrs/addresses、netmask、gateway、protodhcp/dhcp4/bootp→autonone/disabled/off→disabledIPv6 寻址ipv6ipaddr、ipv6addrs、ipv6netmask、ipv6gateway、ipv6proto未指定时默认 SLAACautoDNSdns/nameservers、dns_search/domain分别按 v4/v6 地址族写入对应 section链路参数mtueth/bond/bridge/vlan 均可、autoneg、speed、duplex必须成对设置、wol、hwaddr/macaddrBondmode必填、miimon、lacp_rate、xmit_hash_policy、downdelay、updelay、arp_interval、arp_ip_target、primary、use_carrier以及其他任意内核 bonding 选项透传Bridgestp、fd/forward_delay、ageing、maxage、hello、priorityVLANvlan_id/id、parent/link/vlan-raw-device、reorder_hdr、gvrp、loose_binding静态路由routes见下文build_routes启停控制enabled映射为 keyfile 中autoconnect、onboot值得强调的是不支持的选项不会被静默丢弃_UNSUPPORTED集合salt/modules/nm_ip.py列出了up_cmds/down_cmds/pre_up_cmds/post_up_cmds等 hook 脚本以及ethtool、advertise、channels、rx、tx、sg、tso、ufo、gso、gro、lro等 ethtool offload/channel 设置——这些在 ifcfg/ifupdown 时代存在、但 keyfile 没有等价物。一旦在状态中传入这些选项_check_unsupported会直接抛出CommandExecutionError并给出明确提示NetworkManager keyfiles do not support these network.managed options: ... Manage them outside network.managed on NetworkManager systems.避免用户以为配置已生效。Keyfile 生成原理与幂等性设计连接 UUID确定性命名空间_UUID_NSsalt/modules/nm_ip.py使用一个固定的 UUID 命名空间配合uuid.uuid5(_UUID_NS, fsalt-{iface})为每个接口生成确定性的 connection UUID。这样同一接口永远映射到同一个 UUIDbuild_interface的输出与 NetworkManager 读回的 keyfile 字节一致状态 diff 稳定、重复执行幂等。keyfile 的 section 结构_connection_sectionssalt/modules/nm_ip.py按顺序生成标准 NM keyfile 的多个 section[connection]id、uuid、type、interface-name、autoconnect[ethernet]802-3-ethernetmtu、mac-address、cloned-mac-address、auto-negotiate、speed、duplex、wake-on-lan。注意 NetworkManager 会把[ethernet]设置也挂到 bond/bridge/vlan 连接上以承载mtu因此这些复合接口的 keyfile 会同时包含设备 section[bond]/[bridge]/[vlan]和独立的[ethernet]section[bond]/[bridge]/[vlan]各自的设备参数。bond 强制要求mode显式设置否则内核会静默回退到很少是预期的balance-rrvlan 要求vlan_id与parent齐全或使用eth0.100这样的点分命名自动解析[ipv4]/[ipv6]methodauto/manual/disabled/dhcp、addressNaddr,gateway、dns...;、dns-search...;。其中 NM 的数组值在磁盘上用;分隔如dns10.0.0.1;10.0.0.2;_listify对逗号、空格、分号分隔的输入都做了兼容解析因此 pillar 中既可以用列表也可以用预格式化字符串。原子写入mkstemp os.replace_write_keyfilesalt/modules/nm_ip.py的写入方式值得注意由于连接 keyfile 可能包含密钥且 NetworkManager 通过 inotify 监视该目录模块先把内容写入同目录下由mkstemp创建的临时文件权限 0600再通过os.replace原子替换到目标路径。这样 NM 永远只看到最终以 0600 权限落盘的完整文件绝不会经过先截断再写入的中间状态那会向 NM 的目录监视器暴露半成品文件。Bond / Bridge 的成员端口bond 的slaves或interfaces与 bridge 的ports或bridge_ports/interfaces会被build_interface逐一写成独立的端口 keyfile每个成员以slave类型生成连接[connection]中携带mastermaster_iface与slave-typebond|bridge不承载任何 L3 配置IP 归主设备所有。生成的 keyfile 长什么样以下用salt * ip.build_interface的输出示意testTrue时不落盘仅返回行内容salt * ip.build_interface eth0 eth True \ ipaddr10.0.0.5 netmask255.255.255.0 gateway10.0.0.1 \ dns[8.8.8.8, 1.1.1.1] testTrue对应的 keyfile 内容大致为[connection] ideth0 uuidsalt-eth0 的确定性 UUID typeethernet interface-nameeth0 autoconnecttrue [ethernet] mtu1500 [ipv4] methodmanual address110.0.0.5/24,10.0.0.1 dns8.8.8.8;1.1.1.1; dns-searchexample.com; [ipv6] methodauto可以看到ipaddrnetmask会被_to_cidr规范化为 CIDR 形式10.0.0.5/24网关作为address1的第二段与首个地址绑定IPv6 未指定时保持autoSLAAC保证双栈不被意外破坏。功能函数全景状态背后的调用链network.managed状态salt/states/network.py通过虚拟模块名ip.*调用 provider 实现nm_ip提供的函数与旧rh_ip一一对应minion 侧迁移无感函数作用ip.build_interface(iface, iface_type, enabled, **settings)生成且默认落盘keyfiletestTrue只返回内容bond/bridge 会顺带写出成员端口 keyfileip.get_interface(iface)读取 salt 管理的 keyfile 行列表未管理返回空列表供状态做 diffip.build_routes(iface, routes...)把静态路由折叠为routeNdest,nexthop注入现有 keyfile 的 ipv4/ipv6 sectionip.get_routes(iface)返回当前 keyfile 中声明的路由行ip.apply_network_settings(**settings)执行nmcli connection reload让 NM 重载 keyfiletestTrue时直接返回 Trueip.up(iface)/ip.down(iface)先nmcli connection reload再up/down对应连接slave/teamport 端口由主设备控制直接返回 Noneip.get_network_settings()/ip.build_network_settings()NetworkManager 没有全局 network-settings 文件每个连接 keyfile 自包含返回空列表静态路由示例命令行为来自 salt/modules/nm_ip.py 的 CLI 示例salt * ip.build_routes eth0 \ routes[{ipaddr: 10.1.0.0, netmask: 255.255.0.0, gateway: 10.0.0.1}]build_routes对每条路由支持ipaddr/destination/name指定目标网段gateway指定下一跳目标缺省或为default/0.0.0.0/::时自动展开为0.0.0.0/0或::/0按地址族分流到 ipv4/ipv6 section。_merge_routes在合并时还会丢弃旧的路由条目保证重复执行不产生累积重复保持幂等。在 SLS 中的实战用法在 NetworkManager 管理的 EL8 主机上原有的network.managedSLS 基本无需改动即可工作例如eth0_config: network.managed: - name: eth0 - enabled: True - type: eth - ipaddr: 192.168.10.10 - netmask: 255.255.255.0 - gateway: 192.168.10.1 - dns: - 192.168.10.1 - 1.1.1.1 - mtu: 1500bond 示例mode必须显式给出bond0_config: network.managed: - name: bond0 - enabled: True - type: bond - ipaddr: 192.168.20.10 - netmask: 255.255.255.0 - mode: 802.3ad - miimon: 100 - lacp_rate: fast - xmit_hash_policy: layer34 - slaves: - eth1 - eth2注意事项与限制适用前提本模块仅在 RedHat 系发行版且 NetworkManager 托管nmcli可用、NM 运行、无ifup/ifdown时生效仍装network-scripts的系统继续走rh_ip。不支持 ifcfg 特有项ethtool offload/channel 设置、up/downhook 脚本等会在状态层直接报错而非静默忽略请将这些场景迁移到 NetworkManager dispatcher 脚本等 NM 原生机制。文档入口模块自动生成的参考文档见 doc/ref/modules/all/salt.modules.nm_ip.rst执行模块的实现与全部 CLI 示例可直接阅读 salt/modules/nm_ip.py状态层调用关系见 salt/states/network.py。总体而言nm_ip用 NetworkManager 原生 keyfile nmcli取代了 ifcfg ifup/ifdown的旧链路让network.managed在现代 RedHat 系系统上恢复了可声明、可 diff、可幂等重放的完整能力同时通过明确的错误信息把无法映射的旧选项挡在状态之外避免了静默失败。赞分享运维配置管理后端【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址https://gitcode.com/gh_mirrors/sa/salt点击查看免费下载相关推荐Salt 的 nm_ip 执行模块用 NetworkManager keyfile 接管 RedHat 系网络配置Salt 的 nm_ip 执行模块用 NetworkManager keyfile 接管 RedHat 系网络配置 导读 本指南围绕 Salt 项目中 sal运维配置管理后端Salt 新增 netplan provider让 network.managed 状态真正管住 Ubuntu 18.04 的网络配置Salt 新增 netplan provider让 network.managed 状态真正管住 Ubuntu 18.04 的网络配置 导读 本篇文章围绕运维配置管理后端Salt 的 dnfmodule 执行与状态模块在 RHEL 8/9 上管理 DNF 模块流AppStreamSalt 的 dnfmodule 执行与状态模块在 RHEL 8/9 上管理 DNF 模块流AppStream SaltSaltStack在 3008运维配置管理后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表