今天puppet群有朋友问我,exec资源中的refresh和refreshonly的区别是什么

以下是执行"pi exec"看到的部分解释:
(pi命令是puppet information的缩写,puppet中自带的查询手册,类似man)

Note that if an ``exec`` receives an event from another resource,
it will get executed again (or execute the command specified in
``refresh``, if there is one).

- **refresh**
    How to refresh this command.  By default, the exec is just
    called again when it receives an event from another resource,
    but this parameter allows you to define a different command
    for refreshing.

- **refreshonly**
    The command should only be run as a
    refresh mechanism for when a dependent object is changed.  It only
    makes sense to use this option when this command depends on some
    other object; it is useful for triggering an action::
    
        # Pull down the main aliases file
        file { "/etc/aliases":
            source => "puppet://server/module/aliases"
        }
    
        # Rebuild the database, but only when the file changes
        exec { newaliases:
            path => ["/usr/bin", "/usr/sbin"],
            subscribe => File["/etc/aliases"],
            refreshonly => true
        }
    
    Note that only ``subscribe`` and ``notify`` can trigger actions, not
    ``require``,
    so it only makes sense to use ``refreshonly`` with ``subscribe`` or
    ``notify``.  Valid values are ``true``, ``false``.


refresh可能不太好理解,但refreshonly在pi命令中解释的比较清楚

如果有其他资源调用exec的时候,exec会执行好几次,加上refresh后就只会执行一次了,refresh作用就是不管有通知没通知,有多少次通知,都只执行一次。

如果没有refreshonly时,即使没有事件通知它,exec也会执行
如果加上refreshonly时,exec仅在其他资源用notify或subscribe事件通知时才会执行。refreshonly作用是让exec只在通知时执行,如果被通知多次就执行多次。

所以refresh和refreshonly也可以同时使用。