Puppet 不会忽略空格

Puppet 不会忽略空格

我有一个条目可能会或可能不会出现在/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],
}

如果您不能相信注释会在文件中,我能想到的最简单的解决方案是使用execwith 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现在我已经清理了旧转发器,然后我将返回使用将新转发器添加到位。

相关内容