expect 批量备份网络设备配置文件

2020-12-22 11:22:34 浏览数 (1)

TFTP

TFTP(Trivial File Transfer Protocol,简单文件传输协议)也是用于在远端服务器和本地主机之间传输文件的,相对于FTP,TFTP没有复杂的交互存取接口和认证控制,适用于客户端和服务器之间不需要复杂交互的环境。TFTP协议的运行基于UDP协议,UDP 69 端口,使用UDP端口建立连接、收/发数据报文。

TFTP协议传输是由客户端发起的:

· 当TFTP客户端需要从服务器下载文件时,由客户端向TFTP服务器发送读请求包,然后从服务器接收数据,并向服务器发送确认;

· 当TFTP客户端需要向服务器上传文件时,由客户端向TFTP服务器发送写请求包,然后向服务器发送数据,并接收服务器的确认。

TFTP传输文件有两种模式:

· 二进制模式,用于传输程序文件(比如后缀名为.bin和.btm的文件)。

· ASCII码模式,用于传输文本格式的文件(比如后缀名为.txt、.bat和.cfg的文件)。

安装TFTP Server

代码语言:javascript复制
yum -y install tftp-server xinetd

TFTP Server 配置文件

代码语言:javascript复制
cat  /etc/xinetd.d/tftp
service tftp
{
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -s -c /mnt/backup
        disable                 = no
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}

创建 TFTP 存储目录赋予权限

代码语言:javascript复制
mkdir   -p /mnt/backup
chmod 777  -R /mnt/backup/

重启 xinetd 服务 (tftp服务是依赖于xinetd服务)

代码语言:javascript复制
systemctl   restart xinetd

查看TFTP 服务端口

代码语言:javascript复制
netstat  -auntlp  |grep 69
udp        0      0 0.0.0.0:69              0.0.0.0:*                           20046/xinetd        
udp6       0      0 :::69                   :::*                                1/systemd

Firewall 配置

代码语言:javascript复制
firewall-cmd   --add-port=69/udp --permanent
firewall-cmd    --reload

登录网络设备测试推送配置文件到TFTP 服务器(H3C 设备为例)

TFTP 服务器查看设备备份文件

bash 脚本一

案例中使用 telnet 协议,生产环境多为ssh协议,根据实际环境修改脚本。

代码语言:javascript复制
cat expect06.sh 
#!/usr/bin/bash

date=`date  %F`

cat /mnt/shell/ip.txt | while read ip username password
do
        ping -c1 -W1 $ip &>/dev/null
        if [ $? -eq 0 ];then
                /usr/bin/expect <<-EOF
                set timeout 10
                spawn telnet $ip
                expect "Username:" { send "$usernamen" }
                expect "Password:" { send "$passwordn" }
                expect ">" { send "tftp  172.18.30.27 put  startup.cfg startup.cfg_${date}_$ipn" }
                expect ">" { send "quitn" }
                expect eof 
                EOF
        else 
                 echo -e "e[1;33m$ip ICMP Ping Unavailable...e[0m"
        fi
done

赋予可执行权限

代码语言:javascript复制
chmod a x expect06.sh

文本文件内容

代码语言:javascript复制
cat ip.txt 
172.18.1.30 username  password
172.18.1.14 username  password

网络设备备份配置文件

bash 脚本二

将网络设备备份状态重定向到文本文件

代码语言:javascript复制
cat expect07.sh 
#!/usr/bin/bash

date=`date  %F`

cat /mnt/shell/ip.txt | while read ip username password
do
        ping -c1 -W1 $ip &>/dev/null
        if [ $? -eq 0 ];then
                /usr/bin/expect <<-EOF
                set timeout 5
                spawn telnet $ip
                expect "Username:" { send "$usernamen" }
                expect "Password:" { send "$passwordn" }
                expect ">" { send "tftp  172.18.30.27 put  startup.cfg startup.cfg_${date}_$ipn" }
                expect ">" { send "quitn" }
                expect eof 
                EOF
        else
                 echo -e "e[1;33m$ip ICMP Ping Unavailable...e[0m"
        fi

        if [ -e /mnt/backup/startup.cfg_${date}_$ip ];then
                echo "$date $ip success" >>/mnt/shell/device.txt
        else
                echo "$date $ip failed" >>/mnt/shell/device.txt

           
        fi
done

赋予可执行权限

代码语言:javascript复制
chmod a x expect07.sh

文本文件内容

代码语言:javascript复制
cat ip.txt 
172.18.1.30 username  password
172.18.1.14 username  password
172.18.1.114 username  password

设备备份状态

代码语言:javascript复制
cat device.txt 
2020-12-15 172.18.1.13 success
2020-12-15 172.18.1.14 success
2020-12-15 172.18.1.114 failed

Zabbix 实现对网络设备备份状态监控

zabbix_sender 参数介绍

-c --config 配置文件绝对路径

-z --zabbix-server zabbix server的IP地址

-p --port zabbix server端口.默认10051

-s --host 主机名,zabbix里面配置的主机名(不是服务器的hostname),不能使用ip地址

-I --source-address 源IP

-k --key 监控项的key

-o --value key值

-i --input-file 从文件里面读取hostname、key、value 一行为一条数据,使用空格作为分隔符,如果主机名带空格,那么请使用双引号包起来

-T --with-timestamps 一行一条数据,空格作为分隔符: ,配合 --input-file option,timestamp为unix时间戳

-r --real-time 将数据实时提交给服务器

-v --verbose 详细模式, -vv 更详细

监控项

注意:后续需要根据设备IP地址新增监控项,保证监控项键值和主机的IP地址对应!!!

zabbix_sender 发送数据测试

代码语言:javascript复制
zabbix_sender -z 172.18.30.27 -s Zabbix-server   -k "172.18.1.30" -o sucess -vv
zabbix_sender [25857]: DEBUG: answer [{"response":"success","info":"processed: 1; failed: 0; total: 1; seconds spent: 0.000083"}]
Response from "172.18.30.27:10051": "processed: 1; failed: 0; total: 1; seconds spent: 0.000083"
sent: 1; skipped: 0; total: 1

最新数据

zabbix_sender 读取文件

代码语言:javascript复制
zabbix_sender -z 172.18.30.27  -i device.txt 
Response from "172.18.30.27:10051": "processed: 2; failed: 0; total: 2; seconds spent: 0.000095"
sent: 2; skipped: 0; total: 2

文本文件内容

代码语言:javascript复制
cat device.txt 
Zabbix-server 172.18.1.30 success
Zabbix-server 172.18.1.114 failed

最新数据

bash 脚本三

代码语言:javascript复制
cat  expect08.sh 
#!/usr/bin/bash

>/mnt/shell/device.txt
date=`date  %F`

host="Zabbix-server"
cat /mnt/shell/ip.txt | while read ip username password
do
        ping -c1 -W1 $ip &>/dev/null
        if [ $? -eq 0 ];then
                /usr/bin/expect <<-EOF
                set timeout 5
                spawn telnet $ip
                expect "Username:" { send "$usernamen" }
                expect "Password:" { send "$passwordn" }
                expect ">" { send "tftp  172.18.30.27 put  startup.cfg startup.cfg_${date}_$ipn" }
                expect ">" { send "quitn" }
                expect eof 
                EOF
        else
                 echo -e "e[1;33m$ip ICMP Ping Unavailable...e[0m"
        fi

        if [ -e /mnt/backup/startup.cfg_${date}_$ip ];then
                echo "$host $ip success" >>/mnt/shell/device.txt
        else
                echo "$host $ip failed" >>/mnt/shell/device.txt

           
        fi
done

/usr/bin/zabbix_sender -z 172.18.30.27  -i device.txt

赋予可执行权限

代码语言:javascript复制
chmod a x expect08.sh

文本文件内容

代码语言:javascript复制
cat ip.txt 
172.18.1.30 username  password
172.18.1.114 username  password

设备备份状态

代码语言:javascript复制
cat device.txt 
Zabbix-server 172.18.1.30 success
Zabbix-server 172.18.1.114 failed

Zabbix 最新数据

0 人点赞