文件资源的 Puppet 审计不起作用

文件资源的 Puppet 审计不起作用

我似乎根本无法让它工作。我想让 puppet 发送一条日志消息,该消息在文件更改时显示在报告中。从我听到和读到的内容来看,这似乎很简单,但根本不起作用。

这是 init.pp 文件:

# sudo init.pp

# 21 Sep 2011: Changed to test for notification only

class sudo {
    package { 'sudo':
        ensure  => present,
        before  => File['/etc/sudoers'],
    }

    file { '/etc/sudoers':
        ensure  => file,
        mode    => 440,
        owner   => root,
        group   => root,
        source  => 'puppet:///modules/sudo/sudoers',
        replace => false,
        audit   => content,
    }

#   exec { "/bin/date":
#       cwd => "/tmp",
#       subscribe => File['/etc/sudoers'],
#       refreshonly => true,
#   }

#   notify { "sudoers has been changed.":
#       refreshonly => true,
#   }
}

如果我添加exec,什么也不会发生。如果我添加notify,它会抱怨refreshonly参数。

如果我删除该文件的所有选项(除)audit,则文件权限将从 440 更改为 644。

如果我删除,replace那么 puppet 就会覆盖该文件。

我的测试是:

  1. 跑步puppet agent --test
  2. 更改文件 ( /etc/sudo)
  3. 重播puppet agent --test(可能与touch site.ppservice apache2 reload首次)

我还没看到任何来自的消息audit。我在 Ubuntu Lucid Lynx 服务器 10.04 上运行 puppet v2.6.3。

答案1

是的,这是非常有可能的。你需要使用“通知”元参数,它将告诉file资源在触发时促使另一个资源运行。有些资源类型关心是否收到通知(在文档中为“刷新”);service资源exec是最有用的。然后,您可以构建一个exec资源,将refreshonly => true其写入日志或标准输出。

我会像这样实现上述配置:

class sudo {
    package { 'sudo':
        ensure  => present,
        before  => File['/etc/sudoers'],
    }

    file { '/etc/sudoers':
        ensure  => file,
        mode    => 440,
        owner   => root,
        group   => root,
        source  => 'puppet:///modules/sudo/sudoers',
        replace => false,
        notify  => Exec["sudoers_changed"],
    }

    exec { "sudoers_changed":
       command => "/bin/echo '/etc/sudoers has changed...'",
       refreshonly => true,
       loglevel => "alert",
       logoutput => true,
   }
}

loglevel和参数只会让您更清楚地了解实验时输出的去向;您当然可以根据自己的需要对其进行调整logoutputexec

答案2

您应该能够通知任何类型,因此您可以通知通知类型。

exec { "foo":
  notify => Notify["exec-alert"],
}

notify { "exec-alert":
  message => "sudoers has changed"
}

无论如何,文件的改变都会被记录到 Pubpet 日志中,并被标记为改变。

相关内容