我想根据文件更新运行 puppet exec-resource。例如:
File { '/tmp/foo.bar':
audit => content,
} ~>
exec { 'deployment':
command => 'do_something_meaningful.sh',
}
但是每次 puppet-apply-run 时都会执行此操作。即使文件没有更改。所以我尝试了 exec-attribute refreshonly
。但是有了这个,exec 不会在第一次 puppet-apply 上执行。我认为这是因为还没有 md5-checksum state.yml
。从第二次运行开始,它就运行良好了。
我当前的解决方法是这样的:
File { '/tmp/foo.bar':
audit => content,
}
exec { 'deployment_on_change':
command => 'do_something_meaningful.sh',
refreshonly => true,
subscribe => File['/tmp/foo.bar']
}
exec {'deployment_on_first_run':
command => 'do_something_meaningful.sh',
onlyif => 'test ! -f marker.file',
subscribe => File['/tmp/foo.bar']
} ->
file { 'marker.file':
ensure => present
}
有没有更优雅的方法来解决这个问题?
答案1
您正在强迫 Puppet 执行其设计目的之外的操作。通过执行,您只会延长每次 Puppet 的运行时间。而您不希望出现这种情况。
只需使用一项cron
工作,它将检查是否有某些东西发生了变化。
file{'/usr/bin/local/do_something_meaningful':
ensure => present,
owner => 'myuser',
mode => '0755',
source => 'puppet:///modules/my_module/do_something_meaningful.sh',
}
cron { 'do_something_meaningful':
command => '/usr/bin/local/do_something_meaningful',
user => 'myuser',
hour => ['8-17'],
minute => '*/30',
require => File['/usr/bin/local/do_something_meaningful'],
}
如果您使用其他工具部署代码,则应参与do_something_meaningful.sh
部署过程。Puppet 非常适合确保某些资源(文件、包、服务等)存在。