保持 Tomcat 更新的策略?

问题描述 投票:0回答:4

我维护着许多包含不同应用程序的 RedHat Enterprise Linux(7 台和 8 台)服务器 (>100)。为了保持理智,我当然使用 Ansible 等工具,更重要的是,公共 RPM 存储库的本地镜像副本(为此目的使用 Satellite Server)。

定期从这些存储库应用更新,以确保服务器安全。

其中一些服务器需要安装 Apache Tomcat。据我所知,这是少数几个无法从任何基于 RPM 的存储库中获得的应用程序之一;它必须从 tarball 手动安装。更新也是手动的(由 Ansible 角色辅助,但我仍然必须了解新版本并手动更改它)。

有什么策略可以在很少或没有持续关注的情况下让 Tomcat 保持最新状态吗?

更新:

我找到了解决问题的一半方法。默认情况下,Tomcat 将安装和实例配置混合在由 CATALINA_HOME 标识的单个目录树中。这使得更新 Tomcat 时不会破坏您的配置变得复杂。

为了解决这个问题,您可以将特定于实例的文件放入由 CATALINA_BASE 变量标识的单独目录树中。升级 Tomcat 就变得如此简单:

  • 下载新的 tarball。
  • 将其解压到新位置
  • 查看自述文件和变更日志以了解任何重大更改。
  • 更新 CATALINA_HOME 变量以指向新位置,同时保持 CATALINA_BASE 变量不变。
  • 使用新的 CATALINA_HOME bin 目录中的脚本重新启动 Tomcat。

我不在这里提供代码,因为设置 CATALINA_HOME 和 CATALINA_BASE 的位置和方式会有所不同。我在也启动 Tomcat 的服务单元文件中设置了这两个变量。

仍然开放:寻找一种方法来自动查找 Tomcat 新版本何时发布。

tomcat redhat
4个回答
3
投票

经过大量挖掘,我找到了我需要的答案。我的问题基本上有两个部分:

  • 如何在不破坏现有站点配置的情况下更新 Tomcat。
  • 如何自动查找当前Tomcat版本。

如何在不破坏现有站点配置的情况下更新 Tomcat

答案在于仅将 CATALINA_HOME 目录用于实际的 Tomcat 二进制文件,并将配置放入由 CATALINA_BASE 指定的单独目录中。

CATALINA_HOME 目录应仅包含 Tomcat tarball 的内容,无需修改。您可以根据Tomcat文档删除某些文件,并且您可能想添加某些共享文件,例如tomcat-native库。

CATALINA_BASE 目录将包含 /conf、/webapp、/logs 和其他一些目录。

在启动Tomcat之前,设置并导出这两个环境变量。

作为示例,这是我使用的 systemd 服务单元模板。我将其放入 /etc/system/systems/[电子邮件受保护]

[Unit]
Description=Apache Tomcat Web Application Container for %I
After=syslog.target network.target

[Service]
Type=forking
Environment="CATALINA_HOME={{ usd_tomcat_catalina_home }}" "CATALINA_BASE={{ usd_tomcat_catalina_base }}/%i"
ExecStart=/bin/bash {{ usd_tomcat_catalina_home }}/bin/catalina.sh start
ExecStop=/bin/bash {{ usd_tomcat_catalina_home }}/bin/catalina.sh stop
SuccessExitStatus=126 143
User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target

使用 CATALINA_BASE 的详细说明位于 Tomcat 文档站点。

https://tomcat.apache.org/tomcat-9.0-doc/introduction.html

如何自动查找当前Tomcat版本

第二个问题是如何找到正确版本的 Tomcat tarball 来下载。 Apache 基金会将在发布下一个次要版本时删除一个次要版本的 tarball。

因此,9.0.45 发布后,以下内容就因 404 错误而崩溃。

wget https://mirrors.sonic.net/apache/tomcat/tomcat-9/v9.0.44/bin/apache-tomcat-9.0.44.tar.gz

这个问题之前已经在 Stackoverflow 上得到过解答:How to get all latest link to download tomcat server using shell

TOMCAT_VER=`curl --silent http://mirror.sonic.net/apache/tomcat/tomcat-9/ | grep v9 | awk '{split($5,c,">v") ; split(c[2],d,"/") ; print d[1]}'`
wget https://mirrors.sonic.net/apache/tomcat/tomcat-9/v$TOMCAT_VER/bin/apache-tomcat-${TOMCAT_VER}.tar.gz

我发现 awk 解决方案有点脆弱,因为字段编号可能会移动。使用 sed 做同样的事情:

curl --silent http://mirror.sonic.net/apache/tomcat/tomcat-9/ | grep v9 | sed 's/.*v\([0-9]*\.[0-9]*\.[0-9]*\).*/\1/'

正则表达式正在寻找 v + 数字 + 的序列。 + 数字 + . + 数字。然后它会丢弃除数字和句点之外的所有内容。


0
投票
[rohtash@172 blockinfile]$ cat cron.yml 
- hosts: remote1
  gather_facts: no 
  tasks:
  - name: create file in a min
    cron:
       name: "task"
       minute: "*/1"
       job: "/usr/bin/sh -c 'ansible-playbook update_pkgs.yml'"

在远程服务器上您可以检查

[root@scp ~]# crontab -l
#Ansible: task
*/1 * * * * /usr/bin/sh -c 'ansible-playbook update_pkgs.yml'

cron 模块的作用是,它每分钟都会运行这个剧本。在这个剧本中,您可以使用这样的模块

- include_tasks: yum_install.yml
  when: version != {{ what_you_earlier_saved }}

您可以增加或减少 cron 作业的运行时间(分钟、天、小时、周)。

what_you_earlier_saved 您必须像这样创建并保存在文件中的变量

- shell: rpm -qa|grep python3-pip-wheel > lastversion
- shell: cat lastversion
  register: what_you_earlier_saved

软件包更新后,每次你的ansible playbook都会更新这个最后版本文件。


0
投票

有关新版本的更新,请加入 Tomcat 邮件列表 tomcat-announce。 “该列表用于公布 Tomcat 版本、安全漏洞和其他项目公告。”

https://tomcat.apache.org/lists.html#tomcat-announce


0
投票

聚会迟到了,但我不久前使用了这个:https://github.com/drwetter/automate_tomcat用于 RHEL8 左右的发行版。也应该在其他地方工作。也许有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.