有一种明智的方法可以通过Ansible在4位主机上交错执行cron工作吗?

时间:2019-02-27 16:58:03

标签: deployment ansible

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

该应用程序在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脚本进行部署,这只是批准实施计划以及通过遵循实施计划进行更改的过程非常繁琐,而我只是想简化某人在后期必须采取的步骤晚上。

1 个答案:

答案 0 :(得分: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_hostname012查找其长度或当前主机的索引,3)。

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