| Works
RHEL/CentOSの情報収集
業務でサーバ構築をしたとき、設定情報等はエビデンスとして残しておくと思います。また、設定変更やリプレースに先立って既存環境を調査することもよくあると思います。
そういったいつもやることはスクリプトにして使い回すのがお約束です。
このスクリプトは、自分がこの業界に入ったばかりの頃にシェルスクリプトの勉強も兼ねて作成したものです。その後、収集する情報を調整したりRHELのバージョンに追随するために修正に修正を重ねて数年前まで使用していました。
今は業務環境の変化もあって使っていなかったのですが、たまたま昔の情報とかを整理する機会があって発掘されたので、残しておこうかと思った次第です。
こうしてみると、"/etc"や"/var/lib"を全てtarアーカイブにしてたり情報の集め方が乱暴な気がします。あと、"getopts"や"trap"は使い方を練習するために入れていたように記憶しています。
ハードウェア周りの情報を集めている部分は、当時の機器構成なんかが思い出されますね。
最終更新が4年くらい前で、おそらくRHEL6用に修正したのが最後かなと。
#!/bin/bash
# Base Parameter
HOSTNAME=`hostname`
BASENAME=`basename $0`
BASEDIR=`dirname $0`
PID=$$
DATE=`/bin/date +'%Y%m%d'`
# Constant Parameter
TMPDIR=$BASEDIR/info-$HOSTNAME
TARNAME=info-${HOSTNAME}_${DATE}.tar.gz
# FTP Parameter (Option)
FTPFLAG="0"
FTPTARGET="anonymous:password@localhost"
# SCP Parameter (Option)
SCPFLAG="0"
SCPTARGET="root@localhost:/tmp"
# Parse Positional Parameter
while getopts 'f:s:t:' OPT
do
case $OPT in
f)
if [ $SCPFLAG -eq 1 ]; then
echo "$BASENAME: You may not specify more than one \`-fs\' option"
exit 255
fi
# FTP Option
FTPFLAG="1"
FTPTARGET="$OPTARG"
;;
s)
if [ $FTPFLAG -eq 1 ]; then
echo "$BASENAME: You may not specify more than one \`-fs\' option"
exit 255
fi
# SCP Option
SCPFLAG="1"
SCPTARGET="$OPTARG"
;;
t)
# Archive File Path
TARPATH="$OPTARG"
TARNAME="$TARPATH/$TARNAME"
;;
?)
echo "Usage: $BASENAME: [-f user:password@hostname] [-s [user@]hostname:path] [-t directory] args"
exit 255
esac
done
shift $(($OPTIND - 1))
# Function
# デフォルトのSCSIドライバ情報取得方法
function sdevinfo(){
SDEVPATH="/proc/scsi/$1"
if [ -d $SDEVPATH ]; then
cat $SDEVPATH/* >> $TMPDIR/$1.lst
fi
}
# デフォルトのアプリケーション情報取得方法
function appinfo(){
if [ -d $2 ]; then
tar czvf $TMPDIR/$1.tar.gz $2 1>/dev/null 2>&1
elif [ -f $2 ]; then
cp -p $2 $TMPDIR
fi
}
# Script Start
echo "------ $BASENAME script start. ------"
trap "sleep 1; rm -rf $TMPDIR; exit" 1 2 3 15
# Change Directory
cd $BASEDIR
mkdir -p $TMPDIR
if [ -f $TARNAME ]; then
echo "------ Removing old file : $TARNAME ------"
rm -f $TARNAME
fi
echo "------ Waiting for a few minutes ... ------"
# "/etc"をアーカイブ
tar czvf $TMPDIR/etc_$HOSTNAME.tar.gz /etc 1>/dev/null 2>&1
# "/var/log"をアーカイブ
tar czvf $TMPDIR/varlog_$HOSTNAME.tar.gz /var/log 1>/dev/null 2>&1
# "/var/lib"をアーカイブ
tar czvf $TMPDIR/varlib_$HOSTNAME.tar.gz /var/lib 1>/dev/null 2>&1
# "/var/spool"をアーカイブ
tar czvf $TMPDIR/varspool_$HOSTNAME.tar.gz /var/spool 1>/dev/null 2>&1
# カーネルログ(リングバッファ)
{
echo "# dmesg ----------------------------------------------------"
dmesg
} >> $TMPDIR/dmesg.log
# システム基本情報
{
echo "# uname -a -------------------------------------------------"
uname -a
echo -e "\n# cat /proc/cpuinfo ----------------------------------------"
cat /proc/cpuinfo
echo -e "\n# cat /proc/meminfo ----------------------------------------"
cat /proc/meminfo
echo -e "\n# cat /proc/modules ----------------------------------------"
cat /proc/modules
echo -e "\n# cat /proc/partitions -------------------------------------"
cat /proc/partitions
echo -e "\n# cat /proc/version ----------------------------------------"
cat /proc/version
echo -e "\n# cat /etc/redhat-release ---------------------------------"
cat /etc/redhat-release
} >> $TMPDIR/procinfo.lst
# ハードウェア情報
{
echo "# dmidecode ------------------------------------------------"
/usr/sbin/dmidecode
} >> $TMPDIR/dmidecode.lst
# PCIデバイス情報
{
echo "# lspci ----------------------------------------------------"
/sbin/lspci
} >> $TMPDIR/pci.lst
# パッケージ情報
{
echo "# rpm -qa --------------------------------------------------"
rpm -qa | sort
echo -e "\n# rpm --queryformat ----------------------------------------"
rpm -qa --qf '%{name}-%{version}-%{release}.%{arch}\n' | sort
} >> $TMPDIR/rpm.lst
# サービス情報
{
echo "# chkconfig --list -----------------------------------------"
/sbin/chkconfig --list
} >> $TMPDIR/chkconfig.lst
# プロセス情報
{
echo "# ps aux ---------------------------------------------------"
ps aux
echo "# ps -eZ ---------------------------------------------------"
ps -eZ
} >> $TMPDIR/ps.lst
# オープンファイル情報
{
echo "# lsof -----------------------------------------------------"
lsof
} >> $TMPDIR/lsof.lst
# カーネルパラメータ
{
echo "# sysctl -a ------------------------------------------------"
/sbin/sysctl -a
} >> $TMPDIR/sysctl.lst
# ブートローダ情報
{
echo "# cat /boot/grub/grub.conf ---------------------------------"
cat /boot/grub/grub.conf
} >> $TMPDIR/grub.lst
# ディスク情報
{
echo "# fdisk -l -------------------------------------------------"
/sbin/fdisk -l
echo -e "\n# parted -l ------------------------------------------------"
/sbin/parted -l
echo -e "\n# df -------------------------------------------------------"
df
echo -e "\n# df -h ----------------------------------------------------"
df -h
echo -e "\n# df -i ----------------------------------------------------"
df -i
echo -e "\n# mount ----------------------------------------------------"
mount
} >> $TMPDIR/diskinfo.lst
# LVM情報
/sbin/fdisk -l | grep LVM 1>/dev/null 2>&1
if [ $? -eq 0 ]; then
{
echo "# lvm pvs ----------------------------------------------------"
/sbin/lvm pvs
echo -e "\n# lvm vgs ----------------------------------------------------"
/sbin/lvm vgs
echo -e "\n# lvm lvs ----------------------------------------------------"
/sbin/lvm lvs
} >> $TMPDIR/lvm.lst
fi
# ファイルシステム情報(ext2/ext3/ext4)
{
for FSDEV in `mount | grep "^/dev" | awk '{print $1}'`
do
echo "# tune2fs -l $FSDEV ---------------------------------------"
/sbin/tune2fs -l $FSDEV
echo ""
done
} >> $TMPDIR/e2fs.lst
# モジュール情報
{
echo "# lsmod ----------------------------------------------------"
/sbin/lsmod
for MODS in `ls /etc/modprobe.d`
do
echo -e "\n# cat /etc/modprobe.d/$MODS --------------------------------"
cat /etc/modprobe.d/$MODS
done
} >> $TMPDIR/mod.lst
# ユーザー環境情報(bash)
{
echo "# env ------------------------------------------------------"
env
} >> $TMPDIR/env.lst
tar czvf $TMPDIR/bashenv_root.tar.gz /root/.bash* 1>/dev/null 2>&1
ls -alR /home | grep "bash_" 1>/dev/null 2>&1
if [ $? -eq 0 ]; then
tar czvf $TMPDIR/bashenv_user.tar.gz /home/*/.bash* 1>/dev/null 2>&1
fi
# ユーザー環境情報(ssh)
tar czvf $TMPDIR/sshkey_root.tar.gz /root/.ssh 1>/dev/null 2>&1
ls -alR /home | grep ".ssh" 1>/dev/null 2>&1
if [ $? -eq 0 ]; then
tar czvf $TMPDIR/sshkey_user.tar.gz /home/*/.ssh 1>/dev/null 2>&1
fi
# ユーザー個別Cron情報
tar czvf $TMPDIR/crontab_user.tar.gz /var/spool/cron 1>/dev/null 2>&1
# ドライバ情報
# QLogic qla2xxxドライバ
QLADIR="/proc/scsi/qla*"
if [ -d $QLADIR ]; then
cat $QLADIR/* >> $TMPDIR/qla.lst
fi
# RDACドライバ
sdevinfo "mpp"
# IBM ServeRAID ipsドライバ(IBM ServeRAID 4,5,6,7)
sdevinfo "ips"
# Adaptec aacraidドライバ(IBM ServeRAID 8x)
sdevinfo "aacraid"
# LSI Logic MPTドライバ
MPTDIR="/proc/mpt"
if [ -d $MPTDIR ]; then
cat $MPTDIR/version >> $TMPDIR/mpt.lst
fi
# SCSI情報
SCSIFILE="/proc/scsi/scsi"
if [ -f $SCSIFILE ]; then
cat $SCSIFILE >> $TMPDIR/scsi.lst
fi
# Device Mapper Multipath設定情報
DMMDEV="/dev/mapper/mpath*"
if [ -e $DMMDEV ]; then
{
echo "# multipath -ll --------------------------------------------"
/sbin/multipath -ll
echo -e "\n# dmsetup info --------------------------------------------"
/sbin/dmsetup info
} >> $TMPDIR/dmmp.lst
fi
appinfo "dmmp" "/var/lib/multipath/bindings"
# ネットワーク情報
{
echo "# ifconfig -a ----------------------------------------------"
/sbin/ifconfig -a
echo -e "\n# route -n -------------------------------------------------"
/sbin/route -n
echo -e "\n# netstat -an ----------------------------------------------"
netstat -an
} >> $TMPDIR/netinfo.lst
# Ethernetデバイス情報
{
for TGTDEV in `/sbin/ifconfig -a | awk '/HWaddr/ {print $1}'`
do
echo "# ethtool $TGTDEV ---------------------------------------------"
/sbin/ethtool $TGTDEV
echo -e "\n# ethtool -i $TGTDEV ------------------------------------------"
/sbin/ethtool -i $TGTDEV
echo ""
done
} >> $TMPDIR/ethinfo.lst
# Bonding構成情報
BONDDIR="/proc/net/bonding"
if [ -d $BONDDIR ]; then
cat $BONDDIR/* >> $TMPDIR/bonding.lst
fi
# Broadcom bcm5700ドライバ
NICDIR="/proc/net/nicinfo"
if [ -d $NICDIR ]; then
cat $NICDIR/* >> $TMPDIR/bcm5700.lst
fi
# ファイアウォール情報(iptables)
{
echo "# iptables -L ----------------------------------------------"
/sbin/iptables -L
echo -e "\n# iptables -L -t nat ---------------------------------------"
/sbin/iptables -L -t nat
echo -e "\n# iptables -L -t mangle ------------------------------------"
/sbin/iptables -L -t mangle
echo "# iptables -L -v -------------------------------------------"
/sbin/iptables -L -v
echo -e "\n# iptables -L -v -t nat ------------------------------------"
/sbin/iptables -L -v -t nat
echo -e "\n# iptables -L -v -t mangle ---------------------------------"
/sbin/iptables -L -v -t mangle
echo "# iptables -L -vv ------------------------------------------"
/sbin/iptables -L -vv
echo -e "\n# iptables -L -vv -t nat -----------------------------------"
/sbin/iptables -L -vv -t nat
echo -e "\n# iptables -L -vv -t mangle --------------------------------"
/sbin/iptables -L -vv -t mangle
} >> $TMPDIR/iptables.lst
# SELinux情報
{
echo "# getenforce -----------------------------------------------"
/usr/sbin/getenforce
echo -e "\n# sestatus -v ----------------------------------------------"
/usr/sbin/sestatus -v
} >> $TMPDIR/selinux.lst
# 時刻同期
/sbin/service ntpd status 1>/dev/null 2>&1
if [ $? -eq 0 ]; then
{
echo "# ntpq -p --------------------------------------------------"
/usr/sbin/ntpq -p
} >> $TMPDIR/ntp.lst
fi
# インストールパラメータ
if [ -f /root/anaconda-ks.cfg ]; then
cp -p /root/anaconda-ks.cfg $TMPDIR
fi
# アプリケーション個別情報
# Samba 3.0
SMBNAME="samba"
SMBDIR="/usr/local/samba"
appinfo $SMBNAME $SMBDIR
/sbin/service smb status 1>/dev/null 2>&1
if [ $? -eq 0 ]; then
{
echo "# pdbedit -L -----------------------------------------------"
/usr/bin/pdbedit -L
echo -e "\n# net usershare info ---------------------------------------"
for SHARE in `/usr/bin/net usershare list`
do
/usr/bin/net usershare info $SHARE
done
} >> $TMPDIR/smbshared.lst
fi
# LifeKeeper
LKDIR="/opt/LifeKeeper"
if [ -d $LKDIR ]; then
{
echo "# lktest ---------------------------------------------------"
$LKDIR/bin/lktest
echo -e "\n# lcdstatus -e ---------------------------------------------"
$LKDIR/bin/lcdstatus -e
echo -e "\n# lcdstatus ------------------------------------------------"
$LKDIR/bin/lcdstatus
echo -e "\n# lk_log log -----------------------------------------------"
$LKDIR/bin/lk_log log
$LKDIR/bin/lksupport 1>/dev/null 2>&1
mv /tmp/lksupport/* $TMPDIR/
rm -rf /tmp/lksupport
} >> $TMPDIR/lifekeeper.lst
fi
appinfo "lifekeeper" $LKDIR
# 圧縮処理
echo "------ Making File : $BASEDIR/$TARNAME ------"
tar czvf $TARNAME $TMPDIR/* 1>/dev/null 2>&1
rm -rf $TMPDIR
# FTP送信
if [ $FTPFLAG -eq 1 ]; then
echo "------ Sending $TARNAME to $FTPSERVER by FTP ... ------"
FTPSERVER=`echo $FTPTARGET | awk -F \@ '{print $2}'`
FTPUSER=`echo $FTPTARGET | awk -F \: '{print $1}'`
FTPPASSWD=`echo $FTPTARGET | awk -F \: '{print $2}' | awk -F \@ '{print $1}'`
/usr/bin/ftp -n $FTPSERVER <<EOF
user $FTPUSER $FTPPASSWD
bin
put $TARNAME
quit
EOF
rm -f $TARNAME
fi
# SCP送信
if [ $SCPFLAG -eq 1 ]; then
echo "------ Sending $TARNAME to $SCPTARGET by SCP ... ------"
/usr/bin/scp $TARNAME $SCPTARGET
rm -f $TARNAME
fi
# End of Script
echo "------ End of Script ------"
exit
自分自身の知識や考え方もずいぶん変わったところもありますし、気が向いたらゼロから作り直してみようかと思っています。