【问题标题】:Chef: Do something when a service is startedChef:在服务启动时做一些事情
【发布时间】:2017-06-05 17:38:56
【问题描述】:

我正面临解决一个新手在开始使用厨师 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

我相信这不是一种优雅的方法。

我的问题是:有没有办法使用通知和订阅来解决它。我已经查看了文档,但我不太清楚如何获取它。

【问题讨论】:

  • 你的JS脚本是幂等的吗? IE。如果运行两次,它会做正确的事吗?

标签: chef-infra


【解决方案1】:

这很简单:

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​​ Chef 代码(在我看来)更类似于“基础设施即代码”的概念。

【讨论】:

  • 谢谢@Navarro。我试过你的方法,我觉得我做错了。我已经编辑了帖子。我真的做错了吗?
  • 我刚刚用 stackoverflow 上的一个新帖子替换了这个帖子版本here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多