Press "Enter" to skip to content

运维实例:批量统计分区占用情况,并形成Excel报表

假设有一天,你有一个任务,要统计线上所有服务器的/export分区占用情况,比如下面这一台服务器:

$ df -hT
Filesystem     Type   Size  Used Avail Use% Mounted on
/dev/sda1      ext4    20G  5.2G   13G  29% /
tmpfs          tmpfs  127G     0  127G   0% /dev/shm
/dev/sda3      ext4   514G  279G  209G  58% /export
/dev/sdb1      ext4   1.1T  518G  526G  50% /export/Data/jd_search

像这样一台服务器,除了有个/export分区,还有个/export/Data/jd_search(只有一部分机器有这个分区),现在要统计这2个分区的占用情况,并且最终形成Excel报表,要怎么操作呢?

1,使用批量脚本获得所有机器的/export分区占用情况
#准备远程机器列表

$ vim ip_list
10.191.172.201
10.190.143.38
10.187.110.4
10.190.49.237
10.190.198.192
10.190.163.211

使用ansible将本机的(admin用户的)key推送到所有机器上(的admin用户),实现从本机免密码登陆到所有机器

$ vim deploy_ssh_key.yml   #准备push ssh-key
- hosts: all
  remote_user: admin
  gather_facts: no

  tasks:
  - name: install ssh key
    authorized_key: user=admin
                    key="{{ lookup('file', '/home/admin/.ssh/id_rsa.pub') }}" 
                    state=present

开始批量推送ssh_key

$ ansible-playbook -i ip_list deploy_ssh_key.yml -k  #推送ssh key, 需要输入密码

使用批量执行的脚本

$ vim cmd.sh
#!/bin/bash
ip_list_file=$1

IP_LIST=`cat $ip_list_file`
for dst_ip in ${IP_LIST[@]}; do
    echo -e "$dst_ip    \c"
    ssh ${dst_ip} "df -hT | grep /export | egrep -v bigtable"
done

运行批量执行的脚本,获得所有机器的/export分区占用情况

$ sh cmd.sh ip_list
172.28.35.21    /dev/sda5      ext4   1.1T  590G  418G  59% /export
172.28.35.32    /dev/sda5      ext4   1.1T  590G  417G  59% /export
172.28.139.13    /dev/sda3            ext4      515G   79G  411G  17% /export
/dev/sdb             ext4      1.1T  522G  524G  50% /export/Data/jd_search
172.28.139.14    /dev/sda3            ext4      515G  107G  383G  22% /export
/dev/sdb             ext4      1.1T  523G  522G  51% /export/Data/jd_search
172.28.139.24    /dev/sda3      ext4   515G   74G  415G  16% /export
172.28.139.35    /dev/sda3      ext4   789G  403G  347G  54% /export
172.28.139.55    /dev/sda3      ext4   514G   91G  398G  19% /export
/dev/sdb       ext4   1.1T  522G  523G  50% /export/Data/jd_search
172.28.148.55    /dev/sda5      ext4   513G   72G  416G  15% /export
/dev/sdb       ext4   1.1T  522G  520G  51% /export/Data/jd_search
172.28.35.12    /dev/sda5      ext4   1.1T  591G  417G  59% /export
172.28.35.22    /dev/sda5      ext4   1.1T  591G  417G  59% /export
172.28.35.33    /dev/sda5      ext4   1.1T  592G  416G  59% /export

2,生成Excel报表
按常归方式形成Excel报表

$ sh cmd.sh ip_list  | awk 'BEGIN {OFS=",";} {print $1,$2,$3,$4,$5,$6,$7,$8}' > result.csv

awk输出的时候,指定逗号为分隔符,用来形成报表

打开报表看看,总感觉有哪里不对,有些列好像没有对上
形成Excel报表

重新生成报表

$ sh cmd.sh ip_list  | awk 'BEGIN {OFS=",";} {if (NF==8){print $1,$2,$3,$4,$5,$6,$7,$8} else if(NF==7){print "",$1,$2,$3,$4,$5,$6,$7}}' > result2.csv

awk输出的时候,指定逗号为分隔符,如果一行有8个参数(空格为分隔符),则输出8个参数,如果一行只有7个参数,则将第一个参数设置为空,后面输出7个参数

这回再看,就没有问题了
形成Excel报表

3,在命令行中生成简单报表(2017.09.07补充)
使用批量执行的脚本

$ vim cmd.sh
#!/bin/bash
ip_list_file=$1

IP_LIST=`cat $ip_list_file`
for dst_ip in ${IP_LIST[@]}; do
    echo -e "$dst_ip    \c"
   ssh ${dst_ip} "df -hT | grep /export | egrep -v '(bigtable)' | awk 'END{ if(NR=1) print \$5, \$7; else if(NR=2 && \$7=="/export/Data/jd_search") print \$5, \$7}'"
done

这里进行了一下筛选,如果有/export/Data/jd_search分区,则返回这个分区的剩余空间,否则就返回/export分区的剩余空间。针对awk的详细解释请看这篇文章《awk命令之条件判断

执行结果
awk命令

Leave a Reply

Your email address will not be published. Required fields are marked *