puppet file_line:删除空格数未知的行

puppet file_line:删除空格数未知的行

我想从 sudoers 中删除一行。只要我给出确切的行,一切都会顺利进行。但在某些机器上,空白处可能会有所不同。即使使用“匹配”,也找不到解决方法。

file_line { '/etc/sudoers':
          ensure => absent,
          path   => '/etc/sudoers',
          line   => 'myuser  ALL=NOPASSWD:/bin/su -', }

有什么想法吗?谢谢 Acki

答案1

我不会ensure => absent在这里使用它,因为它只允许精确匹配。一个简单但有效的解决方法是使用注释(或空)line以及match正则表达式来查找要替换的内容:

file_line { 'sudoers-myuser':
          path   => '/etc/sudoers',
          line   => '# myuser  ALL=NOPASSWD:/bin/su -', 
          match  => 'myuser.*ALL=NOPASSWD:/bin/su.*-',
}

line即使文件中不存在,这也会导致出现问题match,但由于内容是无操作,因此不会出现任何严重问题。小心避开正则表达式特殊字符在线上match

答案2

这是一个有趣的解决方案。

file_line { 'sudoers-myuser':
          ensure => 'absent',
          path   => '/etc/sudoers',
          match  => 'myuser.*ALL=NOPASSWD:/bin/su.*-',
          match_for_absence => true,
}

注意:出于某种原因,如果我们想根据“匹配”删除条目,“replace”必须为假。

解释(我所能提供的最好的解释):

  • file_line 不允许在 line 参数中使用 RegEx,仅允许在 match 参数中使用。
  • 通常情况下,“line”是需要的,但是 match_for_absence 消除了对“line”的需要。
  • 文档状态:
    • match_for_absence(默认为:错误的

      可选值,用于确定当ensure => missing时是否应用match。如果设置为true并且设置了match,则将删除与match匹配的行。

  • 如果需要删除同一 RegEx 的多个匹配项,请添加此参数:
    multiple => true,

更多详情请点击这里:file_line 无法通过正则表达式删除行?

答案3

file_line 是一种“可以”的资源,可以确保文件中出现行,但不能确保文件中不存在行,这就是我完全停止使用它的原因。

如果你确实需要逐个管理这个文件,并且需要确保该行完全消失,那么奥杰阿斯资源将更好地完成它。它相当复杂,但工作确实做得很好。并且应该已经有一个 sudoers 文件的镜头。

洛尼克斯是正确的。你不应该以这种方式管理此文件。它充满危险,这里有怪物。

更喜欢模板和包含文件。

明确地回答你的问题:你不能。file_line 的源代码表明它仅寻找完全匹配——空格和所有内容。

  def destroy
    local_lines = lines
    File.open(resource[:path],'w') do |fh|
      fh.write(local_lines.reject{|l| l.chomp == resource[:line] }.join(''))
    end
  end

答案4

将您的用户信息放入一个新文件中,并将此新文件放在 /etc/sudoers.d 中

请参阅 sudoers 手册页以了解更多详细信息。(主要只是观察 /etc/sudoers.d 中的文件名不能包含“~”或“。”。因此 john_doe 是好的,而 john.doe 是不好的)

这将完全消除您遇到的困难,尝试精确匹配文件中的条目。许多服务都有 ?.d 子目录来简化此操作。(cron.d、sysctl.d、/etc/modprobe.d 等)

相关内容