2

考虑一个简单的应用服务器/数据库服务器设置。你想在应用服务器上设置一些值,告诉它数据库服务器在哪里,并且你想在数据库服务器上设置一些权限,只允许来自应用服务器的连接。

搜索(:节点,“角色:数据库服务器”)

搜索(:节点,“角色:应用服务器”)

可以从任何一台机器的配方运行中获取所需的信息。但是,如果在您进行搜索时这台服务器不存在怎么办?有没有办法说“不要继续运行”并将其标记为未完成,以便下次在该机器上运行 chef-client 时,它会再试一次?

或者,是否有一些我想念的漂亮厨师服服务于这个用例(“通知”和“订阅”似乎它们几乎是我想要的,除了据我所知,它们只是关心节点内发生的事情)更好?我正在考虑的另一件事是尝试设置一个睡眠/检查循环以有效地暂停一个执行运行,而另一台服务器到达它需要的位置,但该解决方案似乎相当不雅,并且容易出现死锁问题更复杂的设置.

4

1 回答 1

2

弄清楚了。我敢肯定这可以做得更优雅一点,但这里是基础知识。考虑到您有一个文件 /etc/test.txt,一旦它出现并向厨师注册,就必须从您的数据库服务器中填充一些信息,您将为您的应用程序服务器节点的配方执行以下操作:

ruby_block "edit test.txt" do
    block do
        db_server = search(:node, %Q{role:db-server})
        rc = Chef::Util::FileEdit.new("/etc/test.txt")
        rc.search_file_replace_line(/^replace_this/, "db_server: #{db_server[0][:hostname]}")
        rc.write_file
    end
    action :create
    ignore_failure true
end

关键部分是“ignore_failure true”。这会导致配方在您每次在该服务器上重新启动 chef-client 时重新运行。我还没有弄清楚如何让它在成功后停止运行,但即使事实证明这是不可能的,通过适当的检查,你可以避免重新修改不应重新修改的文​​件,如果这是一个问题。请注意,如果找不到 db 服务器,db_server[0] 将导致配方失败(我相信可以通过将其添加到 not_if 部分并检查搜索结果的长度来更明确地说明这一点)。

于 2012-02-10T19:29:36.450 回答