AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 491596
Accepted
Karussell
Karussell
Asked: 2013-03-27 12:06:25 +0800 CST2013-03-27 12:06:25 +0800 CST 2013-03-27 12:06:25 +0800 CST

使用 puppet、ansible 或 fabric 滚动更新

  • 772

我有一些带有负载均衡器的码头服务器。现在我想在不停机的情况下更新我的应用程序。当一个码头正在下降并且不再可达时,负载均衡器会自动将其从列表中删除,所以这不是问题。

主要问题是避免停机时间:因此,我必须确保一次只有一个码头重新启动 - 或者确保至少有 N 个码头在线!

目前我正在使用一个简单的 bash 脚本,我需要手动等待一个码头再次联机,然后再重新启动下一个码头等等。

现在 bash 对于这类事情不是很理想,我希望有更适合使整个任务自动化的工具。http://jetty-number-n.com/ping例如,如果第 n 个码头在线,我可以使用一个简单的 ping URL来响应 OK (200)。

我如何解决这个任务以及使用哪种工具?

感谢@ceejayoz,我找到了 ansible的滚动更新。但它仍然不是最佳选择,因为我需要设置一个固定的超时时间。

ssh
  • 5 5 个回答
  • 4956 Views

5 个回答

  • Voted
  1. Best Answer
    ceejayoz
    2013-03-27T13:26:43+08:002013-03-27T13:26:43+08:00

    使用 Ansible 这很容易。粗略的伪ansible剧本:

    ---
      - hosts: your_server_group
        sudo: yes
        serial: 1
        tasks:
          - shell: reboot now
          - wait_for: port=22
    
    • 9
  2. Utah_Dave
    2013-04-05T07:57:38+08:002013-04-05T07:57:38+08:00

    Salt 有一个方便的批处理选项。

    salt -G 'os:RedHat' --batch-size 25% service.restart jetty
    

    一次在 25% 的 RedHat 服务器上重启 jetty 服务。

    salt -N group1 -b 2 system.restart
    

    重新启动预定义的“group1”中的服务器,一次 2 个。

    • 4
  3. Ryan Gibbons
    2013-03-27T12:40:39+08:002013-03-27T12:40:39+08:00

    Puppet 具有Services和Ordering的概念。但是人偶在单个服务器上运行。所以它无法洞察它正在运行的其他系统。

    如果你想使用 puppet,你可以拥有它,这样一个主控服务器就有一个初始化脚本来管理每台服务器的服务。因此 init 脚本将在每台服务器上运行重启并返回状态代码。您可以这样做并链接每个服务,从这台服务器重新启动,然后进行排序、链接或通知并订阅以移动到下一个服务器。

    您还可以为 puppet 编写一个自定义库,它将一个服务器视为主控制服务器,而不是使用 init 脚本。它可以使用自定义的 ruby​​ 库来管理每个服务器的服务。设置起来有点复杂,但可以工作。

    • 1
  4. John
    2013-03-27T12:46:12+08:002013-03-27T12:46:12+08:00

    我现在在工作中使用 Puppet,但正如第一位发帖人所回答的那样,这听起来不像是 Puppet 的理想第一项任务。我无法与 ansible 对话(尽管我想开始尝试)。

    Puppet 更适合同时推出更改/重新启动系统——Puppet 守护进程在每个客户端上运行,并以预定的时间间隔(默认为每半小时)检查中央服务器。如果你想改变默认调度,你通常使用不同的机制来调用 puppet。

    如果您可以同时重新启动,那么重新启动服务就是定义清单的问题

    file { 'your_war_file.war':
        ensure  => file,
        source  => "puppet:///...",
    }
    service { 'jetty':
        subscribe  => File['your_war_file.war'],
        hasrestart => True,
    }
    

    资源指令,然后推出清单并让 Puppet 做它的事情。这假设你可以打电话

    /etc/init.d/jetty restart
    

    这可能会或可能不会被接受甚至可能。

    您还可以为此定义自己的自定义资源类型,这绝对超出了简单的首次木偶任务的范围。

    但是,请查看http://forge.puppetlabs.com/,看看是否有其他人解决了类似的问题。

    • 1
  5. zorlem
    2013-03-28T01:58:08+08:002013-03-28T01:58:08+08:00

    你想做的任务可以使用 ansible 完成,而且绝对可以使用 Puppet 完成。我将专注于如何使用木偶来完成它。

    您可以使用 puppet 将 WAR 文件部署到码头,方法是使用普通的“文件”资源和为每个应用程序初始化的已定义资源。

    Puppet 将从您指定的 URL(在您的 Puppet Master 上)下载。如果 WAR 文件修改时间发生变化,Jetty 能够在不重新启动的情况下重新部署 WAR 文件。因此,如果您的清单在其中创建了一个副本,$JETTY_HOME/webapps那么 Jetty 应该会自动获取它。这样(或通过触摸 context.xml)您不需要手动重新启动 Jetty。

    为了将 WAR 文件从您的 Puppet Master 下载到您的应用程序目录,您需要以下清单(替换 $JETTY_HOME):

    define jetty::deployment($path) {
    
      notice("Deploying ${name} to http://$hostname:${appserver-jetty::port}/"),
      include jetty,
    
      file { "$JETTY_HOME/webapps/${name}.war":
        owner => 'root',
        source => $path,
      }
    }
    

    并且您需要指示您的节点一个接一个地获取应用程序的特定版本(在您确定它已在其中一个节点上成功启动之后)。这可以使用ENC(外部节点分类器)来完成,或者,如果您不使用 ENC,则可以通过修改每个节点(或节点组)的 site.pp 部分来完成:

    node jetty-node1 {
       jetty::deployment { "servlet":
         path => '/srv/application/Servlet-1.2.3.war'
       }
    },
    node jetty-node2 {
       jetty::deployment { "servlet":
         path => '/srv/application/Servlet-2.0.1.war'
       }
    }
    

    include jetty仅当您想使用例如 puppet 管理 Jetty 配置时才需要该行。https://github.com/maestrodev/puppet-jetty并且这个定义的资源需要一个 appserver-jetty::$port 变量。此示例显示了您可以准​​确控制哪个节点提供哪个版本的应用程序的最简单方法。通过这种方式,您可以根据您的健康检查编写部署脚本,并仅在 node1 成功运行新版本后才在 node2 上部署。

    这个例子只是为了演示这个概念。

    您可能想查看这些额外资源以获取更多信息和想法:关于重新加载上下文:https ://stackoverflow.com/questions/13965643/auto-reloading-war-in-jetty-standalone

    这是用于 tomcat 的部署和管理,但思想(和清单)是相似的:http ://www.tomcatexpert.com/blog/2010/04/29/deploying-tomcat-applications-puppet

    这是 IMO 直接复制 WAR 文件的更好替代方案 - 使用本机包(例如 RPM)部署您的应用程序: http ://www.slideshare.net/actionjackx/automated-java-deployments-with-rpm

    • 1

相关问题

  • 如何最好地设置 ssh 隧道以访问远程网络 (Linux)

  • SSH 和重定向

  • 通过 SSH 会话使用 NET USER 命令拒绝访问

  • SSH 服务器零日漏洞利用 - 保护自己的建议

  • ubuntu apt-get upgrade - 如何在 shell 中单击确定?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve