2017-06-02 76 views
0

我正面临解决一个新手发现5分钟与厨师开始的问题。厨师:做一些服务开始时

较具体来说:

  1. 我希望有一个服务启动。
  2. 当开始做一些事情(执行命令,创建一个文件,...)

目前,我解决了使用此:

service 'mongod' do 
    action :start 
end 

execute "Add Mongo Users" do 
    command "mongo #{host}:#{port} /tmp/mongo.setup.users.js" 
    retries 5 #times 
    retry_delay 10 #seconds 
end 

这不是一种优雅的方式让它工作我相信。

我的问题是:有什么办法来解决它使用通知和订阅。我已经看过文档,但我不知道如何获取它。

+0

你的JS脚本是幂等的吗?即如果运行两次,它会做正确的事情吗? – coderanger

回答

0

它是那么容易,因为:

execute 'foo' do 
    cmd 'bar' 
    subscribes :run, 'service[mongod]', :immediate # or :delayed 
end 

一般情况下,这样notifiessubscribes是:

subscribes|notify, 'resource_type[resource_name]', :timer 

而且,@coderanger说,我会很小心的JavaScript不是幂等的(这意味着它在这种情况下反复创建用户,即使它们已经存在)。

我个人认为,这将是这更优雅的写作your own library,有一个MongoDB driver for Ruby,你可以用它来创建/删除/编辑用户,索引文件......同时保持这一切保持干净你的Ruby里面的厨师代码,(在我看来)是更类似于“基础结构作为代码”的概念。

+0

谢谢@Navarro。我试过你的方法,我认为我做的事情很错。我编辑了这篇文章。我真的做错了吗? – Jordi

+0

我刚刚用一个新的帖子替换了这个帖子版本在stackoverflow [这里](https://stackoverflow.com/questions/44365961/chef-mmake-sure-a-service-is-listennig-on-network) – Jordi