Заставьте Chef выполнить скрипт mongodb после запуска mongodb
В настоящее время мы используем 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 устанавливает пакет, а затем chef продолжает выполнение дополнительных ресурсов.
Мы попытались выполнить указанный выше ресурс непосредственно после mongodb::10gen_repo, но не похоже, что mongodb доступен и оболочка mongo не может подключиться и запустить скрипт. Ошибка, которую мы видим, выглядит примерно так:
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 следующим:
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, и запросить функцию!
3 ответа
Прежде всего. Уберите этот "сон 60". Это может сделать шеф-повар: все ресурсы имеют общие атрибуты, и "retry" и "retry_delay" являются их частью. Так что самый простой способ будет:
execute "install-mongodb-config" do
command "mongo some_command"
action :run
retries 6
retry_delay 10
end
Если у вас есть более 2-3 мест, где вам нужно выполнить какую-либо команду в базе данных mongo, рассмотрите возможность создания LWRP, аналогичного тому, который был создан в этой кулинарной книге mongodb. (В частности, проверьте файл library /mongodb.rb). Вы можете скрыть логику, которая ожидает ответа сервера.
Важно ли, чтобы тот же прогон Chef, который устанавливает программное обеспечение, также вводил начальную конфигурацию? Метод "chefly" для создания кулинарных книг и рецептов заключается в защите от идемпотентности, чтобы гарантировать, что их можно запускать снова и снова без непредвиденных результатов.
В этом конкретном случае я бы ограничил первый рецепт только установкой и запуском mongodb. Этот рецепт ничего не даст, если увидит, что mongodb уже работает на хосте. Тогда у меня был бы другой рецепт, который запустился бы, только если бы он увидел, что монго настроено и работает. Он запросит у mongodb, была ли начальная конфигурация выполнена. Если это так, он просто вернется. Если нет, он запустит вашу процедуру настройки.
Таким образом, эти рецепты могут запускаться постоянно на вашем компьютере. Даже если кто-то удалит mongodb, шеф-повар найдет способ восстановить его и восстановить его.
Так что я не знаю много о шеф-поваре. Но, похоже, ваша проблема в том, что вы пытаетесь подключиться сразу после запуска сервера.
Серверы не сразу доступны, когда вы вызываете их, так как есть некоторые накладные расходы, связанные с выбором основного, получением всех состояний сервера и т. Д.
Вы можете воссоздать это без шеф-повара, пытаясь вызвать набор реплик и немедленно пытаясь подключиться к нему с помощью простого сценария. Так что это не от шеф-повара.
Не уверен, существует ли способ обойти задержку запуска сервера, поскольку ожидается, что создание первичного сервера будет относительно редким явлением по сравнению с простым добавлением узлов в набор.
Единственное потенциальное решение, которое я вижу, которое является более чистым, - это добавление более длительного тайм-аута для соединения, которое будет сформировано в конфигурации. Вы можете найти, как это сделать, в документации mongodb здесь: http://www.mongodb.org/display/DOCS/Connections
Интересующий вас флаг, скорее всего, connectTimeoutMS