Thank you john!
在 2018年5月17日星期四 UTC+8下午9:55:09,jcbollinger写道:
>
>
>
> On Wednesday, May 16, 2018 at 10:12:54 PM UTC-5, 程伟 wrote:
>>
>> Hi,everyone!
>> I want to create a signal file when some particular file changes. I find
>> a syntax called *notify* in puppet docs could realize my need. So I
>> tried like this:
>>
>> file {'target_file':
>> ensure => 'present',
>> source => 'puppet:///files/target_file',
>> path => '/opt/target_file',
>> notify => File['signal_file'],
>> }
>>
>> file {'signal_file':
>> ensure => 'present',
>> path => '/opt/signal/signal_file',
>> subscribe => File['target_file'],
>> }
>>
>> However, I tried it many times, and found that even if target_file has
>> existed and not changed, signal_file still created. It's not my purpose.
>> Can anyone tell me if I miss something?
>>
>
>
> Yes, you're missing something.
>
> When Puppet creates or modifies a resource A, every resource that A
> notifies and every resource that subscribes to A receives an "*event*"
> (either notify or subscribe is sufficient; you don't need both). A
> resource that receives an event from any source will attempt to "
> *refresh" *some time after it is synced, but a refresh is separate from
> the preceding sync, and for most resource types it is a no-op. The most
> common uses of this feature are in conjunction with Service and Exec
> resources, which have meaningful refresh behavior.
>
> Other than that, 'notify' has the same semantics as 'before', and
> 'subscribe' has the same semantics as 'require', so if A fails, those
> resources it notifies and those that subscribe to it will be skipped. As
> long as A succeeds, however, whether that involves any changes or not,
> those other resources will be applied. In your particular case, then, you
> could change your 'notify' to 'before' and your 'subscribe' to 'require'
> without discernible effect on Puppet's behavior: it will attempt to apply
> File[signal_file] regardless of whether it receives an event, so long as
> File[target_file] is successfully synced first.
>
> It looks like you can achieve your objective with an Exec instead:
>
> file { 'target_file':
> ensure => 'present',
> source => 'puppet:///files/target_file',
> path => '/opt/target_file',
> }
>
> ~> exec { 'create signal file':
> command => '/bin/touch /opt/signal/signal_file',
> refreshonly => true,
> }
>
> Note that the '~>' operator there has the same effect as either your
> notify or your subscribe would have, and that the Exec is marked as
> refreshonly (a feature specific to the Exec resource type) so that its
> designated command is run only when that resource is refreshed, not when it
> is synced.
>
>
> John
>
>
--
You received this message because you are subscribed to the Google Groups
"Puppet Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/puppet-users/c8330f22-72c7-44ec-9483-109694347bfe%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.