У меня ниже сценарий 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