我定期在服务器上安装产品(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 配置文件。
答案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 有助于避免在部署文件后重新设置或恢复。