如何维护服务器上的configuration文件?

我经常在我的服务器上安装一个产品(Atlassian Confluence,这是Tomcat +几个文件)。 对于每次升级,解压缩tar.gz后,我需要更改以下文件:

  • conf / server.xml – >添加JNDI声明并更改端口
  • confluence / WEB-INF / classes / confluence-init.properties – >更改一个属性
  • confluence / WEB-INF / web.xml – >需要HTTPS
  • confluence / WEB-INF / classes / log4j.properties – >更改日志级别
  • 将activation.jar和mail.jar从confluence / WEB-INF / libs移动到lib /
  • 添加postgres.jar到lib /

有没有规范的方式来执行此configuration?

  • 任何方式执行“覆盖”到目录?
  • 我试过git,但git不擅长移动文件。
  • 我试过编写脚本,但不能包含在1个文件中,因为我需要修补程序文件。 如果我们这样做,是否有办法写一个包含补丁的bash脚本,所以它是独立的?
  • 是否所有的系统pipe理员每次只是写一个特别的脚本,使用“补丁”和“移动”来编辑文件? 没有更好的工具吗?

谢谢

像木偶一样的configurationpipe理工具。 厨师,厨师等是现代系统pipe理员的首选工具。

创build一个Ansible的手册来安装tar和后续的自定义。 然后针对目标主机运行该手册。

Ansible提供了易于使用的模块,用于修改文件内容,复制文件,从模板创build新文件,pipe理服务等。

我个人用它来修改例如Tomcatconfiguration文件。

请参阅http://docs.ansible.com/playbooks_intro.html

我把我的configuration文件在一个Mercurial存储库(Git也会这样做),我用符号链接replace原来的configuration文件到这些文件。 这样我不必移动它们。 我使用一个小的shell脚本来维护这个符号链接,这样在升级之后,我只需要重新运行这个脚本。

让我举个例子。 假设我想对Tomcat的server.xml进行更改。

一次设置

首先,我将原始的server.xml复制到我的Mercurialconfiguration库中。 然后在我的shell脚本中,添加这些命令来删除原始的server.xml ,并将其replace为符号链接到存储库中的文件,例如:

 # The location of my Mercurial config repository CONFIG=/home/admin/config rm -f /etc/tomcat7/server.xml ln -s $CONFIG/tomcat/server.xml /etc/tomcat7/server.xml 

接下来,我第一次运行脚本,testing它并创build符号链接。 我调用setupLinks.sh脚本,它位于我的Mercurial存储库的根目录下。

 sudo /home/admin/config/setupLinks.sh 

升级后

升级之后,我只需要重新运行setupLinks.sh来replace任何被覆盖的符号链接。 而已。

我发现把我的configuration文件放在源代码库中非常有用。 这样我可以跟踪更改并从上游存储库中提取新的configuration。 我使用命名分支环境特定的configuration,例如我有一个dev分支和prod分支。

我没有提到任何有关移动jar文件的内容,但是可以通过在shell脚本中添加几行来轻松完成。 您也可以创build符号链接到jar文件。

使用dist-trick

为了避免覆盖你的configuration文件,你可以使用“dist-trick”:使用* .dist文件(例如config.xml.dist)作为发行版的默认configuration文件。 “dist”代表分配文件。 然后将这个.dist文件复制到不是分布的一部分的非dist文件(config.xml)。 而且,你的configuration文件不会再被覆盖。 例如,当使用git,ftp,scp或任何其他机制将文件传送到生产机器时,这种方式非常有效。

dist-trick有助于避免在部署文件后重新设置或恢复事物。