我维护着许多包含不同应用程序的 RedHat Enterprise Linux(7 台和 8 台)服务器 (>100)。为了保持理智,我当然使用 Ansible 等工具,更重要的是,公共 RPM 存储库的本地镜像副本(为此目的使用 Satellite Server)。
定期从这些存储库应用更新,以确保服务器安全。
其中一些服务器需要安装 Apache Tomcat。据我所知,这是少数几个无法从任何基于 RPM 的存储库中获得的应用程序之一;它必须从 tarball 手动安装。更新也是手动的(由 Ansible 角色辅助,但我仍然必须了解新版本并手动更改它)。
有什么策略可以在很少或没有持续关注的情况下让 Tomcat 保持最新状态吗?
更新:
我找到了解决问题的一半方法。默认情况下,Tomcat 将安装和实例配置混合在由 CATALINA_HOME 标识的单个目录树中。这使得更新 Tomcat 时不会破坏您的配置变得复杂。
为了解决这个问题,您可以将特定于实例的文件放入由 CATALINA_BASE 变量标识的单独目录树中。升级 Tomcat 就变得如此简单:
我不在这里提供代码,因为设置 CATALINA_HOME 和 CATALINA_BASE 的位置和方式会有所不同。我在也启动 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 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 + 数字 + 的序列。 + 数字 + . + 数字。然后它会丢弃除数字和句点之外的所有内容。
[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都会更新这个最后版本文件。
有关新版本的更新,请加入 Tomcat 邮件列表 tomcat-announce。 “该列表用于公布 Tomcat 版本、安全漏洞和其他项目公告。”
聚会迟到了,但我不久前使用了这个:https://github.com/drwetter/automate_tomcat用于 RHEL8 左右的发行版。也应该在其他地方工作。也许有帮助。