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

时间:2012-09-06 19:02:05

标签: mongodb provisioning chef

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

这是我们开始遇到问题的地方。我们使用 execute 资源来运行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

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

问题源于我们使用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

我们没有尝试过以漂亮的厨师方式解决这个问题。我们使用的是用以下内容替换执行资源:

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

这使得命令在mongo脚本运行之前休眠60秒。我知道这不是正确的方式,但它现在有效。

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

3 个答案:

答案 0 :(得分:8)

首先。删除这个“睡60”。这可以由厨师完成:所有资源都有common attributes和“重试”,“retry_delay”是其中的一部分。所以最简单的方法是:

execute "install-mongodb-config" do
  command "mongo some_command"
  action :run
  retries 6
  retry_delay 10
end

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

答案 1 :(得分:1)

同样的Chef运行安装软件是否也注入初始配置是否重要?构建食谱和食谱的“主厨”方法是防止幂等性,以确保它们可以反复运行而不会产生意想不到的结果。

在这种特殊情况下,我会将第一个配方限制为仅安装和启动mongodb。如果它看到mongodb已经在主机上运行,​​那么这个配方什么都不会做。然后,我有另一个配方只有在看到mongo已经设置并且正在运行时才能运行。它会查询mongodb以查看初始配置是否已完成。如果是这样,它只会返回。如果没有,它将运行您的配置例程。

通过这种方式,这些食谱可以随时随地在您的机器上运行。即使有人卸载了mongodb,厨师也会帮助确保它再次恢复原状。

答案 2 :(得分:0)

所以,我对厨师一无所知。但是你的问题似乎是你试图在启动服务器后立即连接。

当您启动服务器时,它们不会立即可用,因为选择主服务器会产生一些开销,获得所有服务器状态等等。

您可以通过尝试调出副本集并立即尝试使用简单脚本连接到副本来重新创建此主菜。所以它不是厨师特定的。

不确定是否存在绕服务器启动延迟的方法,因为与仅添加节点相比,启动主节点相对不常发生。

我看到的唯一可能的解决方案是为配置中形成的连接添加更长的超时时间。您可以在mongodb文档中找到如何执行此操作:http://www.mongodb.org/display/DOCS/Connections

您感兴趣的标志很可能是connectTimeoutMS