【问题标题】:Is there a sane way to stagger a cron job across 4 hosts with Ansible?有没有一种理智的方法可以使用 Ansible 在 4 台主机上错开 cron 作业?
【发布时间】:2019-07-21 11:37:55
【问题描述】:

这几天我一直在尝试编写剧本,现在我正在编写剧本来部署应用程序。我可能会发现它不是适合这项工作的工具。

该应用程序在 2 个站点的 4 个系统上部署 HA,最坏情况下的 SLA 为 1 小时。这是通过每 15 分钟运行一次的交错 cron 来完成的。即 s1 在 0 处运行,s2 在 30 处运行 s3 在 15 处运行,...

我查看了 Ansible 支持的各种循环和 cron 以及其他模块,但无法真正找到一种方法,它支持在主机列表中移动时将整数递增 15,也许这很愚蠢做事的方式。

这 4 台服务器之间的唯一通信是非 HA NFS 共享上的目录。因此,我将其作为 15 分钟交错 cron 执行的原因是为了避免网络分区和 NFS 连接的终止。

我的其他想法是......我可以咬紧牙关,将其设为 */15,并拥有一个依赖于祈祷 NFS 永不消亡的架构,这将使编写 Ansible 剧本变得微不足道。我也在考虑使用 Fabric 或 Bash 脚本来部署它,只是让实施计划获得批准以及通过遵循它们进行更改的过程非常繁重,我只是想简化一些人必须在后期采取的步骤晚上。

【问题讨论】:

    标签: deployment ansible


    【解决方案1】:

    解决方案 1

    您可以在单独的文件中或直接在清单中使用 host_varsgroup_vars
    我将尝试仅使用库存文件(以及应用 cron 的剧本)生成一个符合您描述的简单示例:

    [site1]
    host1 cron_restart_minute=0
    host2 cron_restart_minute=30
    host3 cron_restart_minute=15
    host4 cron_restart_minute=45
    
    [site2]
    host5 cron_restart_minute=0
    host6 cron_restart_minute=30
    host7 cron_restart_minute=15
    host8 cron_restart_minute=45
    

    这使用主机变量,如果重复成为问题,您还可以创建其他组并使用组变量。

    在剧本或角色中,您可以简单地引用变量。 在同一主机上:

    - name: Configure the cron job
      cron:
        # your other options
        minute: "{{ cron_restart_minute }}"
    
    

    在另一台主机上,您可以访问其他主机变量,如下所示:
    hostvars[host2].cron_restart_minute

    解决方案 2

    如果您想要一个更动态的解决方案,例如因为您不断添加和删除主机,您可以使用 registerset_fact 在任务中设置一个变量,并计算,例如通过当前主机所在的唯一组。

    例子:

    - name: Set fact for cron_restart_minute
      set_fact:
        cron_restart_minute: "{{ 60 / groups[group_names[0]].length * (1 + groups[group_names[0]].index(inventory_hostname)) | int }}"
    

    我没有测试过这个表达式,但我相信它可以工作。它是 Python / Jinja2。 group_names 是一个 1 元素数组,上面给出了清单,因为没有主机同时在两个组中。 groups包含一个组中的所有主机,然后我们通过它的inventory_hostname0123)找到它的长度或当前主机的索引。

    相关文档的链接:
    Inventory
    Variables,特别是this part

    【讨论】:

    • 你知道了,我在午餐时与一些同事讨论了这个问题,有人提出了 host vars 解决方案,我认为这是这个特定项目的正确抽象级别。我一直在玩它,我对它的效果感到非常兴奋。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 2012-01-10
    相关资源
    最近更新 更多