几天来,我一直在尝试编写剧本,现在我正在编写一个部署应用程序的剧本。这可能是我发现它不是适合这项工作的工具。
该应用程序部署在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脚本来部署这个程序,只是通过执行计划和遵循它们来进行更改的过程非常繁重,我只想简化一些人在深夜必须采取的步骤。
发布于 2019-02-27 20:30:44
解决方案1
您可以在单独的文件中或直接在库存中使用host_vars
或group_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
如果您想要一个更动态的解决方案,例如,因为您一直在添加和移除主机,则可以使用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元素数组,给出了上面的清单,因为没有主机同时在两个组中。groups
包含一个组中的所有主机,然后通过它的inventory_hostname
(0
、1
、2
、3
)找到它的长度或当前主机的索引。
与相关文档的链接:
https://stackoverflow.com/questions/54910719
复制相似问题