📜 Как сохранить конфигурацию в shell скрипте

Сохраните конфигурацию во время выполнения скрипта оболочки, используя простой, но эффективный метод.

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 дополнительные функции, чтобы отделить эти части от основного скрипта оболочки.



2020-01-10T15:19:03
Скрипты