πŸ“œ Как ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Π² 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
Π‘ΠΊΡ€ΠΈΠΏΡ‚Ρ‹

Π”Ρ€ΡƒΠ·ΡŒΡ ΠΏΠΎΠΌΠΎΠ³ΠΈΡ‚Π΅ этому ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Ρƒ ΡΡ‚Π°Ρ‚ΡŒ доступнСС Π² ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… сСтях.

НС ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈ ΠΌΠΈΠΌΠΎ ΠΆΠΌΠ°ΠΊΠ½ΠΈ ΠΏΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΡƒ Ρ‚ΠΎ Π΅Ρ‰Π΅ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π΅Π½!