【问题标题】:Conditionally restart a service有条件地重启服务
【发布时间】:2020-07-23 09:44:58
【问题描述】:

我刚刚学习了如何在 Chef 中使用通知和订阅来执行操作,例如在配置文件更改时重新启动服务。

我还在学习厨师,所以可能还没有进入这个部分,但我想知道如何有条件地执行这些操作。

例如,如果我为我的独立 apache 服务器更改配置文件,我只想在我们不在核心工作时间(即当前本地时间在下午 6 点到早上 6 点之间)时重新启动服务。如果我们处于核心工作时间,我希望重新启动,但在稍后的时间,在核心工作时间之外。

例如,如果我更改负载平衡 apache 服务器集群的配置文件,我只想在以下情况下重新启动服务运行,即我不会一次关闭集群中的多个节点。

我想我们可能需要将操作放在一个 ruby​​ 块中,该块要么循环直到满足条件,要么设置一个标志或创建一个计划任务以便稍后执行,但我不知道要寻找什么来学习如何最好地执行这样做。

【问题讨论】:

  • 在这两个示例中,您都希望在更新模板时始终退回服务器。然后,您可以在模板资源上使用 not_if/only_if 条件来控制何时允许修改模板。您无法更新模板并将通知推迟到服务的几个小时后。您将删除事件,您的系统将不同步。你最好提前做出时间决定。对于#2 chef 也不是设计为编排代理,并且该代码不应该在厨师食谱中。
  • 您可以为#2 编写一个外部脚本来管理编排并由厨师触发它,以便配方通过外部脚本发出“请求”以根据条件反弹服务。请注意,选择哪个服务首先反弹需要某种分布式锁定/集群管理机制。否则,所有成员都可以同时触发脚本,所有人都检查其他人是否已启动,然后所有人都决定同时退出他们的服务。 Chef-the-company 有一个集群管理器,但它在栖息地,而不是 chef-client。

标签: ruby service conditional-statements chef-infra restart


【解决方案1】:

我想这个话题有点哲学。对我来说,Chef 不应该有超出当前节点的特定状态或逻辑并运行。如果我想在特定时间重新启动,我会创建一个带有条件的 cron 作业,然后用厨师设置条件(类似于 debian 的 /var/run/reboot-required)。然后 crond 会触发重启。

对于您的第二个示例,LB 应该没有问题来处理重新启动的 apache 后端和故障转移到另一个后端。鉴于 Chef 经常使用称为“splay”的东西运行,因此无法访问后端的可能性非常低。即使只有 2 个后端。也就是说,重新加载可能是更好的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 2017-09-12
    相关资源
    最近更新 更多