如何将Weblogic的config.xml迁移到多台机器?

时间:2009-10-01 13:27:50

标签: integration weblogic configuration-files weblogic-10.x

我们的开发团队开发了一个在Weblogic 10.3上运行的J2EE应用程序。每台开发机器都运行自己的Weblogic 10.3应用服务器副本。开发环境的Weblogic域最初是在一台机器上创建的,然后使用Weblogic的配置工具(bea10 / wlserver_10.3 / common / bin / config.cmd)复制到所有机器上。

每台开发机器都有自己的config.xml副本。此文件中的所有密码短语(JDBC数据源的密码等)都是加密的,加密显然在每台计算机上使用不同的种子,因为相同的密码在不同的计算机上具有不同的加密形式。

问题是每隔一段时间就需要更新config.xml(例如添加新EJB时),并且需要在所有计算机上应用更新。我们该怎么做呢?如果我们只是将文件放在CVS中并从那里更新其他机器,则每台机器上的加密密码都会被覆盖。当服务器尝试解密最初在另一台机器上加密的密码短语时,这会导致难以辨认的paddingexceptions。

是否存在ant任务(我找不到)或类似的机制,可以在不覆盖加密密码的情况下正确合并config.xml中的更改?或者是否可以以某种方式指定明文中的密码并在第一次启动时加密它们(我有一个微弱的回忆,这在以前的版本中是可能的,但在10.3中没有)。

开发Weblogic的开发团队如何处理这个问题?

BR,

马尔科

4 个答案:

答案 0 :(得分:6)

  

[...]每台开发机器都有自己的   config.xml的副本。一切   密码(用于JDBC的密码)   数据源等)在这个文件中   加密...

是的,WebLogic Server会加密存储在其域配置XML文件中的所有纯文本密码。这是为了防止访问敏感信息。使用管理控制台或脚本工具输入密码时,它会在存储到配置XML文件之前自动加密。

  

...和加密   显然使用了不同的种子   每台机器自密码相同   有不同的加密形式   不同的机器。

关于encrypt实用程序(来自Oracle WebLogic Server Java实用程序),文档说:

  

weblogic.security.Encrypt加密用于WebLogic Server的明文字符串。该实用程序使用当前目录的加密服务或指定WebLogic Server域根目录的加密服务。

     

注意:加密字符串必须已由将在其中使用的加密服务加密到WebLogic Server域中。如果没有,服务器将无法解密该字符串。

文档中没有提到这一点,但是,AFAIK,Weblogic使用域的密码salt文件(SerializedSystemIni.dat)来加密明文字符串。

  

[...]如果我们只是将文件放在CVS中并从那里更新其他机器,那么每台机器上的加密密码都会被覆盖。

您可以选择在VCS中存储的config.xml中使用明文密码(如果这不是问题)。实际上,在WebLogic Server 9.0之前,密码将在后续重新启动期间加密。从WebLogic Server 9.0开始,仅在开发域中“完全”支持在配置文件中使用明文密码,并且Weblogic不会重新加密密码。在这两种情况下,这将允许人们检查配置文件而没有麻烦。

  

是否存在ant任务(我找不到)或类似的机制,可以在不覆盖加密密码的情况下正确合并config.xml中的更改?...

我不确定这会直接回答您的问题,但Oracle WebLogic Server为其大部分(如果不是全部)Java Utilities提供了Ant tasks。也许你会在那里找到有用的东西(查看Configuring a WebLogic Server Domain Using the wlconfig Ant Task

  

或者是否有可能以明文方式指定明文密码并在第一次启动时加密它们(我有一个微弱的回忆,这在以前的版本中是可能的,但在10.3中却没有。)

正如我上面所写,这是Weblogic Server 9.0之前的“默认”行为。我不知道你是否可以为以后的版本强制执行此行为。当然,你总是可以使用ant和encrypt来做,但老实说,如果你允许人们一次看到明文密码,我真的没有看到在事实之后加密它们的重点。

答案 1 :(得分:1)

我会使用类似mercurial或git的东西,并使用导出/导入功能,以便更改在差异中移动,而不是在完整文件中移动。

Short instructions

好吧,如果你被CVS困住(对不起,我在某种程度上分担你的痛苦),你可以考虑创建一个差异的CVS回购。例如。当一个新版本的配置文件被创建时,新文件被扩散到旧文件,diff文件被添加到repo,其他主机从cvs签出并修补配置文件。

这是一个黑客,但应该工作。

答案 2 :(得分:1)

就个人而言,我会研究WLST进行大规模域名更新。即使您没有使用python或WLST

的经验,它也非常简单
  1. 开启域名(管理员界面)
  2. 的录制
  3. 在一个域(管理员网络界面)上进行更改
  4. 激活更改(管理员界面)
  5. 你应该在你的默认域名文件夹中获得一个python脚本
  6. 适用于每个环境
    1. 使用WLST连接到管理服务器
    2. 应用您的脚本
    3. 根据需要重新启动域或托管服务器
  7. 目前我工作的公司与你描述的公司做了类似的事情 - 浏览weblogic域文件,然后通过小调整将相同的文件部署到我们所有的环境中。多年来,我们最终陷入了绝对的混乱局面。这不是要走的路。

答案 3 :(得分:1)

我们使用WLST做到了。我们在python中使用某种简单的声明性“域模型”,这是相当抽象的(即,它没有指定集群中不同服务器的配置,在我们的环境中,所有节点必须相同)。这个模型很短(2-3页用于拥有30多个连接池的大型应用程序,一堆JMS和一些外部JMS提供程序)。之后,我们有2个脚本:首先在目标环境中创建一个空域,第二个应用域模型。为了收集开发人员在“主”环境中所做的更改,我们有一个脚本通过域配置并输出模型文件。在这些模型文件上使用差异,我们可以看到发生了哪些变化。

这看起来像一个重量级的框架,但是当我们必须为100多个应用程序管理开发,测试,登台和生产环境时,它确实节省了大量时间。

对于较小的情况,只需复制文件并使用相同的SerializedSystemIni.dat即可。只需确保您的域名保持不变,请调整地址/端口。 如果你想使用不同的SerializedSystemInit.dat,那么基于这段代码(http://gustlik.wordpress.com/2008/08/06/decryption-of-configuration-passwords-in-weblogic/)也很容易做到这一点很容易编写一个实用工具,用原始的SerializedSystemIni.dat解码密码并编码用一个新的。这应该可以解决问题。