我们有一组 Chef 服务器,我们会将其节点数据与 Chef 之外的数据进行集成。目前,我们使用批量同步流程从 Chef 读取节点,然后将数据推送到数据集成系统中。我们每小时运行一次,到目前为止运行良好。
我的问题是 Chef 是否支持更实时的机制来获取这些数据。理想情况下,我希望在发生更改(例如出现或删除新节点)后立即获得更改,从而减少延迟并消除大批量。Chef 服务器会发布通知吗?(我没有看到任何关于此的信息这里) 或者有人会处理这个客户端 (chef-client)?还有其他我没有考虑的方法吗?
编辑:我专门谈论的是节点数据。我确实
GET /nodes
获取节点->URI 哈希,然后
GET /nodes/:name
获取单个节点数据。不过,返回的数据量非常大,因此如果存在某种推送机制,利用这种机制会很棒。我这样做是因为我想将这些数据与 Chef 之外的其他服务数据(例如,服务依赖性数据、农场数据、负载平衡器轮换状态等)集成在一起。
答案1
您可以使用报告处理程序它在 chef-client 运行结束时运行并通知您的其他系统。
这run_status 对象包含一些有关运行的有趣信息,例如run_status.updated_resources
,这可以使通知依赖于某些资源是否已更改。如果您对节点的属性感兴趣,则run_status.node
包含您可以通过 HTTP 请求 POST 的新属性。
答案2
我认为 Chef 没有内置任何此类机制。不过,你应该看看厨师守卫。Chef-guard 几乎就像您的节点/工作站和 chef-server 之间的代理。它实现了整个 chef rest api,因此您可以像使用 chef server 一样使用它。但是,它会实时维护一个包含您所有更改的 github repo。然后它会将这些更改转发到 chef-server。您可以做两件事之一,具体取决于您的雄心壮志。
- 您可以分叉 chef-guard 并用您自己的自定义操作替换 github 集成。(基本上创建您自己的 chef-server 代理并内置自定义触发器)
- 您可以直接使用 chef-guard,然后将触发器放在 github repo 上(支持开箱即用的自定义触发器)。
我意识到这两个答案都比你希望的要费力一些,但它们会让你达到你想要的目的。