I’ve got a small Ansible script that I bundle up on Ubuntu boxes to do apt updates. This was originally a one-statement job, but I’ve added a few lines to it, so I thought I’d explain what I’m doing (more for myself, for later!)
Initally, I just had a task to do
apt: upgrade=full update_cache=yes autoremove=yes autoclean-yes but if you’re running the script over and over again, well, this gets slow… So I added a tweak!
Here it is folks, in all it’s glory!
- hosts: all tasks: - name: Get stat of last run apt stat: path: /var/cache/apt/pkgcache.bin register: apt_run - name: "Apt update, Full-upgrade, autoremove, autoclean check" debug: msg: "Skipping apt-update, etc. actions as apt update was run today" when: "'%Y-%m-%d' | strftime(apt_run.stat.mtime) in ansible_date_time.date" - name: "Apt update, Full-upgrade, autoremove, autoclean" apt: upgrade: full update_cache: yes autoremove: yes autoclean: yes when: "'%Y-%m-%d' | strftime(apt_run.stat.mtime) not in ansible_date_time.date"
What does this do? Well, according to this AskUbuntu post, the best file to check if an update has been performed is
/var/cache/apt/pkgcache.bin, so we check the status of that file. Most file systems available to Linux distributions provide the
mtime – or “last modified time”. This is returned in the number of seconds since UTC 00:00:00 on the Unix Epoch (1970-01-01), so we need to convert that to a date., which we return as YYYY-MM-DD (e.g. today is 2020-01-06) and then compare that to what the system thinks today is. If the dates don’t equate (so one string doesn’t match the other – in other words,
apt update wasn’t run today), it runs the update. If the dates do match up, we get a statement saying that apt update was already run.