作者:BK运维团队成员
官方链接: https://vincentbernat.github.io/lldpd/usage.html
LLDP 可以让你准确的知道服务器所连接的交换机端口号。
LLDP是一种工业标准协议,用于取代EDP或CDP等专用链路层协议。LLDP的目标是提供一个inter-vendor兼容机制,向相邻网络设备发送链路层通知。
lldpd是一个LLDP协议的一种实现,给各种Unixes使用。除此之外,它还支持一些专有协议。
实现交换机端口的抓取,目前我知道的有两种工具,一种是lldpad,另一种是lldpd。
这两个工具做了一下对比,最终选择了lldpd。原因如下:
1.lldpd比较新
lldpad:https://github.com/jrfastab/lldpad
lldpd:https://github.com/vincentbernat/lldpd
通过对比可以看到lldpad最近一次更新,已经是5年前了。而lldpd的最近一次更新在本月。
2.lldpd使用方便
lldpd可以将输出的信息转化为json格式,非常方便使用。
1、查看网卡类型
lspci |grep -i ether
网卡类型包括:82599ES 10-Gigabit,Broadcom,Intel Corporation I350,Mellanox,Intel X710 for 10GbE,……
其中需要注意的是X710网卡,因为网卡设置问题,会丢弃LLDP包,造成收集不到相关信息,因此需要做相应的配置,配置方式如下:
mount -t debugfs none /sys/kernel/debug
echo “lldp stop” > /sys/kernel/debug/i40e/xxxx:xx:xx:.x/command
umount /sys/kernel/debug
例:
测试机器是有一块X710网卡,按照命令分别设置两个端口的lldp stop ,关闭网卡的lldp包处理。
1、软件lldpd和lldpcli
yum install lldpd -y
2、默认lldpad服务不需要再配置,默认配置可以满足需求
启动lldpd服务,并设置为开机启动
systemctl start lldpd.service
systemctl enable lldpd.service
3、服务启动后,相关信息可以通过如下命令获取
lldpcli show neighbors
将结果处理成json格式,只需要在命令后加上:lldpcli show neighbors -f json
4、输出的信息基本已经可以满足日常运维需求
1、安装相关服务软件和工具
##软件lldpad和lldptool
yum install lldpad -y
2、默认lldpad服务不需要再配置,默认配置可以满足需求
启动lldpad服务,并设置为开机启动
systemctl start lldpad.service
systemctl enable lldpad.service
3、配置服务器端口用于接收和发送相关LLDP信息,包括端口,主机名,mac地址和ip地址
(1)查看系统本地网卡设备:
##因为网卡设备名称包含eth,eno,em,p1p1 ……,默认都是以e或者p开头
ls /sys/class/net/ |egrep ‘e|p’
(2)分别配置每个端口,以eno1为例,如下:
lldptool set-lldp -i eno1 adminStatus=rxtx
lldptool -T -i eno1 -V sysName enableTx=yes
lldptool -T -i eno1 -V portDesc enableTx=yes
lldptool -T -i eno1 -V sysDesc enableTx=yes
lldptool -T -i eno1 -V mngAddr enableTx=yes
##每个端口都配置的原因是防止已经down的端口遗漏掉,新部署服务器可以只配置up状态的接口,具体配置请根据实际需求配置。
4、完成端口配置后,相关信息可以通过如下命令获取
5、输出的信息基本已经可以满足日常运维需求
6、相关脚本
#!/bin/bash
function ins_lldp(){
#installation lldpad and lldptool
yum install -y lldpad & >/dev/null
#Start service
systemctl start lldpad.service
systemctl enable lldpad.service
#set dev
for dev in `ls /sys/class/net/ |egrep 'e|p'`
do
echo "enabling lldp for interface: $dev"
lldptool set-lldp -i $dev adminStatus=rxtx
lldptool -T -i $dev -V sysName enableTx=yes
lldptool -T -i $dev -V portDesc enableTx=yes
lldptool -T -i $dev -V sysDesc enableTx=yes
lldptool -T -i $dev -V mngAddr enableTx=yes
done
}
#show SW info
function show_info() {
local se_dev=$1
local ld_tool="lldptool -t -n -i $se_dev"
local sw_mac=`$ld_tool |grep 'MAC:' |awk -F ': ' '{print $NF}'`
local sw_If=`$ld_tool |grep 'Ifname:' |awk -F ': ' '{print $NF}'`
local sw_name=`$ld_tool |grep 'System Name TLV' -A1 |tail -n1 |sed 's/\t//g'`
local sw_ip=`$ld_tool |grep 'Management Address TLV' -A1 |tail -n1 |awk -F ': ' '{print $NF}' |sed 's/\t//g'`
echo "se_dev: $se_dev
sw_name: $sw_name
sw_ip: $sw_ip
sw_mac: $sw_mac
sw_If: $sw_If"
}
function get_info() {
for up_dev in `ip a |grep 'state UP' |awk -F ': ' '{print $2}'`
do
show_info $up_dev
done
}
function check_lldp() {
if [[ -n `lldptool -p` ]]; then
echo "lldp install success"
fi
}
function main() {
if [[ $1 == "install" ]]; then
if [[ -f "/var/lib/lldpad/lldpad.conf" ]]; then
echo "lldp installed,exit!"
else
ins_lldp
check_lldp
fi
elif [[ $1 == "get" ]]; then
get_info
else
echo "install:install lldp
get:get lldp info"
fi
}
main "$@"
lldpad:https://github.com/jrfastab/lldpad
lldpd:https://github.com/vincentbernat/lldpd
官方链接: https://vincentbernat.github.io/lldpd/usage.html