SaltStack has a schedule state that allows you to manage scheduled jobs on client (Minion), and it's very handy to manage cron style job.
But sometimes you could need to run a job once, in other words, like "at" command not like a cronjob.
OK! There is good news and there is bad news :D
The good news is that SaltStack schedule state supports "run once", so a job can be run just for one time.
The bad news is that to do that you need to specify the date explicitly in ISO 8601 date format by default (but you can change it), e.g. "2017-02-05T19:00:00".
i.e. it doesn't support the style of "at" command like "now +1 min".
I couldn't found any standard way to do that, but I found a workaround using Jinja2 filters to achieve that goal.
It simply generates "now" based on Unix Time, then it add x number of minutes, finally it converts that to ISO8601 time.
(None|strftime("%s")|int + 1)|strftime("%Y-%m-%dT%H:%M:%S")
So let's see that in action, this a dummy example how to run ping job after 1 minute from now.
{% set timer = cfg.get('timer', 1)|int %} an_arbitrary_job: schedule.present: - function: test.ping - once: "{{ (None|strftime("%s")|int + timer)|strftime("%Y-%m-%dT%H:%M:%S") }}" - once_fmt: "%Y-%m-%dT%H:%M:%S" - persist: False
The "at" state or "at" module could be used to, but that totally depends on what you need to do. For example you can run other states from schedule state but just system commands from "at" state/module.