代码之家  ›  专栏  ›  技术社区  ›  bdetweiler

服务器特定配置的自动部署

  •  0
  • bdetweiler  · 技术社区  · 15 年前

    我有一些使用Apache Commons配置的Java项目,它们被部署到多个环境中的多个服务器(dev/test/prod)。

    所有代码都是相同的,但有些配置项会更改,例如jmsurl(dev应该指向dev等)以及服务器名称和环境(我使用这些配置项进行调试)。

    例子:

    <config>
        <!-- environment can be dev|test|prod -->
        <environment>dev</environment>
    
        <serverName>myServer1</serverName>
    
        <jmsUrl>http://my-jms-url-dev1,http://my-jms-url-dev2</jmsUrl>
    </config>
    

    目前,我部署、构建,然后手动编辑文件,以提供特定于服务器的配置。当我将它部署到单独的服务器时,我想要一种自动化的方法,但是我考虑过的所有方法都需要同样的痛苦来设置。

    • ANT-使用SVN检查项目,并使用ANT在每个服务器上构建它。ANT从两个静态文件.server name和.environment读取服务器名和环境,并将特定于服务器的配置复制到通用配置。问题是,我仍然需要为每台服务器创建一个配置文件(我有24台服务器,这可能会增加,所以可伸缩性不好)。

    • SVN-将我的每个项目分支到特定于服务器的分发版。在这里,可伸缩性更差,维护起来就成了一场噩梦。

    有人给我小费吗?

    1 回复  |  直到 15 年前
        1
  •  0
  •   bdetweiler    15 年前

    我想出来了。

    第一步。

    获取主机名:

    <target name="getHostname" description="Stores the current machines hostname in a property named 'hostname'">
        <property environment="env" />
        <condition property="hostname" value="${env.HOSTNAME}">
            <os family="unix" />
        </condition>
    
        <!-- Execute hostname command on Linux systems -->
        <exec executable="hostname"
              osfamily="unix"
              failifexecutionfails="false"
              outputproperty="env.COMPUTERNAME"/>
    
        <!-- On Windows, the hostname is an environment variable -->
        <condition property="hostname" value="${env.COMPUTERNAME}">
            <os family="windows" />
        </condition>
    
        <echo message="${env.COMPUTERNAME}" />
    
    </target>
    

    第二步,创建一个模板文件并用于复制该文件并对其进行查找/替换:

        <copy file="${scripts}/.servername.template"
              tofile="${scripts}/.servername">
            <filterchain>
                <replacetokens>
                    <token key="SERVER_NAME"
                           value="${env.COMPUTERNAME}" />
                </replacetokens>
            </filterchain>
        </copy>
    

    .servername.template文件包含以下字符串:

    @SERVER_NAME@
    

    然后,我使用一个web服务获取一个JSON字符串来告诉我所处的环境。我使用这个任务来处理JSON并获得环境。

    对于这么简单的任务来说,任务相当繁重,但它确实有效!

    推荐文章