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

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

我定期在服务器上安装产品(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/

是否有规范的方法来执行此配置?

  • 有什么方法可以对目录执行“覆盖”吗?
  • 我尝试过 git,但是 git 不擅长移动文件。
  • 我尝试编写一个脚本,但它不能包含在一个文件中,因为我需要补丁文件。如果我们要这样做,有没有办法编写一个包含补丁的 bash 脚本,这样它就是独立的?
  • 所有系统管理员每次都只是编写一个临时脚本,使用“patch”和“move”来编辑文件吗?难道没有更好的工具吗?

谢谢

答案1

puppet、chef、ansible 等配置管理工具是现代系统管理员的首选工具。

答案2

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

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

我个人曾经用它来修改 Tomcat 配置文件。

http://docs.ansible.com/playbooks_intro.html

答案3

我将配置文件放在 Mercurial 存储库中(Git 也可以这样做),并用指向这些文件的符号链接替换原始配置文件。这样我就不必移动它们了。我使用一个小的 shell 脚本来维护符号链接,这样升级后,我只需重新运行这个脚本即可。

举个例子,假设我想修改 Tomcat 的server.xml

一次性设置

首先,我将原始文件复制server.xml到我的 Mercurial 配置存储库。然后,在我的 shell 脚本中,我添加以下命令来删除原始文件server.xml并将其替换为存储库内文件的符号链接,例如:

# 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

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

sudo /home/admin/config/setupLinks.sh

升级后

升级后,我只需重新运行setupLinks.sh以替换任何被覆盖的符号链接。就是这样。

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

我没有提到移动 jar 文件,但只需在 shell 脚本中添加几行代码即可轻松完成。您还可以创建指向 jar 文件的符号链接。

答案4

使用 dist-trick

为了避免覆盖配置文件,您可以使用“dist-trick”:使用 *.dist 文件(例如 config.xml.dist)作为发行版中的默认配置文件。“dist”代表发行版文件。然后将此 .dist 文件复制到非发行版文件(config.xml)。这样,您的配置文件就再也不会被覆盖了。例如,当使用 git、ftp、scp 或任何其他机制将文件带到生产机器时,这种方法非常有效。

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

相关内容