View Categories

F5 BIG-IP Backup Script

20 min read

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

ShellScript
ssh-copy-id -i ~/.ssh/id_rsa.pub root@bigip

Now validate the above command worked by running

ShellScript
ssh root@bigip

if 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

ShellScript
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
ShellScript
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

ShellScript
#!/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

ShellScript
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.log

TROUBLESHOOTING

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

ShellScript
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

ShellScript
awk '/^BEGIN SECTION SOFTWARE/,/^END SECTION SOFTWARE/ {if (!/^BEGIN SECTION SOFTWARE/ && !/^END SECTION SOFTWARE/) print}' *.log

These 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:

ShellScript
#!/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.

Protected By
Shield Security