Chef infra 厨师:延迟服务通知

Chef infra 厨师:延迟服务通知,chef-infra,Chef Infra,这是我的mongodb食谱: node.default['mongodb3']['version'] = '3.4.2' node.default['mongodb3']['repo'] = 'https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/' node.default['mongodb3']['config']['mongod']['net']['port'] = 30158 node.defaul

这是我的mongodb食谱:

node.default['mongodb3']['version'] = '3.4.2'
node.default['mongodb3']['repo'] = 'https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/'

node.default['mongodb3']['config']['mongod']['net']['port'] = 30158
node.default['mongodb3']['config']['mongod']['net']['bindIp'] = 'localhost'
node.default['mongodb3']['config']['mongod']['security']['authorization'] = 'enabled'

include_recipe 'mongodb3::default'

cookbook_file "/tmp/setupUsers.js" do
  source "mongo/setupUsers.js"
  mode 0755
end

execute "Add Mongo Users" do
  command "mongo localhost:30158 /tmp/setupUsers.js"
end
如你所见:

  • 我正在安装mongo 3.4和
  • 我正在尝试执行
    mongolocalhost:30158/tmp/setupUsers.js
  • 然而,我从厨师那里得到了以下信息:

    ==> default:   * execute[Add Mongo Users] action run
    ==> default:
    ==> default:     [execute] MongoDB shell version v3.4.2
    ==> default:               connecting to: localhost:30158
    ==> default:               2017-03-06T10:56:56.875+0000 W NETWORK  [thread1] Failed to connect to 127.0.0.1:30158, in(checking socket
    for error after poll), reason: Connection refused
    ==> default:               2017-03-06T10:56:56.879+0000 E QUERY    [thread1] Error: couldn't connect to server localhost:30158, connec
    tion attempt failed :
    ==> default:               connect@src/mongo/shell/mongo.js:237:13
    ==> default:               @(connect):1:6
    ==> default:               exception: connect failed
    ==> default:
    ==> default:     ================================================================================
    ==> default:     Error executing action `run` on resource 'execute[Add Mongo Users]'
    ==> default:     ================================================================================
    ==> default:
    ==> default:     Mixlib::ShellOut::ShellCommandFailed
    ==> default:     ------------------------------------
    ==> default:     Expected process to exit with [0], but received '1'
    ==> default:     ---- Begin output of mongo localhost:30158 /tmp/setupUsers.js ----
    ==> default:     STDOUT: MongoDB shell version v3.4.2
    ==> default:     connecting to: localhost:30158
    ==> default:     2017-03-06T10:56:56.875+0000 W NETWORK  [thread1] Failed to connect to 127.0.0.1:30158, in(checking socket for error
    after poll), reason: Connection refused
    ==> default:     2017-03-06T10:56:56.879+0000 E QUERY    [thread1] Error: couldn't connect to server localhost:30158, connection attem
    pt failed :
    ==> default:     connect@src/mongo/shell/mongo.js:237:13
    ==> default:     @(connect):1:6
    ==> default:     STDERR: exception: connect failed
    ==> default:     ---- End output of mongo localhost:30158 /tmp/setupUsers.js ----
    ==> default:     Ran mongo localhost:30158 /tmp/setupUsers.js returned 1
    ==> default:
    ==> default:     Resource Declaration:
    ==> default:     ---------------------
    ==> default:     # In /var/chef/cache/cookbooks/berk/recipes/security.rb
    ==> default:
    ==> default:       6: execute "Add Mongo Users" do
    ==> default:       7:   command "mongo localhost:30158 /tmp/setupUsers.js"
    ==> default:       8: end
    ==> default:
    ==> default:     Compiled Resource:
    ==> default:     ------------------
    ==> default:     # Declared in /var/chef/cache/cookbooks/berk/recipes/security.rb:6:in `from_file'
    ==> default:
    ==> default:     execute("Add Mongo Users") do
    ==> default:       action [:run]
    ==> default:       retries 0
    ==> default:       retry_delay 2
    ==> default:       default_guard_interpreter :execute
    ==> default:       command "mongo localhost:30158 /tmp/setupUsers.js"
    ==> default:       backup 5
    ==> default:       returns 0
    ==> default:       user nil
    ==> default:       declared_type :execute
    ==> default:       cookbook_name "berk"
    ==> default:       recipe_name "security"
    ==> default:     end
    ==> default:
    ==> default:     Platform:
    ==> default:     ---------
    ==> default:     x86_64-linux
    ==> default:
    
    正如您所看到的,mongod服务似乎还没有运行,但是在输出消息的末尾,chef告诉我正在尝试重新启动延迟的服务通知

    ==> default: [2017-03-06T10:56:56+00:00] INFO: Running queued delayed notifications before re-raising exception
    ==> default: [2017-03-06T10:56:56+00:00] INFO: template[/etc/mongod.conf] sending restart action to service[mongod] (delayed)
    ==> default: Recipe: mongodb3::default
    ==> default:   * service[mongod] action restart
    ==> default: [2017-03-06T10:56:57+00:00] INFO: service[mongod] restarted
    ==> default:
    ==> default:     - restart service service[mongod]
    ==> default: [2017-03-06T10:56:57+00:00] INFO: template[/opt/wildfly/standalone/configuration/standalone-full.xml] sending restart act
    ion to service[wildfly] (delayed)
    
    为什么在配置结束之前不启动此服务?我需要在mongod服务启动后连接到mongo

    我已经看过mongodb3的食谱了。(mongodb3配方的默认配方),服务应立即启动

    编辑

    我用的是mongodb3配方。mongodb3默认配方:

    service 'mongod' do
      case node['platform']
        when 'ubuntu'
          if node['platform_version'].to_f >= 15.04
            provider Chef::Provider::Service::Systemd
          elsif node['platform_version'].to_f >= 14.04
            provider Chef::Provider::Service::Upstart
          end
      end
      supports :start => true, :stop => true, :restart => true, :status => true
      action :enable
      subscribes :restart, "template[#{node['mongodb3']['mongod']['config_file']}]", :delayed
      subscribes :restart, "template[#{node['mongodb3']['config']['mongod']['security']['keyFile']}", :delayed
    end
    

    在你的食谱中,我看不到
    服务[mongod]
    ,但我想你可能有以下几行:

     service 'mongod' do
       action [:enable, :start]
     end
    
    此时,Chef启动服务,但它可能需要一些时间才能完全运行并响应请求。厨师不再等待,而是继续制作食谱

    您可以多次尝试执行[Add Mongo Users],直到成功,如下所示:

    execute "Add Mongo Users" do
      command "mongo localhost:30158 /tmp/setupUsers.js"
      retries 6 #times
      retry_delay 10 #seconds
    end
    
    这将使您的服务在厨师失败之前有一分钟的时间开始

    重要提示:您还应该为执行[Add Mongo Users]的
    设置一些防护措施,否则它将在每次运行时运行

    编辑(在您显示
    服务[mongod]
    资源之后。)

    它没有启动操作,这就是它没有启动的原因。因此,添加

    service 'mongod' do
      action :start
    end
    

    执行[添加Mongo用户]
    资源之前的某个地方。

    谢谢@Draco。我在帖子中添加了
    mongodb3食谱
    default recipe perfums的代码,以便添加一些细节。我觉得在服务开始之前等待有点难看。在启动过程结束之前,有没有办法订阅?为什么mongod服务启动过程延迟到Chef启动结束?您引用的
    服务[mongod]
    只有启用操作,因此它只是确保服务在启动时启动,但不会立即启动。注释(在第137行)显然是错误的。那么,为什么要启动mongod呢?我明白了,它创建一个订阅是为了更改
    模板[#{no...
    。然后重新启动服务。