【问题标题】:chef deploy start service and restart service in sequencechef 按顺序部署启动服务和重启服务
【发布时间】:2014-03-26 03:49:17
【问题描述】:

我正在阅读https://serverfault.com/questions/378520/chef-stop-and-start-service-in-sequence 并想询问不同的程序。

第 1 步:框架引导到 jboss 服务

bash "bootstrap application" do
    code <<-EOF
    ant bootstrap
    EOF
end

第2步:然后启动jboss

service "jboss" do
    action :start
end

第 3 步:安装应用程序

bash "install application" do
    code <<-EOF
    ant install
    EOF
end

在第 2 步和第 3 步之间,ant install 会返回错误,因为 jboss 尚未启动。但第二次运行成功。显然第 3 步不知道 jboss 是否已经启动。

如何在厨师身上做到这一点?

【问题讨论】:

  • 你能把输出粘贴到某个地方吗?该服务应该在第 2 步之后运行
  • 可能在执行第 3 步时 JBoss 还没有来得及出现。在这种情况下,服务将在技术上启动,但 JBoss 不会监听请求。您必须想出一种方法来监控 JBoss 的服务端口或其日志,以确保第 3 步仅在 JBoss 实际启动后运行。
  • 如果是时间问题,那么一个简单的解决方案是在“安装”目标中添加“等待”语句:ant.apache.org/manual/Tasks/waitfor.html
  • 我给了答案here。这里的一个关键问题是,即使启动了服务 jboss,你也不知道 jboss 是否启动成功。这需要时间。所以你最好改进你的ant目标重试或使用bash[install application]资源中的retries属性
  • @MarkO'Connor build.xml 是从外部包动态生成的,我不能这样做。虽然它更简单。

标签: chef-infra chef-recipe chef-solo


【解决方案1】:

好的,我已经从 ruby​​_block 完成了这个

# for managing service
# jboss block until operational
ruby_block "block_until_operational" do
  block do
    until IO.popen("netstat -lnt").entries.select { |entry|
        entry.split[3] =~ /:#{node[:jboss][:default_port]}$/
      }.size == 1   
      Chef::Log.debug "service[jboss] not listening on port #{node[:jboss][:default_port]}"
      sleep 1
    end
  end
  action :nothing
end

我创建了这个 ruby​​ 块,它会监听端口 8080 直到它返回 1(开始) 并通过

调用它
service "jboss" do
    action :start
    notifies :create, 'ruby_block[block_until_operational]', :immediate
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 2020-08-11
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多