如果不满足特定条件,有没有办法中止厨师 - 客户运行?

时间:2012-02-10 01:13:10

标签: chef chef-recipe

考虑一个简单的应用服务器/数据库服务器设置。您希望在应用服务器上设置一些值,告诉它数据库服务器的位置,并且您希望在数据库服务器上设置一些权限以仅允许来自应用服务器的连接。

搜索(:node,“role:db-server”)

搜索(:node,“role:app-server”)

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

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

1 个答案:

答案 0 :(得分:2)

想出来。我相信这可以做得更优雅,但这是基础知识。考虑到你有一个文件/etc/test.txt,一旦它出现并且自己注册了自己的数据库,就必须从你的数据库服务器填充一些信息,你可以为你的app-server节点的配方执行以下操作:

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_server [0]将导致配方失败(我相信通过在not_if部分中添加并检查搜索结果的长度可以使其更加明确。)