我似乎根本无法让它工作。我想让 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 就会覆盖该文件。
我的测试是:
- 跑步
puppet agent --test
- 更改文件 (
/etc/sudo
) - 重播
puppet agent --test
(可能与touch site.pp
或service 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
和参数只会让您更清楚地了解实验时输出的去向;您当然可以根据自己的需要对其进行调整logoutput
。exec
答案2
您应该能够通知任何类型,因此您可以通知通知类型。
exec { "foo":
notify => Notify["exec-alert"],
}
notify { "exec-alert":
message => "sudoers has changed"
}
无论如何,文件的改变都会被记录到 Pubpet 日志中,并被标记为改变。