如何从OHAI中提取实例引导时网卡的子网掩码?
从Ohai输出中提取子网掩码的方法
嘿,搞定这个其实挺简单的,分两种常见场景给你说:
1. 在Chef Recipe中提取(最常用的场景)
Ohai收集到的系统数据会自动注入到Chef的node属性里,你可以直接用Ruby代码在Recipe里获取目标网卡的子网掩码:
比如你要提取ens5网卡的IPv4子网掩码,可以这么写:
# 筛选出ens5网卡下所有IPv4地址,取第一个的netmask target_netmask = node['network']['interfaces']['ens5']['addresses'].select do |addr, details| details['family'] == 'inet' # 只保留IPv4地址 end.values.first['netmask'] # 验证输出 Chef::Log.info("实例ens5网卡的子网掩码是: #{target_netmask}")
如果你的实例有多个IPv4地址,或者需要遍历所有非回环网卡的子网掩码,可以调整代码遍历interfaces下的所有条目,跳过lo回环接口就行。
2. 命令行直接解析Ohai输出
Ohai默认会输出JSON格式的数据,所以可以用jq这个轻量的JSON解析工具直接提取,非常适合快速验证:
提取指定网卡(比如ens5)的IPv4子网掩码:
ohai network | jq '.interfaces.ens5.addresses | to_entries[] | select(.value.family == "inet") | .value.netmask'
提取所有非回环网卡的IPv4子网掩码(带对应IP地址):
ohai network | jq '.interfaces | to_entries[] | select(.key != "lo") | .value.addresses | to_entries[] | select(.value.family == "inet") | "\(.key) 对应的子网掩码: \(.value.netmask)"'
小贴士:不同系统的网卡命名可能不一样(比如有些是eth0而不是ens5),你可以先运行ohai network | jq '.interfaces'查看所有网卡名称,再调整命令或代码里的网卡标识。
内容的提问来源于stack exchange,提问作者TyMac
相关产品推荐
相关产品推荐

