RunBefore a RunAfter pomocí nástroje Aplikace Azure Konzistentní snímek

Tento článek obsahuje průvodce používáním --runbefore a --runafter schopností nástroje Aplikace Azure Konzistentní snímek, který můžete použít se službou Azure NetApp Files.

Úvod

AzAcSnap může spouštět externí příkazy před nebo po jeho hlavním spuštění pomocí možností --runbefore nebo --runafter v uvedeném pořadí.

--runbefore spustí příkaz prostředí před hlavním spuštěním azacsnap a poskytne některé parametry příkazového řádku azacsnap prostředí. Ve výchozím nastavení počká až 30 sekund, azacsnap než se příkaz externího prostředí dokončí, a pak se vrátí do normálního spuštění azacsnap. Toto zpoždění lze přepsat přidáním čísla, které bude čekat v sekundách po znaku % (například --runbefore "mycommand.sh%60" počká až 60 sekund, než mycommand.sh se dokončí).

--runafter spustí příkaz prostředí po hlavním spuštění azacsnap a poskytne některé parametry příkazového řádku azacsnap prostředí. Ve výchozím nastavení počká až 30 sekund, azacsnap než se příkaz externího prostředí dokončí, a pak se vrátí do normálního spuštění azacsnap. Můžete ho přepsat tak, --runafter "mycommand.sh%60" že po znaku % přidáte číslo, které bude čekat v sekundách (například počká až 60 sekund, než mycommand.sh se dokončí).

Následující seznam proměnných prostředí je generován azacsnap a předán prostředí forked ke spuštění příkazů zadaných jako parametry a --runbefore--runafter:

  • $azCommand = možnost příkazu předaná do -c (například zálohování, testování atd.).
  • $azConfigFileName = název souboru konfigurace.
  • $azPrefix = hodnota --prefix.
  • $azRetention = hodnota --retention.
  • $azSid = hodnota --dbsid.
  • $azSnapshotName = název snímku vygenerovaný azacsnap.

Poznámka:

Tato možnost má jenom hodnotu $azSnapshotName--runafter .

Příklad využití

Příkladem použití této nové funkce je nahrání snímku do objektu blob Azure pro účely archivace pomocí nástroje azcopy (kopírování nebo přesun dat do služby Azure Storage pomocí AzCopy).

Následující položka crontab je jeden řádek a běží azacsnap na pěti o půlnoci. Všimněte si volání předání snapshot-to-blob.sh názvu snímku a předpony snímku:

5 0 * * *         ( . ~/.bash_profile ; cd /home/azacsnap/bin ; ./azacsnap -c backup --volume data --prefix daily --retention 1 --configfile HANA.json --trim --ssl openssl --runafter 'env ; ./snapshot-to-blob.sh $azSnapshotName $azPrefix')

Tento ukázkový skript prostředí má na konci speciální stanza, která zabrání azAcSnap v zabíjení externího příkazu kvůli vypršení časového limitu popsaného výše. To umožňuje dlouhotrvající příkaz, například nahrávání velkých souborů pomocí azcopy, aby se spouštělo bez předčasného zastavení.

Snímky musí být připojené k systému, který provádí kopírování, s minimálními oprávněními jen pro čtení. Základní umístění přípojného bodu pro snímky by se mělo poskytnout sourceDir proměnné ve skriptu.

cat snapshot-to-blob.sh
#!/bin/bash
# Utility to upload-to/list Azure Blob store.
#   If run as snapshot-to-blob.sh will upload a gzipped tarball of the snapshot.
#   If run as list-blobs.sh will list uploaded blobs.
#     e.g. `ln -s snapshot-to-blob.sh list-blobs.sh`


# _START_ Change these
SAS_KEY_FILE="${HOME}/bin/blob-credentials.saskey"
# the snapshots need to be mounted locally for copying, put source directory here
SOURCE_DIR="/mnt/saphana1/hana_data_PR1/.snapshot"
# _END_ Change these


# _START_ AzCopy Settings
#Overrides where the job plan files (used for progress tracking and resuming) are stored, to avoid filling up a disk.
export AZCOPY_JOB_PLAN_LOCATION="${HOME}/.azcopy/plans/"
#Overrides where the log files are stored, to avoid filling up a disk.
export AZCOPY_LOG_LOCATION="${HOME}/.azcopy/logs/"
#If set, to anything, on-screen output will include counts of chunks by state
export AZCOPY_SHOW_PERF_STATES=true
# _END_ AzCopy Settings


# do not change any of the following


# Make sure we got some command line args
if [ "$(basename "$0")" = "snapshot-to-blob.sh" ] && ([ "$1" = "" ] || [ "$2" = "" ]); then
  echo "Usage: $0 <SNAPSHOT_NAME> <PREFIX>"
  exit 1
fi

# Make sure we can read the SAS key credential file.
if [ -r "${SAS_KEY_FILE}" ]; then
  source "${SAS_KEY_FILE}"
else
  echo "Credential file '${SAS_KEY_FILE}' not found, exiting!"
fi


# Assign the rest of the Global variables.
SNAPSHOT_NAME=$1
PREFIX=$2
BLOB_STORE="$(echo "${PORTAL_GENERATED_SAS}" | cut -f1 -d'?')"
BLOB_SAS_KEY="$(echo "${PORTAL_GENERATED_SAS}" | cut -f2 -d'?')"
ARCHIVE_LOG="logs/$(basename "$0").log"

# Archive naming (daily.1, daily.2, etc...)
DAY_OF_WEEK=$(date "+%u")
MONTH_OF_YEAR=$(date "+%m")
ARCHIVE_BLOB_TGZ="${PREFIX}.${DAY_OF_WEEK}.tgz"

#######################################
# Write to the log.
# Globals:
#   None
# Arguments:
#   LOG_MSG
#######################################
write_log(){
  LOG_MSG=$1
  date=$(date "+[%d/%h/%Y:%H:%M:%S %z]")
  echo "$date ${LOG_MSG}" >> "${ARCHIVE_LOG}"
}


#######################################
# Run and Log the command.
# Globals:
#   None
# Arguments:
#   CMD_TO_RUN
#######################################
run_cmd(){
  CMD_TO_RUN="${1}"
  write_log "[RUNCMD] ${CMD_TO_RUN}"
  bash -c "${CMD_TO_RUN}"
}


#######################################
# Check snapshot exists and then background the upload to Blob store.
# Globals:
#   SOURCE_DIR
#   SNAPSHOT_NAME
#   ARCHIVE_LOG
# Arguments:
#   None
#######################################
snapshot_to_blob(){
  # Check SOURCE_DIR and SNAPSHOT_NAME exist
  if [ ! -d "${SOURCE_DIR}/${SNAPSHOT_NAME}" ]; then
    echo "${SOURCE_DIR}/${SNAPSHOT_NAME} not found, exiting!" | tee -a "${ARCHIVE_LOG}"
    exit 1
  fi
  # background ourselves so AzAcSnap exits cleanly
  echo "Backgrounding '$0 $@' to prevent blocking azacsnap"
  echo "write_logging to ${ARCHIVE_LOG}"
  {
    trap '' HUP
    # the script
    upload_to_blob
    list_blob >> "${ARCHIVE_LOG}"
  } < /dev/null > /dev/null 2>&1 &
}


#######################################
# Upload to Blob store.
# Globals:
#   SOURCE_DIR
#   SNAPSHOT_NAME
#   ARCHIVE_BLOB_TGZ
#   BLOB_STORE
#   BLOB_SAS_KEY
#   ARCHIVE_LOG
# Arguments:
#   None
#######################################
upload_to_blob(){
  # Copy snapshot to blob store
  echo "Starting upload of ${SNAPSHOT_NAME} to ${BLOB_STORE}/${ARCHIVE_BLOB_TGZ}" >> "${ARCHIVE_LOG}"
  run_cmd "azcopy env ; cd ${SOURCE_DIR}/${SNAPSHOT_NAME} && tar zcvf - * | azcopy cp \"${BLOB_STORE}/${ARCHIVE_BLOB_TGZ}?${BLOB_SAS_KEY}\" --from-to PipeBlob && cd -"
  echo "Completed upload of ${SNAPSHOT_NAME} ${BLOB_STORE}/${ARCHIVE_BLOB_TGZ}" >> "${ARCHIVE_LOG}"

  # Complete
  echo "Finished ($0 ${SNAPSHOT_NAME} ${PREFIX}) @ $(date "+%d-%h-%Y %H:%M")" >> "${ARCHIVE_LOG}"
  echo "--------------------------------------------------------------------------------" >> "${ARCHIVE_LOG}"
  # col 12345678901234567890123456789012345678901234567890123456789012345678901234567890
}


#######################################
# List contents of Blob store.
# Globals:
#   BLOB_STORE
#   BLOB_SAS_KEY
# Arguments:
#   None
#######################################
list_blob(){
  LOG_MSG="Current list of files stored in ${BLOB_STORE}"
  write_log "${LOG_MSG}"
  echo "${LOG_MSG}"
  run_cmd "azcopy list \"${BLOB_STORE}?${BLOB_SAS_KEY}\"  --properties LastModifiedTime "
}


# Log when script started.
write_log "Started ($0 ${SNAPSHOT_NAME} ${PREFIX}) @ $(date "+%d-%h-%Y %H:%M")"


# Check what this was called as ($0) and run accordingly.
case "$(basename "$0")" in
  "snapshot-to-blob.sh" )
    snapshot_to_blob
    ;;
  "list-blobs.sh" )
    list_blob
    ;;
  *)
    echo "Command '$0' not recognised!"
    ;;
esac

Soubor SASkeyFile obsahuje následující příklad klíče SAS (obsah se změnil pro zabezpečení):

cat blob-credentials.saskey
# we need a generated SAS key, get this from the portal with read,add,create,write,list permissions
PORTAL_GENERATED_SAS="https://<targetstorageaccount>.blob.core.windows.net/<blob-store>?sp=racwl&st=2021-06-10T21:10:38Z&se=2021-06-11T05:10:38Z&spr=https&sv=2020-02-10&sr=c&sig=<key-material>"

Další kroky