URAMIRAIKAN

1020のなれの果て (since 2005.6.19)

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

 自分自身の知識や考え方もずいぶん変わったところもありますし、気が向いたらゼロから作り直してみようかと思っています。