是否有一种理智的方式来通过Ansible错开4个主机的cron作业?


记忆短浅♡思念不变
2025-03-05 10:58:28 (4天前)
  1. 我一直在尝试编写剧本几天,我正在编写一本剧本来部署一个应用程序。我可能会发现它不适合工作......

2 条回复
  1. 0# 夏花 | 2019-08-31 10-32



    解决方案1



    你可以用

    host_vars

    要么

    group_vars

    ,可以在单独的文件中,也可以直接在库存中。

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




    1. [site1]
      host1 cron_restart_minute=0
      host2 cron_restart_minute=30
      host3 cron_restart_minute=15
      host4 cron_restart_minute=45

    2. [site2]
      host5 cron_restart_minute=0
      host6 cron_restart_minute=30
      host7 cron_restart_minute=15
      host8 cron_restart_minute=45

    3. </code>


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



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



    1.   - name: Configure the cron job
    2. cron:

    3. # your other options
    4. minute: "{{ cron_restart_minute }}"
    5. </code>


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



    hostvars[host2].cron_restart_minute



    解决方案2



    如果您需要更动态的解决方案,例如因为您不断添加和删除主机,则可以使用在任务中设置变量

    register

    要么

    set_fact

    ,并计算,例如,当前主机所在的唯一组中的主机数。



    例:



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

    3. </code>


    我没有测试过这个表达,但我相信它有效。这是Python / Jinja2。

    group_names

    给出上面的库存是一个1元素数组,因为没有主机同时在两个组中。

    groups

    包含组中的所有主机,然后我们通过它查找其长度或当前主机的索引

    inventory_hostname



    0



    1



    2



    3

    )。



    相关文档的链接:



    库存




    变量

    特别是

    这部分



登录 后才能参与评论