2012-09-06 45 views
3

我们目前正在使用厨师来配置我们的服务器,并且我们希望我们的食谱/食谱本在mongo数据库安装并运行后自动添加一些数据。在mongodb启动后获得厨师执行mongodb脚本

这是我们开始遇到问题的地方。我们使用的执行资源来运行蒙戈这样的脚本:

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 

这只是让60秒的命令睡眠运行蒙戈脚本之前。我知道这不是正确方式做到这一点,但它现在的作品。

任何人都可以提出正确的方法来做到这一点?我有一种感觉,我需要与创建mongodb厨师脚本并请求功能的人交谈!

回答

0

所以,我对厨师的了解不多。但是你的问题似乎是,你试图在服务器启动后立即进行连接。因为有一些开销是进入选举主,让所有的服务器状态的等

您可以重新创建无厨师,试图打开

服务器的不是,当你给他们带来了立即可用一个副本集并立即尝试通过一个简单的脚本连接到它。所以这不是厨师特定的。

不知道是否有办法解决服务器启动滞后问题,因为与仅仅向节点添加节点相比,启动主节点预计会是相对罕见的情况。

我看到的唯一可能的解决方案是更清晰的是为配置中形成的连接添加更长的Timeout。你可以找到如何在这里MongoDB的文档中做到这一点:http://www.mongodb.org/display/DOCS/Connections

对你感兴趣的标志可能connectTimeoutMS

+0

好吧,似乎越来越接近我所需要的。我明白,使用connectTimeoutMS参数似乎是一个很好的方法,但我的问题是,我似乎无法连接在mongo交互式shell上使用该连接字符串方法。有任何想法吗? –

+0

您可以显示您运行的命令的输出以及返回消息的内容吗? – ChadsworthIII

1

是很重要的是相同的厨师运行也将安装该软件注入初始配置?构建食谱和食谱的'狡猾'方法是为了防止ide in,以确保它们可以反复运行而不会产生意想不到的结果。

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

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

8

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

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

如果你有超过2-3的地方,在那里你必须运行蒙戈数据库的一些命令,考虑创建LWRP,类似人在这个mongodb cookbook创建。 (特别检查库/ mongodb.rb文件)。您可以隐藏等待服务器响应的逻辑。

+0

为此干杯!我现在就试试看,但我有一种感觉,这将是我们所需要的。一旦我们尝试过,我会接受这个答案。 –