Предлагаю Вашему вниманию свою небольшую наработку, которая, по моему мнению, может облегчить жизнь администраторам операционных систем «породы» UNIX. Мне, как администратору Unix серверов, часто приходится предоставлять некую информацию по множеству серверов архитектурному комитету, по этому пришла идея написания «всего этого безобразия».
Смысл работы скрипта — выдача всей (ну почти всей) информации о сервере, работающем на Linux или AIX (других ОС семейства UNIX под рукой нет, но я над этим работаю).
Требования для работы скрипта: пользователь, под которым будет осуществляться подключение к серверам, должен иметь право выполнять все команды от рута без запроса пароля (на рабочей станции, с которой будет запускаться скрипт — аналогично, и, соответственно, это должен быть Linux) и в файле sudoers (ну или в LDAP, у всех по разному) должна быть строка
!requiretty
Для начала необходимо создать файл под названием sshaskpass.sh, со следующим содержанием:
#!/bin/bash if [ -n "$SSH_ASKPASS_TMPFILE" ]; then cat "$SSH_ASKPASS_TMPFILE" exit 0 elif [ $# -lt 1 ]; then echo "Usage: echo password | $0 <ssh command line options>" >&2 exit 1 fi sighandler() { rm "$TMP_PWD" } TMP_PWD=$(mktemp) chmod 600 "$TMP_PWD" trap 'sighandler' SIGHUP SIGINT SIGQUIT SIGABRT SIGKILL SIGALRM SIGTERM export SSH_ASKPASS=$0 export SSH_ASKPASS_TMPFILE=$TMP_PWD [ "$DISPLAY" ] || export DISPLAY=dummydisplay:0 read password echo $password >> "$TMP_PWD" # use setsid to detach from tty exec setsid "$@" rm "$TMP_PWD"
Кладем его, например, в свой домашний каталог и даём ему право на запуск (chmod +x sshaskpass.sh).
В этом же каталоге создаем второй файл, я назвал его Unix_check, Вы можете назвать его как угодно.
#!/bin/bash if [ ! -z $1 ]; then if ping -c1 -w1 $1 >> /dev/null 2>&1; then export HOSTNAME_NEW=$1 export USER_NAME=ИМЯ_ПОЛЬЗОВАТЕЛЯ export pass=ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ connect="$PWD/sshaskpass.sh ssh -o StrictHostKeyChecking=no -l $USER_NAME $HOSTNAME_NEW -n" echo "$pass" | $connect exit > /dev/null 2>&1 SYSTYPE=`echo "$pass" | $connect uname -a | awk '{print $1}'` if [ $SYSTYPE = AIX ]; then #AIX section start echo "--------------------------------------------------------------------------------" echo -en "Hostname: \t\t" echo "$pass" | $connect hostname -s echo -en "Domain: \t\t" echo "$pass" | $connect cat /etc/resolv.conf | grep domain | grep -v "#" | awk '{print $2}' echo -en "Uptime: \t\t" echo "$pass" | $connect sudo uptime | awk -F, '{print $1}' | awk '{print $3" "$4}' echo -en "Load average: \t\t" echo "$pass" | $connect sudo uptime | awk -F: '{print $NF}' | cut -c2- | awk -F, '{print $1$2$3}' cpunum(){ for i in `echo "$pass" | $connect lsdev | grep proc | grep Available | awk '{print $1}'`; do echo $i ; done } CPU=`cpunum` ch(){ for i in $CPU; do PROC1=`echo "$pass" | $connect lsattr -El $i | grep type | awk '{printf "%s", $2" "}'` PROC2=`echo "$pass" | $connect lsattr -El $i | grep frequency | awk '{print $2/1000000000 }' | awk '{printf("%.2f\n", $1)}'` echo -e "$PROC1 $PROC2" done } echo -en "Procs: \t\t\t" ch | cat -n | tail -1 | awk '{print $1"x"$2" "$3$4" GHz"}' echo -en "Cores per CPU: \t\t" echo "$pass" | $connect lsattr -El proc0 | grep smt_threads | awk '{print $2}' ips(){ IFCONFIG=`echo "$pass" | $connect ifconfig -a | grep inet | grep -v inet6 | grep -v 127.0.0.1 | awk '{print $2}'` for i in $IFCONFIG; do echo -en "IP: \t\t\t" echo $i done } ips macs(){ LSMACS=`echo "$pass" | $connect lsdev -Cc adapter | grep ent | grep -v EtherChannel | grep -v VLAN | grep -v Client | awk '{print $1}'` for i in $LSMACS; do echo -en "MAC: \t\t\t" echo "$pass" | $connect lscfg -vpl $i | grep Network | awk -F. '{print $14}' | sed 's/.\{2\}/&:/g' | rev | cut -c2- | rev done } macs echo -en "Mem: \t\t\t" echo "$pass" | $connect lsattr -El mem0 | grep goodsize | awk '{printf "%s", $2/1024 " Gigabytes"}' | sed -e 's/,/./' echo -e "" echo -en "Swap space:\t\t" echo "$pass" | $connect lsps -s | sed -e '1d' | awk '{print $1}' | sed 's/\(.*\)../\1/' | awk '{ tot+=$1 } END { printf "%s", tot/1024 }'; echo " Gigabytes" total(){ LSVG=`echo "$pass" | $connect lsvg` for i in $LSVG; do echo "$pass" | $connect lsvg $i | grep "TOTAL PPs" | awk '{print $7}' | sed -e 's/.//' done } echo -en "Total in VGs:\t\t" total | awk '{ tot+=$1 } END { printf "%s", tot/1024 " Gigabytes"}' | sed 's/,/./' used(){ LSVG=`echo "$pass" | $connect lsvg` for i in $LSVG; do echo "$pass" | $connect lsvg $i | grep "USED PPs" | awk '{print $6}' | sed -e 's/.//' done } echo -e "" echo -en "Used in VGs:\t\t" used | awk '{ tot+=$1 } END { printf "%s", tot/1024 " Gigabytes"}' | sed 's/,/./' free(){ LSVG=`echo "$pass" | $connect lsvg` for i in $LSVG; do echo "$pass" | $connect lsvg $i | grep "FREE PPs" | awk '{print $7}' | sed -e 's/.//' done } echo -e "" echo -en "Free in VGs:\t\t" free | awk '{ tot+=$1 } END { printf "%s", tot/1024 " Gigabytes"}' | sed 's/,/./' echo -e "" echo -en "Total in FS: \t\t" TOT1=`echo "$pass" | $connect lsfs | sed -e '1d' | grep -v "proc" | grep -v "itsm" | grep -v "jfs2 --" | awk '{print $1}'` for i in $TOT1; do echo "$pass" | $connect df -P -m $i | sed -e '1d' ; done | awk ' !x[$0]++' | awk '{print $2}' | awk '{ tot+=$1} END { print tot/1024 " Gigabytes"}' | sed -e 's/,/./' echo -en "Used in FS: \t\t" USED1=`echo "$pass" | $connect lsfs | sed -e '1d' | grep -v "proc" | grep -v "itsm" | grep -v "jfs2 --" | awk '{print $1}'` for i in $USED1; do echo "$pass" | $connect df -P -m $i | sed -e '1d' ; done | awk ' !x[$0]++' | awk '{print $3}' | awk '{ tot+=$1} END { print tot/1024 " Gigabytes"}' | sed -e 's/,/./' echo -en "Free in FS: \t\t" FREE1=`echo "$pass" | $connect lsfs | sed -e '1d' | grep -v "proc" | grep -v "itsm" | grep -v "jfs2 --" | awk '{print $1}'` for i in $FREE1; do echo "$pass" | $connect df -P -m $i | sed -e '1d' ; done | awk ' !x[$0]++' | awk '{print $4}' | awk '{ tot+=$1} END { print tot/1024 " Gigabytes"}' | sed -e 's/,/./' asm(){ RHDS=`echo "$pass" | $connect ls -la /dev/ | grep oracle | grep rhdisk | awk '{print $NF}'` for i in $RHDS; do echo "$pass" | $connect getconf DISK_SIZE /dev/$i done } echo -en "ASM space:\t\t" asm | awk '{tot+=$1} END {printf "%s", tot/1024 " Gigabytes"}' | sed 's/,/./' echo -e "" wwns(){ LSWWNS=`echo "$pass" | $connect lsdev -Cc adapter | grep -v Defined | grep fcs | awk '{print $1}'` for i in $LSWWNS; do echo -en "WWN: \t\t\t" echo "$pass" | $connect lscfg -vpl $i | grep Network | awk -F. '{print $14}' | sed 's/.\{2\}/&:/g' | rev | cut -c2- | rev done } wwns FGET=`echo "$pass" | $connect sudo mpio_get_config -Av 2>&1 | grep "Storage Subsystem Name" | awk -F= '{print $2}' | cut -c3- | rev | cut -c2- | rev` MGET=`echo "$pass" | $connect sudo fget_config -Av 2>&1 | grep "array name" | awk -F= '{print $2}' | cut -c3- | rev | cut -c2- | rev` HDLM=`echo "$pass" | $connect sudo /usr/DynamicLinkManager/bin/dlnkmgr 2>&1 view -lu | grep "SerialNumber" | awk -F: '{print $2}' | cut -c2-` for i in $FGET; do echo -en "Storage: \t\t" echo $i done for i in $MGET; do echo -en "Storage: \t\t" echo $i done for i in $HDLM; do echo -en "Storage: \t\t" echo VSP $i done echo -en "Oslevel:\t\tAIX " echo "$pass" | $connect oslevel -s echo -en "Architecture:\t\t" echo "$pass" | $connect uname -p | tr -d '\n' echo "$pass" | $connect ls -la /unix | awk '{print $NF}' | awk -F / '{print " " $NF}' | sed 's/_/\ /g' # CHECK!!!! echo -en "M/T:\t\t\t" echo "$pass" | $connect lsattr -El sys0 | grep modelname | awk '{print $2}' | cut -c5- echo -en "Serial Num:\t\t" echo "$pass" | $connect lsattr -El sys0 | grep systemid | awk '{print $2}' | cut -c7- echo "--------------------------------------------------------------------------------" sudo rm -f /tmp/tmp.* #AIX section end elif [ $SYSTYPE = Linux ]; then #Linux section start MANUF=`echo "$pass" | $connect sudo /usr/sbin/dmidecode -t system | grep Manufacturer | awk '{ print $2 }'` CPUMANUF=`echo "$pass" | $connect sudo cat /proc/cpuinfo | grep "vendor_id" | uniq | awk '{print $3}'` echo "--------------------------------------------------------------------------------" echo -en "Hostname: \t\t" echo "$pass" | $connect hostname -s echo -en "Domain: \t\t" echo "$pass" | $connect hostname -d echo -en "Uptime: \t\t" echo "$pass" | $connect sudo uptime | awk -F, '{print $1}' | awk '{print $3" "$4}' echo -en "Load average: \t\t" echo "$pass" | $connect sudo uptime | awk -F: '{print $NF}' | cut -c2- | sed -e 's/,/./g' | awk -F. '{print $1"."$2$3"."$4$5"."$6}' echo -en "Procs: \t\t\t" if [ "$MANUF" = "VMware," ]; then CPUS=`echo "$pass" | $connect sudo cat /proc/cpuinfo | grep "processor" | sort | uniq | wc -l` MODEL=`echo "$pass" | $connect sudo cat /proc/cpuinfo | grep "model name" | tail -1 | cut -c14-` if [ "$CPUMANUF" = "AuthenticAMD" ]; then SPEED=`echo "$pass" | $connect sudo /usr/sbin/dmidecode | grep "Current Speed" | head -n 1 | awk '{printf "%s", $3/1000}'` echo $CPUS $MODEL $SPEED GHz else echo $CPUS $MODEL fi CORES=`echo "$pass" | $connect sudo cat /proc/cpuinfo | grep processor | wc -l` echo -en "Cores per CPU: \t\t" echo $(( $CORES / $CPUS )) else CPUS=`echo "$pass" | $connect sudo cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l` MODEL=`echo "$pass" | $connect sudo cat /proc/cpuinfo | grep "model name" | tail -1 | cut -c14-` if [ "$CPUMANUF" = "AuthenticAMD" ]; then SPEED=`echo "$pass" | $connect sudo /usr/sbin/dmidecode | grep "Current Speed" | head -n 1 | awk '{printf "%s", $3/1000}'` echo $CPUS $MODEL $SPEED GHz else echo $CPUS $MODEL fi CORES=`echo "$pass" | $connect sudo cat /proc/cpuinfo | grep "cpu cores" | sort | uniq | awk '{print $4}'` echo -e "Cores per CPU: \t\t""$CORES" fi ips(){ IFCONFIG=`echo "$pass" | $connect sudo /sbin/ip addr | grep inet | grep -v inet6 | grep -w -v lo | awk '{print $2}'` for i in $IFCONFIG; do echo -en "IP: \t\t\t" echo $i done } ips if [ "$MANUF" = "HP" ]; then if echo "$pass" | $connect sudo rpm -aq | grep hponcfg > /dev/null; then echo "$pass" | $connect sudo /sbin/hponcfg -w /tmp/ilo > /dev/null 2>&1 ILOIP=`echo "$pass" | $connect sudo /bin/cat /tmp/ilo | grep "<IP_ADDRESS VALUE" | awk -F= '{print $2}' | cut -c3- | rev | cut -c4- | rev` echo "$pass" | $connect sudo /bin/rm /tmp/ilo else echo "$pass" | $connect sudo /bin/mkdir /tools > /dev/null 2>&1 echo "$pass" | $connect sudo /bin/mount naiad:/tools /tools echo "$pass" | $connect sudo /bin/rpm -ivh /tools/Software/hp/hponcfg-3.1.0-0.noarch.rpm > /dev/null 2>&1 echo "$pass" | $connect sudo /bin/umount /tools echo "$pass" | $connect sudo /sbin/hponcfg -w /tmp/ilo > /dev/null 2>&1 ILOIP=`echo "$pass" | $connect sudo /bin/cat /tmp/ilo | grep "<IP_ADDRESS VALUE" | awk -F= '{print $2}' | cut -c3- | rev | cut -c4- | rev` echo "$pass" | $connect sudo /bin/rm /tmp/ilo fi if ! echo "$pass" | $connect sudo rpm -aq | grep hpacucli > /dev/null; then echo "$pass" | $connect sudo /bin/mkdir /tools > /dev/null 2>&1 echo "$pass" | $connect sudo /bin/mount naiad:/tools /tools > /dev/null 2>&1 echo "$pass" | $connect sudo /usr/bin/yum install -y /tools/Software/hp/hpacucli-9.40-12.0.i386.rpm > /dev/null 2>&1 echo "$pass" | $connect sudo /bin/umount /tools > /dev/null 2>&1 fi echo -en "ILO IP: \t\t" echo $ILOIP fi macs(){ IFCONFIGM=`echo "$pass" | $connect sudo /sbin/ifconfig | grep HWaddr | awk '{print $5}' | uniq` for i in $IFCONFIGM; do echo -en "MAC: \t\t\t" echo $i done } macs echo -en "Mem: \t\t\t" echo "$pass" | $connect sudo /usr/sbin/dmidecode --type memory | grep Size | grep -v No | awk '{print $2}' | awk '{ tot+=$1 } END { printf "%s", tot/1024 }' echo -e " Gigabytes" echo -en "Swap space:\t\t" echo "$pass" | $connect cat /proc/swaps | sed -e '1d' | awk '{print $3}' | awk '{ tot+=$1 } END { printf "%s", tot/1024 }' | awk '{ tot+=$1 } END { printf "%s", tot/1024 }' | awk '{printf("%.2f\n", $1)}' | awk '{print $1 " Gigabytes"}' | sed -e 's/,/./' | sed "s/\.[00][0-9]*//g" echo -en "Total space: \t\t" echo "$pass" | $connect sudo df -m -l -P | grep -v "none" | grep -v "sda1" | grep -v "tmpfs" | sed -e '1d' | awk '{ print $2 }' | awk '{ tot+=$1} END { print tot/1024 " Gigabytes"}' echo -en "Used space: \t\t" echo "$pass" | $connect sudo df -m -l -P | grep -v "none" | grep -v "sda1" | grep -v "tmpfs" | sed -e '1d' | awk '{ print $3 }' | awk '{ tot+=$1} END { print tot/1024 " Gigabytes"}' echo -en "Free space: \t\t" echo "$pass" | $connect sudo df -m -l -P | grep -v "none" | grep -v "sda1" | grep -v "tmpfs" | sed -e '1d' | awk '{ print $4 }' | awk '{ tot+=$1} END { print tot/1024 " Gigabytes"}' if echo "$pass" | $connect rpm -aq | grep asm > /dev/null 2>&1; then nums(){ NUMS0=`echo "$pass" | $connect sudo ls -la /dev/oracleasm/disks/ 2> /dev/null | grep oracle | awk '{print $5" "$6}' | sed 's/,//g' | sed 's/ /@/g'` for i in $NUMS0; do echo $i done } nums > /tmp/asmnums drvs(){ NUMS1=`cat /tmp/asmnums` for i in $NUMS1; do DEVS=`echo "$pass" | $connect cat /proc/partitions | sed 's/ */\ /g' | sed 's/ /@/g' | grep $i | sed 's/@/ /g' | awk '{print $NF}'` echo $DEVS done } drvs > /tmp/asmdrvs echo -en "ASM space: \t\t" asm(){ BLOCK=`cat /tmp/asmdrvs` for s in $BLOCK; do echo "$pass" | $connect sudo cat /proc/partitions | sed 's/ */\ /g' | sed 's/ /@/g' | grep $s | sed 's/@/ /g' | awk '{print $3}'; done } asm | awk '{ tot+=$1 } END { print tot/1048576 " Gigabytes"}'; sudo rm -f /tmp/asmdrvs sudo rm -f /tmp/asmnums else echo -e "ASM space: \t\t0 Gigabytes" fi wwns(){ LSWWNS=`echo "$pass" | $connect sudo /usr/bin/systool -c fc_host -v 2> /dev/null | grep port_name | awk -F= '{print $2}' | cut -c5- | rev | cut -c2- | rev | sed 's/.\{2\}/&:/g' | rev | cut -c2- | rev` for i in $LSWWNS; do echo -en "WWN: \t\t\t" echo $i done } wwns if echo "$pass" | $connect sudo ls /usr/sbin/mppUtil > /dev/null 2>&1 /dev/null; then RDAC=`echo "$pass" | $connect sudo /usr/sbin/mppUtil -a 2>/dev/null | grep FC | awk '{print $NF}'` for i in $RDAC; do echo -en "Storage: \t\t" echo $i done fi echo -en "Oslevel: \t\t" if echo "$pass" | $connect sudo ls /etc/redhat-release > /dev/null 2>&1; then echo "$pass" | $connect cat /etc/redhat-release elif echo "$pass" | $connect sudo ls /etc/SuSE-release > /dev/null 2>&1; then echo "$pass" | $connect cat /etc/SuSE-release | head -1 elif echo "$pass" | $connect sudo ls /etc/gentoo-release > /dev/null 2>&1; then echo "$pass" | $connect cat /etc/gentoo-release elif echo "$pass" | $connect sudo ls /etc/debian_version > /dev/null 2>&1; then echo "$pass" | $connect cat /etc/os-release | grep PRETTY | awk -F= '{print $2}' | cut -c2- | rev | cut -c2- | rev fi echo -en "Kernel ver: \t\t" echo "$pass" | $connect uname -r echo -en "Architecture: \t\t" echo "$pass" | $connect uname -a | awk '{print $12}' echo -en "Manufacturer: \t\t" if [ "$MANUF" = "VMware," ]; then echo "Vmware" else echo "$MANUF" fi echo -en "Model: \t\t\t" echo "$pass" | $connect sudo /usr/sbin/dmidecode -t system | grep "Product Name" | cut -c16- echo -en "Serial Num: \t\t" echo "$pass" | $connect sudo /usr/sbin/dmidecode -t system | grep "Serial Number" | cut -c17- if [ "$MANUF" = "HP" ]; then HDDFAIL=`echo "$pass" | $connect sudo /usr/sbin/hpacucli ctrl all show config | grep "physicaldrive" | grep -v OK | cut -c7-` if [ ! -z "$HDDFAIL" ]; then echo -e "HDD Error: \t\t"$HDDFAIL fi fi echo "--------------------------------------------------------------------------------" sudo rm -f /tmp/tmp.* #Linux section end elif [ $SYSTYPE = FreeBSD ]; then #FreeBSD section start echo "FreeBSD" #FreeBSD section end elif [ $SYSTYPE = SunOS ]; then #Solaris section start echo "Solaris" #Solaris section end elif [ $SYSTYPE = HP-UX ]; then #HP-UX section start echo "HP-UX" #HP-UX section end fi else echo "unknown host $1" fi else echo "hostname or ip must be specified (Unix_check hostname/ip)" fi
Соответственно, ему тоже даем право на запуск.
Запускаем следующим образом: ./Unix_check hostname
Пример для AIX:
-------------------------------------------------------------------------------- Hostname: tsm Domain: xxxxxxx.xxxxx.ua Uptime: 30 days Load average: 0.00 0.00 0.02 Procs: 2xPowerPC_POWER5 2.10 GHz Cores per CPU: 2 IP: 172.17.xx.xx MAC: 00:14:5E:97:xx:xx MAC: 00:14:5E:97:xx:xx Mem: 7.75 Gigabytes Swap space: 5 Gigabytes Total in VGs: 1252.5 Gigabytes Used in VGs: 562.25 Gigabytes Free in VGs: 690.25 Gigabytes Total in FS: 527.375 Gigabytes Used in FS: 461.424 Gigabytes Free in FS: 65.9507 Gigabytes ASM space: 0 Gigabytes WWN: 10:00:00:00:C9:4F:xx:xx WWN: 10:00:00:00:C9:4F:xx:xx Storage: 181470A-78K0xxx-tsm-F Storage: 181470A-78K0xxx-tsm-D Oslevel: AIX 6100-07-03-1207 Architecture: powerpc unix 64 M/T: 9131-52A Serial Num: XXXXXX --------------------------------------------------------------------------------
Пример для Linux
-------------------------------------------------------------------------------- Hostname: dfilendbb01 Domain: xxxx.xxxx.xxx Uptime: 5 days Load average: 0.00 0.02 0.00 Procs: 2 Dual-Core AMD Opteron(tm) Processor 2218 2.6 GHz Cores per CPU: 2 IP: 172.17.xx.xx/xx ILO IP: 172.17.xx.xx MAC: 00:21:5A:49:xx:xx Mem: 8 Gigabytes Swap space: 8 Gigabytes Total space: 71.0547 Gigabytes Used space: 31.0742 Gigabytes Free space: 36.3203 Gigabytes ASM space: 0 Gigabytes WWN: 50:01:43:80:02:9f:xx:xx WWN: 50:01:43:80:02:9f:xx:xx Oslevel: Red Hat Enterprise Linux Server release 5.9 (Tikanga) Kernel ver: 2.6.18-348.3.1.el5 Architecture: x86_64 Manufacturer: HP Model: ProLiant BL465c G1 Serial Num: CZJ8300xxx HDD Error: physicaldrive 1I:1:1 (port 1I:box 1:bay 1, SAS, 146 GB, Predictive Failure) --------------------------------------------------------------------------------
Некоторые пути нужно будет изменить, такие как монтирование NFS шары с пакетами для RHEL от HP (hponcfg и hpacucli).
Так же, для Linux, в скрипте используются утилиты для определения дисковых стоек IBM, подключенных по SAN и использующие не нативный multipathd, а RDAC. Для AIX, должно показывать все стойки, подключенные напрямую (без VIOS и VSCSI).
При определении размеров дисков под Oracle ASM, в AIX используется метод выделения hdisk-ов целиком, без использования LVM.
В Linux размер дисков Oracle ASM должен работать всегда корректно, по крайней мере, другого способа презентации дисков я не знаю.
Для серверов производства HP, скрипт проверяет встроенные RAID адаптеры на наличие ошибок на дисках.
Буду рад, если предоставленная информация кому-то пригодится, так же, готов выслушать любую критику в свой адрес.
P.S. Внимательные читатели увидят в конце основного скрипта строчки, относящиеся к FreeBSD, Solaris, HP-UX, эти разделы еще не готовы, так как, я упоминал ранее, под рукой нет этих ОС. Если уважаемое сообщество предоставит мне право в дальнейшем редактировать эту статью, по мере появления упомянутых систем — буду дополнять скрипт.
Спасибо за внимание.за внимание.
ссылка на оригинал статьи http://habrahabr.ru/post/175899/
Добавить комментарий