首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有一种明智的方式在4台主机上与Ansible一起错开一份cron任务?

是否有一种明智的方式在4台主机上与Ansible一起错开一份cron任务?
EN

Stack Overflow用户
提问于 2019-02-27 16:58:02
回答 1查看 623关注 0票数 0

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

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

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

这4台服务器之间唯一的通信是非HA共享上的一个目录。所以我把它作为一个15分钟错开的cron的原因是为了生存网络分区和NFS连接的死亡。

我的其他想法是..。我可以咬紧牙关,把它变成一个*/15,并且有一个架构,它依赖于祈祷NFS永远不会死,这会使编写Ansible剧本变得微不足道。我还在考虑使用Fabric或Bash脚本来部署这个程序,只是通过执行计划和遵循它们来进行更改的过程非常繁重,我只想简化一些人在深夜必须采取的步骤。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-27 20:30:44

解决方案1

您可以在单独的文件中或直接在库存中使用host_varsgroup_vars

我将尝试生成一个简单的示例,它符合您的描述,只使用库存文件(以及应用cron的剧本):

代码语言:javascript
运行
复制
[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

这使用主机变量,如果重复出现问题,还可以创建其他组和使用组变量。

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

代码语言:javascript
运行
复制
- name: Configure the cron job
  cron:
    # your other options
    minute: "{{ cron_restart_minute }}"

在另一个主机上,您可以访问其他主机变量,如下所示:

hostvars[host2].cron_restart_minute

解决方案2

如果您想要一个更动态的解决方案,例如,因为您一直在添加和移除主机,则可以使用registerset_fact在任务中设置一个变量,并根据当前主机所在的唯一组中的主机数进行计算。

示例:

代码语言:javascript
运行
复制
- 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_hostname (0123)找到它的长度或当前主机的索引。

与相关文档的链接:

库存

变量,特别是这部分

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54910719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档