Shell скрипт
Я буду использовать следующий скрипт оболочки, чтобы проиллюстрировать идею.
Ничего особенного, он отобразит доступное дисковое пространство на конкретном сервере и разделе.
#!/usr/bin/env bash # Display available disk space on specific server and partition # default parameters default_bastion="" default_busername="" default_server="localhost" default_username="milosz" default_partition="/srv" # nextcloud server nextcloud_server="nextcloud.local" nextcloud_partition="/data" # dokuwiki server dokuwiki_bastion="bastion.example.org" dokuwiki_busername="bouncer" dokuwiki_server="192.0.2.10" dokuwiki_username="dokuwiki" dokuwiki_partition="/wiki" # kolab server kolab_bastion="bastion.example.org" kolab_busername="bouncer" kolab_server="192.0.2.20" kolab_username="monitoring" kolab_partition="/" # get defined servers/applications applications="$((set -o posix; set) | awk -F '=' '/_server/ {split($1,array,"_"); print array[1]}' | grep -v default)" # get defined attributes attributes="$((set -o posix; set) | awk -F '=' '/default_/ {split($1,array,"_"); print array[2]}')" for application in $applications; do # define attributes for server/application for attribute in $attributes; do application_attribute="${application}_${attribute}" default_attribute="default_${attribute}" if [ -n "${!application_attribute}" ]; then eval "${attribute}"="${!application_attribute}" else eval "${attribute}"="${!default_attribute}" fi done # perform an action if [ -n "$bastion" ]; then bastion_param="-J ${busername}@${bastion}" else bastion_param="" fi echo -n "$server: " ssh $bastion_param $server -l $username "bash -c 'df -h --output=avail $partition | sed 1d'" done
Использование
Выполните вышеупомянутый скрипт оболочки, чтобы увидеть доступное дисковое пространство на указанных серверах.
nextcloud.local: 87G 192.0.2.10: 98G 192.0.2.20: 5,5G
Как это работает
Атрибуты
Определите значения по умолчанию, не забудьте включить пустые.
# default parameters default_bastion="" default_busername="" default_server="localhost" default_username="milosz" default_partition="/srv"
# get defined attributes attributes="$((set -o posix; set) | awk -F '=' '/default_/ {split($1,array,"_"); print array[2]}')"
Извлеченные имена атрибутов.
attributes="bastion busername server username partition"
Приложения
Определите атрибуты для каждого приложения.
# nextcloud server nextcloud_server="nextcloud.local" nextcloud_partition="/data" [...]
Эти переменные будут использоваться для извлечения имен приложений.
Обратите внимание, я использую атрибут server в качестве индикатора приложения в этом примере.
# get defined servers/applications applications="$((set -o posix; set) | awk -F '=' '/_server/ {split($1,array,"_"); print array[1]}' | grep -v default)"
Названия извлеченных приложений.
applications="nextcloud dokuwiki kolab"
Разбор атрибутов для каждого приложения
Я буду перебирать список приложений.
for application in $applications; do
Присвойте атрибуты (например, server, username …), используя переменную application_attribute (значения, такие как nextcloud_server, nextcloud_username, … в зависимости от имени приложения), чтобы определить имя целевой переменной и значение для чтения, используя конструкцию $ {! Application_attribute}. Используйте значение по умолчанию, если оно пустое.
# define attributes for server/application for attribute in $attributes; do application_attribute="${application}_${attribute}" default_attribute="default_${attribute}" if [ -n "${!application_attribute}" ]; then eval "${attribute}"="${!application_attribute}" else eval "${attribute}"="${!default_attribute}" fi done
Выполните нужные действия, используя короткие имена атрибутов.
# perform an action if [ -n "$bastion" ]; then bastion_param="-J ${busername}@${bastion}" else bastion_param="" fi echo -n "$server: " ssh $bastion_param $server -l $username "bash -c 'df -h --output=avail $partition | sed 1d'"
Конец цикла приложения не требует пояснений.
done
Дополнительные замечания
Используйте source дополнительные функции, чтобы отделить эти части от основного скрипта оболочки.