我有一个条目可能会或可能不会出现在/etc/rsyslog.conf
:
# Added for Kiwi
*.err;*.emerg;*.alert;*.warning;*.debug;*.notice;*.crit;*.info @10.19.24.50
由于其中一些服务器会手动输入此内容,因此我不能假设空白是统一的(并且在我发现的至少两台服务器上它确实有所不同)。我正在尝试编写一个木偶模块来删除这些行。
该模块的相关部分:
file_line {'remove_kiwi_comment':
ensure => absent,
path => $confFile,
match => "^#.*Kiwi$",
line => "# Added for Kiwi",
match_for_absence => true,
}
file_line {'remove_kiwi_forward2':
ensure => absent,
match_for_absence => true,
path => $confFile,
match => '^.*50$',
line => '*.err;*.emerg;*.alert;*.warning;*.debug;*.notice;*.crit;*.info @10.19.24.50',
notify => Service[$serviceName],
}
上面的代码成功地从其中一台 DEV 服务器中删除了注释,但实际的重定向似乎并未被删除。我已经尝试过使用正则表达式,match=>
但没有成功,我不确定还有什么可以尝试让它删除该行。如果我添加足够的空格,它将删除它,但我不希望我的模块假定任何数量的空格,只是为了加载而存在一定数量的空格rsyslog
。
Stdlib模块版本是4.11,master是3.3,该服务器的客户端节点是3.6
答案1
该file_line
类型有一个应该适合您的 after 选项。唯一的问题是您需要确保在评论之前删除规则。
file_line {'remove_kiwi_comment':
ensure => absent,
path => $confFile,
match => '^#.*Kiwi$',
line => '# Added for Kiwi',
match_for_absence => true,
}
file_line {'remove_kiwi_forward2':
ensure => absent,
path => $confFile,
line => '# Added for Kiwi',
after => '^#.*Kiwi$',
before => File_line['remove_kiwi_comment'],
notify => Service[$serviceName],
}
如果您不能相信注释会在文件中,我能想到的最简单的解决方案是使用exec
with sed
。
exec { 'remove-kiwi-rsyslog-line-with-sed':
command => "sed -i '/@10\.19\.24\.50$/d' $confFile",
path => '/usr/bin:/bin',
onlyif => "grep -q '@10.19.24.50$' $confFile",
}
仅当文件中包含 IP 地址 10.19.24.50 时,才会运行 exec。
答案2
要删除重定向线,请尝试使用这个,
file_line {'remove_kiwi_forward2': 确保=>缺席, match_for_absence => true, 路径 => $confFile, 匹配 => '^.*50$', line => '\*.err;\*.emerg;\*.alert;\*.warning;\*.debug;\*.notice;\*.crit;\*.info.*@10.19.24.50' , 通知=>服务[$serviceName], }
答案3
经过更多研究后,我发现这file_line
或多或少是对非侵入性配置文件管理的最大努力。还有很多人提出与我类似的抱怨。普遍的共识似乎是file_line
当您想要易于阅读的 puppet 模块时使用,但在出现麻烦的第一个迹象时就放弃它并开始使用 Augeas 来处理其他所有事情
我的临时木偶模块的最终版本:
class kiwiprep {
if ($::syslogng == "ABSENT"){
case $::operatingsystemmajrelease {
/^5/: {
$serviceName="syslog"
$confFile="/etc/syslog.conf"
}
/^(6|7)/: {
$serviceName="rsyslog"
$confFile="/etc/rsyslog.conf"
}
default:{
fail("Platform Not Supported")
}
}
service {$serviceName:
ensure => running,
enable => true,
}
file_line {'remove_kiwi_comment':
ensure => absent,
path => $confFile,
match => "^#.*Kiwi$",
line => "# Added for Kiwi",
match_for_absence => true,
}
augeas {"kiwi forwarder 1":
context => "/files$confFile",
changes => ["rm *[descendant::hostname = '10.19.24.50']"],
}
augeas {"kiwi forwarder 2":
context => "/files$confFile",
changes => ["rm *[descendant::hostname = '10.18.104.50']"],
}
}
}
(您会注意到这是 RHEL 特定的,需要针对 SUSE 或 Debian 进行更改)
正如您所看到的,我的最终模块保留了file_line
评论,这对我来说效果很好。然后我恢复删除任何具有名为其值与我的转发器之一相同的augeas
后代的顶级对象。hostname
在清理环境方面,这个模块对我来说非常完美。file_line
现在我已经清理了旧转发器,然后我将返回使用将新转发器添加到位。