在mongodb启动后,让Chef执行mongodb脚本

rea*_*ate 3 provisioning mongodb chef-infra

我们目前正在使用厨师配置我们的服务器,我们希望我们的配方/食谱在安装和运行后自动将一些数据添加到mongo数据库.

这是我们开始遇到问题的地方.我们使用执行资源来运行mongo脚本,如下所示:

execute "install-mongodb-config" do
  command "mongo #{node[:mongodb][:mongo_db_host]}/#{node[:mongodb][:mongo_db]} \"#{node[:mongodb][:mongo_add_config_script]}\""
  action :run
end
Run Code Online (Sandbox Code Playgroud)

无论我们尝试什么,这部分配方总是失败!我不会详细介绍我们在这里尝试的所有内容(除非我需要),但我只想说我已经用尽所有订阅的可能性并通知(我认为).

问题源于我们使用mongodb :: 10gen_repo安装mongodb的事实.当apt-get安装包时,配方退出,然后厨师继续执行更多资源.

我们已经尝试在mongodb :: 10gen_repo之后直接执行上面的资源,但似乎mongodb不可用,并且mongo shell无法连接并运行脚本.我们看到的错误有点像这样:

MongoDB shell version: 2.0.2
Thu Sep  6 18:40:45 ReferenceError: setTimeout is not defined mongotest.js:2
failed to load: mongoAddConfig.js
Run Code Online (Sandbox Code Playgroud)

我们没有尝试过的任何东西能够以一种不错的厨师方式解决这个问题.我们采取的措施是用以下内容替换执行资源:

execute "install-mongodb-config" do
  command "sleep 60; mongo #{node[:mongodb][:mongo_db_host]}/#{node[:mongodb][:mongo_db]} \"#{node[:mongodb][:mongo_add_config_script]}\""
  action :run
end
Run Code Online (Sandbox Code Playgroud)

这只是让命令在mongo脚本运行之前休眠60秒.我知道这不是正确的方法,但它现在有效.

任何人都可以建议正确的方法吗?我有一种感觉,我需要与创建mongodb主厨脚本并请求功能的人交谈!

Dra*_*ter 8

首先.删除这个"睡60".这可以由厨师完成:所有资源都有共同的属性,"retries"和"retry_delay"是其中的一部分.所以最简单的方法是:

execute "install-mongodb-config" do
  command "mongo some_command"
  action :run
  retries 6
  retry_delay 10
end
Run Code Online (Sandbox Code Playgroud)

如果你有超过2-3个位置,你必须在mongo数据库上运行一些命令,考虑创建LWRP,类似于在这个mongodb cookbook中创建的LWRP .(特别检查libraries/mongodb.rb文件).您可以隐藏等待服务器响应的逻辑.