3

我们目前正在使用 chef 来配置我们的服务器,并且我们希望我们的食谱/食谱在安装和运行后自动将一些数据添加到 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

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

问题源于我们使用 mongodb::10gen_repo 来安装 mongodb。当 apt-get 安装软件包时配方退出,然后 chef 继续执行更多资源。

我们尝试在 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 chef 脚本并请求功能的人交谈!

4

3 回答 3

8

首先。去掉这个“sleep 60”。这可以由厨师来完成:所有资源都有共同的属性,“重试”和“重试延迟”是其中的一部分。所以最简单的方法是:

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

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

于 2012-09-26T18:59:23.530 回答
1

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

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

通过这种方式,这些食谱可以在您的机器上随时运行。即使有人卸载了 mongodb,厨师也会设法确保它重新设置并保持原始状态。

于 2012-09-22T19:44:12.953 回答
0

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

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

您可以通过尝试调出一个副本集并立即尝试在一个简单的脚本中连接到它来在没有厨师的情况下重新创建它。所以这不是厨师特定的。

不确定是否有解决服务器启动延迟的方法,因为与仅向集合中添加节点相比,启动主节点的情况相对较少。

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

您感兴趣的标志可能是 connectTimeoutMS

于 2012-09-10T21:12:05.887 回答