Ansible how to subtract two variables in a playbook?

So I created a simple bash script to compare dates of the current date and last date of a directory that was last modified.

What I am looking for is something done in Ansible that can take the converted date string of two variables and subtract the difference.

We have these DAT MacAfee files, I just don’t like the bash script I created and looking for something that can be done with a yaml playbook.

So here is my script:

`

#!/bin/bash
# TO PRINT THE NUMBER OF DAYS SINCE LAST AV UPDATE
past_date=$(du -h --time testdate | grep -Eo '[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}')

# Perform a subtraction of past_date string
# from today's string divided by seconds times 12 hour days  
diff=$((($(date +%s)-$(date +%s --date "$past_date"))/(3600*24)))
echo It has been $diff days since the last AV DAT update

`


Thanks in advance.

Andy Magana

Oklahoma, City OK

You could run a “shell” command and register the output to a variable using a command something like the following:

echo $((($(date +%s) - $(date +%s -r "$filename")) / 86400))

Alternatively, you could develop a action_plugin that could accept the filename as a parameter and perform the logic in python by first calling the stat module on the file as it also returns the last modification time of the file via mtime.

You could do something like this:

  • stat:
    path: “/path/to/file”
    register: result

  • debug:
    msg: “File was modified {{ days_ago }} days ago”
    vars:
    days_ago: “{{ ((result.stat.mtime - ansible_date_time.epoch|int)|int / 3600 / 24)|round(0, ‘floor’)|abs|int }}”

So I really have been racking my melon on this so your saying I can echo with the shell module what is the -r any way ?

Yeah, you can register the output of a shell command as a fact, below is simple example. Matts reply looks much nicer though, i would use his so you are not dependent on shell commands.

from the man page of date:

-r, --reference=FILE
display the last modification time of FILE

working example (replace filenametocheck with your actual filename)