Bash Script для проверки работоспособности Linux

У меня ниже сценарий bash, который я написал для проверки работоспособности различных компонентов хранилища, а затем создает инцидент с помощью инструмента service-now.

Этот сценарий отлично работает у меня, но я думаю, что его можно улучшить, поскольку я писал его, изучая различные источники Google.

Буду признателен за любую помощь в импровизации сценария.

#!/bin/bash
DATE=$(date +"%m_%d_%Y_%H_%M")
clusters=(udcl101 udcl2011 udcl3011 udcl4011)
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:$PATH

incident=$1
sysid=UNKNOWN

checkvaultenv=$(echo $vaultenv | tr '[:upper:]' '[:lower:]')
if [[  "$checkvaultenv" == "" ]]
then
  vaultenv=prod
else
  if [[  "$checkvaultenv" != "dev" &&  "$checkvaultenv" != "test" && "$checkvaultenv" != "acc" && "$checkvaultenv" != "prod" ]]
  then
    echo unknown vault environment specified: $vaultenv
    exit 1
  fi
fi
vaultenvlc=$(echo $vaultenv | tr '[:upper:]' '[:lower:]')
vaultenvuc=$(echo $vaultenv | tr '[:lower:]' '[:upper:]')


SNOW_USERNAME=$(export EDITOR=cat ; ansible-vault view --vault-password-file=~/.ssh/sss.str.${vaultenvlc} ~/iss/vaults/vault-${vaultenvuc}.yml | awk '/vault_servicenow_username/{gsub(/"/, ""); print $2}')
SNOW_PASSWORD=$(export EDITOR=cat ; ansible-vault view --vault-password-file=~/.ssh/sss.str.${vaultenvlc} ~/iss/vaults/vault-${vaultenvuc}.yml | awk '/vault_servicenow_password/{gsub(/"/, ""); print $2}')


case $vaultenvlc in
  ram)
    SNOW_INSTANCE=udc2dev.service-now.com
    ;;
  iqa)
    SNOW_INSTANCE=udc2dev.service-now.com
    ;;
  dev)
    SNOW_INSTANCE=udc2dev.service-now.com
    ;;
  test)
    SNOW_INSTANCE=udc2trn.service-now.com
    ;;
  acc)
    SNOW_INSTANCE=udc2qa.service-now.com
    ;;
  *)
    SNOW_INSTANCE=udc2.service-now.com
    ;;
esac

SNOW_AUTH=$(echo -n $SNOW_USERNAME:$SNOW_PASSWORD)

create_incident()
{
  url="https://${SNOW_INSTANCE}/api/now/table/incident"
  curloutput=$(curl -sslv1 -u $SNOW_AUTH -X POST -s -H "Accept:application/json" -H "Content-Type:application/json" $url -d "$variables" 2>/dev/null)
  RETURNCODE=$?
  if [ "$RETURNCODE" == "0" ]
  then
    incident_number=$(echo $curloutput |  python -c $'import sys, jsonnprint json.load(sys.stdin)["result"]["number"]')
    sysid=$(echo $curloutput |  python -c $'import sys, jsonnprint json.load(sys.stdin)["result"]["sys_id"]')
    echo "OK: created incident $incident_number with sysid $sysid"
  else
    echo "ERROR creating incident:"
    echo "======================================="
    echo $curloutput
    echo "======================================="
  fi
}


# sets the variables for the incident
set_variables()
{
read -r -d '' variables <<- EOM
{
  "short_description": "$snshort_description",
  "assignment_group":  "RD-DI-Infra-Storage",
  "contact_type":      "interface",
  "state":             "New",
  "urgency":           "3 - Low",
  "impact":            "3 - Low",
  "cmdb_ci":           "$udcl",
  "u_sec_env":         "Normal Secure",
  "description":       $body
}
EOM
}


# checks if file is empty *or* has only "", if not create incident
chk_body()
{
  if [[ $body == "" || $body == '""' ]]
   then
    echo empty body
   else
    set_variables
    echo $variables
    echo ""
    create_incident
  fi
}

# actual storage health checks

for udcl in "${clusters[@]}";
do

  body=$(ssh admin@$udcl aggr show -root false | awk '/^udc/ && $4 >= 92 {sub(/r$/, ""); s = (s == "" ? "" : s "\n") $0} END {printf ""%s"n", s}')
  snshort_description="aggr utilization above limit"
  chk_body

  body=$(ssh admin@$udcl "ro 0;snapshot show -create-time <21d" |awk '/^stv/ {sub(/r$/, ""); s = (s == "" ? "" : s "\n") $0} END {printf ""%s"n", s}')
  snshort_description="snapshots older then 21 days"
  chk_body

  body=$(ssh admin@$udcl "ro 1;event log show -time <8h"| awk '/netinet.ethr.duplct.ipAdr|secd.ldap.noServers|object.store.unavailable/ {sub(/r$/, ""); s = (s == "" ? "" : s "\n") $0} END {printf ""%s"n", s}')
  snshort_description="eventlog netinet.ethr.duplct.ipAdr, secd.ldap.noServers, object.store.unavailable messages"
  chk_body

  body=$(ssh admin@$udcl "ro 1;event log show -severity EMERGENCY -time <8h"| awk '/udc/ && !/netinet.ethr.duplct.ipAdr|secd.ldap.noServers|object.store.unavailable/ {sub(/r$/, ""); s = (s == "" ? "" : s "\n") $0} END {printf ""%s"n", s}')
  snshort_description="EMERGENCY messages"
  chk_body

  body=$(ssh admin@$udcl "ro 0;system healt alert show"| awk '/Node|Severity|Proba/ {sub(/r$/, ""); s = (s == "" ? "" : s "\n") $0} END {printf ""%s"n", s}')
  snshort_description="system healt alert show messages"
  chk_body

  body=$(ssh admin@$udcl "ro 0;vol show -volume *esx* -percent-used >=85" | awk '/stv/ && !/dr/ {sub(/r$/, ""); s = (s == "" ? "" : s "\n") $0} END {printf ""%s"n", s}')
  snshort_description="ESX volumes utilization more then 85"
  chk_body

  body=$(ssh admin@$udcl "ro 0;vol show -state offline -fields aggregate" | awk '/stv/ {sub(/r$/, ""); s = (s == "" ? "" : s "\n") $0} END {printf ""%s"n", s}')
  snshort_description="Validate offline volumes"
  chk_body

done

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *