Here is my F5 tmos backup script. Going to walk through how to reproduce if I forget years later how to reproduce.
NOTE: My user is confback in this example
STEP ONE – Setup
Create a directory for the backup script and device files. In this example I created a folder called backups
mkdir backups
Next log into the Linux box with confback (or your user account) and then you need the ability to connect to the F5s via root (or an account that doesn’t expire that has admin permissions) so what I do from the terminal of my linux user (confback) I run the following command for each F5
ssh-copy-id -i ~/.ssh/id_rsa.pub root@bigipNow validate the above command worked by running
ssh root@bigipif you are able to connect with no password then success and you are ready to continue on
NEXT create some text files for each environment. I personally created a folder called backups (so /home/confback/backups) that I store all my backup stuff so all this is done under this folder.
Each text file you create having all the F5’s FQDNs (one on each line)
I have three files and I named them
bigip_devices_dev.txt
bigip_devices_mdl.txt
bigip_devices_prd.txt**note you can name them whatever you want and have as many as you want. This is just the way I’m doing it.
EXAMPLE:
/home/confback/backups/bigip_devices_prd.txt
usfnt1slbprd01.hosangit.corp
usfnt1slbprd02.hosangit.corp**NOTE: you can have whatever FQDN’s in the .txt files you want.. no limit from my testing so far. Just make sure you have one per line.Â
STEP TWO – Shell Script
Create /home/confback/backups/bigip_backup.sh
#!/bin/sh
## Created by Cowboy Denny
## version: 2024.05.06
## PRE_REQ
## ssh-copy-id -i ~/.ssh/id_rsa.pub root@bigip
## TEST-VERIFY: ssh root@bigip <--no password login means success
###### SYNTAX to RUN: ./bigip_backup.sh bigip_devices.txt [daily|weekly]
## BACKUP FILES ARE DELIMITED BY - [hostname-f5_daily_backup-DATE-TIME]
#DEBUG=yes
tstart=$SECONDS && [[ -n $DEBUG ]] && echo "DEBUG: TOTAL start is $tstart"
##CLEANUP JUMPBOX BEFORE ADDING MORE
#
cat $1 | while read REMOTE_BIGIP || [[ -n $REMOTE_BIGIP ]];
do
echo "********************** $REMOTE_BIGIP STARTING ******************************"
start=$SECONDS && [[ -n $DEBUG ]] && echo "DEBUG: start is $start"
DATETIME="`date +%Y%m%d-%H%M`"
REMOTE_PATH="/var/tmp"
LOCAL_PATH="/home/confback"
FILE_UCS="$(echo $REMOTE_BIGIP | cut -d'.' -f1)-f5_daily_backup-${DATETIME}.ucs"
FILE_SCF="$(echo $REMOTE_BIGIP | cut -d'.' -f1)-f5_daily_backup-${DATETIME}.scf"
FILE_CERT="$(echo $REMOTE_BIGIP | cut -d'.' -f1)-f5_daily_backup-${DATETIME}.cert.tar"
start=$SECONDS
if [ $# -eq 0 ]; then
echo "$0: Missing BIGIP FQDN - Try Running again: .bigip_backup.sh usfnt1slbdv03.hosangit.corp"
exit 1
elif [ $# -gt 2 ]; then
echo "$0: Too many arguments: $@"
exit 1
elif [[ $REMOTE_BIGIP == *"slbgtm"* ]]; then
echo "this is a GTM"
TYPE="GTM"
elif [[ $REMOTE_BIGIP == *"slbdv"* ]]; then
echo "this is a DEV LTM"
TYPE="LTM"
elif [[ $REMOTE_BIGIP == *"slbcov"* ]]; then
echo "this is a VIRTUAL HOST"
TYPE="vHOST"
elif [[ $REMOTE_BIGIP == *"slbco"* ]]; then
echo "this is a CORE LTM"
TYPE="LTM"
elif [[ $REMOTE_BIGIP == *"slbdz"* ]]; then
echo "this is a DMZ LTM"
TYPE="LTM"
elif [[ $REMOTE_BIGIP == *"slbtst"* ]]; then
echo "this is a TST LTM"
TYPE="LTM"
fi
echo "=================================================================="
echo "filename........: $1"
echo "REMOTE_BIGIP....: $REMOTE_BIGIP"
echo "DATETIME........: $DATETIME"
echo "REMOTE_PATH.....: $REMOTE_PATH"
echo "LOCAL_PATH......: $LOCAL_PATH"
echo "FILE_UCS........: $FILE_UCS"
echo "FILE_SCF........: $FILE_SCF"
echo "FILE_CERT.......: $FILE_CERT"
echo "TYPE............: $TYPE"
echo "=================================================================="
echo "Variable are SET"
echo ""
echo "BIG-IP: $REMOTE_BIGIP"
echo "-----------------------------------------------------"
echo ""
#############################
## CONNECTION TEST SECTION ##
echo "-----------------------------------------------------"
echo "BEGIN SECTION CONNECTION TEST"
echo "-----------------------------------------------------"
echo "`date +%Y%m%d_%H.%M.%S`: ENTERING CONNECTION TEST for $REMOTE_BIGIP"
echo ""
echo "Can we connect to $REMOTE_BIGIP without a password prompt?"
cmd="ssh -n root@$REMOTE_BIGIP > /dev/null"
echo "`date +%Y%m%d_%H.%M.%S`: running $cmd"
#$cmd || { echo '$cmd' ; exit 1; }
expect -c "
set timeout 5
spawn $cmd
expect "Password" { exit 1 }
"
# Do something based on the exit status of the expect script.
if [ $? -eq 1 ]; then
echo "$?"
echo "Password prompt detected on $REMOTE_BIGIP "
echo "run ssh-copy-id -i ~/.ssh/id_rsa.pub root@$REMOTE_BIGIP "
echo "then run the script again and you should be good"
echo "exiting script for now for $REMOTE_BIGIP but going to next device in list"
exit
fi
echo "`date +%Y%m%d_%H.%M.%S`: DONE with CONNECTION TEST FOR $REMOTE_BIGIP"
echo "-----------------------------------------------------"
echo "END SECTION CONNECTION TEST"
echo "-----------------------------------------------------"
echo ""
####################
## UPTIME Section ##
echo "-----------------------------------------------------"
echo "BEGIN SECTION UPTIME"
echo "-----------------------------------------------------"
echo "`date +%Y%m%d_%H.%M.%S`: ENTERING UPTIME SECTION for $REMOTE_BIGIP"
echo ""
uplength=$(ssh -n root@$REMOTE_BIGIP uptime)
echo "Uptime for $REMOTE_BIGIP is $uplength"
echo "`date +%Y%m%d_%H.%M.%S`: DONE WITH UPTIME Section for $REMOTE_BIGIP"
echo "-----------------------------------------------------"
echo "END SECTION UPTIME"
echo "-----------------------------------------------------"
echo ""
######################
## MASTERKEY Section ##
echo "-----------------------------------------------------"
echo "BEGIN SECTION MASTERKEY"
echo "-----------------------------------------------------"
echo "`date +%Y%m%d_%H.%M.%S`: ENTERING MASTERKEY SECTION for $REMOTE_BIGIP"
echo ""
https://eventguyz.com/wp-content/uploads/2025/02/mywiseguys-uncategorized-2541-1.pngkey=$(ssh -n root@$REMOTE_BIGIP f5mku -K)
echo "MasterKey for $REMOTE_BIGIP is $https://eventguyz.com/wp-content/uploads/2025/02/mywiseguys-uncategorized-2541-1.pngkey"
echo "`date +%Y%m%d_%H.%M.%S`: DONE WITH MASTERKEY Section for $REMOTE_BIGIP"
echo "-----------------------------------------------------"
echo "END SECTION MASTERKEY"
echo "-----------------------------------------------------"
echo ""
######################
## SOFTWARE Section ##
echo "-----------------------------------------------------"
echo "BEGIN SECTION SOFTWARE"
echo "-----------------------------------------------------"
echo "`date +%Y%m%d_%H.%M.%S`: ENTERING SOFTWARE SECTION for $REMOTE_BIGIP"
echo ""
software=$(ssh -n root@$REMOTE_BIGIP tmsh show sys software status | grep "HD1.")
#echo "`date +%Y%m%d_%H.%M.%S`: running $cmd"
#$cmd || { echo '$cmd' ; exit 1; }
echo "SOFTWARE installed: $software"
echo "`date +%Y%m%d_%H.%M.%S`: DONE WITH SOFTWARE Section for $REMOTE_BIGIP"
echo "-----------------------------------------------------"
echo "END SECTION SOFTWARE"
echo "-----------------------------------------------------"
echo ""
#################
## HDD Section ##
## CLEANUP DRIVE TO MAKE ROOM FOR UCS FILE
echo "-----------------------------------------------------"
echo "BEGIN SECTION HDD"
echo "-----------------------------------------------------"
echo "`date +%Y%m%d_%H.%M.%S`: ENTERING CLEANING UP DRIVE for $REMOTE_BIGIP"
echo ""
echo "How full is /var/tmp?"
ssh -n root@$REMOTE_BIGIP df -P /var/tmp | tail -1 | awk '{ print $5}'
echo "`date +%Y%m%d_%H.%M.%S`: time to cleanup created files and rpm-tmp files"
cmd="ssh -n root@$REMOTE_BIGIP rm -f $REMOTE_PATH/{rpm-tmp.*,*.ucs,*qkview,*.*cap} > /dev/null"
$cmd || { echo '$cmd' ; exit 1; }
cmd="ssh -n root@$REMOTE_BIGIP rm -f /shared/images/{Hotfix*.iso,BIGIP-12*.*,BIGIP-13*.*,BIGIP-14*.*,BIGIP-15*.*,BIGIP-16*.*,BIGIP-17.1.0*.iso} > /dev/null"
$cmd || { echo '$cmd' ; exit 1; }
#echo "After Cleanup, Do we have more space for a backup?"
hdd=$(ssh -n root@$REMOTE_BIGIP df -P /var/tmp | tail -1 | awk '{ print $5}')
echo ""
echo "`date +%Y%m%d_%H.%M.%S`: DONE WITH CLEANING UP DRIVE for $REMOTE_BIGIP"
echo "-----------------------------------------------------"
echo "END SECTION HDD"
echo "-----------------------------------------------------"
echo ""
####################
## STATUS Section ##
echo "-----------------------------------------------------"
echo "BEGIN SECTION STATUS"
echo "-----------------------------------------------------"
echo "`date +%Y%m%d_%H.%M.%S`: ENTERING STATUS SECTION"
echo ""
echo "TYPE: $TYPE"
if [[ $TYPE == *"LTM"* ]]; then
echo "UPLOAD ltmchgverify to $REMOTE_BIGIP"
cmd="scp -v $LOCAL_PATH/backups/ltmchgverify.sh root@$REMOTE_BIGIP:/var/tmp"
echo "`date +%Y%m%d_%H.%M.%S`: running $cmd"
$cmd > /dev/null || { echo '$cmd' ; exit 1; }
echo "Finished uploading ltmchgverify.sh"
echo ""
echo "Let's grab the LTM status now"
cmd="ssh -n root@$REMOTE_BIGIP '/var/tmp/ltmchgverify.sh'"
echo "`date +%Y%m%d_%H.%M.%S`: running $cmd"
$cmd > /dev/null || { echo '$cmd' ; exit 1; }
elif [[ $TYPE == *"GTM"* ]]; then
echo "UPLOAD gtmchgverify to $REMOTE_BIGIP"
cmd="scp -v $LOCAL_PATH/backups/gtmchgverify.sh root@$REMOTE_BIGIP:/var/tmp"
echo "`date +%Y%m%d_%H.%M.%S`: running $cmd"
$cmd > /dev/null || { echo '$cmd' ; exit 1; }
echo "Finished uploading gtmchgverify.sh"
echo ""
echo "Let's grab the GTM status now"
cmd="ssh -n root@$REMOTE_BIGIP '/var/tmp/gtmchgverify.sh'"
echo "`date +%Y%m%d_%H.%M.%S`: running $cmd"
$cmd > /dev/null || { echo '$cmd' ; exit 1; }
else
echo "Not a GTM or LTM"
fi
echo ""
echo "checking obervability"
echo "do we have the crontab configured to send hourly splunk and cribl logs"
cmd="ssh -n root@$REMOTE_BIGIP crontab -l"
$cmd || { echo '$cmd' ; exit 1; }
echo ""
#echo "what are the snmp strings configured?"
#cmd="ssh -n root@$REMOTE_BIGIP 'tmsh list sys snmp users | grep _1 {'"
#$cmd || { echo '$cmd' ; exit 1; }
echo ""
echo "`date +%Y%m%d_%H.%M.%S`: DONE WITH STATUS SECTION for $REMOTE_BIGIP "
echo "-----------------------------------------------------"
echo "END SECTION STATUS"
echo "-----------------------------------------------------"
echo ""
##########################
## SAVE AND TEST CONFIG ##
echo "-----------------------------------------------------"
echo "BEGIN SECTION CONFIG"
echo "-----------------------------------------------------"
echo "`date +%Y%m%d_%H.%M.%S`: ENTERING SAVE AND VERIFY CONFIG SECTION for $REMOTE_BIGIP"
echo ""
echo "Saving Config on $REMOTE_BIGIP first"
cmd="ssh -n root@$REMOTE_BIGIP tmsh save /sys config > /dev/null"
echo "`date +%Y%m%d_%H.%M.%S`: running $cmd"
$cmd
echo "done saving config"
echo ""
echo "Let's VERIFY the config"
cmd="ssh -n root@$REMOTE_BIGIP tmsh load sys config verify partitions all"
echo "`date +%Y%m%d_%H.%M.%S`: running $cmd"
$cmd
echo "Done with the VERIFY config"
echo ::
echo "`date +%Y%m%d_%H.%M.%S`: DONE WITH SAVE AND VERIFY CONFIG for $REMOTE_BIGIP"
echo "-----------------------------------------------------"
echo "END SECTION CONFIG"
echo "-----------------------------------------------------"
echo ""
##############################
## NOW let's create the UCS ##
echo "-----------------------------------------------------"
echo "BEGIN SECTION CREATE UCS"
echo "-----------------------------------------------------"
echo "`date +%Y%m%d_%H.%M.%S`: ENTERING CREATING UCS BACKUP FILE for $REMOTE_BIGIP"
echo ""
echo "Creating Backup File (.ucs) for $REMOTE_BIGIP"
cmd="ssh -n root@$REMOTE_BIGIP tmsh save /sys ucs $REMOTE_PATH/$FILE_UCS > /dev/null"
echo "`date +%Y%m%d_%H.%M.%S`: running $cmd"
$cmd || { echo '$cmd' ; exit 1; }
if [ $? -eq 0 ]; then
echo "success running $cmd"
else
echo "failed running $cmd"
exit
fi
echo "`date +%Y%m%d_%H.%M.%S`: DONE WITH CREATING UCS BACKUP FILE for $REMOTE_BIGIP "
echo "-----------------------------------------------------"
echo "END SECTION CREATE UCS"
echo "-----------------------------------------------------"
echo ""
#################################
## NOW let's create the QKVIEW ##
echo "-----------------------------------------------------"
echo "BEGIN SECTION CREATE QKVIEW"
echo "-----------------------------------------------------"
echo "`date +%Y%m%d_%H.%M.%S`: ENTERING CREATING QKVIEW DIAG FILE for $REMOTE_BIGIP"
echo ""
echo "Creating Diagnostic File (.qkview) for $REMOTE_BIGIP"
cmd="ssh -n root@$REMOTE_BIGIP qkview -s0 -o asm-request-log > /dev/null"
echo "`date +%Y%m%d_%H.%M.%S`: running $cmd"
$cmd || { echo '$cmd' ; exit 1; }
if [ $? -eq 0 ]; then
echo "success running $cmd"
else
echo "failed running $cmd"
exit
fi
echo "`date +%Y%m%d_%H.%M.%S`: DONE WITH CREATING QKVIEW DIAG FILE for $REMOTE_BIGIP "
echo "-----------------------------------------------------"
echo "END SECTION CREATE QKVIEW"
echo "-----------------------------------------------------"
echo ""
echo ""
######################
## DOWNLOAD Section ##
echo "-----------------------------------------------------"
echo "BEGIN SECTION DOWNLOAD"
echo "-----------------------------------------------------"
echo "`date +%Y%m%d_%H.%M.%S`: ENTERING DOWNLOAD SECTION"
echo ""
echo "Downloading -STATUS.log from $REMOTE_BIGIP"
cmd="scp -v root@$REMOTE_BIGIP:$REMOTE_PATH/*-STATUS.log $LOCAL_PATH/f5status"
echo "`date +%Y%m%d_%H.%M.%S`: running $cmd"
$cmd > /dev/null
echo "Finished Downloading -STATUS.log"
echo ""
echo "Let's remove the -STATUS.log file from $REMOTE_BIGIP to save space on the drive"
cmd="ssh -n root@$REMOTE_BIGIP rm -f $REMOTE_PATH/*-STATUS.log > /dev/null"
echo "`date +%Y%m%d_%H.%M.%S`: running $cmd"
$cmd
echo ""
echo ""
echo "Downloading .ucs from $REMOTE_BIGIP"
cmd="scp -v root@$REMOTE_BIGIP:$REMOTE_PATH/*f5_daily_backup*.ucs $LOCAL_PATH/backups/f5"
echo "`date +%Y%m%d_%H.%M.%S`: running $cmd"
$cmd > /dev/null || { echo '$cmd' ; exit 1; }
echo "Finished Downloading ucs"
echo ""
echo "Let's remove the .ucs file from $REMOTE_BIGIP to save space on the drive"
cmd="ssh -n root@$REMOTE_BIGIP rm -f $REMOTE_PATH/*.ucs > /dev/null"
echo "`date +%Y%m%d_%H.%M.%S`: running $cmd"
$cmd || { echo '$cmd' ; exit 1; }
echo ""
echo ""
echo "Downloading .qkview from $REMOTE_BIGIP"
cmd="scp -v root@$REMOTE_BIGIP:$REMOTE_PATH/*.qkview $LOCAL_PATH/diag"
echo "`date +%Y%m%d_%H.%M.%S`: running $cmd"
$cmd > /dev/null || { echo '$cmd' ; exit 1; }
echo "Finished Downloading qkview"
echo ""
echo "Let's remove the .qkview file from $REMOTE_BIGIP to save space on the drive"
cmd="ssh -n root@$REMOTE_BIGIP rm -f $REMOTE_PATH/*.qkview > /dev/null"
echo "`date +%Y%m%d_%H.%M.%S`: running $cmd"
$cmd || { echo '$cmd' ; exit 1; }
echo "`date +%Y%m%d_%H.%M.%S`: DONE WITH DOWNLOAD SECTION for $REMOTE_BIGIP "
echo "-----------------------------------------------------"
echo "END SECTION DOWNLOAD"
echo "-----------------------------------------------------"
echo ""
echo ""
######################
## iHEALTH Section ##
echo "-----------------------------------------------------"
echo "BEGIN SECTION iHEALTH"
echo "-----------------------------------------------------"
echo "`date +%Y%m%d_%H.%M.%S`: ENTERING iHEALTH SECTION"
FILE_QKVIEW="$REMOTE_BIGIP.qkview"
BEARERTOKEN=`(replace this with curl command you copy from iHealth API settings for your profile | jq -r '.access_token')`
echo "FILE= $FILE_QKVIEW"
echo "iHealthToken= $BEARERTOKEN"
echo ""
echo "***********************************************"
echo "NOW let's upload $FILE_QKVIEW to iHealth"
curl -v -H "Authorization: Bearer "$BEARERTOKEN -H "Accept: application/vnd.f5.ihealth.api" --user-agent "MyGreatiHealthClient" -o - -F qkview=@"/home/confback/diag/$FILE_QKVIEW" 'https://ihealth2-api.f5.com/qkview-analyzer/api/qkviews?visible_in_gui=true'
echo "done uploading $FILE_QKVIEW to iHealth"
echo ""
echo "***********************************************"
echo "DELETE local qkview that was uploaded for $REMOTE_BIGIP"
rm -rf $LOCAL_PATH/diag/$FILE_QKVIEW
echo "done removing $LOCAL_PATH/diag/$FILE_QKVIEW"
echo ""
echo "***********************************************"
echo "done with $REMOTE_BIGIP.."
echo ""
echo "`date +%Y%m%d_%H.%M.%S`: DONE WITH iHEALTH SECTION for $REMOTE_BIGIP "
echo "-----------------------------------------------------"
echo "END SECTION iHEALTH"
echo "-----------------------------------------------------"
echo ""
echo ""
echo ""
echo "`date +%Y%m%d_%H.%M.%S`: FINISHED with $REMOTE_BIGIP"
echo "*********************************************************************************************"
echo "********************** $REMOTE_BIGIP OVERVIEW BEGIN ******************************"
echo "OVERVIEW for BIG-IP: $REMOTE_BIGIP"
echo "MASTERKEY: $https://eventguyz.com/wp-content/uploads/2025/02/mywiseguys-uncategorized-2541-1.pngkey"
echo "UPTIME: $uplength"
echo "SOFTWARE: $software"
echo "HDD FULL%: $hdd"
# echo "Number of Virtual Servers: $totalvips"
echo ""
echo "THIS BACKUP TOOK...."
duration=$(( SECONDS - start ))
echo "Duration(seconds): $duration"
echo "Duration(minutes): $(( $duration / 60))"
echo "************************* $REMOTE_BIGIP END ************************************"
echo "*********************************************************************************************"
done
#####################
## CLEANUP JUMPBOX ##
echo "You Should ONLY see this after all big-ips are done backing up"
echo "Cleaning up any backup files older than 30 days on RHEL storage"
echo "...................................."
echo "Removing STATUS files older than 30days..."
find /home/confback/f5status -name "*-STATUS.log" -type f -mtime +31 -delete
echo "Done with removing old UCS files"
echo ""
echo "Removing UCS files older than 30days..."
find /home/confback/backups -name "*.ucs" -type f -mtime +31 -delete
echo "Done with removing old UCS files"
echo ""
echo "Removing QKVIEW files older than 30days..."
find /home/confback/diag -name "*.ucs" -type f -mtime +31 -delete
echo "Done with removing old UCS files"
echo ""
echo "Removing LOG files older than 30days..."
find /home/confback/backups -name "*.log" -type f -mtime +31 -delete
echo "Done with removing old LOG files"
echo ""
echo "Removing IB files older than 30days..."
find /home/confback/backups -name "*.gz" -type f -mtime +31 -delete
echo "Done with removing old IB files"
echo ""
echo "FINISHED CLEANING UP JUMPBOX and now exiting script"
echo "...................................."
echo ""
################################
## VERIFY WE HAVE ALL BACKUPS ##
echo "ENTERING THE VERIFY WE HAVE ALL BACKUPS"
echo ""
location=usfnt1
echo "$location should have 4 devices"
result=$(find /home/confback/backups/f5 -maxdepth 2 -name "$location*-f5_daily_backup-`date +%Y%m%d`*" | wc -l)
echo "Number of usuyk1 devices backed up should be 4 and is $result"
if [ "$result" = "4" ]; then
echo "We have all $result $location devices backed up"
else
echo "Only found $result $location devices backed up when it should be 4"
fi
echo ""
location=usfnt2
echo "$location should have 16 devices"
result=$(find /home/confback/backups/f5 -maxdepth 2 -name "$location*-f5_daily_backup-`date +%Y%m%d`*" | wc -l)
echo "Number of $location devices backed up should be 16 and is $result"
if [ "$result" = "16" ]; then
echo "We have all $result $location devices backed up"
else
echo "Only found $result $location devices backed up when it should be 16"
fi
echo ""
location=usdet1
echo "$location should have 40 devices"
result=$(find /home/confback/backups/f5 -maxdepth 2 -name "$location*-f5_daily_backup-`date +%Y%m%d`*" | wc -l)
echo "Number of $location devices backed up should be 40 and is $result"
if [ "$result" = "40" ]; then
echo "We have all $result $location devices backed up"
else
echo "Only found $result $location devices backed up when it should be 40"
fi
echo "/////////////// DURATION of SCRIPT SUMMARY ///////////////"
echo ""
echo "Script took this long to run on all the devices included in file: $1"
tduration=$(( SECONDS - tstart ))
echo "TOTAL Duration(seconds): $tduration"
echo "TOTAL Duration(minutes): $(( $tduration / 60))"
echo ""
echo "BYE"STEP THREE – Autorun Script
NEXT create the cronjob usually by running crontab -e and adding these three lines
0 0 * * * /home/confback/backups/bigip_backup.sh /home/confback/backups/bigip_devices_dev.txt > /home/confback/backups/bigip_backup_dev_date +20\%y\%m\%d_\%H\%M\%S.log
0 2 * * * /home/confback/backups/bigip_backup.sh /home/confback/backups/bigip_devices_mdl.txt > /home/confback/backups/bigip_backup_mdl_date +20\%y\%m\%d_\%H\%M\%S.log
0 4 * * * /home/confback/backups/bigip_backup.sh /home/confback/backups/bigip_devices_prd.txt > /home/confback/backups/bigip_backup_prd_date +20\%y\%m\%d_\%H\%M\%S.logTROUBLESHOOTING
Now every day you’ll get backup of the devices you included in your text file and you will get a log that is layed out to make it easier to do searches for info you might want.
Example: You want all the devices hostname and version of software just run this command
egrep -Rw *.log -e 'BIG-IP:|yes complete'Another example is to give you the full output of a SECTION and you can use awk for this and you can use this example to print everything from BEGIN of section of text file to END of section of text file.
This example we will search for SOFTWARE SECTION as an example
awk '/^BEGIN SECTION SOFTWARE/,/^END SECTION SOFTWARE/ {if (!/^BEGIN SECTION SOFTWARE/ && !/^END SECTION SOFTWARE/) print}' *.logThese are just some examples of how to backup your configs from your BIG-IP boxes to a jumpbox in this case running RHEL.
I did add the ability to upload QKVIEW diagnostic F5 file using API to iHealth.
NOTE: My user is confback
CREATE file named /home/confback/backups/f5/diag/upqkview.sh and paste the following:
#!/bin/sh
## PRE_REQ
#!/bin/sh
## PRE_REQ
ls -f /home/confback/backups/f5/diag/*.qkview | while read FILE_QKVIEW || [[ -n $FILE_QKVIEW ]]; do
if [ -z $FILE_QKVIEW ]; then
echo "no value in FILE_QKVIEW"
break
fi
start=$SECONDS
echo "***********************************************"
echo "STARTING with $FILE_QKVIEW"
DATETIME="
date +%Y%m%d_%H%M`"
REMOTE_PATH='/var/tmp'
LOCAL_PATH="/home/confback/backups/f5/diag"
BEARERTOKEN=
(curl --request POST --url https://identity.account.f5.com/oauth2/ausp95ykc80HOU7SQ357/v1/token -H "accept:application/json" -H "authorization: Basic <insertauthorizationcopiedfromihealth>" -H "cache-control: no-cache" -H "content-type: application/x-www-form-urlencoded" --data "grant_type=client_credentials&scope=ihealth" | jq -r .access_token)
echo "$FILE_QKVIEW"
echo "***********************************************"
echo "NOW let's upload $FILE_QKVIEW to iHealth"
curl -v -H "Authorization: Bearer "$BEARERTOKEN -H "Accept: application/vnd.f5.ihealth.api" --user-agent "MyGreatiHealthClient" -o - -F qkview=@"$FILE_QKVIEW" 'https://ihealth2-api.f5.com/qkview-analyzer/api/qkviews?visible_in_gui=true'
echo "done uploading $FILE_QKVIEW to iHealth"
echo ""
echo "***********************************************"
echo "DELETE local qkview that was uploaded"
# rm -rf $FILE_QKVIEW
echo "done removing $FILE_QKVIEW"
echo ""
echo "***********************************************"
echo "done with $FILE_QKVIEW.. continue to next F5"
echo "***********************************************"
done
rm -rf /home/confback/backups/f5/diag/*.qkview
echo "done with uploading qkviews to ihealth and cleaning up local drive"NOTE: you will need to replace the authorization in the BEARERTOKEN variable. You get this from iHealth under your profile settings.