【问题标题】:Ansible: run task at most once every n hoursAnsible:每n小时最多运行一次任务
【发布时间】:2020-10-12 11:31:16
【问题描述】:

我有一个更新 LetsEncrypt 证书的 Ansible 任务。我只希望这个任务每周运行一次,以避免因敲击 API 而被阻止,但剧本的其余部分需要每天运行 - 并且将比开发期间运行更多方式 .

是否可以对 Ansible 任务进行速率限制,以便如果它在过去 n 小时内已经运行,则将被跳过?

我能想到的最好方法是在任务运行时触摸文件,如果文件存在并且比某个时间戳更新,则跳过任务——但 Ansible 在日期和时间上似乎并不大计算。这也让剧本变得很厚实。

我确实想过在任务中应用一个标签,并在ansible.cfg 中将标签标记为默认跳过,然后每周只启用一次该标签,但ansible.cfg 似乎覆盖了--tags 而不是其他方式。

【问题讨论】:

  • 这能回答你的问题吗? Run CRON job everyday at specific time
  • 问题不是从 cron 运行,而是让 Ansible 记录任务上次运行的时间并在最近运行时跳过它。在这种情况下,该作业每天运行,但如果它在不到 7 天前运行,则应跳过证书更新。

标签: ansible


【解决方案1】:

选项 1

您可以通过 CRON 执行 Bash 脚本来运行 playbook,例如:

#!/usr/bin/env bash

DAY=$(date +%u)
HOUR=$(date +%k)

# This only runs all tasks (including letsencrypt) if it's 1 AM on Monday, at 
# all other times letsencrypt will be omitted. 
if [[ $(($DAY)) -eq 1 && $(($HOUR)) -eq 1 ]]; then
        echo "ansible-playbook [...]"
else
        echo 'ansible-playbook [...] --tags "!letsencrypt"'
fi

然后您必须使用letsencrypt 标记您的任务。然后它只会在您在脚本中设置的任何特定时间与所有其他任务一起运行,否则它将被跳过。 cronjob 本身仍然可以每小时运行一次。

选项 2

另一种方法是在你的剧本中使用ansible_date_time。这样,您就不需要 cronjob 拐杖了。请参阅以下简单示例剧本。

- hosts: localhost
  pre_tasks:

    - name: Get current weekday.
      set_fact:
        weekday: "{{ ansible_date_time.weekday }}"

    - name: Get current hour.
      set_fact:
        hour: "{{ ansible_date_time.hour }}"

  tasks:

    - debug:
        msg: "Replace this task with your Let's Encrypt task."
      when:
        - weekday is match("Thursday")
        - hour is match("22")

也许可以看看 this post 关于在 Ansible 中使用日期/时间和其他可能的输出格式。

【讨论】:

  • 我试过了,但是当我使用--tags letsencrypt 运行时,nothing 会运行。
  • 嗯,对,您必须使用 always 标记所有其他任务。或者,甚至更好:使用 --tags "!letsencrypt" 运行常规任务。我已经相应地更新了我的答案。
  • 啊,所以 Ansible 没有提供一种方法来做到这一点,而不是在背后痛苦。真可惜。幸运的是,在这种情况下,我通过 cron 作业在其他地方更新证书并将文件复制到 playbook 中解决了这个问题——如果文件没有更改,没问题 :)
  • 我刚刚更新了我的答案,也许第二个选项更适合你。 :)
猜你喜欢
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-25
  • 2019-12-04
  • 2010-12-02
  • 2010-10-05
  • 2011-02-05
相关资源
最近更新 更多