Deployment 使用Ansible在4台主机上错开一个cron作业是否有合理的方法?

Deployment 使用Ansible在4台主机上错开一个cron作业是否有合理的方法?,deployment,ansible,Deployment,Ansible,几天来我一直在尝试编写剧本,现在我正在编写剧本来部署应用程序。我可能会发现这不是适合这份工作的工具 该应用程序部署在2个站点的4个系统上,最坏情况下的SLA为1小时。这是通过每15分钟运行一次的交错cron实现的。i、 e.s1运行速度为0,s2运行速度为30,s3运行速度为15 我已经浏览了Ansible支持的各种循环、cron和其他模块,但找不到一种方法支持在主机列表中移动时将整数增加15,这可能是一种愚蠢的做法 这4台服务器之间的唯一通信是非HA NFS共享上的目录。因此,我之所以将其作为

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

该应用程序部署在2个站点的4个系统上,最坏情况下的SLA为1小时。这是通过每15分钟运行一次的交错cron实现的。i、 e.s1运行速度为0,s2运行速度为30,s3运行速度为15

我已经浏览了Ansible支持的各种循环、cron和其他模块,但找不到一种方法支持在主机列表中移动时将整数增加15,这可能是一种愚蠢的做法

这4台服务器之间的唯一通信是非HA NFS共享上的目录。因此,我之所以将其作为15分钟交错的cron,是为了在网络分区和NFS连接死亡的情况下生存下来

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

Solution 1 您可以在单独的文件中或直接在资源清册中使用主机变量或组变量。 我将尝试生成一个符合您描述的简单示例,仅使用清单文件和应用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\u重新启动\u分钟

解决方案2 如果您想要一个更动态的解决方案,例如,因为您一直在添加和删除主机,您可以使用register或set_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元素数组,如上清单所示,因为没有主机同时位于两个组中。组包含一个组中的所有主机,然后我们通过其目录主机名0、1、2、3查找其长度或当前主机的索引

相关文档的链接:
具体来说。

你明白了,我在午餐时与一些同事讨论了这个问题,有人提出了host vars解决方案,我认为这是这个特定项目的正确抽象级别。我一直在玩它,我对它的工作原理感到非常兴奋。谢谢