例如,如果进程在chef-client运行时更新节点,则chef-client将覆盖节点数据:
如果我们有两个进程在同一时刻保存节点数据,则会出现同样的问题
修改
我们需要进行外部修改,因为我们有一个很好的Chef服务器UI来远程管理很多计算机,就像一棵树(类似于LDAP)。管理员可以从此处更新配方的值。这个项目是OpenSource:https://github.com/gecos-team/
虽然我们有一个信号量系统,但我们检测到如果我们有两个或多个同时发出的请求,我们就会遇到并发问题:
答案 0 :(得分:3)
作为答案,抛出我将为此案件做的事情:
摆脱处理程序(但仍然需要锁定UI)的方法是利用reporting api(厨师12的高级功能,25个以下节点免费,需要向上许可)< / p>
这个转折点有点复杂,需要节点做报告(所以chef-server url应该以组织/结尾,客户端版本应该高于11.16或use the backport)
然后你可以询问runs for a node并检查这个节点是否处于启动状态,并等到它结束。
答案 1 :(得分:3)
我建议您避免从外部应用程序更新Chef节点数据,并将所需的节点配置移动到Chef databag。
因此,节点将读取Chef节点数据和配置数据字节,并仅在节点数据中写入。而你的外部应用程序读取两个但只写在数据库中。
答案 2 :(得分:2)
在生产中发现了这个,并得出结论,没有直接编辑节点属性的安全方法。留给厨师 - 客户: - )
好消息是还有其他更可靠的方法来设置节点属性。在客户端运行时,可以安全地编辑Chef角色和环境,并且只有在下一次厨师运行期间才能生效。另外node attribute precedence rules确保您所做的任何设置都会覆盖配方可能做出的设置。
答案 3 :(得分:2)
Chef没有实现事务功能,并且默认情况下它不会自动在更新上重新聚合节点。它对于竞争条件是开放的,你可以尝试通过厨师 - 客户端运行中的更新节点属性来减少(在你做一些关键的事情之前),但你永远不会在一个可靠的工作设置中结束。
收敛时间越长,差距和腐败风险就越高。
Chef的节点属性仅用于在节点本身上运行的chef-client进行调试或修改,在高度并发/动态环境中几乎无用。
我会使用Consul.io来实时协调信号量和键/值配置数据。使用厨师配方或LWRP使用consul提供的各种界面(http,DNS,...)访问它。
你可以实现一个非常简单的推送工作任务来运行chef-client(恕我直言,比厨师的“推送工作”功能更容易,更强大,但没有集成在厨师的ACL /用户管理中),这也是有问题的{{ 3}}或使用by a distributed semaphore功能。当然,您也必须将此逻辑添加到节点更新脚本中。
然后,Chef-client将在启动时检索锁定并阻止您在收敛时操纵数据,反之亦然。
答案 4 :(得分:0)
如果你想避免依赖其他外部服务,也许你可以使用某种时间切片。
粗略地说:节点只在奇数分钟启动厨师 - 客户端。 Api仅在几分钟内更新厨师数据(如果您有多个队列,则分配这些甚至几分钟)。