2023-11-13 14:38:57 +00:00
#!/usr/bin/env bash
2023-11-13 15:18:53 +00:00
#OS Credentials and settings
2023-11-13 14:38:57 +00:00
export OS_AUTH_TYPE = xxxx
export OS_AUTH_URL = xxxx
export OS_IDENTITY_API_VERSION = xxx
export OS_REGION_NAME = "xxxx"
export OS_INTERFACE = public
export OS_APPLICATION_CREDENTIAL_ID = xxxx
export OS_APPLICATION_CREDENTIAL_SECRET = xxxx
2023-12-18 10:15:42 +00:00
export TODAY = $( date +"%Y-%m-%d_%HH%M" )
export LOG_FILE = /var/log/backup/OpenStack_Vms_And_Volumes_${ TODAY } .log
2023-11-13 14:38:57 +00:00
2023-12-18 10:15:42 +00:00
#Daily_Retention
export DAILY_RETENTION = 15
2023-11-13 15:18:53 +00:00
2023-12-18 10:15:42 +00:00
CHECK_BACKUP_DELAY = 3600
2023-11-13 14:38:57 +00:00
BCK_VOLUMES_LIST = ( )
BCK_SERVERS_LIST = ( )
echo "======================================================" >>${ LOG_FILE } 2>& 1
2023-12-18 10:15:42 +00:00
date +"[%Y-%m-%d_%HH%M] - Listing of instances to be backed up" >>${ LOG_FILE } 2>& 1
2023-11-13 14:38:57 +00:00
echo "======================================================" >>${ LOG_FILE } 2>& 1
if SERVERS = $( /usr/bin/openstack server list -f json| jq -r '.[].Name' ) ; then
2023-12-18 10:15:42 +00:00
date +"[%Y-%m-%d_%HH%M] ---> Instance(s) found" >>${ LOG_FILE } 2>& 1
2023-11-13 14:38:57 +00:00
for SERVER in $SERVERS
do
SNAPSHOT_SERVER = ${ SERVER } _${ TODAY }
2023-12-18 10:15:42 +00:00
date +" [%Y-%m-%d_%HH%M] ------> [Instance : ${ SERVER } ] === === Launching the backup === === " >>${ LOG_FILE } 2>& 1
date +" [%Y-%m-%d_%HH%M] ------> [Instance : ${ SERVER } ] ---> Listing of volumes attached " >>${ LOG_FILE } 2>& 1
2023-11-13 14:38:57 +00:00
if VOLUMES_ATTACHED = $( /usr/bin/openstack server volume list ${ SERVER } -f json | jq -r '.[]."Volume ID"' ) ; then
2023-12-18 10:15:42 +00:00
date +" [%Y-%m-%d_%HH%M] ------> [Srv : ${ SERVER } ] ------> Attached volume(s) Found " >>${ LOG_FILE } 2>& 1
2023-11-13 14:38:57 +00:00
for VOLUME_ATTACHED_ID in $VOLUMES_ATTACHED
do
VOLUME_ATTACHED_NAME = $( /usr/bin/openstack volume show ${ VOLUME_ATTACHED_ID } -f json | jq -r '.name' )
BCK_VOLUME_ATTACHED_NAME = Backup_${ VOLUME_ATTACHED_NAME } _${ TODAY }
2023-12-18 10:15:42 +00:00
date +" [%Y-%m-%d_%HH%M] ------> [Srv : ${ SERVER } ] ------> Launching the backup of the volume ${ VOLUME_ATTACHED_NAME } to ${ BCK_VOLUME_ATTACHED_NAME } " >>${ LOG_FILE } 2>& 1
BCK_VOLUMES_LIST += ( ${ BCK_VOLUME_ATTACHED_NAME } )
2023-11-13 14:38:57 +00:00
/usr/bin/openstack volume backup create --name ${ BCK_VOLUME_ATTACHED_NAME } ${ VOLUME_ATTACHED_NAME } --force >>${ LOG_FILE } 2>& 1
done
else
date +" [%Y-%m-%d_%HH%M] ------> [Srv : ${ SERVER } ] ------> No volumes attached " >>${ LOG_FILE } 2>& 1
fi
BCK_SERVER = Backup_${ SERVER } _${ TODAY }
2023-12-18 10:15:42 +00:00
date +" [%Y-%m-%d_%HH%M] ------> [Srv : ${ SERVER } ] ---> Launching the Snapshot of the instance ${ SERVER } to ${ BCK_SERVER } " >>${ LOG_FILE } 2>& 1
BCK_SERVERS_LIST += ( ${ BCK_SERVER } )
2023-11-13 14:38:57 +00:00
/usr/bin/openstack server backup create --rotate ${ DAILY_RETENTION } --name ${ BCK_SERVER } ${ SERVER } >>${ LOG_FILE } 2>& 1
2023-12-18 10:15:42 +00:00
date +" [%Y-%m-%d_%HH%M] ------> [Srv : ${ SERVER } ] === === End of the backup === === " >>${ LOG_FILE } 2>& 1
2023-11-13 14:38:57 +00:00
done
else
2023-12-18 10:15:42 +00:00
echo "No instance found" >>${ LOG_FILE } 2>& 1
2023-11-13 14:38:57 +00:00
fi
echo "======================================================" >>${ LOG_FILE } 2>& 1
date +"[%Y-%m-%d_%HH%M] - Confirm that's all backup is OK" >>${ LOG_FILE } 2>& 1
echo "======================================================" >>${ LOG_FILE } 2>& 1
2023-11-13 15:18:53 +00:00
MAXIMUM_TIMESTAMP = ` date -d '+' ${ CHECK_BACKUP_DELAY } ' seconds' '+%s' `
2023-11-13 14:38:57 +00:00
2023-12-18 10:15:42 +00:00
date +"[%Y-%m-%d_%HH%M] => Checking the backup of volumes" >>${ LOG_FILE } 2>& 1
2023-11-13 14:38:57 +00:00
for CHECK_BCK_VOLUME in ${ BCK_VOLUMES_LIST }
do
2023-11-13 15:18:53 +00:00
RESULT = false
while [ ! " $RESULT " = "true" ] ;
do
date +" [%Y-%m-%d_%HH%M] Checking Backup for ${ CHECK_BCK_VOLUME } and waiting 60 secondes " >>${ LOG_FILE } 2>& 1
CURRENT_TIMESTAMP = ` date +%s`
if [ " $CURRENT_TIMESTAMP " -gt " $MAXIMUM_TIMESTAMP " ] ; then
date +" [%Y-%m-%d_%HH%M] [ERROR] backup for ${ CHECK_BCK_VOLUME } verification time expired " >>${ LOG_FILE } 2>& 1
exit -1
fi
RESULT = ` openstack volume backup show ${ CHECK_BCK_VOLUME } -f json | jq -r '.status == "available"' `
sleep 60
done
date +" [%Y-%m-%d_%HH%M] Backup Volume ${ CHECK_BCK_VOLUME } is OK " >>${ LOG_FILE } 2>& 1
2023-11-13 14:38:57 +00:00
done
date +"[%Y-%m-%d_%HH%M] => Checking Backup Instance" >>${ LOG_FILE } 2>& 1
for CHECK_BCK_SERVER in ${ BCK_SERVERS_LIST }
do
2023-11-13 15:18:53 +00:00
RESULT = false
while [ ! " $RESULT " = "true" ] ;
do
date +" [%Y-%m-%d_%HH%M] Checking Backup for ${ CHECK_BCK_SERVER } and waiting 60 secondes " >>${ LOG_FILE } 2>& 1
CURRENT_TIMESTAMP = ` date +%s`
if [ " $CURRENT_TIMESTAMP " -gt " $MAXIMUM_TIMESTAMP " ] ; then
date +" [%Y-%m-%d_%HH%M] [ERROR] backup for ${ CHECK_BCK_SERVER } verification time expired " >>${ LOG_FILE } 2>& 1
exit -1
fi
RESULT = ` /usr/bin/openstack image show ${ CHECK_BCK_SERVER } -f json | jq -r '.properties.image_state == "available" and .status == "active"' `
sleep 60
done
date +" [%Y-%m-%d_%HH%M] Backup Instance ${ CHECK_BCK_SERVER } is OK " >>${ LOG_FILE } 2>& 1
2023-11-13 14:38:57 +00:00
done
echo "======================================================" >>${ LOG_FILE } 2>& 1
date +" [%Y-%m-%d_%HH%M] - Manage Retention - keep last ${ DAILY_RETENTION } Backup Volumes " >>${ LOG_FILE } 2>& 1
echo "======================================================" >>${ LOG_FILE } 2>& 1
date +"[%Y-%m-%d_%HH%M] => Manage Retention for Backup Volumes" >>${ LOG_FILE } 2>& 1
date +"[%Y-%m-%d_%HH%M] ---> List all Backup Volumes" >>${ LOG_FILE } 2>& 1
/usr/bin/openstack volume backup list -f json | jq '.[].Name' >>${ LOG_FILE } 2>& 1
if OLD_VOLUMES = $( /usr/bin/openstack volume backup list -f json | jq -r '.[].Name' | sed " 1, ${ DAILY_RETENTION } d " ) ; then
date +"[%Y-%m-%d_%HH%M] ---> Backup Volume(s) to be removed Found" >>${ LOG_FILE } 2>& 1
for OLD_VOLUME in $OLD_VOLUMES
do
date +" [%Y-%m-%d_%HH%M] ------> Remove Backup Volume ${ OLD_VOLUME } " >>${ LOG_FILE } 2>& 1
2023-12-18 10:15:42 +00:00
/usr/bin/openstack volume backup delete ${ OLD_VOLUME } >>${ LOG_FILE } 2>& 1
2023-11-13 14:38:57 +00:00
done
else
date +"[%Y-%m-%d_%HH%M] No Old Backup Volume found" >>${ LOG_FILE } 2>& 1
fi
date +"[%Y-%m-%d_%HH%M] => Manage Retention for Backup Instances" >>${ LOG_FILE } 2>& 1
date +"[%Y-%m-%d_%HH%M] ---> List all Backup Instances" >>${ LOG_FILE } 2>& 1
/usr/bin/openstack image list -f json| jq -r '.[].Name|select(. | startswith("Backup_"))' >>${ LOG_FILE } 2>& 1
if OLD_INSTANCES = $( /usr/bin/openstack image list -f json| jq -r '.[].Name|select(. | startswith("Backup_"))' | sed " 1, ${ DAILY_RETENTION } d " ) ; then
date +"[%Y-%m-%d_%HH%M] ---> Backup Instance(s) to be removed Found" >>${ LOG_FILE } 2>& 1
for OLD_INSTANCE in $INSTANCES
do
date +" [%Y-%m-%d_%HH%M] ------> Remove Backup Instance ${ OLD_INSTANCE } " >>${ LOG_FILE } 2>& 1
2023-12-18 10:15:42 +00:00
/usr/bin/openstack image delete ${ OLD_INSTANCE } >>${ LOG_FILE } 2>& 1
2023-11-13 14:38:57 +00:00
done
else
date +"[%Y-%m-%d_%HH%M] No Old Backup Instances found" >>${ LOG_FILE } 2>& 1
fi