有时我想自动将配置添加到 conf 文件中,以便以后可以通过脚本删除,例如,我想暂时让 10 个主机记录到远程 syslog 服务器。因此,我在脚本中做了类似的事情;
##some other commands
echo "kern.* @syslog.server.local" >> /etc/syslog.conf
service syslogd restart
然而,我经常会更新一些其他命令并再次运行脚本。显然这不是幂等的,如果没有一些 grep/delete jiggerpokery,我就无法重新应用它,也无法轻易删除它。
所以我开始做这样的事情;
cat <<HEREDOC >>/etc/syslog.conf
###some unique string###
echo "kern.* @syslog.server.local"
###end some unique string###
HEREDOC
这使我能够做到这一点,使操作可重复......
sed -e 's/###some unique string###(*)###end some unique string###/replacement/g' /tmp/syslog.conf > /tmp/syslog.conf
cat <<HEREDOC >>$dfile
###some unique string###
echo "kecrn.* @syslog.server.local"
###end some unique string###
HEREDOC
然而这一切似乎有点太多了……
(显然 /etc/httpd/conf.d/someconffile.conf 安排已经为较新的软件包解决了这个问题)
有没有更简单的方法可以做到这一点?
使用这种方法时我应该注意什么?
答案1
我曾使用 SVN 来实现这一点。假设
- 每个主机都有一个 svn 存储库: http://svn.localnet/thishost/并且您想要开始对‘thishost’上的真实 /etc/syslog.conf 进行一些奇怪的更改。
- 您已经在 /configs/ 中本地签出了此主机的配置存储库
开始管理此文件的配置
cp /etc/syslog.conf /configs/etc/
svn add /configs/etc/syslog.conf
svn commit -m "Managing syslog.conf"
通过脚本进行更改
#echo some stuff into the file.. no need for extra markup/metadata
cp /etc/syslog.conf /configs/etc/
svn commit -m "I added some junk temporarily"
service syslogd restart
现在您可以回滚到上一个版本。如果在添加和回滚之间,您进行了其他永久性更改,则可以使用 svn 获取版本之间的差异,并将内容合并在一起。
当然,用 git 或任何你喜欢的替代版本控制。还可以制作一些永久脚本来减少出错的机会,比如一个 bash 函数,它根据路径将文件 cp 到你签出的存储库中,以提交注释作为参数。或者其他什么。
你有一个配置存储库svn:///配置/其中包含等/syslog.conf,并且您知道存储库中最新的内容与文件系统上的实时配置文件相同:
答案2
作为部署 puppet 项目的一部分,我发现了 augeas; http://augeas.net/
这是一个配置文件管理工具。
答案3
sed
通常不会这样做。您可以这样做:
read -d '' -r replacement<<HEREDOC
###some unique string###
echo "kecrn.* @syslog.server.local"
###end some unique string###
HEREDOC
sed -e "/beginmark/i\beginmark\n$replacement\nendmark" -e '/beginmark/,/endmark/d'` filename
您也无法重定向到同一个文件。它将首先截断文件,然后sed
在其上运行(现在为空)。您必须使用临时文件或使用--in-place
(或-i
) 选项:
sed -i 'sed commands' filename
或者
sed 'sed commands' filename > tmpfile
mv tmpfile filename