使用Ansible更改cron条目而无需更改时间

时间:2019-04-03 18:11:12

标签: cron ansible

我有一堆系统,上面有由Cron安排的工作,这是由Ansible建立的。检查crontab,我可以看到

#Ansible: Job Name
0 22 * * * /path/to/script.sh >/var/log/folder/script.log

我需要更改该条目以指向其他脚本。这很容易,除了某些有问题的系统更改了时间,我需要保留更改后的时间。我没有时间就尝试了一项艰巨的任务:

- name: Update Cron
  cron:
    name: Job Name
    job: /path/to/new/script.sh >/var/log/folder/script.log

但是,这当然只剩下以下内容,因为每次选项默认为'*':

#Ansible: Job Name
* * * * * /path/to/new/script.sh >/var/log/folder/script.log

是否有什么好方法可以使Ansible更新cron条目而不破坏当前时间,或者有一种干净的方法来读取它并告诉Ansible写出当前时间?还是我不得不依靠一些丑陋且不建议使用的东西,例如使用lineinfile模块直接编辑相应的/ var / spool / cron /文件?

2 个答案:

答案 0 :(得分:1)

这仅对cron模块是不可能的。但是我看到了一种干净的方法,并有机会同时增加您的库存。

  1. command模块与crontab -l一起使用。
  2. 解析stdout_lines来找到cron名称注释,定义在下一行
  3. 解析cron定义以提取计划。将此存储在变量中
  4. (可选)使用这些值更新清单中的host_vars,以便在需要时制定下一次运行的时间表
  5. 使用已分析的时间表运行cron模块。

我承认通常要完成一项任务的步骤很多,但这是我能想到的唯一干净的方法。

答案 1 :(得分:1)

假设对主机进行某种形式的逻辑分组,而不是为crontab条目解析每个主机,可以设置每个组的时间,然后在清单中设置组以使用“ cron:”模块设置时间吗?

如果您需要确保时间条目具有一定的随机性(因此您没有500个主机都试图在同一时间上传日志文件),则可以使用“随机”过滤器以及一个如以下StackOverflow答案所示的种子: https://stackoverflow.com/a/45946949/187426