以健壮的方式自动维护 Linux 配置文件(如 syslog.conf)中的条目

以健壮的方式自动维护 Linux 配置文件(如 syslog.conf)中的条目

有时我想自动将配置添加到 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

相关内容