代码之家  ›  专栏  ›  技术社区  ›  Kevin Keane

保持Tomcat更新的策略?

  •  0
  • Kevin Keane  · 技术社区  · 3 年前

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

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

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

    有没有什么策略可以让Tomcat随时了解最新情况,而很少或根本没有持续的关注?

    更新时间:

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

    要解决这个问题,可以将特定于实例的文件放在一个单独的目录树中,目录树由CATALINA\u BASE变量标识。然后,升级Tomcat变得非常简单:

    • 下载新的tarball。
    • 将其卸载到新位置
    • 查看自述文件和变更日志中是否有任何破坏性的更改。
    • 更新CATALINA\u HOME变量以指向新位置,同时保持CATALINA\u基变量不变。
    • 使用新CATALINA\u HOME bin目录中的脚本重新启动Tomcat。

    我在这里不提供代码,因为您在哪里以及如何设置CATALINA\u主页和CATALINA\u基地将有所不同。我在同样启动Tomcat的服务单元文件中设置了这两个变量。

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

    0 回复  |  直到 3 年前
        1
  •  3
  •   Kevin Keane    3 年前

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

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

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

    答案在于只对实际的Tomcat二进制文件使用CATALINA\u主目录,并将配置放在使用CATALINA\u BASE指定的单独目录中。

    CATALINA\u主目录应该只包含Tomcat tarball的内容,无需修改。您可以根据Tomcat文档删除某些文件,还可以添加某些共享文件,例如Tomcat本机库。

    CATALINA\u基本目录将包含/conf、/webapp、/logs和一些其他目录。

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

    例如,这是我使用的systemd服务单元模板。我把它放进了/etc/system/systems/tomcat@.service

    [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\u BASE的详细说明,请访问Tomcat文档网站。

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

    如何自动查找当前Tomcat版本

    第二个问题是如何找到要下载的Tomcat tarball的正确版本。Apache foundation将在下一个次要版本发布时删除一个次要版本的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 always 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+数字+的序列数字+.+数字。然后,它会丢弃除数字和句点以外的所有内容。

        2
  •  0
  •   SAURABH PANDEY    3 年前
    [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\u you\u previous\u保存了什么 您必须创建此变量并将其保存在如下文件中

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

    包更新后,ansible playbook每次都会更新此最新版本文件。