RunBefore e RunAfter usando app Azure strumento snapshot coerente con app Azure
Questo articolo fornisce una guida per l'uso --runbefore
della funzionalità e --runafter
dello strumento snapshot coerente app Azure cation che è possibile usare con Azure NetApp Files.
Introduzione
AzAcSnap può eseguire comandi esterni prima o dopo l'esecuzione principale usando rispettivamente le opzioni --runbefore
o --runafter
.
--runbefore
eseguirà un comando shell prima dell'esecuzione principale di azacsnap e fornisce alcuni dei parametri della riga di comando azacsnap all'ambiente della shell.
Per impostazione predefinita, azacsnap
attenderà fino a 30 secondi per il completamento del comando della shell esterna prima di uccidere il processo e tornare all'esecuzione normale di azacsnap.
Questo ritardo può essere sottoposto a override aggiungendo un numero di attesa in secondi dopo un %
carattere (ad esempio, --runbefore "mycommand.sh%60"
attenderà fino a 60 secondi per mycommand.sh
il completamento).
--runafter
eseguirà un comando shell dopo l'esecuzione principale di azacsnap e fornisce alcuni dei parametri della riga di comando azacsnap all'ambiente della shell.
Per impostazione predefinita, azacsnap
attenderà fino a 30 secondi per il completamento del comando della shell esterna prima di uccidere il processo e tornare all'esecuzione normale di azacsnap.
È possibile eseguire l'override aggiungendo un numero di attesa in secondi dopo un %
carattere (ad esempio, --runafter "mycommand.sh%60"
attenderà fino a 60 secondi per mycommand.sh
il completamento).
L'elenco seguente di variabili di ambiente viene generato da azacsnap
e passato alla shell tramite fork per eseguire i comandi forniti come parametri in --runbefore
e --runafter
:
$azCommand
= l'opzione di comando passata a -c (ad esempio, backup, test e così via).$azConfigFileName
= nome file di configurazione.$azPrefix
= valore --prefix.$azRetention
= il valore --retention.$azSid
= valore --dbsid.$azSnapshotName
= nome dello snapshot generato da azacsnap.
Nota
Esiste solo un valore per $azSnapshotName
nell'opzione --runafter
.
Esempio di utilizzo
Un esempio di utilizzo per questa nuova funzionalità consiste nel caricare uno snapshot nel BLOB di Azure per scopi di archiviazione usando lo strumento azcopy (copiare o spostare i dati in Archiviazione di Azure usando AzCopy).
La voce crontab seguente è una singola riga e viene eseguita azacsnap
alle cinque precedenti mezzanotte. Si noti la chiamata al snapshot-to-blob.sh
passaggio del nome dello snapshot e del prefisso dello snapshot:
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')
Questo script della shell di esempio ha una stanza speciale alla fine per impedire ad AzAcSnap di uccidere il comando esterno a causa del timeout descritto in precedenza. Ciò consente l'esecuzione di un comando a esecuzione prolungata, ad esempio il caricamento di file di grandi dimensioni con azcopy, senza essere interrotto prematuramente.
Gli snapshot devono essere montati nel sistema che esegue la copia, con un privilegio di sola lettura minimo. La posizione di base del punto di montaggio per gli snapshot deve essere fornita alla sourceDir
variabile nello script.
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
SaskeyFile contiene la chiave di firma di accesso condiviso di esempio seguente (contenuto modificato per la sicurezza):
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>"